X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fw-input-stt-voice.cpp;h=47353488a84d62423153f60e489449863134f3c7;hb=ee7b7d53aff1b32c6fae3ad9057c8020fac480ba;hp=77b8bb10fd7bd019029919211c4870b19d1e461d;hpb=b1ad982d7d88ca1280fb36217816cd5758c78f2a;p=platform%2Fcore%2Fuifw%2Finputdelegator.git diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index 77b8bb1..4735348 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -45,8 +45,12 @@ using namespace std; 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; @@ -66,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 Eina_Bool change_guide_text(void *data); +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 { @@ -141,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) @@ -200,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; @@ -224,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"); @@ -269,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); @@ -306,29 +315,39 @@ 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){ - 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) { + 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; @@ -344,14 +363,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 @@ -398,88 +417,53 @@ void start_by_press(VoiceData *voicedata) edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background"); } -static void on_mic_button_press_cb(void *data, Evas_Object *obj, void *event_info) -{ - LOGD("on_mic_button_press_cb"); - VoiceData *voicedata = (VoiceData *)data; - if (!voicedata) 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"); - } -} - - -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) + if (vr) filePath = vr->file_path; + char *path[] = {filePath, }; - reply_to_sender_by_callback(result_text.c_str(), "voice", (const char **)path); + reply_to_sender_by_callback(result_text.c_str(), "voice", (const char **)path, NULL); destroy_voice(); powerUnlock(); ui_app_exit(); @@ -487,22 +471,12 @@ static void on_confirm_button_clicked_cb(void *data, Evas_Object *obj, void *eve 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; @@ -515,7 +489,7 @@ void stt_feedback(FeedbackType type) int ret; ret = feedback_initialize(); - if(ret != 0) + if (ret != 0) { PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!"); return; @@ -528,7 +502,7 @@ void stt_feedback(FeedbackType type) } ret = feedback_deinitialize(); - if(ret != 0) + if (ret != 0) { PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!"); return; @@ -540,7 +514,7 @@ void stt_feedback_deinitialize() int ret = 0; ret = feedback_deinitialize(); - if(ret != 0) + if (ret != 0) { PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!"); return; @@ -550,14 +524,13 @@ 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)) { + if (true == _app_stt_initialize(voicedata)) { LOGD("_app_stt_initialize None Error"); voicedata->voicefw_state = 1; voicedata->state = STT_STATE_VAL_INIT; @@ -570,29 +543,32 @@ static Eina_Bool _idler_cb(void *data) is::ui::WInputSttMicEffect *ieffect = new is::ui::WInputSttMicEffect(); if (ieffect) { - ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle()); + if (voicedata->sttmanager) + 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 (voicedata->progressbar) + ieffect->SetProgressBar(voicedata->progressbar); } 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"); VoiceData *voicedata = (VoiceData *) data; - device_power_release_lock(POWER_LOCK_DISPLAY); + int ret = device_power_release_lock(POWER_LOCK_DISPLAY); + if (ret != DEVICE_ERROR_NONE) + LOGW("Failed to release power(Display) (%d)", ret); + voicedata->power_unlock_timer = NULL; return ECORE_CALLBACK_CANCEL; @@ -601,7 +577,9 @@ static Eina_Bool _power_delayed_unlock(void *data){ void powerUnlock() { PRINTFUNC(DLOG_DEBUG, "POWER Unlock directly."); - device_power_release_lock(POWER_LOCK_DISPLAY); + int ret = device_power_release_lock(POWER_LOCK_DISPLAY); + if (ret != DEVICE_ERROR_NONE) + LOGW("Failed to release power(Display) (%d)", ret); } void powerLock(void *data, bool enable) @@ -610,28 +588,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; } @@ -639,31 +617,70 @@ 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 void expand_send_text(void *data) +{ + PRINTFUNC(DLOG_DEBUG, ""); - 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); + if(data) { + VoiceData *voicedata = (VoiceData *) data; + elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,send,text,expand", "elm"); + } +} - return ECORE_CALLBACK_CANCEL; +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"); + } } +static void set_cue_text(void *data) +{ + PRINTFUNC(DLOG_DEBUG, ""); + + if(data) { + VoiceData *voicedata = (VoiceData *) data; + if (voicedata->state == STT_STATE_VAL_INIT) { + elm_object_domain_translatable_part_text_set(voicedata->layout_main, "elm.text.cue", PACKAGE, SK_SPEAK_PREPARE); + } else { + 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"); + } +} static void set_guide_text(VoiceData *vd, const char* text, bool translatable) { - elm_object_signal_emit(vd->layout_main, "idle,state,guide_text,bottom", "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, change_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); } /** @@ -674,32 +691,22 @@ static void set_guide_text(VoiceData *vd, const char* text, bool translatable) void set_animation_state(VoiceData *voicedata) { 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, "Tap mic to speak"); + set_cue_text(voicedata); + expand_send_text(voicedata); 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(); @@ -707,11 +714,12 @@ void set_animation_state(VoiceData *voicedata) } else { 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) @@ -767,18 +775,24 @@ static Eina_Bool _start_timer_cb(void* data) try { voicedata->state = STT_STATE_VAL_PREPARE_LISTENING; - voicedata->sttmanager->Start(); + if (voicedata->sttmanager) + 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) { - set_guide_text(voicedata, _(SK_STT_BUSY)); + PRINTFUNC(DLOG_WARN, "STT is used by another application"); + show_popup_toast(_(SK_STT_BUSY), false); voicedata->state = STT_STATE_VAL_INIT; } else { - set_guide_text(voicedata, _(SK_STT_BUSY)); + PRINTFUNC(DLOG_WARN, "Check error code"); + show_popup_toast(_(SK_STT_BUSY), false); voicedata->state = STT_STATE_VAL_INIT; } } @@ -790,6 +804,57 @@ static Eina_Bool _start_timer_cb(void* data) 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 - @@ -800,12 +865,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) + if (vd == NULL || vd->sttmanager == 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; } @@ -839,8 +904,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(); } @@ -867,8 +930,6 @@ 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; @@ -884,7 +945,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); @@ -915,9 +976,9 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part) const int BUF_LEN = 128; char text[BUF_LEN] = {'\0', }; - if(!strcmp(part, "elm.text")) + if (!strcmp(part, "elm.text")) { - if((uintptr_t)data == 0) { + if ((uintptr_t)data == 0) { return strdup(_("IDS_VC_BODY_AUTOMATIC")); } else { char *s = NULL; @@ -1029,7 +1090,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; } @@ -1107,7 +1168,7 @@ 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; @@ -1120,12 +1181,16 @@ static void language_set_genlist_radio_cb(void *data, Evas_Object *obj, void *ev 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); } @@ -1146,9 +1211,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; @@ -1156,7 +1221,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); @@ -1268,7 +1333,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; } @@ -1330,7 +1395,7 @@ 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) @@ -1347,11 +1412,12 @@ 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); - vd->sttmanager->SetLanguage(std::string(vd->kbd_lang)); + if (vd->sttmanager) + vd->sttmanager->SetLanguage(std::string(vd->kbd_lang)); vd->mo->Update(); return; @@ -1361,8 +1427,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; @@ -1371,7 +1437,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; @@ -1397,7 +1463,7 @@ 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(); if(_WEARABLE) @@ -1417,10 +1483,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); @@ -1431,12 +1495,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; @@ -1444,26 +1514,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; } @@ -1472,26 +1553,34 @@ 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 { - if (voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING || - voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { - voicedata->sttmanager->Cancel(); - PRINTFUNC(DLOG_DEBUG, "stt entry clicked callback during STT recording and processing"); - //return; + if (voicedata->sttmanager) { + if (voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING || + voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { + voicedata->sttmanager->Cancel(); + PRINTFUNC(DLOG_DEBUG, "stt entry clicked callback during STT recording and processing"); + //return; + } } } catch(is::stt::SttException &e) { @@ -1515,17 +1604,19 @@ static void _stt_entry_clicked_cb(void *data, Evas_Object * obj, void *event_inf elm_naviframe_item_pop_cb_set(navi_it, __stt_entry_detailed_view_pop_cb, (void *)voicedata); elm_naviframe_item_title_enabled_set(navi_it, EINA_FALSE, EINA_FALSE); free(str); + } else { + if (str) free(str); + str = NULL; } 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; @@ -1539,7 +1630,7 @@ void activate_circle_scroller_for_stt_textbox(void* data, Eina_Bool bActivate) static Evas_Object *create_textblock(void* data) { - if(!data) return NULL; + if (!data) return NULL; VoiceData *voicedata = (VoiceData *)data; @@ -1558,16 +1649,11 @@ static Evas_Object *create_textblock(void* data) 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); + 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); @@ -1579,11 +1665,7 @@ static Evas_Object *create_textblock(void* data) 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; @@ -1613,22 +1695,148 @@ static Evas_Object *create_textblock(void* data) return scroller; } -static Evas_Object *create_progressbar(Evas_Object *parent) +bool is_textblock_empty(void *data) { - Evas_Object *progressbar = NULL; + if (!data) return false; - 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 *scroller = (Evas_Object *)voicedata->scroller; + Evas_Object *inner_layout = NULL; + + inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout"); - 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); + 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; + } -// ea_theme_object_color_replace(progressbar, "B065L6", "AO012"); + 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_show(progressbar); + 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; - return progressbar; + 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) @@ -1650,7 +1858,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) @@ -1675,10 +1882,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); @@ -1686,7 +1892,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); @@ -1694,56 +1900,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); @@ -1784,21 +1960,17 @@ int init_voicedata(VoiceData *r_voicedata) voicedata->progressbar = NULL; voicedata->scroller = NULL; voicedata->main_entry = NULL; - voicedata->mic_button = NULL; voicedata->state = STT_STATE_VAL_INIT; voicedata->kbd_lang = NULL; + voicedata->setup_timer = NULL; voicedata->start_timer = NULL; voicedata->refresh_timer = NULL; - voicedata->progressbar_timer = NULL; voicedata->textblock_timer = NULL; - voicedata->guide_text_timer = NULL; - voicedata->btn_disabling_timer = NULL; voicedata->power_unlock_timer = NULL; - voicedata->stt_results.clear(); voicedata->partial_result = NULL; voicedata->result_type = 0; - voicedata->disclaimer = 0; + voicedata->disclaimer = 1; voicedata->mo = NULL; voicedata->sttfeedback = NULL; voicedata->sttmanager = NULL; @@ -1848,12 +2020,6 @@ 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; @@ -1866,9 +2032,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); } @@ -1925,11 +2098,13 @@ 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()); } @@ -1937,8 +2112,8 @@ void on_stt_pause(VoiceData *r_voicedata){ close_setting_window_idler_cb(NULL); Evas_Object *mo_layout = voicedata->mo->getMoreOptionLayout(); if (_WEARABLE) { - if(mo_layout){ - if(eext_more_option_opened_get(mo_layout) == EINA_TRUE) { + if (mo_layout){ + if (eext_more_option_opened_get(mo_layout) == EINA_TRUE) { eext_more_option_opened_set(mo_layout, EINA_FALSE); } } @@ -1946,6 +2121,21 @@ void on_stt_pause(VoiceData *r_voicedata){ } } +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; + } + } + } +} + void on_destroy(VoiceData *r_voicedata) { PRINTFUNC(NO_PRINT, ""); @@ -1955,7 +2145,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; } @@ -1963,6 +2173,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; @@ -1973,27 +2188,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; @@ -2029,9 +2228,6 @@ void on_destroy(VoiceData *r_voicedata) voicedata->sttfeedback = NULL; } - free(voicedata); + delete voicedata; } } - - -