From 665a8ea5ba318182562e96452d97c31b13aec744 Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Thu, 7 Sep 2017 13:28:52 +0900 Subject: [PATCH] Modify the screen UI for stt mode and refactoring code Change-Id: Icee4362896d7604caa3c1798d2a95e96a988add2 Signed-off-by: sungwook79.park --- edje/wearable/images/wi_stt_icon_error.png | Bin 0 -> 1445 bytes inc/MoreOption.h | 15 + inc/w-input-stt-engine.h | 6 +- inc/w-input-stt-ise.h | 1 + inc/w-input-stt-voice.h | 7 + po/en_US.po | 2 +- res/wearable/edje/w-input-stt.edc | 801 +++++++++++++++-------------- src/MoreOption.cpp | 365 ++++++++++--- src/SttFeedback.cpp | 5 + src/w-input-emoticon.cpp | 7 +- src/w-input-selector.cpp | 5 +- src/w-input-stt-ise.cpp | 13 +- src/w-input-stt-voice.cpp | 753 +++++++++++++++++---------- 13 files changed, 1224 insertions(+), 756 deletions(-) create mode 100644 edje/wearable/images/wi_stt_icon_error.png diff --git a/edje/wearable/images/wi_stt_icon_error.png b/edje/wearable/images/wi_stt_icon_error.png new file mode 100644 index 0000000000000000000000000000000000000000..7720b4f0b5c95a5ec7631938251f6b639a8a99c1 GIT binary patch literal 1445 zcmaJ>eM}Q)7%vuK#o;st_Tjdi$1pJ0_P%Kk3bws=Hc~`rgvBs-TwmaX_UheX3z(tI z5pkQ_m>WViX5!SrB4I;xVxkk+2V*e-M}}KW)MaI3L*rsL-9+~mDDw~EC-tE?_}&<5x&epBRY$Q}D3z%}UIrSgS1JXF z%g2|40>FD~whe(SjYb<1J;iFVJC_wCpMj6q7(%`PL~ArzIiUbAR00(#1?8gOf?hv; z7DYs_1udf8m^)wx72>*D85Gv$d4$?Z!R$qIvXQJ13kiHc<&luD%CE2?3p&Hg!g*xd zh$1s4YNZ986;Xe5ZXZM1q{a#hB4q2%`o_L2!Y{*5ra3Q$0?R(SRwTv^ZxRSmF4V=x#r1WAJ=mm6`j*&N{@2tBmWD>Z(V59$3%N|b>EiXe*t zRh0Zlgpn_ms#OaLmClCX3%K3$#C~NiQ7~o35Faq&2F&R5MdF&VR@4IUzl;T~6;Dk7 z7z=jIle+jLk`y=_toSSkj3xI7xCeM?s{6F=Gyg*=lvtjETq~7&3}=`4yG- z3n1!Ogns9+_6K5Fy9{_$l0A}C6|I2$3Q3ie3Mqit3mGJ>Nc4N9ppqUrp4n(QAdB09 z*C|UrWG26?xPX7!%-QS?$_7K^91M(`ut6y{lZnQyP7_9{dHeqUV&&(H%P*&nykkmE-n2F)y#BkA-rLkP7WbDmXM0Px`K|1` zx0X`zTR!?dVLzp-S={pN_=((}&bsc@3;x`W&?hH;nW}6%*|j-*a_rsCEx)z%K$}Df zHN$tBZ+4XMgX2BzWv^PkI^*nn^T^Phw9f`t4<8ph(?5s@;nw%5te-sZ;V&=R^weHQ z`>FcQPU`a2Ws3|WJISSu+387bM`G;p1Gat~Pro^pd?tN*ti7*&jj9_zJk_CHeV}p4 z!Mta6Mc1i=zm^Z@4s7eb_GwaL+o%$6A9?ZVb3Hr4leS}r_0Fb$7A2JyzAd==E{u)t z;Xkh2KsR1$>#|(h`Sb4MH(Lcy|3t5(y&LNw&Zd1mo>(0GP(t~o{j1JjENni6OxGWXQ^!tf aw3_`(>h8U9c(Nn%<8(RlxGvjE4gUdwn+Mte literal 0 HcmV?d00001 diff --git a/inc/MoreOption.h b/inc/MoreOption.h index f410d52..1aca4ff 100755 --- a/inc/MoreOption.h +++ b/inc/MoreOption.h @@ -47,6 +47,14 @@ class MoreOption Evas_Object *getMoreOptionLayout(){return more_option_layout;}; + static void moreOptionOpened(void *data, Evas_Object * obj, void *event_info); + static void moreOptionClosed(void *data, Evas_Object * obj, void *event_info); + + static void moreItemClicked(void *data, Evas_Object * obj, void *event_info); + static void moreItemSelected(void *data, Evas_Object * obj, void *event_info); + Eina_Bool isMoreOptionOpened(){ return option_opened;}; + Eina_Bool discard_popup_opened; + private : /** * Main layout @@ -68,5 +76,12 @@ class MoreOption * */ Evas_Object *AddLanguageIcon(Evas_Object *parent); + + /** + * Show /Hide Cue button of More Option. + * + */ + void hideCue(); + void showCue(); }; diff --git a/inc/w-input-stt-engine.h b/inc/w-input-stt-engine.h index 0cf85e1..044a7a3 100755 --- a/inc/w-input-stt-engine.h +++ b/inc/w-input-stt-engine.h @@ -65,15 +65,13 @@ struct _VoiceData Evas_Object *progressbar; //progressbar Evas_Object *scroller; //scroller Evas_Object *main_entry; //entry - Evas_Object *mic_button; //MIC button + Evas_Object *bottom_button; //bottom button SttStateVal state; char *kbd_lang; + Ecore_Timer *setup_timer; Ecore_Timer *start_timer; Ecore_Timer *refresh_timer; - Ecore_Timer *progressbar_timer; Ecore_Timer *textblock_timer; - Ecore_Timer *guide_text_timer; - Ecore_Timer *btn_disabling_timer; Ecore_Timer *power_unlock_timer; std::vector stt_results; diff --git a/inc/w-input-stt-ise.h b/inc/w-input-stt-ise.h index 9be2138..99aaae9 100755 --- a/inc/w-input-stt-ise.h +++ b/inc/w-input-stt-ise.h @@ -47,6 +47,7 @@ extern "C" void show_voice_input(Evas_Object *parent, const char *lang, void (*get_string)(char *, int)); void pause_voice(); +void resume_voice(); void destroy_voice(); int is_lang_supported_by_voice_input(const char *lang); void ise_show_stt_popup(void *data); diff --git a/inc/w-input-stt-voice.h b/inc/w-input-stt-voice.h index 685f252..7696789 100755 --- a/inc/w-input-stt-voice.h +++ b/inc/w-input-stt-voice.h @@ -81,10 +81,12 @@ int init_voice(Evas_Object *parent, const char *lang, VoiceData *r_voicedata); int is_lang_supported_by_stt(char lang[]); Evas_Object *show_voice_window(Evas_Object *parent, VoiceData *voicedata); void on_stt_pause(VoiceData *voicedata); +void on_stt_resume(VoiceData *voicedata); void on_destroy(VoiceData *voicedata); const char* get_lang_label(char lang[]); void _stt_lang_changed_cb(keynode_t *key, void* data); void start_by_press(VoiceData *voicedata); +void restart_listening(double in); void voice_get_string(const char *keyValue, VoiceData *voicedata); void create_setting_window(Evas_Object *more_option_layout); void activate_circle_scroller_for_stt_textbox(void* data, Eina_Bool bActivate); @@ -92,6 +94,11 @@ void stt_feedback_initialize(); void stt_feedback_deinitialize(); void show_error_message(VoiceData *voicedata, stt_error_e reason); void powerUnlock(void); +Evas_Object *create_text_detiled_view(Evas_Object *parent); +bool is_textblock_empty(void *data); +void set_textblock_empty(void *data); +void show_bottom_button(void* data, bool delayed); +void hide_bottom_button(void* data); #endif /* W_INPUT_STT_VOICE_H_ */ diff --git a/po/en_US.po b/po/en_US.po index 4331d77..8d82798 100644 --- a/po/en_US.po +++ b/po/en_US.po @@ -125,7 +125,7 @@ msgid "IDS_MSG_HEADER_QUICK_RESPONSES_ABB" msgstr "Quick responses" msgid "IDS_AMEMO_BUTTON_SEND" -msgstr "Send" +msgstr "SEND" msgid "IDS_IME_BODY_OK_HAND_SIGN_M_EMOTICON_NAME_TTS" msgstr "OK hand sign" diff --git a/res/wearable/edje/w-input-stt.edc b/res/wearable/edje/w-input-stt.edc index 13168ba..89fdbf1 100755 --- a/res/wearable/edje/w-input-stt.edc +++ b/res/wearable/edje/w-input-stt.edc @@ -1,7 +1,7 @@ #include "w-input-stt-button.edc" #define VOICE_CANDIDATE_AREA_HEIGHT 56 -#define BUTTON_TEXT_SIZE_INC 85 +#define BUTTON_TEXT_SIZE_INC 80 collections { @@ -36,11 +36,6 @@ collections * web: http://slp-info.sec.samsung.net/gerrit/plugins/gitiles/magnolia/framework/system/libsvi */ } - plugin { - name: "haptic_tap"; - source: "feedback"; - param: "FEEDBACK_TYPE_VIBRATION FEEDBACK_PATTERN_TAP"; - } } images { @@ -50,8 +45,6 @@ collections image, "./icon/B13_mic_Que.png" COMP; image, "./icon/B13_mic_Que_01.png" COMP; image, "./icon/B13_mic_procecessing_bg.png" COMP; - image, "./text_downdrop.#.png" COMP; - image, "./text_downdrop_press.#.png" COMP; image, "./input_ic_voice_mic.png" COMP; image, "./w_sip_mask_bg.png" COMP; @@ -64,6 +57,7 @@ collections image, "./b_stt_icon_btn.png" COMP; image, "./b_stt_confirm_icon.png" COMP; image, "./b_stt_send_icon.png" COMP; + image, "./wi_stt_icon_error.png" COMP; } color_classes @@ -387,7 +381,7 @@ collections { name: "AT0114"; # color: 0 0 0 100; - color: 128 128 128 100; + color: 128 128 128 100; } color_class { @@ -469,14 +463,23 @@ collections tag, "b" "+ font=Tizen:style=Bold"; tag, "tab" "\t"; } + style { name: "button_general_text_normal"; + base: "font=Tizen:style=Regular font_size="BUTTON_TEXT_SIZE_INC" align=center color=#FFFFFF ellipsis=0.0 wrap=mixed"; + } style { name: "button_general_text_dim"; base: "font=Tizen:style=Regular font_size="BUTTON_TEXT_SIZE_INC" align=center color=#FFFFFF ellipsis=0.0 wrap=mixed"; } style { name: "button_general_text_press"; base: "font=Tizen:style=Regular font_size="BUTTON_TEXT_SIZE_INC" align=center color=#888888 ellipsis=0.0 wrap=mixed"; } - style { name: "button_general_text_normal"; - base: "font=Tizen:style=Regular font_size="BUTTON_TEXT_SIZE_INC" align=center color=#FFFFFF ellipsis=0.0 wrap=mixed"; + style { name: "button_send_text_normal"; + base: "font=Tizen:style=Regular font_size="BUTTON_TEXT_SIZE_INC" align=center color=#FFFFFF color_class=AT0117 ellipsis=0.0 wrap=mixed"; + } + style { name: "button_cue_text_normal"; + base: "font=Tizen:style=Regular font_size="BUTTON_TEXT_SIZE_INC" align=center color=#FFFFFF color_class=AT032 ellipsis=0.0 wrap=mixed"; + } + style { name: "button_bottom_text_normal"; + base: "font=Tizen:style=Regular font_size=26 align=center color=#FFFFFF color_class=AT0118"; } } @@ -507,6 +510,21 @@ collections } part { + name, "access_bg"; + type, SWALLOW; + scale, 1; + description + { + state, "default" 0.0; + visible, 1; + min, 360 360; + max, 360 360; + rel1.to, "bg"; + rel2.to, "bg"; + } + } + part + { name, "top_block"; type, SPACER; scale, 1; @@ -526,6 +544,23 @@ collections to, "bg"; } } + description + { + state, "hide" 0.0; + min, 360 360; + align, 0.5 0; + rel1 + { + relative, 0.0 0.0; + to, "bg"; + } + rel2 + { + relative, 1.0 0.0; + to, "bg"; + } + } + } part @@ -536,20 +571,18 @@ collections { state, "default" 0.0; align, 0.5 1; - min, 282 (360-103); - max, 282 (360-103); + min, 282 360; + max, 282 360; rel1 { relative, 39/360 1; - to, "top_block"; - offset, 0 -1; + to, "bg"; } rel2 { relative, 321/360 1; - to, "top_block"; - offset, 0 -1; + to, "bg"; } } } @@ -583,11 +616,11 @@ collections description { state, "default" 0.0; - min, 360 100; - max, 360 100; + min, 360 78; + max, 360 78; rel1 { - relative, 0 260/360; + relative, 0 (360-78)/360; to, "bg"; } rel2 @@ -600,6 +633,25 @@ collections } description { + state, "hide" 0.0; + min, 360 78; + max, 360 78; + rel1 + { + relative, 0 1; + to, "bg"; + } + rel2 + { + relative, 1 (360+78)/360; + to, "bg"; + } + image.normal, "./tw_bottom_btn_bg.png"; + color: 128 128 128 128; + } + + description + { state, "pressed" 0.0; inherit, "default" 0.0; color: 128 128 128 128; @@ -658,7 +710,6 @@ collections } } - part { name, "EFFECT_BG"; @@ -686,123 +737,286 @@ collections } } - + //Part for mic button part { - name, "MIC_ICON"; - type, IMAGE; + name, "BOTTOM_BUTTON"; + type, SWALLOW; + scale, 1; + description + { + state, "default" 0.0; + visible, 1; + min, 290 78; + max, 290 78; + rel1 + { + relative, 35/360 0.0; + to, "background"; + } + rel2 + { + relative, 325/360 1.0; + to, "background"; + } + } + } + part + { + name, "PROGRESS_BAR"; + type, SWALLOW; scale, 1; description { state, "default" 0.0; min, 50 50; max, 50 50; + visible, 0; rel1 { - relative, 155/360 26/100; + relative, 155/360 27/100; to, "background"; } rel2 { - relative, 205/360 76/100; + relative, 205/360 77/100; to, "background"; } - image.normal, "./input_ic_voice_mic.png"; } description { - state, "recording" 0.0; + state, "message" 0.0; inherit, "default" 0.0; - visible, 0; } description { state, "processing" 0.0; inherit, "default" 0.0; - visible, 0; + visible, 1; + } } + + part + { + name, "cue_text_block"; + type, SPACER; description { - state, "message" 0.0; - inherit, "default" 0.0; + state, "default" 0.0; + align, 0.5 0; rel1 { - relative, 155/360 41/100; - to, "background"; + relative, 30/360 158/360; + to, "bg"; } rel2 { - relative, 205/360 91/100; - to, "background"; + relative, (360-30)/360 (158+43)/360; + to, "bg"; + } + } + } + + part + { + name, "elm.text.cue"; + type, TEXTBLOCK; + mouse_events, 0; + scale, 1; + description + { + state, "default" 0.0; + visible, 0; + rel1.to, "cue_text_block"; + rel2.to, "cue_text_block"; + text + { + fit: 1 1; + style, "button_cue_text_normal"; } + } + description + { + state, "show" 0.0; visible, 1; + align, 0.5 0.6; + rel1.to, "cue_text_block"; + rel2.to, "cue_text_block"; + text + { + fit: 1 1; + style, "button_cue_text_normal"; + } + } + } + + part + { + name, "guide_text_block_left_padding"; + type, SPACER; + description + { + state, "default" 0.0; + min, (80+28+8) 0; + max, (80+28+8) -1; + fixed, 1 0; + align, 0.0 0.0; + rel1 + { + relative, 0 (360-70)/360; + to, "bg"; + } + rel2 + { + relative, 0 (360-33)/360; + to, "bg"; } } + } + part + { + name, "guide_text_block_right_padding"; + type, SPACER; + description + { + state, "default" 0.0; + min, 80 0; + max, 80 -1; + fixed, 1 0; + align, 1.0 0.0; + rel1 + { + relative, 1 (360-70)/360; + to, "bg"; + } + rel2 + { + relative, 1 (360-33)/360; + to, "bg"; + } + } + } - //Part for mic button part { - name, "MIC"; - type, SWALLOW; - scale, 1; + name, "guide_text_block"; + type, SPACER; description { state, "default" 0.0; - visible, 1; - min, 290 100; - max, 290 100; + align, 0.5 0; rel1 { - relative, 35/360 0.0; - to, "background"; + relative, 1.0 0.0; + to, "guide_text_block_left_padding"; } rel2 { - relative, 325/360 1.0; - to, "background"; + relative, 0.0 1.0; + to, "guide_text_block_right_padding"; } } + } part { - name, "PROGRESS_BAR"; - type, SWALLOW; + name, "elm.text"; + type, TEXTBLOCK; + mouse_events, 0; scale, 1; description { state, "default" 0.0; - min, 50 50; - max, 50 50; + min, 0 37; + max, -1 37; + fixed, 0 1; + align, 0.5 0.5; + text { + min, 0 1; + max, 1 1; + ellipsis, -1.0; + fade_ellipsis, 1.0; + style, "button_bottom_text_normal"; + } visible, 0; rel1 { - relative, 155/360 27/100; - to, "background"; + relative, 0.0 0.0; + to, "guide_text_block"; } rel2 { - relative, 205/360 77/100; - to, "background"; + relative, 1.0 1.0; + to, "guide_text_block"; } } description { - state, "message" 0.0; - inherit, "default" 0.0; + state, "show" 0.0; + inherit, "default"; + visible, 1; + } } + part + { + name, "guide_text_block_icon_padding"; + type, SPACER; description { - state, "processing" 0.0; - inherit, "default" 0.0; - visible, 1; + state, "default" 0.0; + min, 8 0; + max, 8 -1; + fixed, 1 0; + align, 1.0 0.0; + rel1 + { + relative, 0 0; + to, "elm.text"; + } + rel2 + { + relative, 0 1; + to, "elm.text"; } } + } part { - name, "guide_text_block"; + name, "error_icon"; + type, IMAGE; + description + { + state, "default" 0.0; + min, 28 37; + max, 28 37; + align, 1.0 0.5; + rel1 + { + relative, 0.0 0.0; + to, "guide_text_block_icon_padding"; + } + rel2 + { + relative, 0.0 1.0; + to, "guide_text_block_icon_padding"; + } + image.normal, "./wi_stt_icon_error.png"; + color_class, "AO015"; + visible, 0; + } + description + { + state, "show" 0.0; + inherit, "default"; + visible, 1; + } + } + part + { + name, "send_text_block"; type, SPACER; description { @@ -810,35 +1024,35 @@ collections align, 0.5 0; rel1 { - relative, 39/360 140/360; - to, "bg"; + relative, 105/360 5/78; + to, "background"; } rel2 { - relative, (360-39)/360 (140+42)/360; - to, "bg"; + relative, (360-105)/360 (78-38)/78; + to, "background"; } } description { - state, "bottom" 0.0; + state, "expand" 0.0; align, 0.5 0; rel1 { - relative, 74/360 (360-91)/360; - to, "bg"; + relative, 84/360 18/78; + to, "background"; } rel2 { - relative, (360-74)/360 (360-57)/360; - to, "bg"; - } + relative, (360-82)/360 (78-23)/78; + to, "background"; } } + } part { - name, "elm.text"; + name, "elm.text.send"; type, TEXTBLOCK; mouse_events, 0; scale, 1; @@ -846,28 +1060,17 @@ collections { state, "default" 0.0; visible, 1; - align, 0.5 0.6; - rel1.to, "guide_text_block"; - rel2.to, "guide_text_block"; - text - { - fit: 1 1; - style, "textblock_style"; - } - color, 120 120 120 120; - } - description - { - state, "bottom" 0.0; - inherit, "default" 0.0; + align, 0.5 0.5; + rel1.to, "send_text_block"; + rel2.to, "send_text_block"; text { fit: 1 1; - style, "textblock_style_bottom"; + style, "button_send_text_normal"; } - color, 120 120 120 120; } } + } programs @@ -889,60 +1092,73 @@ collections program { - name, "listening"; - signal, "elm,state,listening"; + name, "cue_text_show"; + signal, "idle,state,cue_text,visible"; source, "elm"; - action, STATE_SET "recording" 0.0; - target, "MIC_ICON"; + action, STATE_SET "show" 0.0; + target, "elm.text.cue"; + after: "cue_text_hide"; } program { - name, "start_processing"; - signal, "elm,state,processing"; + name, "cue_text_hide"; + signal, "idle,state,cue_text,hidden"; source, "elm"; - action, STATE_SET "processing" 0.0; - target, "PROGRESS_BAR"; - target, "MIC_ICON"; - transition, DECELERATE 0.3; + in, 2.0 0.0; + action, STATE_SET "default" 0.0; + target, "elm.text.cue"; } program { - name, "idle"; - signal, "elm,state,init"; + name, "text_show"; + signal, "idle,state,text,visible"; source, "elm"; - action, STATE_SET "default" 0.0; - target, "PROGRESS_BAR"; - target, "MIC_ICON"; - transition, DECELERATE 0.3; + action, STATE_SET "show" 0.0; + target, "elm.text"; + target, "error_icon"; + after: "text_hide_delayed"; } + program { - name, "idle_message"; - signal, "elm,state,init_message"; + name, "text_hide"; + signal, "idle,state,text,hidden"; source, "elm"; - action, STATE_SET "message" 0.0; - target, "PROGRESS_BAR"; - target, "MIC_ICON"; + action, STATE_SET "default" 0.0; + target, "elm.text"; + target, "error_icon"; } program { - name, "text_show"; - signal, "idle,state,text,visible"; + name, "text_hide_delayed"; + signal, "idle,state,text,hidden,delayed"; source, "elm"; - action, STATE_SET "expand" 0.0; + in, 2.0 0.0; + action, STATE_SET "default" 0.0; target, "elm.text"; + target, "error_icon"; } program { - name, "text_hide"; - signal, "idle,state,text,hidden"; + name, "contract_send_text"; + signal, "idle,state,send,text,contract"; source, "elm"; action, STATE_SET "default" 0.0; - target, "elm.text"; + target, "send_text_block"; + + } + program + { + name, "expand_send_text"; + signal, "idle,state,send,text,expand"; + source, "elm"; + action, STATE_SET "expand" 0.0; + target, "send_text_block"; + } program { @@ -962,24 +1178,55 @@ collections target, "EFFECT_BG"; } + // Button program { - name, "guide_text_up"; - signal, "idle,state,guide_text,up"; + name, "bottom_button_show"; + signal, "idle,state,show,bottom_button"; source, "elm"; action, STATE_SET "default" 0.0; - target, "guide_text_block"; + target, "background"; + transition, DECELERATE 0.2; } program { - name, "guide_text_bottom"; - signal, "idle,state,guide_text,bottom"; + name, "bottom_button_show_delayed"; + signal, "idle,state,show,bottom_button,delayed"; source, "elm"; - action, STATE_SET "bottom" 0.0; - target, "guide_text_block"; + in, 2.0 0.0; + action, STATE_SET "default" 0.0; + target, "background"; + transition, DECELERATE 0.2; } - + program + { + name, "bottom_button_hide"; + signal, "idle,state,hide,bottom_button"; + source, "elm"; + action, STATE_SET "hide" 0.0; + target, "background"; + transition, DECELERATE 0.2; + } + // EFFECT Area + program + { + name, "bottom_effect_show"; + signal, "idle,state,show,effect"; + source, "elm"; + action, STATE_SET "default" 0.0; + target, "EFFECT_BG_AREA"; + transition, DECELERATE 0.2; + } + program + { + name, "bottom_effect_hide"; + signal, "idle,state,hide,effect"; + source, "elm"; + action, STATE_SET "hide" 0.0; + target, "EFFECT_BG_AREA"; + transition, DECELERATE 0.2; + } } } @@ -1117,7 +1364,15 @@ collections type: SWALLOW; description { state: "default" 0.0; min: 282 39; - color, 120 120 120 120; + align: 0.5 1; + rel1 + { + relative, 0.0 1.0; + } + rel2 + { + relative, 1.0 1.0; + } } } } @@ -1158,7 +1413,7 @@ collections relative, 1.0 1.0; } visible: 1; - color, 120 120 120 120; + color: 0 0 0 255; } } part { name: "padding_top"; @@ -1169,7 +1424,7 @@ collections align: 0.0 0.0; rel1.relative: 0.0 0.0; rel2.relative: 1.0 0.0; - min: 0 20; + min: 0 24; fixed: 1 1; } } @@ -1215,205 +1470,6 @@ collections -#define PROGRESSBAR_ACTIVITY_SMALL_SIZE_INC 50 - group - { - name: "elm/progressbar/horizontal/voice_input/process/small"; - images { - image: "style/tw_loading_small_00.png" COMP; - image: "style/tw_loading_small_01.png" COMP; - image: "style/tw_loading_small_02.png" COMP; - image: "style/tw_loading_small_03.png" COMP; - image: "style/tw_loading_small_04.png" COMP; - image: "style/tw_loading_small_05.png" COMP; - image: "style/tw_loading_small_06.png" COMP; - image: "style/tw_loading_small_07.png" COMP; - image: "style/tw_loading_small_08.png" COMP; - image: "style/tw_loading_small_09.png" COMP; - image: "style/tw_loading_small_10.png" COMP; - image: "style/tw_loading_small_11.png" COMP; - image: "style/tw_loading_small_12.png" COMP; - image: "style/tw_loading_small_13.png" COMP; - image: "style/tw_loading_small_14.png" COMP; - image: "style/tw_loading_small_15.png" COMP; - image: "style/tw_loading_small_16.png" COMP; - image: "style/tw_loading_small_17.png" COMP; - image: "style/tw_loading_small_18.png" COMP; - image: "style/tw_loading_small_19.png" COMP; - image: "style/tw_loading_small_20.png" COMP; - image: "style/tw_loading_small_21.png" COMP; - image: "style/tw_loading_small_22.png" COMP; - image: "style/tw_loading_small_23.png" COMP; - image: "style/tw_loading_small_24.png" COMP; - image: "style/tw_loading_small_25.png" COMP; - image: "style/tw_loading_small_26.png" COMP; - image: "style/tw_loading_small_27.png" COMP; - image: "style/tw_loading_small_28.png" COMP; - image: "style/tw_loading_small_29.png" COMP; - image: "style/tw_loading_small_30.png" COMP; - image: "style/tw_loading_small_31.png" COMP; - image: "style/tw_loading_small_32.png" COMP; - image: "style/tw_loading_small_33.png" COMP; - image: "style/tw_loading_small_34.png" COMP; - image: "style/tw_loading_small_35.png" COMP; - image: "style/tw_loading_small_36.png" COMP; - image: "style/tw_loading_small_37.png" COMP; - image: "style/tw_loading_small_38.png" COMP; - image: "style/tw_loading_small_39.png" COMP; - image: "style/tw_loading_small_40.png" COMP; - image: "style/tw_loading_small_41.png" COMP; - image: "style/tw_loading_small_42.png" COMP; - image: "style/tw_loading_small_43.png" COMP; - image: "style/tw_loading_small_44.png" COMP; - image: "style/tw_loading_small_45.png" COMP; - image: "style/tw_loading_small_46.png" COMP; - image: "style/tw_loading_small_47.png" COMP; - image: "style/tw_loading_small_48.png" COMP; - image: "style/tw_loading_small_49.png" COMP; - image: "style/tw_loading_small_50.png" COMP; - image: "style/tw_loading_small_51.png" COMP; - image: "style/tw_loading_small_52.png" COMP; - image: "style/tw_loading_small_53.png" COMP; - image: "style/tw_loading_small_54.png" COMP; - image: "style/tw_loading_small_55.png" COMP; - image: "style/tw_loading_small_56.png" COMP; - image: "style/tw_loading_small_57.png" COMP; - image: "style/tw_loading_small_58.png" COMP; - image: "style/tw_loading_small_59.png" COMP; - image: "style/tw_loading_small_60.png" COMP; - image: "style/tw_loading_small_61.png" COMP; - image: "style/tw_loading_small_62.png" COMP; - image: "style/tw_loading_small_63.png" COMP; - image: "style/tw_loading_small_64.png" COMP; - } - parts { - part { - name: "access"; - type: RECT; - description - { - state: "default" 0.0; - fixed: 1 1; - color: 0 0 0 0; - } - } - part { - name: "elm.background.progressbar"; - mouse_events: 0; - scale: 1; - type: RECT; - description { - state: "default" 0.0; - } - } - part { - name: "bar"; - mouse_events: 0; - scale: 1; - clip_to: "elm.background.progressbar"; - description { - state: "default" 0.0; - min: PROGRESSBAR_ACTIVITY_SMALL_SIZE_INC PROGRESSBAR_ACTIVITY_SMALL_SIZE_INC; - max: PROGRESSBAR_ACTIVITY_SMALL_SIZE_INC PROGRESSBAR_ACTIVITY_SMALL_SIZE_INC; - fixed, 1 1; - aspect: 1.0 1.0; - aspect_preference: BOTH; - image.normal: "style/tw_loading_small_00.png"; - image.tween: "style/tw_loading_small_01.png"; - image.tween: "style/tw_loading_small_02.png"; - image.tween: "style/tw_loading_small_03.png"; - image.tween: "style/tw_loading_small_04.png"; - image.tween: "style/tw_loading_small_05.png"; - image.tween: "style/tw_loading_small_06.png"; - image.tween: "style/tw_loading_small_07.png"; - image.tween: "style/tw_loading_small_08.png"; - image.tween: "style/tw_loading_small_09.png"; - image.tween: "style/tw_loading_small_10.png"; - image.tween: "style/tw_loading_small_11.png"; - image.tween: "style/tw_loading_small_12.png"; - image.tween: "style/tw_loading_small_13.png"; - image.tween: "style/tw_loading_small_14.png"; - image.tween: "style/tw_loading_small_15.png"; - image.tween: "style/tw_loading_small_16.png"; - image.tween: "style/tw_loading_small_17.png"; - image.tween: "style/tw_loading_small_18.png"; - image.tween: "style/tw_loading_small_19.png"; - image.tween: "style/tw_loading_small_20.png"; - image.tween: "style/tw_loading_small_21.png"; - image.tween: "style/tw_loading_small_22.png"; - image.tween: "style/tw_loading_small_23.png"; - image.tween: "style/tw_loading_small_24.png"; - image.tween: "style/tw_loading_small_25.png"; - image.tween: "style/tw_loading_small_26.png"; - image.tween: "style/tw_loading_small_27.png"; - image.tween: "style/tw_loading_small_28.png"; - image.tween: "style/tw_loading_small_29.png"; - image.tween: "style/tw_loading_small_30.png"; - image.tween: "style/tw_loading_small_31.png"; - image.tween: "style/tw_loading_small_32.png"; - image.tween: "style/tw_loading_small_33.png"; - image.tween: "style/tw_loading_small_34.png"; - image.tween: "style/tw_loading_small_35.png"; - image.tween: "style/tw_loading_small_36.png"; - image.tween: "style/tw_loading_small_37.png"; - image.tween: "style/tw_loading_small_38.png"; - image.tween: "style/tw_loading_small_39.png"; - image.tween: "style/tw_loading_small_40.png"; - image.tween: "style/tw_loading_small_41.png"; - image.tween: "style/tw_loading_small_42.png"; - image.tween: "style/tw_loading_small_43.png"; - image.tween: "style/tw_loading_small_44.png"; - image.tween: "style/tw_loading_small_45.png"; - image.tween: "style/tw_loading_small_46.png"; - image.tween: "style/tw_loading_small_47.png"; - image.tween: "style/tw_loading_small_48.png"; - image.tween: "style/tw_loading_small_48.png"; - image.tween: "style/tw_loading_small_49.png"; - image.tween: "style/tw_loading_small_50.png"; - image.tween: "style/tw_loading_small_51.png"; - image.tween: "style/tw_loading_small_52.png"; - image.tween: "style/tw_loading_small_53.png"; - image.tween: "style/tw_loading_small_54.png"; - image.tween: "style/tw_loading_small_55.png"; - image.tween: "style/tw_loading_small_56.png"; - image.tween: "style/tw_loading_small_57.png"; - image.tween: "style/tw_loading_small_58.png"; - image.tween: "style/tw_loading_small_59.png"; - image.tween: "style/tw_loading_small_60.png"; - image.tween: "style/tw_loading_small_61.png"; - image.tween: "style/tw_loading_small_62.png"; - image.tween: "style/tw_loading_small_63.png"; - image.tween: "style/tw_loading_small_64.png"; - color: 128 128 128 128; - } - } - } - programs { - program { - name: "start_pulse"; - signal: "elm,state,pulse,start"; - source: "elm"; - action: STATE_SET "default" 0.0; - target: "bar"; - transition: LINEAR 1.8; - after: "start_pulse"; - } - program { - name: "stop_pulse"; - signal: "elm,state,pulse,stop"; - source: "elm"; - action: ACTION_STOP; - target: "start_pulse"; - after: "init_pulse"; - } - program { name: "init_pulse"; - action: STATE_SET "default" 0.0; - target: "bar"; - } - } - } - - #define BUTTON_PADDING_SIZE_INC 20 0 #define BUTTON_HEIGHT_INC 122 #define BUTTON_ICON_SIZE_INC 60 60 @@ -1591,7 +1647,8 @@ collections get_state(PART:"bg", st, 30, vl); if (strcmp(st, "disabled")) { set_state(PART:"bg", "pressed", 0.0); - set_state(PART:"elm.text", "pressed", 0.0); + //set_state(PART:"bg_image", "pressed", 0.0); + set_state(PART:"elm.swallow.content.clip", "pressed", 0.0); emit("elm,action,press", ""); } } @@ -1613,7 +1670,8 @@ collections get_state(PART:"bg", st, 30, vl); if (strcmp(st, "disabled")) { set_state(PART:"bg", "default", 0.0); - set_state(PART:"elm.text", "default", 0.0); + //set_state(PART:"bg_image", "default", 0.0); + set_state(PART:"elm.swallow.content.clip", "default", 0.0); emit("elm,action,unpress", ""); } } @@ -1681,7 +1739,7 @@ collections program { name: "icon_hide"; signal: "elm,state,icon,hidden"; source: "elm"; - action: STATE_SET "default" 0.0; + action: STATE_SET "visible" 0.0; target: "elm.swallow.content"; target: "icon_rect"; } @@ -1944,45 +2002,6 @@ collections } } - group { name: "elm/button/base/ime_button_stt_confirm"; - inherit: "elm/button/base/ime_button"; - parts { - part { name: "bg"; - type: IMAGE; - scale: 1; - description { state: "default" 0.0; - min: 0 0; - color_class: "AO015L2"; - visible: 0; - image.normal: "./b_stt_icon_btn.png"; - } - description { state: "pressed" 0.0; - inherit: "default" 0.0; - color_class: "AO015L2P"; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - color_class: "AO015L2D"; - } - } - part { name: "elm.swallow.content.clip"; - type: RECT; - scale: 1; - description { state: "default" 0.0; - color_class: "AO015L2"; - } - description { state: "pressed" 0.0; - inherit: "default" 0.0; - color_class: "AO015L2P"; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - color_class: "AO015L2D"; - } - } - } - } - group { name: "elm/button/base/touch_area"; inherit: "elm/button/base/default"; parts { @@ -2080,7 +2099,7 @@ collections to: "padding_right_bottom"; } text { - min: 1 0; + max: 1 0; style: "button_general_text_normal"; } } @@ -2523,14 +2542,42 @@ group { name: "elm_naviframe_item_basic_customized"; rel2 {relative: 1.0 1.0; to: "title_bg"; } } } + part { name: "left_padding_content"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 33 0; + max: 33 -1; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "base"; } + rel2 { relative: 0.0 1.0; to: "base"; } + visible: 0; + color: 255 0 0 100; + } + } + part { name: "right_padding_content"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 33 0; + max: 33 -1; + fixed: 1 0; + align: 1.0 0.5; + rel1 { relative: 1.0 0.0; to: "base"; } + rel2 { relative: 1.0 1.0; to: "base"; } + visible: 0; + color: 0 255 0 100; + } + } part { name: "elm.swallow.content"; type: SWALLOW; scale: 1; repeat_events: 0; clip_to: "clipper"; description { state: "default" 0.0; - rel1 { relative: 0.0 1.0; to_x: "base"; to_y: "title_expand"; } - rel2 { relative: 1.0 0.0; to_x: "base"; to_y: "button_padding"; } + rel1 { relative: 1.0 1.0; to_x: "left_padding_content"; to_y: "title_expand"; } + rel2 { relative: 0.0 0.0; to_x: "right_padding_content"; to_y: "button_padding"; } } } part { name: "elm.swallow.circle_bg"; @@ -2741,7 +2788,7 @@ images { image, "./b_ic_press_full_circle_bg.png" COMP; } -group { name: "elm/panel/right1/default"; +group { name: "elm/panel/right/default"; script { public mouse_down = 0; public mouse_click = 0; @@ -3244,8 +3291,8 @@ group { name: "elm/panel/right1/default"; } } -group { name: "elm/panel/left1/default"; - inherit: "elm/panel/right1/default"; +group { name: "elm/panel/left/default"; + inherit: "elm/panel/right/default"; parts { part { name: "cue.padding"; type: SPACER; @@ -3460,8 +3507,8 @@ group { name: "elm/panel/left1/default"; } } -group { name: "elm/panel/left_sending/default"; - inherit: "elm/panel/left1/default"; +group { name: "elm/panel/left/sending"; + inherit: "elm/panel/left/default"; parts { part { name: "cue.padding"; type: SPACER; @@ -3517,8 +3564,8 @@ group { name: "elm/panel/left_sending/default"; } } -group { name: "elm/panel/left_confirm/default"; - inherit: "elm/panel/left_sending/default"; +group { name: "elm/panel/left/confirm"; + inherit: "elm/panel/left/sending"; parts { part { name: "cue"; description { state: "default" 0.0; diff --git a/src/MoreOption.cpp b/src/MoreOption.cpp index 7550d75..39bc951 100755 --- a/src/MoreOption.cpp +++ b/src/MoreOption.cpp @@ -32,21 +32,145 @@ using namespace std; extern Evas_Object *g_setting_window; +static bool voice_input_back_agree = false; + +static void +popup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (!obj) return; + elm_popup_dismiss(obj); +} + +static void +popup_hide_finished_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (!obj) return; + evas_object_del(obj); +} + +static void voice_input_back_disagree_cb(void *data, Evas_Object *obj, void *event_info) +{ + if(!obj) return; + if(!data) return; + + VoiceData *voicedata = (VoiceData *)data; + Evas_Object *popup = (Evas_Object *)evas_object_data_get(obj, "popup"); + + voicedata->mo->discard_popup_opened = EINA_FALSE; + + if (popup) + elm_popup_dismiss(popup); +} + +static void voice_input_back_agree_cb(void *data, Evas_Object *obj, void *event_info) +{ + if(!obj) return; + if(!data) return; + + VoiceData *voicedata = (VoiceData *)data; + Evas_Object *popup = (Evas_Object *)evas_object_data_get(obj, "popup"); + + voicedata->mo->discard_popup_opened = EINA_FALSE; + + if (popup) + elm_popup_dismiss(popup); + + if(voicedata->naviframe){ + voice_input_back_agree = true; + + if(voicedata->disclaimer == 1){ + voicedata->disclaimer = 0; + elm_naviframe_item_pop_to(elm_naviframe_bottom_item_get(voicedata->naviframe)); + } else { + elm_naviframe_item_pop(voicedata->naviframe); + } + } +} + +static void show_discard_popup(void *data) +{ + if(!data) return; + + VoiceData *voicedata = (VoiceData *)data; + + Evas_Object *popup = NULL; + Evas_Object *layout = NULL; + Evas_Object *btn_popup = NULL; + Evas_Object *icon = NULL; + + std::string path = get_resource_path(); + + popup = elm_popup_add(voicedata->naviframe); + elm_object_style_set(popup, "circle"); +// uxt_popup_set_rotary_event_enabled(popup, EINA_TRUE); + eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, popup_hide_cb, NULL); + evas_object_smart_callback_add(popup, "dismissed", popup_hide_finished_cb, NULL); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + layout = elm_layout_add(popup); + elm_layout_theme_set(layout, "layout", "popup", "content/circle/buttons2"); + elm_object_domain_translatable_part_text_set(layout, "elm.text", PACKAGE, "IDS_ST_SK_OK"); + elm_object_content_set(popup, layout); + evas_object_show(layout); + + btn_popup = elm_button_add(popup); + elm_object_style_set(btn_popup, "popup/circle/left"); + elm_object_part_content_set(popup, "button1", btn_popup); + elm_access_info_set(btn_popup, ELM_ACCESS_INFO, dgettext(PACKAGE, "IDS_ST_SK_OK")); + evas_object_smart_callback_add(btn_popup, "clicked", voice_input_back_disagree_cb, voicedata); + evas_object_data_set(btn_popup, "popup", popup); + evas_object_show(btn_popup); + + std::string path_ic_left = path + "/images/tw_ic_popup_btn_delete.png"; + icon = elm_image_add(btn_popup); + elm_image_file_set(icon, path_ic_left.c_str(), NULL); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(btn_popup, "elm.swallow.content", icon); + evas_object_show(icon); + + btn_popup = elm_button_add(popup); + elm_object_style_set(btn_popup, "popup/circle/right"); + elm_access_info_set(btn_popup, ELM_ACCESS_INFO, dgettext(PACKAGE, "IDS_ST_SK_OK")); + elm_object_part_content_set(popup, "button2", btn_popup); + evas_object_smart_callback_add(btn_popup, "clicked", voice_input_back_agree_cb, voicedata); + evas_object_data_set(btn_popup, "popup", popup); + evas_object_show(btn_popup); + + std::string path_ic_right = path + "/images/tw_ic_popup_btn_check.png"; + icon = elm_image_add(btn_popup); + elm_image_file_set(icon, path_ic_right.c_str(), NULL); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(btn_popup, "elm.swallow.content", icon); + evas_object_show(icon); + + evas_object_show(popup); + + voicedata->mo->discard_popup_opened = EINA_TRUE; +} MoreOption::MoreOption(Evas_Object *naviframe, void* voicedata) : nf(naviframe) , more_option_layout(NULL) , item(NULL) , option_opened(EINA_FALSE) + , discard_popup_opened(EINA_FALSE) , voicedata(voicedata) { /** todo. implement constructor */ + voice_input_back_agree = false; } MoreOption::~MoreOption() { /** todo. implement destructor */ -// if(more_option_layout) -// evas_object_del(more_option_layout); + if(more_option_layout) + { + PRINTFUNC(DLOG_DEBUG, "del callbacks"); + evas_object_smart_callback_del(more_option_layout, "item,clicked", moreItemClicked); + evas_object_smart_callback_del(more_option_layout, "item,selected", moreItemSelected); + + evas_object_smart_callback_del(more_option_layout, "more,option,opened", moreOptionOpened); + evas_object_smart_callback_del(more_option_layout, "more,option,closed", moreOptionClosed); + } } void MoreOption::Create() { @@ -68,45 +192,15 @@ void MoreOption::AddLayout() { /** add layout */ more_option_layout = eext_more_option_add(nf); - if(!more_option_layout) + if(!more_option_layout){ PRINTFUNC(DLOG_ERROR, "It's failed to create layout"); + return; + } - evas_object_smart_callback_add(more_option_layout, "more,option,opened", - [](void *data, Evas_Object *obj, void *event_info){ - PRINTFUNC(DLOG_DEBUG, "more option is opened!!! \n"); - - if(!data) return; - - /** - * if more option is completed, stt have to be stopped. - * - */ - MoreOption *opt = (MoreOption *)data; - VoiceData *vd = (VoiceData *) opt->voicedata; - try { - if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || - vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { - vd->sttmanager->Cancel(); - } - } - catch(is::stt::SttException &e) { - PRINTFUNC(DLOG_ERROR, "%s", e.what()); - } - - opt->option_opened = EINA_TRUE; - }, this); - - evas_object_smart_callback_add(more_option_layout, "more,option,closed", - [](void *data, Evas_Object *obj, void *event_info){ - PRINTFUNC(DLOG_DEBUG, "more option is closed!!! \n"); - - MoreOption *opt = (MoreOption *)data; - VoiceData *vd = (VoiceData *) opt->voicedata; - - activate_circle_scroller_for_stt_textbox(vd, EINA_TRUE); + evas_object_smart_callback_add(more_option_layout, "more,option,opened", moreOptionOpened, this); + evas_object_smart_callback_add(more_option_layout, "more,option,closed", moreOptionClosed, this); - opt->option_opened = EINA_FALSE; - }, this); + hideCue(); evas_object_show(more_option_layout); } @@ -142,17 +236,8 @@ void MoreOption::SetContentLayout(Evas_Object *content) { vd->sttmanager->GetCurrent() == STT_STATE_READY) { PRINTFUNC(DLOG_DEBUG, "STT_STATE_CREATED || STT_STATE_READY\n"); - } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); - vd->effector->Stop(); - try{ - vd->sttmanager->Stop(); - }catch(is::stt::SttException &e){ - PRINTFUNC(DLOG_ERROR, "reason : %s", e.what()); - } - - } else if (vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); + } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { + PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING or STT_STATE_PROCESSING\n"); try{ vd->sttmanager->Cancel(); }catch(is::stt::SttException &e){ @@ -162,6 +247,10 @@ void MoreOption::SetContentLayout(Evas_Object *content) { } } + if (voice_input_back_agree == false && !is_textblock_empty(vd)){ + show_discard_popup(vd); + return EINA_FALSE; + } elm_naviframe_item_pop_to(elm_naviframe_bottom_item_get(vd->naviframe)); vd->disclaimer = 0; @@ -169,44 +258,37 @@ void MoreOption::SetContentLayout(Evas_Object *content) { powerUnlock(); _back_to_genlist_for_selector(); + destroy_voice(); + return EINA_TRUE; } - if(opt->option_opened == EINA_FALSE){ + if (opt->option_opened == EINA_FALSE){ PRINTFUNC(DLOG_DEBUG, "pop_cb called in STT view\n"); - if(vd->sttmanager){ + if (vd->sttmanager){ if (vd->sttmanager->GetCurrent() == STT_STATE_CREATED || vd->sttmanager->GetCurrent() == STT_STATE_READY) { PRINTFUNC(DLOG_DEBUG, "STT_STATE_CREATED || STT_STATE_READY\n"); - } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); - vd->effector->Stop(); - try{ - vd->sttmanager->Stop(); - }catch(is::stt::SttException &e){ - PRINTFUNC(DLOG_ERROR, "reason : %s", e.what()); - } - - } else if (vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); + } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { + PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING or STT_STATE_PROCESSING\n"); try{ vd->sttmanager->Cancel(); }catch(is::stt::SttException &e){ PRINTFUNC(DLOG_ERROR, "reason : %s", e.what()); } } + } - _back_to_genlist_for_selector(); - - destroy_voice(); - - return EINA_TRUE; - } else { - PRINTFUNC(DLOG_DEBUG, "naviframe transition, not finished\n"); + if (voice_input_back_agree == false && !is_textblock_empty(vd)){ + show_discard_popup(vd); return EINA_FALSE; } + + _back_to_genlist_for_selector(); + destroy_voice(); + return EINA_TRUE; } return EINA_FALSE; }, this); @@ -219,6 +301,8 @@ void MoreOption::Update() const char* display_lang = get_lang_label(lang); eext_more_option_item_part_text_set(item, "selector,sub_text", display_lang); + + showCue(); } Evas_Object* MoreOption::AddLanguageIcon(Evas_Object *parent) { @@ -257,18 +341,139 @@ void MoreOption::AddMorePage() { eext_more_option_item_part_content_set(item, "item,icon", img); - evas_object_smart_callback_add(more_option_layout, "item,clicked", - [](void *data, Evas_Object *obj, void *event_info) - { - PRINTFUNC(DLOG_DEBUG, "item,clicked"); - if(g_setting_window == NULL) - create_setting_window(obj); - }, NULL); + evas_object_smart_callback_add(more_option_layout, "item,clicked", moreItemClicked, NULL); + evas_object_smart_callback_add(more_option_layout, "item,selected", moreItemSelected , NULL); +} + +void MoreOption::moreOptionOpened(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "more option is opened!!! \n"); + + if(!data) return; + + /** + * if more option is completed, stt have to be stopped. + * + */ + MoreOption *opt = (MoreOption *)data; + VoiceData *vd = (VoiceData *) opt->voicedata; + + if(vd && vd->setup_timer){ + ecore_timer_del(vd->setup_timer); + vd->setup_timer = NULL; + } - evas_object_smart_callback_add(more_option_layout, "item,selected", - [](void *data, Evas_Object *obj, void *event_info) + try { + if (vd && vd->sttmanager && (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || + vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING)) { + vd->sttmanager->Cancel(); + } + } + catch(is::stt::SttException &e) { + PRINTFUNC(DLOG_ERROR, "%s", e.what()); + } + + // Clear guide text + if(vd && vd->layout_main){ + elm_object_signal_emit((Evas_Object *)vd->layout_main, "idle,state,text,hidden", "elm"); + } + + opt->option_opened = EINA_TRUE; +} + +void MoreOption::moreOptionClosed(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "more option is closed!!! \n"); + + if (!data) return; + + MoreOption *opt = (MoreOption *)data; + VoiceData *vd = (VoiceData *) opt->voicedata; + + if (opt->option_opened == EINA_TRUE && is_textblock_empty(vd)) { + restart_listening(2.0); + } + + if (vd) + activate_circle_scroller_for_stt_textbox(vd, EINA_TRUE); + + opt->option_opened = EINA_FALSE; +} + +void MoreOption::moreItemClicked(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "item,clicked"); + if(g_setting_window == NULL) + create_setting_window(obj); +} + +void MoreOption::moreItemSelected(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "item,selected"); + if(!obj) return; + + Eext_Object_Item *selected_item = (Eext_Object_Item *)event_info; + + //for custom accessibility + if (elm_config_access_get()) { - PRINTFUNC(DLOG_DEBUG, "item,selected"); - }, NULL); + Evas_Object *panel = elm_object_part_content_get(obj, "elm.swallow.right"); + if (!panel) return; + + Evas_Object *rotary_selector = elm_object_content_get(panel); + if (!rotary_selector) return; + + Evas_Object *content = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rotary_selector), "content"); + if (!content) return; + + Evas_Object *content_access = elm_access_object_get(content); + if (!content_access) return; + + if (eext_more_option_item_part_text_get(selected_item, "selector,main_text")) + { + std::string text; + text = text + std::string(gettext("WDS_IME_HEADER_INPUT_LANGUAGES_ABB")) + " "; + + if(eext_more_option_item_part_text_get(selected_item, "selector,sub_text")) + text = text + std::string(eext_more_option_item_part_text_get(selected_item, "selector,sub_text")); + + elm_access_info_set(content_access, ELM_ACCESS_INFO, text.c_str()); + } + } +} + +void MoreOption::hideCue() +{ + Evas_Object *panel_right = NULL; + if (!more_option_layout) { + PRINTFUNC(DLOG_ERROR, "more_option_layout == NULL"); + return; + } + + panel_right = elm_object_part_content_get(more_option_layout, "elm.swallow.right"); + if (!panel_right) { + PRINTFUNC(DLOG_ERROR, "panel_right == NULL"); + return; + } + + elm_object_signal_emit(panel_right, "cue,hide", "elm"); +} + +void MoreOption::showCue() +{ + Evas_Object *panel_right = NULL; + + if (!more_option_layout) { + PRINTFUNC(DLOG_ERROR, "more_option_layout == NULL"); + return; + } + + panel_right = elm_object_part_content_get(more_option_layout, "elm.swallow.right"); + if (!panel_right) { + PRINTFUNC(DLOG_ERROR, "panel_right == NULL"); + return; + } + + elm_object_signal_emit(panel_right, "cue,show", "elm"); } diff --git a/src/SttFeedback.cpp b/src/SttFeedback.cpp index a3b5f2a..ec7d91f 100755 --- a/src/SttFeedback.cpp +++ b/src/SttFeedback.cpp @@ -73,6 +73,11 @@ void SttFeedback::OnResult( vd.result_type = STT_RESULT_EVENT_PARTIAL_RESULT; voice_get_string(result.c_str(), &vd); break; + case STT_RESULT_EVENT_ERROR: + PRINTFUNC(DLOG_DEBUG, "STT_RESULT_EVENT_ERROR"); + vd.state = STT_STATE_VAL_NOT_RECOGNISED; + set_animation_state(&vd); + break; default: PRINTFUNC(DLOG_INFO, ""); break; diff --git a/src/w-input-emoticon.cpp b/src/w-input-emoticon.cpp index d94c553..2a19150 100755 --- a/src/w-input-emoticon.cpp +++ b/src/w-input-emoticon.cpp @@ -280,7 +280,7 @@ static Eina_Bool _custom_back_cb2(void *data, Elm_Object_Item *it) lazy_loading_timer_for_contents = NULL; } - if(emoticon_drawing_pool.used == 0){ + if (emoticon_drawing_pool.used == 0){ evas_object_del(emoticon_drawing_pool.content); } emoticon_drawing_pool.content = NULL; @@ -368,7 +368,6 @@ void set_recent_emoticons(vector &emoticon_list, int val) if (PREFERENCE_ERROR_NONE != ret) { PRINTFUNC(DLOG_ERROR, "preference_set_string error!(%d)", ret); } - } static void _drawing_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) @@ -376,7 +375,7 @@ static void _drawing_app_control_reply_cb(app_control_h request, app_control_h r char* path = NULL; app_control_get_extra_data(reply, APP_CONTROL_DATA_PATH, &path); - if(path){ + if (path){ PRINTFUNC(DLOG_DEBUG, "path=%s", path); char *pathes[] = {path, }; reply_to_sender_by_callback(NULL, "image", (const char **)pathes, NULL); @@ -566,7 +565,7 @@ static Evas_Object * __emoticon_gl_1_content_get(void *data, Evas_Object *obj, c emoticon_drawing_pool.content = btn; emoticon_drawing_pool.used = 0; return btn; - } else if(!strcmp(part, "base")){ + } else if (!strcmp(part, "base")){ Evas_Object* btn = elm_button_add(obj); elm_object_style_set(btn, "ime/transparent"); return btn; diff --git a/src/w-input-selector.cpp b/src/w-input-selector.cpp index 57320ec..0bfbeff 100755 --- a/src/w-input-selector.cpp +++ b/src/w-input-selector.cpp @@ -1130,14 +1130,14 @@ void _app_service(app_control_h service, void* user_data) if (mime_type) free(mime_type); goto ACTIVATE; - } else if(!strncmp(mime_type, "audio/", strlen("audio/"))) { + } else if (!strncmp(mime_type, "audio/", strlen("audio/"))) { app_data->mime_type = MIME_TYPE_AUDIO; app_data->app_type = APP_TYPE_STT; _stt_clicked_cb((void *)app_data, NULL, NULL); if (mime_type) free(mime_type); goto ACTIVATE; - } else if(!strncmp(mime_type, "text/", strlen("text/"))) { + } else if (!strncmp(mime_type, "text/", strlen("text/"))) { app_data->mime_type = MIME_TYPE_TEXT; } } @@ -1212,6 +1212,7 @@ void _app_pause(void* user_data) void _app_resume(void* user_data) { PRINTFUNC(DLOG_DEBUG, ""); + resume_voice(); } void _app_terminate(void* user_data) diff --git a/src/w-input-stt-ise.cpp b/src/w-input-stt-ise.cpp index db786c4..0d14c94 100755 --- a/src/w-input-stt-ise.cpp +++ b/src/w-input-stt-ise.cpp @@ -68,7 +68,7 @@ void show_voice_input(Evas_Object *parent, const char *lang, void (*get_string)( vconf_notify_key_changed(VCONFKEY_ISE_STT_LANGUAGE, _stt_lang_changed_cb, my_voicedata); } -void pause_voice(){ +void pause_voice(){ PRINTFUNC(DLOG_DEBUG, "pause_voice"); powerUnlock(); @@ -77,8 +77,15 @@ void pause_voice(){ } } - void destroy_voice() - { +void resume_voice(){ + if (my_voicedata) { + PRINTFUNC(DLOG_DEBUG, "resume_voice"); + on_stt_resume(my_voicedata); + } +} + +void destroy_voice() +{ PRINTFUNC(DLOG_DEBUG, "destroy voice"); //stt_feedback_deinitialize(); // It disable w-input-selector touch sound. So removed. diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index 1795cc8..6f137e5 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -48,6 +48,10 @@ using namespace std; "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,31 @@ 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 sroll_bar_show = false; + +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 +148,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 +206,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 +230,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 +280,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 +317,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){ - 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; @@ -344,7 +362,7 @@ void _update_textblock(void *data) void voice_get_string(const char *keyValue, _VoiceData *voicedata) { - if(!voicedata) + if (!voicedata) return; char* strbuf = NULL; @@ -404,71 +422,45 @@ static void on_mic_button_press_cb(void *data, Evas_Object *obj, void *event_inf 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); + edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background"); - 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"); - } + 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 += " "; } @@ -491,18 +483,15 @@ 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 +504,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 +517,7 @@ void stt_feedback(FeedbackType type) } ret = feedback_deinitialize(); - if(ret != 0) + if (ret != 0) { PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!"); return; @@ -540,7 +529,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 +539,14 @@ 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; @@ -582,12 +571,11 @@ static Eina_Bool _idler_cb(void *data) 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"); @@ -610,28 +598,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 +627,66 @@ 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; + 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"); + PRINTFUNC(DLOG_DEBUG, "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, 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 +697,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"); + 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 +720,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) @@ -770,15 +784,20 @@ static Eina_Bool _start_timer_cb(void* data) voicedata->sttmanager->Start(); } catch (is::stt::SttException &e) { + PRINTFUNC(DLOG_ERROR, "%s", e.what()); + if (e.GetEcode() == STT_ERROR_OUT_OF_NETWORK) { + PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR"); set_guide_text(voicedata, _(SK_NETWORK_ERROR)); voicedata->state = STT_STATE_VAL_INIT; } else if (e.GetEcode() == STT_ERROR_RECORDER_BUSY) { - 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 +809,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 - @@ -839,8 +909,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 +935,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 +950,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 +981,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 +1095,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 +1173,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 +1186,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 +1216,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 +1226,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 +1338,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 +1400,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,7 +1417,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); @@ -1361,8 +1431,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 +1441,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 +1467,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 +1487,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 +1499,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 +1518,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); + } + + elm_entry_entry_set(main_entry, str); + elm_entry_cursor_pos_set(main_entry, pos); -// 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); + 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,18 +1557,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 { @@ -1520,12 +1611,11 @@ 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; @@ -1539,7 +1629,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 +1648,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 +1664,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 +1694,141 @@ 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) { - Evas_Object *progressbar = NULL; + PRINTFUNC(DLOG_DEBUG, "show_bottom_button"); + 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 (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"); + } +} -// ea_theme_object_color_replace(progressbar, "B065L6", "AO012"); +void hide_bottom_button(void* data) +{ + PRINTFUNC(DLOG_DEBUG, "hide_bottom_button"); + if (!data) return; - evas_object_show(progressbar); + VoiceData *voicedata = (VoiceData *)data; - return progressbar; + elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,hide,bottom_button", "elm"); + PRINTFUNC(DLOG_DEBUG, "Emit idle,state,hide,bottom_button"); +} + +static void scroll_effect_start(void* data, Evas_Object* obj, const char* s, const char* e) +{ + PRINTFUNC(DLOG_DEBUG, "scroll_effect_start"); + if (!data) return; + + VoiceData *voicedata = (VoiceData *)data; + + if (voicedata->state == STT_STATE_VAL_LISTENING) + return; + + if (is_textblock_empty(voicedata) == true) + return; + + hide_bottom_button(voicedata); +} + +static void scroll_effect_stop(void* data, Evas_Object* obj, const char* s, const char* e) +{ + PRINTFUNC(DLOG_DEBUG, "scroll_effect_stop"); + if (!data) return; + + VoiceData *voicedata = (VoiceData *)data; + + if (voicedata->state == STT_STATE_VAL_LISTENING) + return; + + Evas_Coord x, y, w, h; + Evas_Object *scroller = (Evas_Object *)voicedata->scroller; + Evas_Object *inner_layout = NULL; + + inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout"); + + evas_object_geometry_get(inner_layout , &x, &y, &w, &h); + PRINTFUNC(DLOG_DEBUG, "scroll x=%d, y=%d, w=%d, h=%d", x, y, w, h); + + if (is_textblock_empty(voicedata) == true) + return; + + if (h+y != (360 - BOTTOM_PADDING_AREA)) { + show_bottom_button(voicedata, true); + } else { + show_bottom_button(voicedata, false); + } } static Eina_Bool _custom_back_cb(void *data, Elm_Object_Item *it) @@ -1657,7 +1857,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) @@ -1682,10 +1881,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); @@ -1693,7 +1891,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); @@ -1701,55 +1899,26 @@ static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata) elm_object_part_content_set(layout_main, "EFFECT_BG", canvas); - // 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; + // 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; - 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); @@ -1790,15 +1959,11 @@ 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->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; @@ -1853,12 +2018,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; @@ -1880,6 +2039,7 @@ static Eina_Bool init_view(void *data) voicedata->layout_main = create_fullview(voicedata->naviframe, voicedata); if (voicedata->layout_main) { + hide_bottom_button(voicedata); evas_object_show(voicedata->layout_main); } @@ -1936,11 +2096,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()); } @@ -1948,8 +2110,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); } } @@ -1957,6 +2119,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, ""); @@ -1966,7 +2143,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; } @@ -1974,6 +2171,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; @@ -1984,27 +2186,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; @@ -2043,6 +2229,3 @@ void on_destroy(VoiceData *r_voicedata) delete voicedata; } } - - - -- 2.7.4