X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fw-input-stt-voice.cpp;h=5e3f576f5ff92eddca0019d462218b6772bb6026;hb=7472f9d27309359bd738e7e982e10d51a348c478;hp=40dab3eaa11382a9f859e9a4d4f7c55dd9b2495a;hpb=72a64ab999a139cd46a9e9f9f07fb213e83a8b54;p=platform%2Fcore%2Fuifw%2Finputdelegator.git diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index 40dab3e..5e3f576 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -21,15 +21,18 @@ #include #include #include +#include #include #include #include +#include #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; @@ -39,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; @@ -63,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[7] = { - "auto", - "en_US", - "es_US", - "fr_FR", - "zh_CN", - "ja_JP", - "ko_KR", +const char *supported_language[] = { + "auto", + "en_US", + "es_US", + "fr_FR", + "zh_CN", + "ja_JP", + "ko_KR", }; - -const char *disp_lang_array[7] = { - "", - "English (United States)", - "Español (América Latina)", - "Français (France)", - "简体中文", - "日本語", - "한국어", +const char *disp_lang_array[] = { + "", + "English (United States)", + "Español (América Latina)", + "Français (France)", + "简体中文", + "日本語", + "한국어", }; typedef enum { @@ -138,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) @@ -197,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; @@ -221,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"); @@ -266,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); @@ -303,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; @@ -342,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 @@ -392,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; @@ -481,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; @@ -494,7 +499,7 @@ void stt_feedback(FeedbackType type) } ret = feedback_deinitialize(); - if(ret != 0) + if (ret != 0) { PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!"); return; @@ -506,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; @@ -516,44 +521,43 @@ 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!
Check STT-daemon is running"); + LOGD("Initialization Fail!
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"); @@ -576,28 +580,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; } @@ -605,33 +609,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"); + } +} - voicedata->guide_text_timer = NULL; +static void contract_send_text(void *data) +{ + PRINTFUNC(DLOG_DEBUG, ""); + if(data) { + VoiceData *voicedata = (VoiceData *) data; + elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,send,text,contract", "elm"); + } +} - PRINTFUNC(DLOG_ERROR, ""); - elm_object_part_text_set(voicedata->layout_main, "elm.text", ""); +static void set_cue_text(void *data) +{ + PRINTFUNC(DLOG_DEBUG, ""); + + 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 (!vd) return; - if(translatable) + 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); } /** @@ -641,71 +678,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); } } @@ -777,9 +785,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 - @@ -790,6 +852,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) { @@ -827,8 +891,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(); } @@ -870,7 +932,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); @@ -881,11 +943,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); + } } } } @@ -897,30 +960,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) { @@ -940,17 +1004,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); } @@ -960,47 +1024,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; } @@ -1010,19 +1065,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 @@ -1030,7 +1077,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; } @@ -1108,25 +1155,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); } @@ -1147,23 +1198,24 @@ 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; elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); elm_genlist_homogeneous_set(genlist, EINA_TRUE); -// uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE); - - Evas_Object *circle_language_genlist = eext_circle_object_genlist_add(genlist, NULL); +#ifdef _CIRCLE + 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); 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; @@ -1180,11 +1232,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 = 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; @@ -1201,40 +1258,52 @@ 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_cb, NULL); -// eext_rotary_event_callback_set(genlist, _language_list_rotary_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; } @@ -1251,7 +1320,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; } @@ -1313,10 +1382,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; @@ -1327,7 +1399,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); @@ -1341,8 +1413,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; @@ -1351,7 +1423,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; @@ -1377,11 +1449,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"); @@ -1393,10 +1469,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); @@ -1407,12 +1481,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; @@ -1420,26 +1500,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; } @@ -1448,18 +1539,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 { @@ -1496,25 +1593,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; @@ -1525,37 +1622,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; @@ -1585,22 +1676,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) +{ + 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"); + + evas_object_smart_callback_add(bottom_button, "clicked", on_confirm_button_clicked_cb, voicedata); + evas_object_show(bottom_button); + + return bottom_button; +} + +void show_bottom_button(void* data, bool delayed) +{ + PRINTFUNC(DLOG_DEBUG, "show_bottom_button"); + if (!data) return; + + VoiceData *voicedata = (VoiceData *)data; + + 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) { - Evas_Object *progressbar = NULL; + PRINTFUNC(DLOG_DEBUG, "scroll_effect_stop"); + if (!data) return; - progressbar = elm_progressbar_add(parent); - elm_object_style_set(progressbar, "voice_input/process/small"); - elm_progressbar_pulse(progressbar, EINA_TRUE); + VoiceData *voicedata = (VoiceData *)data; - 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); + if (voicedata->state == STT_STATE_VAL_LISTENING) + return; -// ea_theme_object_color_replace(progressbar, "B065L6", "AO012"); + Evas_Coord x, y, w, h; + Evas_Object *scroller = (Evas_Object *)voicedata->scroller; + Evas_Object *inner_layout = NULL; - evas_object_show(progressbar); + 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); + } +} - return progressbar; +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) @@ -1622,7 +1839,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) @@ -1631,7 +1847,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"); @@ -1642,10 +1863,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); @@ -1653,7 +1873,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); @@ -1661,56 +1881,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); @@ -1737,6 +1927,39 @@ 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->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]"); @@ -1777,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; } @@ -1793,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); } @@ -1852,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; } } } @@ -1880,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; } @@ -1888,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; @@ -1898,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; @@ -1954,9 +2208,6 @@ void on_destroy(VoiceData *r_voicedata) voicedata->sttfeedback = NULL; } - free(voicedata); + delete voicedata; } } - - -