Change source file permissions to 0644
[platform/core/uifw/inputdelegator.git] / src / w-input-stt-voice.cpp
old mode 100755 (executable)
new mode 100644 (file)
index bac5865..00dbbfb
 #include <string>
 #include <efl_extension.h>
 #include <feedback.h>
+#include <stdint.h>
 
 #include "Debug.h"
 #include "w-input-selector.h"
 #include "w-input-stt-voice.h"
 #include "w-input-stt-engine.h"
 #include "w-input-stt-ise.h"
+#include "voice-recorder.h"
 
 using namespace std;
 
@@ -40,11 +42,15 @@ using namespace std;
 #define GRP_PORTRAIT "mic_control"
 
 #define item_append(obj, style, index, cb, udata) \
-               elm_genlist_item_append(obj, &(style), (void *)index, NULL, ELM_GENLIST_ITEM_NONE, cb, udata)
+               elm_genlist_item_append(obj, &(style), (void *)(uintptr_t)index, NULL, ELM_GENLIST_ITEM_NONE, cb, udata)
 
 #define VIRTUAL_TEXT_AREA_FONT_STYLE \
-               "DEFAULT='font=Tizen:style=Regular  font_size=32 color=#FFFFFF color_class=AT013 text_class=tizen wrap=mixed align=center' \
-               newline='br' b='+ font=Tizen:style=Bold'link='+ underline=on underline_color=#FFFFFF'"
+               "DEFAULT = 'font = Tizen:style = Regular  font_size = 32 color = #FFFFFF color_class = AT013 text_class = tizen wrap = mixed align = center' \
+               newline = 'br' b = '+ font = Tizen:style = Bold'link = '+ underline = on underline_color = #FFFFFF'"
+
+#define TOP_PADDING_AREA 120
+#define BOTTOM_PADDING_AREA 81 // Bottom Button H 78 + margin 3
+
 
 extern App_Data* app_data;
 extern VoiceData *my_voicedata;
@@ -64,28 +70,29 @@ static Elm_Genlist_Item_Class itc_title;
 static Elm_Genlist_Item_Class itc_1text;
 static Elm_Genlist_Item_Class itc_2text;
 
+static bool g_send_button_clicked = false;
+
 
 static void set_guide_text(VoiceData *vd, const char* text, bool translatable = false);
 
 const char *supported_language[] = {
-                "auto",
-                "en_US",
-                "es_US",
-                "fr_FR",
-                "zh_CN",
-                "ja_JP",
-                "ko_KR",
+       "auto",
+       "en_US",
+       "es_US",
+       "fr_FR",
+       "zh_CN",
+       "ja_JP",
+       "ko_KR",
 };
 
-
 const char *disp_lang_array[] = {
-                "",
-                "English (United States)",
-                "Español (América Latina)",
-                "Français (France)",
-                "简体中文",
-                "日本語",
-                "한국어",
+       "",
+       "English (United States)",
+       "Español (América Latina)",
+       "Français (France)",
+       "简体中文",
+       "日本語",
+       "한국어",
 };
 
 typedef enum {
@@ -139,25 +146,24 @@ const char* get_lang_label(char lang[])
 }
 
 
-static Eina_Bool
-_bring_in_cb(void *data)
+static void _bring_in_cb(void* data, Evas_Object* obj, const char* s, const char* e)
 {
-       if(!data)
-               return ECORE_CALLBACK_CANCEL;
+       if (!data) return;
+
+       VoiceData *voicedata = (VoiceData *)data;
 
        Evas_Coord x, y, w, h;
 
-       Evas_Object *scroller = (Evas_Object *)data;
+       Evas_Object *scroller = (Evas_Object *)voicedata->scroller;
        Evas_Object *inner_layout = NULL;
 
        inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout");
-
        evas_object_geometry_get(inner_layout, &x, &y, &w, &h);
-       elm_scroller_region_bring_in(scroller, x, h, w, h);
+       elm_scroller_region_bring_in(scroller, x, h + BOTTOM_PADDING_AREA, w, h); // in case of 3 line textblock, bring in is not working so, bottom padding size will be added
 
        PRINTFUNC(NO_PRINT, "scroller %d %d %d %d", x, y, w, h);
 
-       return ECORE_CALLBACK_CANCEL;
+       return;
 }
 
 static inline Evas_Coord get_text_block_size(Evas_Object *obj, std::string text)
@@ -198,7 +204,7 @@ static inline Evas_Coord get_text_block_size(Evas_Object *obj, std::string text)
 
 static Eina_Bool _update_textblock_timer_cb(void *data)
 {
-       if(!data)
+       if (!data)
                return ECORE_CALLBACK_CANCEL;
 
        VoiceData* voicedata = (VoiceData*)data;
@@ -222,33 +228,38 @@ static Eina_Bool _update_textblock_timer_cb(void *data)
        Evas_Object *inner_layout = NULL;
 
        scroller = elm_layout_content_get((Evas_Object *)voicedata->layout_main, "text_area");
-       if(!scroller)
+       if (!scroller)
        {
                PRINTFUNC(DLOG_ERROR, "failed to get scroller");
                return ECORE_CALLBACK_CANCEL;
        }
 
        box = elm_object_content_get(scroller);
-       if(!box)
+       if (!box)
        {
                PRINTFUNC(DLOG_ERROR, "failed to get box");
                return ECORE_CALLBACK_CANCEL;
        }
 
        inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout");
-       if(!inner_layout)
+       if (!inner_layout)
        {
                PRINTFUNC(DLOG_ERROR, "failed to get inner_layout");
                return ECORE_CALLBACK_CANCEL;
        }
 
        entry = elm_layout_content_get(inner_layout, "elm.swallow.content");
-       if(!entry)
+       if (!entry)
        {
                PRINTFUNC(DLOG_ERROR, "failed to get entry");
                return ECORE_CALLBACK_CANCEL;
        }
 
+       if (!strcmp(result_text.c_str(), elm_entry_entry_get(entry))){
+               PRINTFUNC(DLOG_ERROR, "Nothing to update");
+               return ECORE_CALLBACK_CANCEL;
+       }
+
        Evas_Object *top = (Evas_Object *) evas_object_data_get(box, "top_padding");
        Evas_Object *bottom = (Evas_Object *) evas_object_data_get(box, "bottom_padding");
 
@@ -267,12 +278,12 @@ static Eina_Bool _update_textblock_timer_cb(void *data)
 
 //     if(height < 173) {
        {
-               int text_area_height = 360-102; // screen H - bottom button H
-               int top_height = ((text_area_height - height) / 2);
-               if(top_height < 120) top_height = 120; // Top fade area H
+               int text_area_height = 360; // screen H
+               int top_height = ((text_area_height - height - BOTTOM_PADDING_AREA) / 2); // 78 + 3 : bottom button H ++ margin
+               if (top_height < TOP_PADDING_AREA) top_height = TOP_PADDING_AREA; // Top fade area H
 
                int bottom_height = (text_area_height - top_height - height);
-               if(bottom_height < 1) bottom_height = 0;
+               if (bottom_height < BOTTOM_PADDING_AREA) bottom_height = BOTTOM_PADDING_AREA;
 
                PRINTFUNC(SECURE_DEBUG, "str : %s", result_text.c_str());
                PRINTFUNC(DLOG_DEBUG, "height : %d", height);
@@ -304,30 +315,36 @@ static Eina_Bool _update_textblock_timer_cb(void *data)
        Evas_Object *panel_left = elm_layout_content_get((Evas_Object *)panel_layout, "elm.swallow.right");
 
        if (result_text.size() > 0) {
+               show_bottom_button(voicedata, false);
                elm_object_signal_emit(panel_left, "elm,state,enabled", "elm");
        } else {
                elm_object_signal_emit(panel_left, "elm,state,disabled", "elm");
        }
 
-       elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,guide_text,bottom", "elm");
+       elm_object_signal_emit(inner_layout, "scrolling", "entry");
 
-       if(voicedata->state == STT_STATE_VAL_LISTENING){
-               if(voicedata->guide_text_timer != NULL){
-                       PRINTFUNC(DLOG_DEBUG, "Skip hide_guide_text");
-                       ecore_timer_del(voicedata->guide_text_timer);
-                       voicedata->guide_text_timer = NULL;
+       Evas_Coord x, y, w, h;
+       evas_object_geometry_get(inner_layout , &x, &y, &w, &h);
+       PRINTFUNC(DLOG_DEBUG, "inner_layout x=%d, y=%d, w=%d, h=%d", x, y, w, h);
+
+       if (h > 3900){ // to avoid Textblock size overflow (limit : 4000x4000)
+               PRINTFUNC(DLOG_ERROR, "Stop STT to avoid text block overflow");
+               if(voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING || voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING) {
+                       PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING or STT_STATE_PROCESSING\n");
+                       try{
+                               voicedata->sttmanager->Cancel();
+                       }catch(is::stt::SttException &e){
+                               PRINTFUNC(DLOG_ERROR, "reason : %s", e.what());
+                       }
                }
-               set_guide_text(voicedata, SK_TAP_TO_PAUSE, true);
        }
 
-       elm_object_signal_emit(inner_layout, "scrolling", "entry");
-
        return ECORE_CALLBACK_CANCEL;
 }
 
 void _update_textblock(void *data)
 {
-       if(!data)
+       if (!data)
                return;
 
        VoiceData *voicedata = (VoiceData *) data;
@@ -343,14 +360,14 @@ void _update_textblock(void *data)
 
 void voice_get_string(const char *keyValue, _VoiceData *voicedata)
 {
-       if(!voicedata)
+       if (!voicedata)
                return;
 
        char* strbuf = NULL;
 
        strbuf = elm_entry_utf8_to_markup(keyValue);
 
-       PRINTFUNC(DLOG_DEBUG, "text : %s, voicedata->partial_result=%s", strbuf, voicedata->partial_result);
+       SECURE_LOGD("text : %s, voicedata->partial_result=%s", strbuf, voicedata->partial_result);
 
        if(strbuf){
                if(voicedata->partial_result){ // partial_result is not Null so replace
@@ -393,83 +410,70 @@ static Eina_Bool _recognition_failure_cb(void *data)
 
 void start_by_press(VoiceData *voicedata)
 {
-       PRINTFUNC(DLOG_DEBUG, "");
-
+       LOGD("start_by_press ");
        edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
-
-       return;
 }
 
-static void on_mic_button_press_cb(void *data, Evas_Object *obj, void *event_info)
-{
-       PRINTFUNC(NO_PRINT, "");
-
-       VoiceData *voicedata = (VoiceData *)data;
-       edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
-
-       return;
-}
-
-
-static Eina_Bool _mic_button_enable_cb(void *data)
+static void on_confirm_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       PRINTFUNC(DLOG_DEBUG, "");
-
-       if(!data)
-               return ECORE_CALLBACK_CANCEL;
+       if (!data)
+               return;
 
        VoiceData* voicedata = (VoiceData*)data;
 
-       voicedata->btn_disabling_timer = NULL;
-
-       Evas_Object *button = (Evas_Object *)voicedata->mic_button;
-
-       elm_object_disabled_set(button, EINA_FALSE);
-
-       return ECORE_CALLBACK_CANCEL;
-}
-
+       if (g_send_button_clicked == true){
+               PRINTFUNC(DLOG_ERROR, "skipped seding STT result");
+               return;
+       }
 
-static void on_confirm_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
-{
-       if(!data)
+       if (is_textblock_empty(voicedata) == true){
                return;
+       }
 
-       VoiceData* voicedata = (VoiceData*)data;
+       if (voicedata->sttmanager){
+               if (voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING ||
+                       voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING) {
+                       PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING or STT_STATE_PROCESSING\n");
+                       try{
+                               voicedata->sttmanager->Cancel();
+                       }catch(is::stt::SttException &e){
+                               PRINTFUNC(DLOG_ERROR, "reason : %s", e.what());
+                       }
+               }
+       }
+
+       g_send_button_clicked = true;
 
        std::string result_text;
        for(unsigned int i = 0; i < voicedata->stt_results.size(); i++){
                result_text += voicedata->stt_results.at(i);
-               if(i != voicedata->stt_results.size()-1)
+               if (i != voicedata->stt_results.size()-1)
                        result_text += " ";
        }
 
-       PRINTFUNC(DLOG_DEBUG, "result_text = %s", result_text.c_str());
+       SECURE_LOGD("result_text = %s", result_text.c_str());
+       stop_voice_recorder();
+
+       char *filePath = NULL;
+       voice_recorder *vr = _voice_recorder_get_data();
+       if (vr)
+               filePath = vr->file_path;
 
-       reply_to_sender_by_callback(result_text.c_str(), "voice");
+       char *path[] = {filePath, };
+       reply_to_sender_by_callback(result_text.c_str(), "voice", (const char **)path, NULL);
        destroy_voice();
        powerUnlock();
-       elm_exit();
+       ui_app_exit();
 
        return;
 }
 
-static void
-_panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-       PRINTFUNC(DLOG_DEBUG, "left cue clicked!!");
-
-       on_confirm_button_clicked_cb(data, NULL, NULL);
-}
-
-
-
 void stt_feedback_initialize()
 {
        int ret = 0;
 
        ret = feedback_initialize();
-       if(ret != 0)
+       if (ret != 0)
        {
                PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
                return;
@@ -482,7 +486,7 @@ void stt_feedback(FeedbackType type)
        int ret;
 
        ret = feedback_initialize();
-       if(ret != 0)
+       if (ret != 0)
        {
                PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
                return;
@@ -495,7 +499,7 @@ void stt_feedback(FeedbackType type)
        }
 
        ret = feedback_deinitialize();
-       if(ret != 0)
+       if (ret != 0)
        {
                PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
                return;
@@ -507,7 +511,7 @@ void stt_feedback_deinitialize()
        int ret = 0;
 
        ret = feedback_deinitialize();
-       if(ret != 0)
+       if (ret != 0)
        {
                PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
                return;
@@ -517,44 +521,42 @@ void stt_feedback_deinitialize()
 
 static Eina_Bool _idler_cb(void *data)
 {
-       if(!data) return ECORE_CALLBACK_CANCEL;
+       if (!data) return ECORE_CALLBACK_CANCEL;
 
        VoiceData *voicedata = (VoiceData *)data;
 
        PRINTFUNC(DLOG_DEBUG, "");
 
-
-       if(true == _app_stt_initialize(voicedata)) {
-               PRINTFUNC(NO_PRINT, "_app_stt_initialize None Error");
+       if (true == _app_stt_initialize(voicedata)) {
+               LOGD("_app_stt_initialize None Error");
                voicedata->voicefw_state = 1;
                voicedata->state = STT_STATE_VAL_INIT;
        } else {
                voicedata->voicefw_state = 0;
-               PRINTFUNC(DLOG_ERROR, "Initialization Fail!<br>Check STT-daemon is running");
+               LOGD("Initialization Fail!<br>Check STT-daemon is running");
        }
 
        Evas_Object *canvas = elm_object_part_content_get(voicedata->layout_main, "EFFECT_BG");
 
-
        is::ui::WInputSttMicEffect *ieffect = new is::ui::WInputSttMicEffect();
-       ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+       if (ieffect) {
+               ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
 
-       is::ui::MicEffector *effector = new is::ui::MicEffector(canvas, voicedata->layout_main, *ieffect);
-       voicedata->ieffect = ieffect;
-       voicedata->effector = effector;
+               is::ui::MicEffector *effector = new is::ui::MicEffector(canvas, voicedata->layout_main, *ieffect);
+               voicedata->ieffect = ieffect;
+               voicedata->effector = effector;
 
-       ieffect->SetProgressBar(voicedata->progressbar);
-       ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+               ieffect->SetProgressBar(voicedata->progressbar);
+               ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+       }
 
        voicedata->mo->Update();
 
-       elm_access_highlight_set(voicedata->mic_button);
-
+       voicedata->setup_timer = NULL;
 
        return ECORE_CALLBACK_CANCEL;
 }
 
-
 static Eina_Bool _power_delayed_unlock(void *data){
        PRINTFUNC(DLOG_DEBUG, "POWER Unlock");
 
@@ -577,28 +579,28 @@ void powerLock(void *data, bool enable)
 
        VoiceData *voicedata = (VoiceData *) data;
 
-       if(enable) {
+       if (enable) {
                ret = device_power_wakeup(false);
                PRINTFUNC(DLOG_DEBUG, "LCD Wakeup");
 
-               if(ret != DEVICE_ERROR_NONE)
+               if (ret != DEVICE_ERROR_NONE)
                        PRINTFUNC(DLOG_ERROR, "LCD Wakeup ERROR = %d", ret);
 
                ret = device_power_request_lock(POWER_LOCK_DISPLAY, 0);
                PRINTFUNC(DLOG_DEBUG, "POWER LOCK");
                power_state = enable;
 
-               if(ret != DEVICE_ERROR_NONE)
+               if (ret != DEVICE_ERROR_NONE)
                        PRINTFUNC(DLOG_ERROR, "ERROR = %d", ret);
 
-               if(voicedata->power_unlock_timer != NULL){
+               if (voicedata->power_unlock_timer != NULL){
                        ecore_timer_del(voicedata->power_unlock_timer);
                        voicedata->power_unlock_timer = NULL;
                }
        } else {
                PRINTFUNC(DLOG_DEBUG, "POWER Unlock Delayed(5 sec)");
 
-               if(voicedata->power_unlock_timer != NULL){
+               if (voicedata->power_unlock_timer != NULL){
                        ecore_timer_del(voicedata->power_unlock_timer);
                        voicedata->power_unlock_timer = NULL;
                }
@@ -606,33 +608,66 @@ void powerLock(void *data, bool enable)
        }
 }
 
+static void expand_send_text(void *data)
+{
+       PRINTFUNC(DLOG_DEBUG, "");
 
-static Eina_Bool hide_guide_text(void *data){
        if(data) {
                VoiceData *voicedata = (VoiceData *) data;
+               elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,send,text,expand", "elm");
+       }
+}
+
+static void contract_send_text(void *data)
+{
+       PRINTFUNC(DLOG_DEBUG, "");
 
-               voicedata->guide_text_timer = NULL;
+       if(data) {
+               VoiceData *voicedata = (VoiceData *) data;
+               elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,send,text,contract", "elm");
+       }
+}
 
+static void set_cue_text(void *data)
+{
+       PRINTFUNC(DLOG_DEBUG, "");
 
-               PRINTFUNC(DLOG_ERROR, "");
-               elm_object_part_text_set(voicedata->layout_main, "elm.text", "");
+       if(data) {
+               VoiceData *voicedata = (VoiceData *) data;
+               elm_object_domain_translatable_part_text_set(voicedata->layout_main, "elm.text.cue", PACKAGE, SK_SPEAK_NOW);
+               elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,cue_text,visible", "elm");
        }
-       return ECORE_CALLBACK_CANCEL;
 }
 
 static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
 {
-       //elm_object_signal_emit(vd->layout_main, "idle,state,text,visible", "elm");
+       SECURE_LOGD("text = %s", text);
 
-       if(translatable)
+       if (!vd) return;
+
+       if (vd->mo){
+               PRINTFUNC(DLOG_DEBUG, "isMoreOptionOpend() = %d, discard_popup_opend == %d, g_send_button_clicked = %d", vd->mo->isMoreOptionOpened(), vd->mo->discard_popup_opened, g_send_button_clicked);
+               if (vd->mo->isMoreOptionOpened() == EINA_TRUE || vd->mo->discard_popup_opened == EINA_TRUE
+                       || g_send_button_clicked == true){
+                       elm_object_signal_emit((Evas_Object *)vd->layout_main, "idle,state,text,hidden", "elm");
+                       PRINTFUNC(DLOG_DEBUG, "MoreOption or DiscardPopup is opened, So skipped");
+                       return;
+               }
+       }
+
+       if (translatable)
                elm_object_domain_translatable_part_text_set(vd->layout_main, "elm.text", PACKAGE, text);
        else
                elm_object_part_text_set(vd->layout_main, "elm.text", text);
 
-       if(!strcmp(text, SK_SPEAK_NOW)){
-               if(vd->guide_text_timer == NULL)
-                       vd->guide_text_timer = ecore_timer_add(2.0, hide_guide_text, vd);
-       }
+       elm_object_signal_emit((Evas_Object *)vd->layout_main, "idle,state,text,visible", "elm");
+       hide_bottom_button(vd);
+
+       // check whether any result exists
+       if (is_textblock_empty(vd))
+               return;
+
+       show_bottom_button(vd, true);
 }
 
 /**
@@ -642,71 +677,42 @@ static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
  */
 void set_animation_state(VoiceData *voicedata)
 {
-       PRINTFUNC(DLOG_DEBUG, "");
-
-       PRINTFUNC(DLOG_ERROR, "voicedata->state == %s",
-               voicedata->state == STT_STATE_VAL_INIT ?
-                       "STT_STATE_VAL_INIT" :
-               voicedata->state == STT_STATE_VAL_LISTENING ?
-                       "STT_STATE_VAL_LISTENING" :
-               voicedata->state == STT_STATE_VAL_PREPARE_LISTENING ?
-                       "STT_STATE_VAL_PREPARE_LISTENING" :
-               voicedata->state == STT_STATE_VAL_PROCESSING ?
-                       "STT_STATE_VAL_PROCESSING" :
-               voicedata->state == STT_STATE_VAL_PREPARE_PROCESSING ?
-                       "STT_STATE_VAL_PREPARE_PROCESSING" :
-               voicedata->state == STT_STATE_VAL_TERMINATING ?
-                       "STT_STATE_VAL_TERMINATING" : "STT_STATE_VAL_NOT_RECOGNISED");
-
        if (voicedata->state == STT_STATE_VAL_INIT) {
-#if 0
-               if (voicedata->sttmanager->GetCurrent() == STT_STATE_READY) {
-                       set_guide_text(voicedata, "", false);
-                       //_elm_access_say(voicedata->layout_main, _(SK_INIT));
-               } else {
-                       PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR [%d]", voicedata->sttmanager->GetCurrent());
-                       set_guide_text(voicedata, _(SK_NETWORK_ERROR));
-                       //_elm_access_say(voicedata->layout_main, _(SK_NETWORK_CONNECTION_ERROR));
-               }
-#endif
-
                if(voicedata->effector)
                        voicedata->effector->Stop(true);
 
-               set_guide_text(voicedata, "");
+               expand_send_text(voicedata);
 
-               PRINTFUNC(DLOG_DEBUG, "%d", voicedata->stt_results.size());
                powerLock((void*)voicedata, false);
        } else if (voicedata->state == STT_STATE_VAL_LISTENING) {
-               set_guide_text(voicedata, SK_SPEAK_NOW, true);
+               set_cue_text(voicedata);
+               contract_send_text(voicedata);
 
                if(voicedata->effector)
                        voicedata->effector->Start();
 
                powerLock((void*)voicedata, true);
        } else if (voicedata->state == STT_STATE_VAL_PROCESSING) {
-               set_guide_text(voicedata, "");
+               expand_send_text(voicedata);
                if(voicedata->effector)
                        voicedata->effector->Stop();
 
                stt_feedback(VIBRATION_STOP);
        } else {
-               PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR");
                set_guide_text(voicedata, _(SK_RECOGNITION_FAILED));
                //_elm_access_say(voicedata->layout_main, _(SK_RECOGNITION_FAILED));
-
+               expand_send_text(voicedata);
                voicedata->state = STT_STATE_VAL_NOT_RECOGNISED;
 
                if(voicedata->refresh_timer) {
                        ecore_timer_del(voicedata->refresh_timer);
+                       voicedata->refresh_timer = NULL;
                }
 
                if(voicedata->effector)
                        voicedata->effector->Stop(true);
 
                voicedata->refresh_timer = ecore_timer_add(2.0, _recognition_failure_cb, voicedata);
-
-               //powerLock((void*)voicedata, false);
        }
 }
 
@@ -778,9 +784,63 @@ static Eina_Bool _start_timer_cb(void* data)
                }
                voicedata->start_timer = NULL;
        }
+
+       start_voice_recorder();
+
        return ECORE_CALLBACK_CANCEL;
 }
 
+void restart_listening(double in)
+{
+       PRINTFUNC(DLOG_DEBUG, "");
+
+       if(my_voicedata){
+               // reset STT Objects
+               if(my_voicedata->ieffect) {
+                       delete my_voicedata->ieffect;
+                       my_voicedata->ieffect = NULL;
+               }
+
+               if(my_voicedata->effector) {
+                       delete my_voicedata->effector;
+                       my_voicedata->effector = NULL;
+               }
+
+               if(my_voicedata->sttmanager) {
+                       delete my_voicedata->sttmanager;
+                       my_voicedata->sttmanager = NULL;
+               }
+
+               if(my_voicedata->sttfeedback) {
+                       delete my_voicedata->sttfeedback;
+                       my_voicedata->sttfeedback = NULL;
+               }
+
+               if(my_voicedata->setup_timer){
+                       ecore_timer_del(my_voicedata->setup_timer);
+                       my_voicedata->setup_timer = NULL;
+               }
+
+               my_voicedata->setup_timer = ecore_timer_add(0.5, _idler_cb, my_voicedata);
+
+               // clear resut
+               my_voicedata->stt_results.clear();
+
+               if(my_voicedata->textblock_timer){
+                       ecore_timer_del(my_voicedata->textblock_timer);
+                       my_voicedata->textblock_timer = NULL;
+               }
+
+               if(my_voicedata->refresh_timer){
+                       ecore_timer_del(my_voicedata->refresh_timer);
+                       my_voicedata->refresh_timer = NULL;
+               }
+
+               hide_bottom_button(my_voicedata);
+               _update_textblock_timer_cb(my_voicedata);
+       }
+}
+
 /**
  * @brief - cancel button press callback for cross button
  * @param -
@@ -791,10 +851,12 @@ void on_initial_anim_press_cb(void *data, Evas_Object *obj, const char *emission
        PRINTFUNC(NO_PRINT, "");
 
        VoiceData *vd = (VoiceData *)data;
+       if (vd == NULL)
+               return;
 
        int tempVal = vd->sttmanager->GetCurrent();
        if(tempVal == STT_STATE_CREATED) {
-               PRINTFUNC(DLOG_WARN, "IGNORE TOUCH event before STT READY. STT is preparing", vd->state);
+               PRINTFUNC(DLOG_WARN, "IGNORE TOUCH event before STT READY. STT is preparing");
                return;
        }
 
@@ -828,8 +890,6 @@ void on_initial_anim_press_cb(void *data, Evas_Object *obj, const char *emission
                                 * Cuased touch reponse time, it can be called to stop animator.
                                 *
                                 */
-                               set_guide_text(vd, "");
-
                                if(vd->effector)
                                        vd->effector->Stop();
                        }
@@ -871,7 +931,7 @@ void on_initial_anim_press_cb(void *data, Evas_Object *obj, const char *emission
 
 static inline void ea_naviframe_back(void *data, Evas_Object *obj, void *event_info)
 {
-       if(!data) return;
+       if (!data) return;
 
        evas_object_del((Evas_Object *) data);
 
@@ -882,11 +942,12 @@ static inline void ea_naviframe_back(void *data, Evas_Object *obj, void *event_i
                ecore_event_handler_del(g_evt_key_down);
 
        g_evt_key_down = NULL;
-
-       //Hide more option
-       if(g_more_option_layout){
-               if(eext_more_option_opened_get(g_more_option_layout) == EINA_TRUE) {
-                       eext_more_option_opened_set(g_more_option_layout, EINA_FALSE);
+       if (_WEARABLE) {
+               //Hide more option
+               if(g_more_option_layout){
+                       if(eext_more_option_opened_get(g_more_option_layout) == EINA_TRUE) {
+                               eext_more_option_opened_set(g_more_option_layout, EINA_FALSE);
+                       }
                }
        }
 }
@@ -898,30 +959,31 @@ static char *__get_genlist_title_label(void *data, Evas_Object *obj, const char
 
 char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
 {
-       char text[128] = {0, };
+       const int BUF_LEN = 128;
+       char text[BUF_LEN] = {'\0', };
 
-       if(!strcmp(part, "elm.text"))
+       if (!strcmp(part, "elm.text"))
        {
-               if((int)data == 0) {
+               if ((uintptr_t)data == 0) {
                        return strdup(_("IDS_VC_BODY_AUTOMATIC"));
                } else {
                        char *s = NULL;
-                       s = (char *)disp_lang_array[(int)data];
+                       s = (char *)disp_lang_array[(uintptr_t)data];
 
                        if(s) {
                                char *p = strchr(s, '(');
                                if(p) {
                                        strncpy(text, s, p-s);
                                } else {
-                                       strncpy(text, s, strlen(s));
+                                       snprintf(text, BUF_LEN, "%s", s);
                                }
                        } else {
-                               strncpy(text, "", strlen(""));
+                               snprintf(text, BUF_LEN, "%s", "");
                        }
                }
                return strdup(text);
        } else if (!strcmp(part, "elm.text.1")) {
-               if ((int)data == 0) {
+               if ((uintptr_t)data == 0) {
                        char* value = NULL;
                        value = vconf_get_str(VCONFKEY_LANGSET);
                        if (NULL == value) {
@@ -941,17 +1003,17 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
 
                } else {
                        char *s = NULL;
-                       s = (char *)disp_lang_array[(int)data];
+                       s = (char *)disp_lang_array[(uintptr_t)data];
 
                        if(s) {
                                char *p = strchr(s, '(');
                                if(p) {
                                        strncpy(text, p+1, strlen(s)-(p-s)-2);
                                } else {
-                                       strncpy(text, s, strlen(s));
+                                       snprintf(text, BUF_LEN, "%s", s);
                                }
                        } else {
-                               strncpy(text, "", strlen(""));
+                               snprintf(text, BUF_LEN, "%s", "");
                        }
                        return strdup(text);
                }
@@ -965,7 +1027,7 @@ static Evas_Object *__get_genlist_item_content(void *data, Evas_Object *obj, con
        Evas_Object * content = NULL;
 
        if (!strcmp(part, "elm.icon") ||
-               !strcmp(part, "elm.swallow.end")) {
+           !strcmp(part, "elm.swallow.end")) {
                content = elm_radio_add(obj);
                elm_object_style_set(content, "list");
                elm_radio_state_value_set(content, index);
@@ -1014,7 +1076,7 @@ static void set_language_value(int type)
 
 static void get_stt_default_language(VoiceData *my_voicedata)
 {
-       if(!my_voicedata) {
+       if (!my_voicedata) {
                PRINTFUNC(DLOG_ERROR, "my_voicedata NULL");
                return;
        }
@@ -1092,25 +1154,29 @@ static Eina_Bool close_setting_window_idler_cb(void *data)
 static void language_set_genlist_radio_cb(void *data, Evas_Object *obj, void *event_info)
 {
        PRINTFUNC(DLOG_DEBUG, "");
-       if(!data) return;
+       if (!data) return;
 
        int index = 0;
 
        Elm_Object_Item * item = (Elm_Object_Item *) event_info;
        if (item) {
                elm_genlist_item_selected_set(item, 0);
-               index = (int)elm_object_item_data_get(item);
+               index = (uintptr_t)elm_object_item_data_get(item);
                elm_genlist_item_update(item);
        }
        set_language_value(index);
 
        elm_radio_value_set(radio_gp, index);
+
+       if(my_voicedata)
+               set_textblock_empty(my_voicedata);
+
        ecore_timer_add(0.3, close_setting_window_idler_cb, NULL);
 }
 
 static void language_changed_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-       if(!obj) return;
+       if (!obj) return;
        elm_genlist_realized_items_update(obj);
 }
 
@@ -1131,9 +1197,9 @@ static void _language_list_item_realized(void *data, Evas_Object *obj, void *eve
        PRINTFUNC(DLOG_DEBUG, "%s", __func__);
 }
 
-static Evas_Object *create_language_list(Evas_Object *parent)
+static Evas_Object *create_language_list(Evas_Object *parent, Eext_Circle_Surface* circle_surface)
 {
-       if(!parent) return NULL;
+       if (!parent) return NULL;
 
        Evas_Object *genlist = elm_genlist_add(parent);
        if (!genlist) return NULL;
@@ -1141,7 +1207,7 @@ static Evas_Object *create_language_list(Evas_Object *parent)
        elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
        elm_genlist_homogeneous_set(genlist, EINA_TRUE);
 #ifdef _CIRCLE
-       Evas_Object *circle_language_genlist = eext_circle_object_genlist_add(genlist, NULL);
+       Evas_Object *circle_language_genlist = eext_circle_object_genlist_add(genlist, circle_surface);
        eext_circle_object_genlist_scroller_policy_set(circle_language_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
        evas_object_resize(circle_language_genlist, 360, 360);
        evas_object_show(circle_language_genlist);
@@ -1165,16 +1231,16 @@ static Evas_Object *create_language_list(Evas_Object *parent)
        itc_title.item_style = "title";
        itc_title.func.text_get = __get_genlist_title_label;
        itc_title.func.content_get = NULL;
-#ifdef _WEARABLE
-       item = elm_genlist_item_append(genlist, &itc_title, (void *)-1, NULL, ELM_GENLIST_ITEM_GROUP, NULL, genlist);
-#endif
+       if (_WEARABLE) {
+               item = elm_genlist_item_append(genlist, &itc_title, (void *)-1, NULL, ELM_GENLIST_ITEM_GROUP, NULL, genlist);
+       }
 
        // 2 line text
-#ifdef _WEARABLE
-       itc_2text.item_style = "2text.1icon.1/sub1.multiline";
-#else
-       itc_2text.item_style = "type1";
-#endif
+       if (_WEARABLE) {
+               itc_2text.item_style = "2text.1icon.1/sub1.multiline";
+       } else {
+               itc_2text.item_style = "type1";
+       }
        itc_2text.func.text_get = __get_genlist_item_label;
        itc_2text.func.content_get = __get_genlist_item_content;
 
@@ -1191,11 +1257,11 @@ static Evas_Object *create_language_list(Evas_Object *parent)
        }
 
        // 1 line text
-#ifdef _WEARABLE
-       itc_1text.item_style = "1text.1icon.1";
-#else
-       itc_1text.item_style = "type1";
-#endif
+       if (_WEARABLE) {
+               itc_1text.item_style = "1text.1icon.1";
+       } else {
+               itc_1text.item_style = "type1";
+       }
        itc_1text.func.text_get = __get_genlist_item_label;
        itc_1text.func.content_get = __get_genlist_item_content;
 
@@ -1253,7 +1319,7 @@ void create_setting_window(Evas_Object *more_option_layout)
         *
         */
        window = elm_win_add(NULL, "voice-input-setting", ELM_WIN_BASIC);
-       if(!window) {
+       if (!window) {
                PRINTFUNC(DLOG_DEBUG, "it's fail to create window.");
                return;
        }
@@ -1315,10 +1381,13 @@ void create_setting_window(Evas_Object *more_option_layout)
         * Push language list
         *
         */
-       genlist = create_language_list(naviframe);
+       genlist = create_language_list(naviframe, NULL);
 
+       const char *item_style = NULL;
+       if (_WEARABLE)
+               item_style = "empty";
        //item = elm_naviframe_item_push(naviframe, "IDS_VC_HEADER_VOICE_INPUT_LANGUAGE", NULL, NULL, genlist, NULL);
-       elm_naviframe_item_push(naviframe, NULL, NULL, NULL, genlist, "empty");
+       elm_naviframe_item_push(naviframe, NULL, NULL, NULL, genlist, item_style);
        //elm_object_item_domain_text_translatable_set(item, PACKAGE, EINA_TRUE);
 
        g_setting_window = window;
@@ -1329,7 +1398,7 @@ void create_setting_window(Evas_Object *more_option_layout)
 void _stt_lang_changed_cb(keynode_t *key, void* data)
 {
        PRINTFUNC(DLOG_DEBUG, "");
-       if(!data) return;
+       if (!data) return;
 
        VoiceData *vd = (VoiceData *) data;
        get_stt_default_language(vd);
@@ -1343,8 +1412,8 @@ static void __done_key_cb(void *data, Evas_Object *obj, void *event_info )
 {
        PRINTFUNC(DLOG_DEBUG, "");
 
-       if(!obj) return;
-       if(!data) return;
+       if (!obj) return;
+       if (!data) return;
 
        VoiceData *voicedata = (VoiceData *)data;
 
@@ -1353,7 +1422,7 @@ static void __done_key_cb(void *data, Evas_Object *obj, void *event_info )
 
 static void __stt_detailed_entry_input_panel_event_cb(void *data, Ecore_IMF_Context *imf_context,  int value)
 {
-       if(!data) return;
+       if (!data) return;
 
        VoiceData *voicedata = (VoiceData *)data;
 
@@ -1379,11 +1448,15 @@ static void __stt_detailed_entry_del_cb(void *data, Evas *e, Evas_Object *obj, v
        }
 }
 
-static Evas_Object *create_text_detiled_view(Evas_Object *parent)
+Evas_Object *create_text_detiled_view(Evas_Object *parent)
 {
        string edj_path = get_resource_path();
-       edj_path = edj_path + STT_EDJ_FILE;
-
+       if(_WEARABLE)
+               edj_path = edj_path + STT_EDJ_FILE_WEARABLE;
+       else if (_TV)
+               edj_path = edj_path + STT_EDJ_FILE_TV;
+       else
+               edj_path = edj_path + STT_EDJ_FILE_MOBILE;
        //layout
        Evas_Object *layout = elm_layout_add(parent);
        elm_layout_file_set(layout, edj_path.c_str(), "entry_focused_layout");
@@ -1395,10 +1468,8 @@ static Evas_Object *create_text_detiled_view(Evas_Object *parent)
        Evas_Object *entry = elm_entry_add(parent);
        evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
-//     ea_entry_selection_back_event_allow_set(entry, EINA_TRUE);
        elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
        elm_entry_select_allow_set(entry, EINA_FALSE);
-//     elm_entry_cursor_handler_disabled_set(entry, EINA_TRUE);
        elm_entry_single_line_set(entry, EINA_TRUE);
        elm_entry_scrollable_set(entry, EINA_TRUE);
        elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
@@ -1409,12 +1480,18 @@ static Evas_Object *create_text_detiled_view(Evas_Object *parent)
        return layout;
 }
 
+static Eina_Bool _idler_cb2(void *data)
+{
+       if (!data) return ECORE_CALLBACK_CANCEL;
+
+       return ECORE_CALLBACK_CANCEL;
+}
 
 static Eina_Bool __stt_entry_detailed_view_pop_cb(void *data, Elm_Object_Item *it)
 {
        PRINTFUNC(DLOG_DEBUG, "");
 
-       if(!data) return EINA_FALSE;
+       if (!data) return EINA_FALSE;
 
        VoiceData *voicedata = (VoiceData *)data;
 
@@ -1422,26 +1499,37 @@ static Eina_Bool __stt_entry_detailed_view_pop_cb(void *data, Elm_Object_Item *i
        Evas_Object *detailed_layout = elm_object_item_part_content_get(it, "elm.swallow.content");
        Evas_Object *detailed_entry = elm_object_part_content_get(detailed_layout, "contents");
 
-       const char *str = NULL;
+       if (elm_entry_is_empty(detailed_entry) == EINA_TRUE){
+               PRINTFUNC(DLOG_DEBUG, "detailed_entry is empty");
+               voicedata->stt_results.clear();
+               elm_entry_entry_set(main_entry, "");
 
-       int pos = 0;
-       pos = elm_entry_cursor_pos_get(detailed_entry);
-       PRINTFUNC(DLOG_DEBUG, "pos = %d", pos);
+               hide_bottom_button(voicedata);
+       } else {
+               const char *str = NULL;
+               int pos = 0;
+               pos = elm_entry_cursor_pos_get(detailed_entry);
+               PRINTFUNC(DLOG_DEBUG, "pos = %d", pos);
 
-       str =  elm_entry_entry_get(detailed_entry);
+               str =  elm_entry_entry_get(detailed_entry);
+               PRINTFUNC(DLOG_DEBUG, "str = %s", str);
 
-       voicedata->stt_results.clear();
-       voicedata->stt_results.push_back(str);
+               if (str) {
+                       voicedata->stt_results.clear();
+                       voicedata->stt_results.push_back(str);
+               }
 
-//     uxt_scroller_set_auto_scroll_enabled(voicedata->scroller, EINA_TRUE);
-       elm_entry_entry_set(main_entry, str);
-       elm_entry_cursor_pos_set(main_entry, pos);
+               elm_entry_entry_set(main_entry, str);
+               elm_entry_cursor_pos_set(main_entry, pos);
 
-       int x, y, w, h;
-       elm_entry_cursor_geometry_get(main_entry, &x, &y, &w, &h);
-       PRINTFUNC(DLOG_DEBUG, "%d %d %d %d", x, y, w, h);
+               int x, y, w, h;
+               elm_entry_cursor_geometry_get(main_entry, &x, &y, &w, &h);
+               PRINTFUNC(DLOG_DEBUG, "%d %d %d %d", x, y, w, h);
 
-       elm_scroller_region_bring_in(voicedata->scroller, 0, y+h, 300, 168);
+               elm_scroller_region_bring_in(voicedata->scroller, 0, y+h, 300, 168);
+
+               ecore_idler_add(_idler_cb2, voicedata);
+       }
 
        return EINA_TRUE;
 }
@@ -1450,18 +1538,24 @@ static void _stt_entry_clicked_cb(void *data, Evas_Object * obj, void *event_inf
 {
        PRINTFUNC(DLOG_DEBUG, "");
 
-       if(!obj) return;
-       if(!data) return;
+       if (!obj) return;
+       if (!data) return;
 
        VoiceData *voicedata = (VoiceData *)data;
 
        char *str = NULL;
+       char *utf8 = NULL;
 
        int pos = 0;
        pos = elm_entry_cursor_pos_get(obj);
        PRINTFUNC(DLOG_DEBUG, "pos = %d", pos);
 
-       str =  elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
+       utf8 = elm_entry_markup_to_utf8(elm_entry_entry_get(obj)); // to remove the tag for fade-in effect
+       if (utf8) {
+               str =  elm_entry_utf8_to_markup(utf8);
+               free(utf8);
+               utf8 = NULL;
+       }
 
        if (str && strlen(str) > 0) {
                try {
@@ -1498,25 +1592,25 @@ static void _stt_entry_clicked_cb(void *data, Evas_Object * obj, void *event_inf
        return;
 }
 
-
 void activate_circle_scroller_for_stt_textbox(void* data, Eina_Bool bActivate)
 {
        PRINTFUNC(DLOG_DEBUG, "");
 
-       if(!data) return;
+       if (!data) return;
        VoiceData *voicedata = (VoiceData *)data;
 
        Evas_Object *scroller = NULL;
-       Evas_Object *circle_scroller = NULL;
-
        scroller = elm_layout_content_get((Evas_Object *)voicedata->layout_main, "text_area");
-       circle_scroller = (Evas_Object *) evas_object_data_get(scroller, "circle");
-       eext_rotary_object_event_activated_set(circle_scroller, bActivate);
+       if (_WEARABLE) {
+               Evas_Object *circle_scroller = NULL;
+               circle_scroller = (Evas_Object *) evas_object_data_get(scroller, "circle");
+               eext_rotary_object_event_activated_set(circle_scroller, bActivate);
+       }
 }
 
 static Evas_Object *create_textblock(void* data)
 {
-       if(!data) return NULL;
+       if (!data) return NULL;
 
        VoiceData *voicedata = (VoiceData *)data;
 
@@ -1527,37 +1621,31 @@ static Evas_Object *create_textblock(void* data)
        Evas_Object *circle_scroller = NULL;
 
        string edj_path = get_resource_path();
-       edj_path = edj_path + STT_EDJ_FILE;
+       if(_WEARABLE)
+               edj_path = edj_path + STT_EDJ_FILE_WEARABLE;
+       else if (_TV)
+               edj_path = edj_path + STT_EDJ_FILE_TV;
+       else
+               edj_path = edj_path + STT_EDJ_FILE_MOBILE;
 
        scroller = elm_scroller_add(voicedata->layout_main);
-
        elm_scroller_loop_set(scroller, EINA_FALSE, EINA_FALSE);
-
        evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
        evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-
-       elm_scroller_page_size_set(scroller, 0, 50);
-       elm_scroller_page_scroll_limit_set(scroller, 0, 1);
-
        elm_object_scroll_lock_x_set(scroller, EINA_TRUE);
 
-//     uxt_scroller_set_auto_scroll_enabled(scroller, EINA_FALSE);
-
-       circle_scroller = eext_circle_object_scroller_add(scroller, app_data->circle_surface);
-       eext_circle_object_scroller_policy_set(circle_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
-       eext_rotary_object_event_activated_set(circle_scroller, EINA_TRUE);
-
+       if (_WEARABLE) {
+               circle_scroller = eext_circle_object_scroller_add(scroller, app_data->circle_surface);
+               eext_circle_object_scroller_policy_set(circle_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+               eext_rotary_object_event_activated_set(circle_scroller, EINA_TRUE);
+       }
        box = elm_box_add(scroller);
 
        inner_layout = elm_layout_add(scroller);
        elm_layout_file_set(inner_layout, edj_path.c_str(), "layout_textblock");
        evas_object_size_hint_weight_set(inner_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 
-       elm_object_signal_callback_add(inner_layout, "do_scroll", "entry",
-               [](void *data, Evas_Object *obj, const char* signal, const char* e)
-               {
-                       _bring_in_cb((void *) data);
-               }, (void *) scroller);
+       elm_object_signal_callback_add(inner_layout, "do_scroll", "entry", _bring_in_cb, (void *) voicedata);
 
        entry = elm_entry_add(inner_layout);
        voicedata->main_entry = entry;
@@ -1587,22 +1675,148 @@ static Evas_Object *create_textblock(void* data)
        return scroller;
 }
 
-static Evas_Object *create_progressbar(Evas_Object *parent)
+bool is_textblock_empty(void *data)
+{
+       if (!data) return false;
+
+       VoiceData *voicedata = (VoiceData *)data;
+
+       Evas_Object *scroller = (Evas_Object *)voicedata->scroller;
+       Evas_Object *inner_layout = NULL;
+
+       inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout");
+
+       Evas_Object *entry = elm_layout_content_get(inner_layout, "elm.swallow.content");
+       if (!entry)
+       {
+               PRINTFUNC(DLOG_ERROR, "failed to get entry");
+               return false;
+       }
+
+       if (elm_entry_is_empty(entry)) {
+               PRINTFUNC(DLOG_ERROR, "entry empty");
+               return true;
+       }
+
+       return false;
+}
+
+void set_textblock_empty(void *data)
+{
+       if (!data) return;
+
+       VoiceData *voicedata = (VoiceData *)data;
+
+       Evas_Object *scroller = (Evas_Object *)voicedata->scroller;
+       Evas_Object *inner_layout = NULL;
+
+       inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout");
+
+       Evas_Object *entry = elm_layout_content_get(inner_layout, "elm.swallow.content");
+       if (!entry) {
+               PRINTFUNC(DLOG_ERROR, "failed to get entry");
+               return;
+       }
+
+       PRINTFUNC(DLOG_DEBUG, "set entry empty");
+       elm_entry_entry_set(entry, NULL);
+
+       return;
+}
+
+static Evas_Object *create_bottom_button(void* data)
 {
-       Evas_Object *progressbar = NULL;
+       PRINTFUNC(DLOG_DEBUG, "create_bottom_button");
+       if (!data) return NULL;
+
+       VoiceData *voicedata = (VoiceData *)data;
+
+       Evas_Object *bottom_button = elm_button_add(voicedata->layout_main);
+       elm_object_style_set(bottom_button, "vic/micbutton");
 
-       progressbar = elm_progressbar_add(parent);
-       elm_object_style_set(progressbar, "voice_input/process/small");
-       elm_progressbar_pulse(progressbar, EINA_TRUE);
+       evas_object_smart_callback_add(bottom_button, "clicked", on_confirm_button_clicked_cb, voicedata);
+       evas_object_show(bottom_button);
 
-       evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       return bottom_button;
+}
 
-//     ea_theme_object_color_replace(progressbar, "B065L6", "AO012");
+void show_bottom_button(void* data, bool delayed)
+{
+       PRINTFUNC(DLOG_DEBUG, "show_bottom_button");
+       if (!data) return;
 
-       evas_object_show(progressbar);
+       VoiceData *voicedata = (VoiceData *)data;
 
-       return progressbar;
+       if (delayed) {
+               elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,show,bottom_button,delayed", "elm");
+               PRINTFUNC(DLOG_DEBUG, "Emit idle,state,show,bottom_button,delayed");
+       } else {
+               elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,show,bottom_button", "elm");
+               PRINTFUNC(DLOG_DEBUG, "Emit idle,state,show,bottom_button");
+       }
+}
+
+void hide_bottom_button(void* data)
+{
+       PRINTFUNC(DLOG_DEBUG, "hide_bottom_button");
+       if (!data) return;
+
+       VoiceData *voicedata = (VoiceData *)data;
+
+       elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,hide,bottom_button", "elm");
+       PRINTFUNC(DLOG_DEBUG, "Emit idle,state,hide,bottom_button");
+}
+
+static void scroll_effect_start(void* data, Evas_Object* obj, const char* s, const char* e)
+{
+       PRINTFUNC(DLOG_DEBUG, "scroll_effect_start");
+       if (!data) return;
+
+       VoiceData *voicedata = (VoiceData *)data;
+
+       if (voicedata->state == STT_STATE_VAL_LISTENING)
+               return;
+
+       if (is_textblock_empty(voicedata) == true)
+               return;
+
+       hide_bottom_button(voicedata);
+}
+
+static void scroll_effect_stop(void* data, Evas_Object* obj, const char* s, const char* e)
+{
+       PRINTFUNC(DLOG_DEBUG, "scroll_effect_stop");
+       if (!data) return;
+
+       VoiceData *voicedata = (VoiceData *)data;
+
+       if (voicedata->state == STT_STATE_VAL_LISTENING)
+               return;
+
+       Evas_Coord x, y, w, h;
+       Evas_Object *scroller = (Evas_Object *)voicedata->scroller;
+       Evas_Object *inner_layout = NULL;
+
+       inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout");
+
+       evas_object_geometry_get(inner_layout , &x, &y, &w, &h);
+       PRINTFUNC(DLOG_DEBUG, "scroll x=%d, y=%d, w=%d, h=%d", x, y, w, h);
+
+       if (is_textblock_empty(voicedata) == true)
+               return;
+
+       if (h+y != (360 - BOTTOM_PADDING_AREA)) {
+               show_bottom_button(voicedata, true);
+       } else {
+               show_bottom_button(voicedata, false);
+       }
+}
+
+static Eina_Bool _custom_back_cb(void *data, Elm_Object_Item *it)
+{
+       PRINTFUNC(DLOG_DEBUG, "");
+       _back_to_genlist_for_selector();
+       return EINA_TRUE;
 }
 
 static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
@@ -1624,7 +1838,6 @@ static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
 
        voicedata->mo = mo;
 
-
        layout_main = elm_layout_add(mo->getMoreOptionLayout());
 
        if (!layout_main)
@@ -1633,7 +1846,12 @@ static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
        voicedata->layout_main = layout_main;
 
        string edj_path = get_resource_path();
-       edj_path = edj_path + STT_EDJ_FILE;
+       if(_WEARABLE)
+               edj_path = edj_path + STT_EDJ_FILE_WEARABLE;
+       else if (_TV)
+               edj_path = edj_path + STT_EDJ_FILE_TV;
+       else
+               edj_path = edj_path + STT_EDJ_FILE_MOBILE;
 
        if (vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &is_screen_reader_on) == -1) {
                PRINTFUNC(DLOG_ERROR, "Cannot read value of screen reader from vconf");
@@ -1644,10 +1862,9 @@ static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
 
        elm_layout_file_set(layout_main, edj_path.c_str(), "mic_control");
 
-       elm_object_content_set(parent, layout_main);
-
        //Canvas for Cairo effect
        Evas_Object *canvas = evas_object_image_filled_add(evas_object_evas_get(layout_main));
+       evas_object_propagate_events_set(canvas, EINA_TRUE);
        evas_object_image_alpha_set(canvas, EINA_TRUE);
        evas_object_size_hint_align_set(canvas, EVAS_HINT_FILL, EVAS_HINT_FILL);
        evas_object_size_hint_weight_set(canvas, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -1655,7 +1872,7 @@ static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
 
        Evas_Coord CanvasW, CanvasH;
        CanvasW = 360;
-       CanvasH = 74;
+       CanvasH = 64;
        evas_object_image_size_set(canvas, CanvasW, CanvasH);
        evas_object_resize(canvas, CanvasW, CanvasH);
        evas_object_size_hint_min_set(canvas, CanvasW, CanvasH);
@@ -1663,56 +1880,26 @@ static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
 
        elm_object_part_content_set(layout_main, "EFFECT_BG", canvas);
 
+       // Bottom Button
+       Evas_Object *bottom_button = create_bottom_button(voicedata);
+       elm_object_part_content_set(voicedata->layout_main, "BOTTOM_BUTTON", bottom_button);
+       voicedata->bottom_button = bottom_button;
 
-       // MIC Button
-       Evas_Object *m_mic_button = elm_button_add(layout_main);
-       elm_object_style_set(m_mic_button, "vic/micbutton");
-       elm_object_part_content_set(layout_main, "MIC", m_mic_button);
-
-       elm_object_disabled_set(m_mic_button, EINA_TRUE);
-       evas_object_smart_callback_add(m_mic_button, "clicked", on_mic_button_press_cb, (void *) voicedata);
-
-       voicedata->mic_button = m_mic_button;
-
-       if(voicedata->btn_disabling_timer == NULL){
-               voicedata->btn_disabling_timer = ecore_timer_add(2.0, _mic_button_enable_cb, voicedata);
+       // STT Setup timer
+       if (voicedata->setup_timer == NULL) {
+               voicedata->setup_timer = ecore_timer_add(0.3, _idler_cb, voicedata);
        }
 
-//     ecore_idler_add(_idler_cb, voicedata);
-       ecore_timer_add(0.6, _idler_cb, voicedata);
-
-       // Confirm panel layout
-       Evas_Object *panel_layout;
-       panel_layout = elm_layout_add(layout_main);
-       elm_layout_theme_set(panel_layout, "layout", "drawer", "panel");
-       evas_object_show(panel_layout);
-
-       // Confirm panel
-       Evas_Object *panel;
-       panel = elm_panel_add(panel_layout);
-       elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT);
-       elm_layout_theme_set(panel, "panel", "left_confirm", "default");
-       elm_layout_theme_set(panel, "panel", "left_sending", "default");
-
-       elm_layout_signal_callback_add(panel, "cue,clicked", "elm", _panel_cue_clicked_cb, (void *) voicedata);
-       evas_object_show(panel);
-
-       elm_object_part_content_set(panel_layout, "elm.swallow.right", panel);
-       elm_object_part_content_set(layout_main, "left_panel_area", panel_layout);
-
-       elm_object_signal_emit(panel, "elm,state,disabled", "elm");
-       elm_panel_toggle(panel);
-
-
        // Textblock
        Evas_Object *scroller = create_textblock(voicedata);
        elm_object_part_content_set(layout_main, "text_area", scroller);
        voicedata->scroller = scroller;
 
-       // Progress Bar
-       Evas_Object *progress_bar = create_progressbar(layout_main);
-       elm_object_part_content_set(layout_main, "PROGRESS_BAR", progress_bar);
-       voicedata->progressbar = progress_bar;
+       elm_object_signal_callback_add(scroller, "do-show-vbar", "", scroll_effect_start, voicedata);
+       elm_object_signal_callback_add(scroller, "do-hide-vbar", "", scroll_effect_stop, voicedata);
+
+       // Send Text
+       elm_object_part_text_set(layout_main, "elm.text.send", dgettext(PACKAGE, "IDS_AMEMO_BUTTON_SEND"));
 
        // add callback
        elm_object_signal_callback_add(layout_main, "idle,state,pulse,visible", "", on_initial_anim_press_cb, voicedata);
@@ -1739,6 +1926,40 @@ int is_lang_supported_by_stt(char lang[])
        return FALSE;
 }
 
+int init_voicedata(VoiceData *r_voicedata)
+{
+       VoiceData *voicedata = (VoiceData *)r_voicedata;
+       if (!voicedata) {
+               return FALSE;
+       }
+
+       voicedata->voicefw_state = 0;
+       voicedata->voicefw_handle = NULL;
+       voicedata->naviframe = NULL;
+       voicedata->layout_main = NULL;
+       voicedata->progressbar = NULL;
+       voicedata->scroller = NULL;
+       voicedata->main_entry = NULL;
+       voicedata->state = STT_STATE_VAL_INIT;
+       voicedata->kbd_lang = NULL;
+       voicedata->setup_timer = NULL;
+       voicedata->start_timer = NULL;
+       voicedata->refresh_timer = NULL;
+       voicedata->textblock_timer = NULL;
+       voicedata->power_unlock_timer = NULL;
+       voicedata->stt_results.clear();
+       voicedata->partial_result = NULL;
+       voicedata->result_type = 0;
+       voicedata->disclaimer = 1;
+       voicedata->mo = NULL;
+       voicedata->sttfeedback = NULL;
+       voicedata->sttmanager = NULL;
+       voicedata->ieffect = NULL;
+       voicedata->effector = NULL;
+
+       return TRUE;
+}
+
 int init_voice(Evas_Object *parent, const char *lang, VoiceData *r_voicedata)
 {
        PRINTFUNC(DLOG_DEBUG, "[init_voice]");
@@ -1779,11 +2000,7 @@ int init_voice(Evas_Object *parent, const char *lang, VoiceData *r_voicedata)
                return FALSE;
        }
 
-       if (NULL != voicedata->textblock_timer) {
-               PRINTFUNC(DLOG_DEBUG, "delete previous textblock");
-               ecore_timer_del(voicedata->textblock_timer);
-               voicedata->textblock_timer = NULL;
-       }
+       init_voice_recorder(NULL);
 
        return TRUE;
 }
@@ -1795,9 +2012,16 @@ static Eina_Bool init_view(void *data)
        if(voicedata == NULL)
                return ECORE_CALLBACK_CANCEL;
 
+       const char *item_style = NULL;
+       if (_WEARABLE)
+               item_style = "empty";
+       Elm_Object_Item *nf_voice_item = elm_naviframe_item_push(voicedata->naviframe, NULL, NULL, NULL, NULL, item_style);
+       elm_naviframe_item_pop_cb_set(nf_voice_item, _custom_back_cb, NULL);
+
        voicedata->layout_main = create_fullview(voicedata->naviframe, voicedata);
 
        if (voicedata->layout_main) {
+               hide_bottom_button(voicedata);
                evas_object_show(voicedata->layout_main);
        }
 
@@ -1854,20 +2078,39 @@ void on_stt_pause(VoiceData *r_voicedata){
 
        VoiceData *voicedata = (VoiceData *)r_voicedata;
 
-       if(voicedata){
-               try{
-                       //voicedata->state = STT_STATE_VAL_PREPARE_CANCEL;
-                       voicedata->sttmanager->Cancel();
-               }catch(is::stt::SttException &e){
+       if (voicedata) {
+               try {
+                       if (voicedata->sttmanager)
+                               voicedata->sttmanager->Cancel();
+                       else
+                               PRINTFUNC(DLOG_ERROR, "sttmanager is null");
+               } catch(is::stt::SttException &e) {
                        PRINTFUNC(DLOG_ERROR, "reason : %s", e.what());
                }
 
                //Hide more option and language settings by interrupt scenario.
                close_setting_window_idler_cb(NULL);
                Evas_Object *mo_layout = voicedata->mo->getMoreOptionLayout();
-               if(mo_layout){
-                       if(eext_more_option_opened_get(mo_layout) == EINA_TRUE) {
-                               eext_more_option_opened_set(mo_layout, EINA_FALSE);
+               if (_WEARABLE) {
+                       if (mo_layout){
+                               if (eext_more_option_opened_get(mo_layout) == EINA_TRUE) {
+                                       eext_more_option_opened_set(mo_layout, EINA_FALSE);
+                               }
+                       }
+               }
+       }
+}
+
+void on_stt_resume(VoiceData *r_voicedata)
+{
+       PRINTFUNC(NO_PRINT, "");
+
+       VoiceData *voicedata = (VoiceData *)r_voicedata;
+       if (voicedata){
+               if (voicedata->mo) {
+                       if (voicedata->mo->isMoreOptionOpened() == EINA_FALSE && is_textblock_empty(voicedata)) {
+                               restart_listening(2.0);
+                               return;
                        }
                }
        }
@@ -1882,7 +2125,27 @@ void on_destroy(VoiceData *r_voicedata)
        powerUnlock();
 
        if (NULL != voicedata) {
+               if (NULL != voicedata->main_entry) {
+                       evas_object_smart_callback_del(voicedata->main_entry, "clicked", _stt_entry_clicked_cb);
+                       voicedata->main_entry = NULL;
+               }
+
+               if (NULL != voicedata->scroller) {
+                       Evas_Object *inner_layout = NULL;
+                       inner_layout = (Evas_Object *) evas_object_data_get(voicedata->scroller, "inner_layout");
+
+                       if (NULL != inner_layout)
+                               elm_object_signal_callback_del(inner_layout, "do_scroll", "entry", _bring_in_cb);
+
+
+                       elm_object_signal_callback_del(voicedata->scroller, "do-show-vbar", "", scroll_effect_start);
+                       elm_object_signal_callback_del(voicedata->scroller, "do-hide-vbar", "", scroll_effect_stop);
+
+                       voicedata->scroller = NULL;
+               }
+
                if (NULL != voicedata->layout_main) {
+                       elm_object_signal_callback_del(voicedata->layout_main, "idle,state,pulse,visible", "", on_initial_anim_press_cb);
                        voicedata->layout_main = NULL;
                }
 
@@ -1890,6 +2153,11 @@ void on_destroy(VoiceData *r_voicedata)
                        voicedata->naviframe = NULL;
                }
 
+               if (NULL != voicedata->setup_timer) {
+                       ecore_timer_del(voicedata->setup_timer);
+                       voicedata->setup_timer = NULL;
+               }
+
                if (NULL != voicedata->start_timer) {
                        ecore_timer_del(voicedata->start_timer);
                        voicedata->start_timer = NULL;
@@ -1900,27 +2168,11 @@ void on_destroy(VoiceData *r_voicedata)
                        voicedata->refresh_timer = NULL;
                }
 
-               if (NULL != voicedata->progressbar_timer) {
-                       ecore_timer_del(voicedata->progressbar_timer);
-                       voicedata->progressbar_timer = NULL;
-                       elm_progressbar_pulse(voicedata->progressbar, EINA_FALSE);
-               }
-
                if (NULL != voicedata->textblock_timer) {
                        ecore_timer_del(voicedata->textblock_timer);
                        voicedata->textblock_timer = NULL;
                }
 
-               if (NULL != voicedata->guide_text_timer) {
-                       ecore_timer_del(voicedata->guide_text_timer);
-                       voicedata->guide_text_timer = NULL;
-               }
-
-               if (NULL != voicedata->btn_disabling_timer) {
-                       ecore_timer_del(voicedata->btn_disabling_timer);
-                       voicedata->btn_disabling_timer = NULL;
-               }
-
                if (NULL != voicedata->power_unlock_timer) {
                        ecore_timer_del(voicedata->power_unlock_timer);
                        voicedata->power_unlock_timer = NULL;
@@ -1956,9 +2208,6 @@ void on_destroy(VoiceData *r_voicedata)
                        voicedata->sttfeedback = NULL;
                }
 
-               free(voicedata);
+               delete voicedata;
        }
 }
-
-
-