Support to delegate various MIME types to caller as like voice recording
[platform/core/uifw/inputdelegator.git] / src / w-input-stt-voice.cpp
index 1b90386..595d417 100755 (executable)
 #include <Ecore_IMF.h>
 #include <Ecore.h>
 #include <device/power.h>
-#include <efl_assist.h>
 #include <app_common.h>
 #include <app.h>
+#include <app_preference.h>
 #include <string>
 #include <efl_extension.h>
 #include <feedback.h>
+#include <stdint.h>
 
 #include "Debug.h"
 #include "w-input-selector.h"
-#include "w-input-smartreply.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;
 
@@ -41,7 +42,7 @@ 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' \
@@ -65,10 +66,10 @@ static Elm_Genlist_Item_Class itc_title;
 static Elm_Genlist_Item_Class itc_1text;
 static Elm_Genlist_Item_Class itc_2text;
 
-
+static Eina_Bool change_guide_text(void *data);
 static void set_guide_text(VoiceData *vd, const char* text, bool translatable = false);
 
-char *supported_language[7] = {
+const char *supported_language[] = {
                 "auto",
                 "en_US",
                 "es_US",
@@ -79,7 +80,7 @@ char *supported_language[7] = {
 };
 
 
-char *disp_lang_array[7] = {
+const char *disp_lang_array[] = {
                 "",
                 "English (United States)",
                 "Español (América Latina)",
@@ -111,9 +112,9 @@ typedef enum {
 static void get_stt_default_language(VoiceData *my_voicedata);
 
 
-char* get_lang_label(char lang[])
+const char* get_lang_label(char lang[])
 {
-       char *str = NULL;
+       const char *str = NULL;
 
        if (strcmp (lang, "en_US") == 0)
                str = disp_lang_array[1];
@@ -163,8 +164,6 @@ _bring_in_cb(void *data)
 
 static inline Evas_Coord get_text_block_size(Evas_Object *obj, std::string text)
 {
-       int calculated_height = 0;
-
        int max_height = 1280;
        int unit_width = 282;
 
@@ -194,7 +193,7 @@ static inline Evas_Coord get_text_block_size(Evas_Object *obj, std::string text)
        if(strbuf) free(strbuf);
        if(tb) evas_object_del(tb);
        if(st) evas_textblock_style_free(st);
-       if(cur) evas_textblock_cursor_free(cur);
+//     if(cur) evas_textblock_cursor_free(cur);
 
        return height;
 }
@@ -209,7 +208,7 @@ static Eina_Bool _update_textblock_timer_cb(void *data)
        voicedata->textblock_timer = NULL;
 
        std::string result_text;
-       for(int i = 0; i < voicedata->stt_results.size(); i++){
+       for(unsigned int i = 0; i < voicedata->stt_results.size(); i++){
                if(i == voicedata->stt_results.size()-1){
                        result_text += voicedata->stt_results.at(i);
                } else {
@@ -223,7 +222,6 @@ static Eina_Bool _update_textblock_timer_cb(void *data)
        Evas_Object *scroller = NULL;
        Evas_Object *box = NULL;
        Evas_Object *inner_layout = NULL;
-       char *strbuf = NULL;
 
        scroller = elm_layout_content_get((Evas_Object *)voicedata->layout_main, "text_area");
        if(!scroller)
@@ -317,7 +315,6 @@ static Eina_Bool _update_textblock_timer_cb(void *data)
 
        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;
                }
@@ -397,21 +394,48 @@ 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, "");
-
+       LOGD("on_mic_button_press_cb");
        VoiceData *voicedata = (VoiceData *)data;
-       edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
+       if (!voicedata) return;
 
-       return;
+       if (voicedata->sttmanager != NULL &&
+               (voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING
+               || voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING)) {
+               try {
+                       voicedata->state = STT_STATE_VAL_INIT;
+                       voicedata->sttmanager->Stop();
+               }
+               catch (is::stt::SttException &e) {
+               }
+
+               if (voicedata->effector)
+                       voicedata->effector->Stop(true);
+
+               if (NULL != voicedata->start_timer) {
+                       ecore_timer_del(voicedata->start_timer);
+                       voicedata->start_timer = NULL;
+               }
+               if (NULL != voicedata->guide_text_timer) {
+                       ecore_timer_del(voicedata->guide_text_timer);
+                       voicedata->guide_text_timer = NULL;
+               }
+               if (NULL != voicedata->refresh_timer) {
+                       ecore_timer_del(voicedata->refresh_timer);
+                       voicedata->refresh_timer = NULL;
+               }
+       } else {
+               if (NULL != voicedata->guide_text_timer) {
+                       ecore_timer_del(voicedata->guide_text_timer);
+                       voicedata->guide_text_timer = NULL;
+               }
+               edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
+       }
 }
 
 
@@ -442,19 +466,23 @@ static void on_confirm_button_clicked_cb(void *data, Evas_Object *obj, void *eve
        VoiceData* voicedata = (VoiceData*)data;
 
        std::string result_text;
-       for(int i = 0; i < voicedata->stt_results.size(); i++){
+       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)
                        result_text += " ";
        }
 
        PRINTFUNC(DLOG_DEBUG, "result_text = %s", result_text.c_str());
-       input_smartreply_send_feedback(result_text.c_str());
 
-       reply_to_sender_by_callback(result_text.c_str(), "voice");
+       char *filePath = NULL;
+       voice_recorder *vr = _voice_recorder_get_data();
+       if (!vr)
+               filePath = vr->file_path;
+       char *path[] = {filePath, };
+       reply_to_sender_by_callback(result_text.c_str(), "voice", (const char **)path);
        destroy_voice();
        powerUnlock();
-       elm_exit();
+       ui_app_exit();
 
        return;
 }
@@ -530,32 +558,33 @@ static Eina_Bool _idler_cb(void *data)
 
 
        if(true == _app_stt_initialize(voicedata)) {
-               PRINTFUNC(NO_PRINT, "_app_stt_initialize None Error");
+               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;
 
-       ieffect->SetProgressBar(voicedata->progressbar);
-       ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+       if (ieffect) {
+               ieffect->SetProgressBar(voicedata->progressbar);
+               ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+       }
 
        voicedata->mo->Update();
 
        elm_access_highlight_set(voicedata->mic_button);
 
-
        return ECORE_CALLBACK_CANCEL;
 }
 
@@ -611,23 +640,21 @@ void powerLock(void *data, bool enable)
        }
 }
 
+static Eina_Bool change_guide_text(void *data){
+       VoiceData *voicedata = (VoiceData *) data;
+       if (!voicedata) return ECORE_CALLBACK_CANCEL;
 
-static Eina_Bool hide_guide_text(void *data){
-       if(data) {
-               VoiceData *voicedata = (VoiceData *) data;
-
-               voicedata->guide_text_timer = NULL;
-
+       stt_state_e state = voicedata->sttmanager->GetCurrent();
+       if (state == STT_STATE_RECORDING || state == STT_STATE_PROCESSING)
+               elm_object_domain_translatable_part_text_set(voicedata->layout_main, "elm.text", PACKAGE, SK_TAP_TO_PAUSE);
 
-               PRINTFUNC(DLOG_ERROR, "");
-               elm_object_part_text_set(voicedata->layout_main, "elm.text", "");
-       }
        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");
+       elm_object_signal_emit(vd->layout_main, "idle,state,guide_text,bottom", "elm");
 
        if(translatable)
                elm_object_domain_translatable_part_text_set(vd->layout_main, "elm.text", PACKAGE, text);
@@ -636,7 +663,7 @@ static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
 
        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);
+                       vd->guide_text_timer = ecore_timer_add(2.0, change_guide_text, vd);
        }
 }
 
@@ -647,22 +674,6 @@ 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) {
@@ -678,9 +689,8 @@ void set_animation_state(VoiceData *voicedata)
                if(voicedata->effector)
                        voicedata->effector->Stop(true);
 
-               set_guide_text(voicedata, "");
+               set_guide_text(voicedata, "Tap mic to speak");
 
-               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);
@@ -696,7 +706,6 @@ void set_animation_state(VoiceData *voicedata)
 
                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));
 
@@ -710,8 +719,6 @@ void set_animation_state(VoiceData *voicedata)
                        voicedata->effector->Stop(true);
 
                voicedata->refresh_timer = ecore_timer_add(2.0, _recognition_failure_cb, voicedata);
-
-               //powerLock((void*)voicedata, false);
        }
 }
 
@@ -732,7 +739,9 @@ void show_error_message(VoiceData *vd, stt_error_e reason)
 
                if (ancs_connected) {
                        char text[512];
-                       snprintf(text, sizeof(text), _(SK_NETWORK_ERROR_FOR_IOS), _(SK_SAMSUNG_GEAR));
+                       const char *format1 = _(SK_NETWORK_ERROR_FOR_IOS);
+                       const char *format2 = _(SK_SAMSUNG_GEAR);
+                       snprintf(text, sizeof(text), format1, format2);
 
                        show_popup_toast((const char*)text, false);
                } else {
@@ -762,25 +771,23 @@ static Eina_Bool _start_timer_cb(void* data)
                        voicedata->sttmanager->Start();
                }
                catch (is::stt::SttException &e) {
-                       PRINTFUNC(DLOG_ERROR, "%s", e.what());
-
                        if (e.GetEcode() == STT_ERROR_OUT_OF_NETWORK)
                        {
-                               PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR");
                                set_guide_text(voicedata, _(SK_NETWORK_ERROR));
                                voicedata->state = STT_STATE_VAL_INIT;
                        } else if (e.GetEcode() == STT_ERROR_RECORDER_BUSY) {
-                               PRINTFUNC(DLOG_WARN, "STT is used by another application");
-                               show_popup_toast(_(SK_STT_BUSY), false);
+                               set_guide_text(voicedata, _(SK_STT_BUSY));
                                voicedata->state = STT_STATE_VAL_INIT;
                        } else {
-                               PRINTFUNC(DLOG_WARN, "Check error code");
-                               show_popup_toast(_(SK_STT_BUSY), false);
+                               set_guide_text(voicedata, _(SK_STT_BUSY));
                                voicedata->state = STT_STATE_VAL_INIT;
                        }
                }
                voicedata->start_timer = NULL;
        }
+
+       start_voice_recorder();
+
        return ECORE_CALLBACK_CANCEL;
 }
 
@@ -794,6 +801,8 @@ 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) {
@@ -859,6 +868,8 @@ void on_initial_anim_press_cb(void *data, Evas_Object *obj, const char *emission
                        catch (is::stt::SttException &e) {
                                PRINTFUNC(DLOG_ERROR, "%s", e.what());
                        }
+                       if (vd->effector)
+                               vd->effector->Stop(true);
 
                        break;
 
@@ -885,11 +896,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);
+                       }
                }
        }
 }
@@ -905,11 +917,11 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
 
        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, '(');
@@ -917,6 +929,7 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
                                        strncpy(text, s, p-s);
                                } else {
                                        strncpy(text, s, strlen(s));
+                                       text[strlen(s)] = '\0';
                                }
                        } else {
                                strncpy(text, "", strlen(""));
@@ -924,7 +937,7 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
                }
                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) {
@@ -944,7 +957,7 @@ 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, '(');
@@ -952,6 +965,7 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
                                        strncpy(text, p+1, strlen(s)-(p-s)-2);
                                } else {
                                        strncpy(text, s, strlen(s));
+                                       text[strlen(s)] = '\0';
                                }
                        } else {
                                strncpy(text, "", strlen(""));
@@ -964,47 +978,38 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
 
 static Evas_Object *__get_genlist_item_content(void *data, Evas_Object *obj, const char *part)
 {
-       int index = (int)data;
+       int index = (intptr_t)data;
        Evas_Object * content = NULL;
 
-       if (!strcmp(part, "elm.icon")) {
+       if (!strcmp(part, "elm.icon") ||
+           !strcmp(part, "elm.swallow.end")) {
                content = elm_radio_add(obj);
+               elm_object_style_set(content, "list");
                elm_radio_state_value_set(content, index);
                elm_radio_group_add(content, radio_gp);
                evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
                evas_object_propagate_events_set(content, EINA_TRUE);
                evas_object_size_hint_align_set(content, EVAS_HINT_FILL, EVAS_HINT_FILL);
-               elm_object_style_set(content, "list");
        }
        return content;
 }
 
 static int get_language_value()
 {
-#if 1
        int lang = 0, ret = 0;
 
        ret = preference_get_int(PREFERENCE_ISE_STT_LANGUAGE, &lang);
-       if(PREFERENCE_ERROR_NONE != ret){
+       if (PREFERENCE_ERROR_NONE != ret) {
                PRINTFUNC(DLOG_ERROR, "preference_get_int error!(%d)", ret);
-               preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, (int)2); //auto
-               lang = 2;
+               preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, STT_VOICE_N66_AUTO); //auto
+               lang = STT_VOICE_N66_AUTO;
        }
-#else
-       int lang = 0, ret = 0;
 
-       ret = vconf_get_int(VCONFKEY_ISE_STT_LANGUAGE, &lang);
-       if (ret !=0) {
-               PRINTFUNC(DLOG_ERROR, "Vconf_get_int error!(%d)", ret);
-       }
-#endif
-       if(g_is_n66) {
-               if(lang < 0 || lang > 6) {
-                       PRINTFUNC(DLOG_WARN, "vconf lang orig(%d) to be 0", lang);
-                       lang = 0;
-               }
-               PRINTFUNC(DLOG_DEBUG, "n66 current language value for stt (%s).", disp_lang_array[lang]);
+       if (lang < 0 || lang > (int)(sizeof(supported_language)/sizeof(supported_language[0])-1)) {
+               PRINTFUNC(DLOG_WARN, "vconf lang orig(%d) to be 0", lang);
+               lang = 0;
        }
+       PRINTFUNC(DLOG_DEBUG, "n66 current language value for stt (%s).", disp_lang_array[lang]);
 
        return lang;
 }
@@ -1014,19 +1019,11 @@ static void set_language_value(int type)
        // Add implementation to store language type.
        int ret = 0;
 
-#if 1
        ret = preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, (int)type);
        if(PREFERENCE_ERROR_NONE != ret){
                PRINTFUNC(DLOG_ERROR, "preference_set_int error!(%d)", ret);
        }
 
-#else
-       ret = vconf_set_int(VCONFKEY_ISE_STT_LANGUAGE, (int) type);
-       if (ret != 0) {
-               PRINTFUNC(DLOG_ERROR, "Vconf_set_int error!(%d)", ret);
-               return;
-       }
-#endif
        PRINTFUNC(DLOG_DEBUG, "language type (%d)", type);
 
        // Update string
@@ -1115,12 +1112,11 @@ static void language_set_genlist_radio_cb(void *data, Evas_Object *obj, void *ev
        if(!data) return;
 
        int index = 0;
-       Evas_Object *genlist = (Evas_Object *) data;
 
        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);
@@ -1129,7 +1125,7 @@ static void language_set_genlist_radio_cb(void *data, Evas_Object *obj, void *ev
        ecore_timer_add(0.3, close_setting_window_idler_cb, NULL);
 }
 
-static void language_changed_cb2(void *data, Evas_Object *obj, const char *emission, const char *source)
+static void language_changed_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
        if(!obj) return;
        elm_genlist_realized_items_update(obj);
@@ -1161,18 +1157,18 @@ static Evas_Object *create_language_list(Evas_Object *parent)
 
        elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
        elm_genlist_homogeneous_set(genlist, EINA_TRUE);
-//     uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE);
-
+#ifdef _CIRCLE
        Evas_Object *circle_language_genlist = eext_circle_object_genlist_add(genlist, NULL);
        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);
        eext_rotary_object_event_activated_set(circle_language_genlist, EINA_TRUE);
-
+#else
+       evas_object_show(genlist);
+#endif
        int i = 0;
        int lang_val = 0;
        Elm_Object_Item * item = NULL;
-       Elm_Object_Item * item_title = NULL;
 
        evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
@@ -1186,11 +1182,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;
-
-       item_title = elm_genlist_item_append(genlist, &itc_title, (void *)-1, NULL, ELM_GENLIST_ITEM_GROUP, NULL, genlist);
+       if (_WEARABLE) {
+               item = elm_genlist_item_append(genlist, &itc_title, (void *)-1, NULL, ELM_GENLIST_ITEM_GROUP, NULL, genlist);
+       }
 
        // 2 line text
-       itc_2text.item_style = "2text.1icon.1/sub1.multiline";
+       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;
 
@@ -1207,57 +1208,63 @@ static Evas_Object *create_language_list(Evas_Object *parent)
        }
 
        // 1 line text
-       itc_1text.item_style = "1text.1icon.1";
+       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;
 
-       if(g_is_n66) {
-               for (i = 1; i < 7; i++)
-               {
-                       char *s = (char *)disp_lang_array[i];
+       for (i = 1; i < (long)(sizeof(disp_lang_array)/sizeof(disp_lang_array[0])); i++)
+       {
+               char *s = (char *)disp_lang_array[i];
 
-                       if(strchr(s, '(')){
-                               item = item_append(genlist, itc_2text, i, language_set_genlist_radio_cb, genlist);
-                       } else {
-                               item = item_append(genlist, itc_1text, i, language_set_genlist_radio_cb, genlist);
-                       }
+               if(strchr(s, '(')){
+                       item = item_append(genlist, itc_2text, i, language_set_genlist_radio_cb, genlist);
+               } else {
+                       item = item_append(genlist, itc_1text, i, language_set_genlist_radio_cb, genlist);
+               }
 
-                       if(lang_val == i) {
-                               PRINTFUNC(DLOG_DEBUG, "%d item is choiced.", i);
-                               elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
-                       }
+               if(lang_val == i) {
+                       PRINTFUNC(DLOG_DEBUG, "%d item is choiced.", i);
+                       elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+               }
 
-                       if ( item == NULL ) {
-                               PRINTFUNC(DLOG_DEBUG, "elm_genlist_item_append was failed");
-                               break;
-                       }
+               if ( item == NULL ) {
+                       PRINTFUNC(DLOG_DEBUG, "elm_genlist_item_append was failed");
+                       break;
                }
        }
+       Elm_Object_Item *dummy;
+       Elm_Genlist_Item_Class *itc_dummy = elm_genlist_item_class_new();
+       if (itc_dummy) {
+               itc_dummy->item_style = "title";
+               itc_dummy->func.text_get = NULL;
+               itc_dummy->func.content_get = NULL;
+       }
+       dummy = elm_genlist_item_append(genlist, itc_dummy, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+       elm_genlist_item_select_mode_set(dummy, ELM_OBJECT_SELECT_MODE_NONE);
 
+       LOGD("before elm_radio_value_set > lang_val = %d", lang_val);
+       radio_gp = elm_radio_add(genlist);
+       elm_radio_state_value_set(radio_gp, lang_val);
        elm_radio_value_set(radio_gp, lang_val);
 
-       elm_object_signal_callback_add(genlist, "elm,system,language,change", "elm", language_changed_cb2, NULL);
-//     eext_rotary_event_callback_set(genlist, _language_list_rotary_cb, NULL);
+       elm_object_signal_callback_add(genlist, "elm,system,language,change", "elm", language_changed_cb, NULL);
        evas_object_smart_callback_add(genlist, "realized", _language_list_item_realized, NULL);
 
-
        g_evt_key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _ise_keydown_cb, NULL);
        return genlist;
 }
 
 void create_setting_window(Evas_Object *more_option_layout)
 {
-       Evas_Coord w, h;
-
        Evas_Object *window = NULL;
        Evas_Object *layout = NULL;
        Evas_Object *genlist = NULL;
        Evas_Object *naviframe = NULL;
 
-       Elm_Object_Item *item = NULL;
-
-       const char *str = "mobile";
-
        /**
         * Create full size window
         *
@@ -1269,12 +1276,10 @@ void create_setting_window(Evas_Object *more_option_layout)
        }
 
        elm_win_title_set(window, "voice-input-setting");
-//     ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
        elm_win_borderless_set(window, EINA_TRUE);
-       evas_object_resize(window, w, h);
+
 
        elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_HIDE);
-       elm_win_profiles_set(window, &str, 1);
 
        /**
         * Set window theme
@@ -1329,8 +1334,11 @@ void create_setting_window(Evas_Object *more_option_layout)
         */
        genlist = create_language_list(naviframe);
 
+       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);
-       item = 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;
@@ -1338,15 +1346,6 @@ void create_setting_window(Evas_Object *more_option_layout)
        g_more_option_layout = more_option_layout;
 }
 
-static void language_changed_cb(void *data, Evas_Object * obj, void *event_info)
-{
-       PRINTFUNC(DLOG_DEBUG, "");
-
-       if(!obj) return;
-       if(!data) return;
-}
-
-
 void _stt_lang_changed_cb(keynode_t *key, void* data)
 {
        PRINTFUNC(DLOG_DEBUG, "");
@@ -1403,8 +1402,12 @@ 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)
 {
        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");
@@ -1430,14 +1433,6 @@ static Evas_Object *create_text_detiled_view(Evas_Object *parent)
        return layout;
 }
 
-static Eina_Bool _idler_cb2(void *data)
-{
-       VoiceData *voicedata = (VoiceData *)data;
-
-//     uxt_scroller_set_auto_scroll_enabled(voicedata->scroller, EINA_FALSE);
-
-       return ECORE_CALLBACK_CANCEL;
-}
 
 static Eina_Bool __stt_entry_detailed_view_pop_cb(void *data, Elm_Object_Item *it)
 {
@@ -1472,8 +1467,6 @@ static Eina_Bool __stt_entry_detailed_view_pop_cb(void *data, Elm_Object_Item *i
 
        elm_scroller_region_bring_in(voicedata->scroller, 0, y+h, 300, 168);
 
-       ecore_idler_add(_idler_cb2, voicedata);
-
        return EINA_TRUE;
 }
 
@@ -1538,11 +1531,12 @@ void activate_circle_scroller_for_stt_textbox(void* data, Eina_Bool bActivate)
        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)
@@ -1555,11 +1549,15 @@ static Evas_Object *create_textblock(void* data)
        Evas_Object *box = NULL;
        Evas_Object *inner_layout = NULL;
        Evas_Object *entry = NULL;
-       Evas_Object *tb = NULL;
        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);
 
@@ -1572,13 +1570,11 @@ static Evas_Object *create_textblock(void* data)
        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);
@@ -1597,7 +1593,7 @@ static Evas_Object *create_textblock(void* data)
 
 #define FORMAT_TEXT_AREA_FONT_STYLE \
        "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'"
-       int a, r, g, b;
+       int a = 0xFF, r = 0xFF, g = 0xFF, b = 0xFF;
        char customStyle[512];
 //     ea_theme_color_get("AT02112", &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        snprintf(customStyle, 512, FORMAT_TEXT_AREA_FONT_STYLE, r, g, b, a, r, g, b, a);
@@ -1641,16 +1637,8 @@ static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
 {
        PRINTFUNC(NO_PRINT, "");
 
-       Evas_Object *more_option_layout = NULL;
        Evas_Object *layout_main = NULL;
-       Evas_Object *lang_btn_box = NULL;
-       Evas_Object *lang_btn = NULL;
-       Evas_Object *to = NULL;
-       Evas_Object *ao = NULL;
 
-       char *lang_type_str = NULL;
-
-       int lang_val = 0;
        int is_screen_reader_on = FALSE;
 
        VoiceData *voicedata = r_voicedata;
@@ -1673,7 +1661,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");
@@ -1819,6 +1812,14 @@ 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;
 }
 
@@ -1899,9 +1900,11 @@ void on_stt_pause(VoiceData *r_voicedata){
                //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);
+                               }
                        }
                }
        }
@@ -1913,8 +1916,6 @@ void on_destroy(VoiceData *r_voicedata)
 
        VoiceData *voicedata = (VoiceData *)r_voicedata;
 
-       int result = STT_ERROR_NONE;
-
        powerUnlock();
 
        if (NULL != voicedata) {