From 14f0deffe01d498bf18693417fac9f5b9a38ad0a Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Tue, 25 Jul 2017 13:35:20 +0900 Subject: [PATCH 01/16] Add drawing feature in emoticon input mode Change-Id: I58785c2289022243bc36a36e6623403c32d3abef Signed-off-by: sungwook79.park --- res/wearable/edje/w-input-selector.edc | 143 ++++++++++++++++++++++++++++++++- res/wearable/edje/w-input-stt.edc | 41 ++++++++++ src/w-input-emoticon.cpp | 113 +++++++++++++++++++++++--- 3 files changed, 283 insertions(+), 14 deletions(-) diff --git a/res/wearable/edje/w-input-selector.edc b/res/wearable/edje/w-input-selector.edc index c00e082..9be1ffa 100755 --- a/res/wearable/edje/w-input-selector.edc +++ b/res/wearable/edje/w-input-selector.edc @@ -805,4 +805,145 @@ collections { } ) } -} + } + +// ------------------------------------------------Drawing ---------------------------------------------// + styles{ + style { + name: "list_text_drawing_normal"; + base: "font=Tizen:style=Regular font_size=36 align=left color=#FFFFFF color_class=AT021 wrap=word text_class=AT021"; + } + } + + images { + image, "./fadeout_masking.#.png" COMP; + } + + group { + name: "elm/genlist/item/drawing/default"; + data.item: "treesize" 0; + data.item: "flips" "elm.flip.icon elm.flip.content"; + data.item: "texts" "elm.text"; + data.item: "contents" "base elm.icon"; + data.item: "vi_effect" "on"; + data.item: "dim" "off"; + data.item: "focus_bg" "off"; + + parts { + PART_LIST_BG + PART_LIST_PADDINGS( + 0, 0, + LIST_BUTTON_PADDING_2BUTTON_TOP_SIZE_INC, LIST_BUTTON_PADDING_BOTTOM_SIZE_INC + ) + + PART(SWALLOW, "base",DESC_LRTB("elm.padding.left", "elm.padding.right", "elm.padding.top", "elm.padding.bottom", min: 360 0; fixed: 1 0; visible: 1;)) + + part { + name: "elm.padding.text.left_a"; + type: SPACER; + scale: 1; + mouse_events: 0; + repeat_events: 0; + description { + state: "default" 0.0; + min: (30+76+24) 0; + max: (30+76+24) 51; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to_x: "elm.padding.left"; to_y: "elm.padding.top"; } + rel2 { relative: 1.0 0.0; to_x: "elm.padding.left"; to_y: "elm.padding.bottom"; } + } + } + part { + name: "elm.padding.text.left_b"; + type: SPACER; + scale: 1; + mouse_events: 0; + repeat_events: 0; + description { + state: "default" 0.0; + min: (360-30) 0; + max: (360-30) 51; + fixed: 1 0; + align: 0.0 0.5; + rel1 { relative: 1.0 1.0; to_x: "elm.padding.left"; to_y: "elm.padding.top"; } + rel2 { relative: 1.0 0.0; to_x: "elm.padding.left"; to_y: "elm.padding.bottom"; } + } + } + + part { + name: "elm.text"; + type: TEXTBLOCK; + scale: 1; + mouse_events: 0; + repeat_events: 0; + description { + state: "default" 0.0; + min: 0 48; + max: -1 48; + fixed: 0 1; + align: 0.5 0.5; + text { + min: 0 1; + max: 1 1; + ellipsis: -1.0; + fade_ellipsis: 1.0; + style: "list_text_drawing_normal"; + } + rel1 { relative: 1.0 1.0; to_x: "elm.padding.text.left_a"; to_y: "elm.padding.top"; } + rel2 { relative: 1.0 0.0; to_x: "elm.padding.text.left_b"; to_y: "elm.padding.bottom"; } + } + } + + part { + name: "fadeout"; + type: IMAGE; + scale: 1; + mouse_events: 0; + repeat_events: 0; + description { + state: "default" 0.0; + align: 1.0 0.5; + min: 49 44; + max: 49 44; + fixed: 1 1; + rel1 { relative: 1.0 1.0; to_x: "elm.padding.text.left_b"; to_y: "elm.padding.top"; } + rel2 { relative: 1.0 0.0; to_x: "elm.padding.text.left_b"; to_y: "elm.padding.bottom"; } + image.normal: "./fadeout_masking.#.png"; + color: 0 0 0 10; + } + } + + part { + name: "elm.padding.icon.left"; + type: SPACER; + scale: 1; + mouse_events: 0; + repeat_events: 0; + description { + state: "default" 0.0; + min: 24 0; + max: 24 51; + fixed: 1 1; + align: 1.0 0.5; + rel1 { relative: 0.0 1.0; to_x: "elm.text"; to_y: "elm.padding.top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.text"; to_y: "elm.padding.bottom"; } + } + } + + part { + name: "elm.icon"; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 1.0 0.5; + fixed: 1 1; + min: 76 76; + max: 76 76; + rel1 { relative: 0.0 1.0; to_x: "elm.padding.icon.left"; to_y: "elm.padding.top"; } + rel2 { relative: 0.0 0.0; to_x: "elm.padding.icon.left"; to_y: "elm.padding.bottom"; } + } + } + } + } diff --git a/res/wearable/edje/w-input-stt.edc b/res/wearable/edje/w-input-stt.edc index 082731d..13168ba 100755 --- a/res/wearable/edje/w-input-stt.edc +++ b/res/wearable/edje/w-input-stt.edc @@ -58,6 +58,7 @@ collections image, "./tw_bottom_btn_bg.png" COMP; image, "./w_mode_ic_bg.png" COMP; + image, "./wi_drawing_bg.png" COMP; image, "./b_stt_text_fade_out.png" COMP; image, "./b_stt_icon_btn.png" COMP; @@ -433,6 +434,21 @@ collections name: "AT023D"; color: 0 0 0 40; } + color_class + { + name: "AO0391"; + color: 0 151 207 100; + } + color_class + { + name: "AO0391P"; + color: 0 0 0 50; + } + color_class + { + name: "AO0391D"; + color: 0 0 0 40; + } } styles @@ -1903,6 +1919,31 @@ collections } } + group { name: "elm/button/base/ime_button_drawing"; + inherit: "elm/button/base/ime_button"; + parts { + part { name: "bg"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + min: 76 76; + max: 76 76; + color_class: "AO0391"; + visible: 1; + image.normal: "./wi_drawing_bg.png"; + } + description { state: "pressed" 0.0; + inherit: "default" 0.0; + color_class: "AO0391P"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color_class: "AO0391D"; + } + } + } + } + group { name: "elm/button/base/ime_button_stt_confirm"; inherit: "elm/button/base/ime_button"; parts { diff --git a/src/w-input-emoticon.cpp b/src/w-input-emoticon.cpp index 4bd585b..a7f9a9c 100755 --- a/src/w-input-emoticon.cpp +++ b/src/w-input-emoticon.cpp @@ -49,6 +49,7 @@ typedef struct { static Elm_Object_Item *it_emoticon_empty = NULL; static Elm_Object_Item *it_emoticon_recent_group = NULL; static Elm_Object_Item *it_emoticon_emoji_group = NULL; +static Elm_Object_Item* it_drawing = NULL; static Elm_Object_Item *it_last = NULL; static Elm_Genlist_Item_Class *itc_emoticon = NULL; @@ -72,6 +73,7 @@ typedef struct emoticon_content } emoticon_content_s; static emoticon_content_s emoticon_contents_pool[EMOTICON_CNT] = { 0, }; +static emoticon_content_s emoticon_drawing_pool = { 0, }; static emoticon_content_s emoticon_recents_pool[RECENT_CNT] = { 0, }; @@ -278,6 +280,11 @@ static Eina_Bool _custom_back_cb2(void *data, Elm_Object_Item *it) lazy_loading_timer_for_contents = NULL; } + if(emoticon_drawing_pool.used == 0){ + evas_object_del(emoticon_drawing_pool.content); + } + emoticon_drawing_pool.content = NULL; + //Recent EMOTICONS : the recent emoiton need to be updated whenever emoticon view is generated, so deleted here. for (i=0;i< RECENT_CNT;i++) { @@ -361,6 +368,44 @@ 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) +{ + char* path = NULL; + app_control_get_extra_data(reply, APP_CONTROL_DATA_PATH, &path); + + if(path){ + PRINTFUNC(DLOG_DEBUG, "path=%s", path); + free(path); + reply_to_sender_by_callback((const char*)path, "image", NULL); + } + ui_app_exit(); +} + +static void _drawing_item_clicked_cb(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "%s", __func__); + App_Data* ad = (App_Data*) data; + if (!ad) + return; + + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + if (item) + elm_genlist_item_selected_set(item, EINA_FALSE); + + /* launch */ + app_control_h request = NULL; + app_control_create(&request); + app_control_set_app_id(request, "com.samsung.sketch"); + //app_control_set_app_id(request, "wearable-input.sketch"); + + int ret = app_control_send_launch_request(request, _drawing_app_control_reply_cb, NULL); + if (ret != APP_CONTROL_ERROR_NONE) { + PRINTFUNC(DLOG_DEBUG, "error code = 0x%x", ret); + } + app_control_destroy(request); } static void _emoticon_item_clicked_cb(void *data, Evas_Object * obj, void *event_info) @@ -442,7 +487,6 @@ static void _emoticon_gl_lang_changed(void *data, Evas_Object *obj, void *event_ static char * __emoticon_gl_text_get(void *data, Evas_Object *obj, const char *part) { //PRINTFUNC(DLOG_DEBUG,"part = %s", part); - const char* str = (const char*) data; if (!str) return NULL; @@ -460,7 +504,7 @@ static void _emoticon_gl_content_unswallowed_cb(void *data, Evas_Object *obj, vo const Elm_Genlist_Item_Class *itc = elm_genlist_item_item_class_get(it); -// PRINTFUNC(DLOG_DEBUG,"%s - stype[%s]", __func__, itc->item_style); + //PRINTFUNC(DLOG_DEBUG,"%s - stype[%s]", __func__, itc->item_style); if (!strcmp(itc->item_style, "3button_flat")) { int index = (uintptr_t)elm_object_item_data_get(it); //PRINTFUNC(DLOG_DEBUG,"it = %p", it); @@ -488,16 +532,55 @@ static void _emoticon_gl_content_unswallowed_cb(void *data, Evas_Object *obj, vo if (index + 2 < recent_emoji_list.size()) { emoticon_recents_pool[index+2].used = 0; } + } else if (it_drawing == it) { + //PRINTFUNC(DLOG_DEBUG,"it_drawing = %p", it_drawing); + emoticon_drawing_pool.used = 0; } } +static Evas_Object * __emoticon_gl_1_content_get(void *data, Evas_Object *obj, const char *part) +{ + if (!strcmp(part, "elm.icon")) { + Evas_Object* btn = elm_button_add(obj); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + Evas_Object* ic = elm_image_add(btn); + elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE); + + string path = get_resource_path(); + if (_WEARABLE) + path = path + "wearable/"; + else if (_TV) + path = path + "tv/"; + else + path = path + "mobile/"; + + elm_object_style_set(btn, "ime_button_drawing"); + string path_ic = path + "images/wi_drawing_icon.png"; + PRINTFUNC(DLOG_DEBUG, "path_ic = %s", path_ic.c_str()); + elm_image_file_set(ic, path_ic.c_str(), NULL); + elm_object_content_set(btn, ic); + evas_object_layer_set(btn, 32000); + + emoticon_drawing_pool.index = 0; + emoticon_drawing_pool.content = btn; + emoticon_drawing_pool.used = 0; + return btn; + } else if(!strcmp(part, "base")){ + Evas_Object* btn = elm_button_add(obj); + elm_object_style_set(btn, "ime/transparent"); + return btn; + } + return NULL; +} + static Evas_Object * __emoticon_gl_recent_content_get(void *data, Evas_Object *obj, const char *part) { if (is_content_reuse_on) { unsigned int index = (uintptr_t)data; int new_index = 0; - //PRINTFUNC(DLOG_DEBUG,"%s %d", part, index); + //PRINTFUNC(DLOG_DEBUG,"%s %d", part, index); if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) { if (!strcmp(part, "elm.icon.1")) { if (index >= recent_emoji_list.size()) return NULL; @@ -523,7 +606,7 @@ static Evas_Object * __emoticon_gl_recent_content_get(void *data, Evas_Object *o unsigned int index = (uintptr_t)data; int new_index = 0; - // PRINTFUNC(DLOG_DEBUG,"%s %d", part, index); + //PRINTFUNC(DLOG_DEBUG,"%s %d", part, index); if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) { if (!strcmp(part, "elm.icon.1")) { if (index >= recent_emoji_list.size()) return NULL; @@ -548,7 +631,6 @@ static Evas_Object * __emoticon_gl_recent_content_get(void *data, Evas_Object *o static Evas_Object * __emoticon_gl_emoticon_content_get(void *data, Evas_Object *obj, const char *part) { //PRINTFUNC(DLOG_DEBUG,"%s", __func__); - if (is_content_reuse_on) { int index = (uintptr_t)data; int new_index = 0; @@ -614,7 +696,6 @@ static Evas_Object * __emoticon_gl_emoticon_content_get(void *data, Evas_Object return NULL; } - void _create_reusable_recents(Evas_Object *parent) { if (!parent) { @@ -802,8 +883,14 @@ void _update_emoticon_items(void *data) itc_dummy->func.state_get = NULL; itc_dummy->func.del = NULL; - Elm_Genlist_Item_Class *itc_group = elm_genlist_item_class_new(); + Elm_Genlist_Item_Class *itc_1text_1icon = elm_genlist_item_class_new(); + itc_1text_1icon->item_style = "drawing"; + itc_1text_1icon->func.text_get = __emoticon_gl_text_get; + itc_1text_1icon->func.content_get = __emoticon_gl_1_content_get; + itc_1text_1icon->func.state_get = NULL; + itc_1text_1icon->func.del = NULL; + Elm_Genlist_Item_Class *itc_group = elm_genlist_item_class_new(); itc_group->item_style = "groupindex"; itc_group->func.text_get = __emoticon_gl_text_get; itc_group->func.content_get = NULL; @@ -811,9 +898,6 @@ void _update_emoticon_items(void *data) itc_group->func.del = NULL; Elm_Genlist_Item_Class *itc_recent = elm_genlist_item_class_new(); - if (is_content_reuse_on) { -// itc_recent->content_reusable = EINA_TRUE; - } itc_recent->item_style = "3button_flat_recent"; itc_recent->func.text_get = NULL; itc_recent->func.content_get = __emoticon_gl_recent_content_get; @@ -821,9 +905,6 @@ void _update_emoticon_items(void *data) itc_recent->func.del = NULL; itc_emoticon = elm_genlist_item_class_new(); - if (is_content_reuse_on) { -// itc_emoticon->content_reusable = EINA_TRUE; - } itc_emoticon->item_style = "3button_flat"; itc_emoticon->func.text_get = NULL; itc_emoticon->func.content_get = __emoticon_gl_emoticon_content_get; @@ -833,6 +914,10 @@ void _update_emoticon_items(void *data) // dummy title for empty space it_emoticon_empty = elm_genlist_item_append(gl, itc_dummy, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + // Drawing + it_drawing = elm_genlist_item_append(gl, itc_1text_1icon, "Doodle", NULL, ELM_GENLIST_ITEM_NONE, _drawing_item_clicked_cb, (void *)app_data); + first_it = it_drawing; + if (recent_emoji_list.size() > 0) { if (is_content_reuse_on) { _create_reusable_recents(gl); @@ -877,6 +962,7 @@ void _update_emoticon_items(void *data) elm_genlist_item_class_free(itc_recent); elm_genlist_item_class_free(itc_group); + elm_genlist_item_class_free(itc_1text_1icon); elm_genlist_item_class_free(itc_dummy); } @@ -889,6 +975,7 @@ void ise_show_emoticon_list(void *data) it_emoticon_empty = NULL; it_emoticon_recent_group = NULL; it_emoticon_emoji_group = NULL; + it_drawing = NULL; it_last = NULL; get_recent_emoticons(recent_emoji_list); -- 2.7.4 From 5b633f28bf048df0eccebc99445cd118ad9c6c66 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Tue, 25 Jul 2017 19:01:06 +0900 Subject: [PATCH 02/16] Fix issue detected by static analysis tool Change-Id: I0f272e71f07c1b11d3927312442f3b75b0caa91a Signed-off-by: Jihoon Kim --- src/w-input-stt-voice.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index 820299c..3f8e754 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -569,14 +569,13 @@ static Eina_Bool _idler_cb(void *data) Evas_Object *canvas = elm_object_part_content_get(voicedata->layout_main, "EFFECT_BG"); is::ui::WInputSttMicEffect *ieffect = new is::ui::WInputSttMicEffect(); - if (ieffect) + if (ieffect) { ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle()); - is::ui::MicEffector *effector = new is::ui::MicEffector(canvas, voicedata->layout_main, *ieffect); - voicedata->ieffect = ieffect; - voicedata->effector = effector; + is::ui::MicEffector *effector = new is::ui::MicEffector(canvas, voicedata->layout_main, *ieffect); + voicedata->ieffect = ieffect; + voicedata->effector = effector; - if (ieffect) { ieffect->SetProgressBar(voicedata->progressbar); ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle()); } -- 2.7.4 From 8f56e97798140f71b25e8ea2bea68e32035c5b02 Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Wed, 26 Jul 2017 16:44:23 +0900 Subject: [PATCH 03/16] Adopt the package name that changed to org.tizen.sketch when calling drawing function Change-Id: Ief78b3a6ddc00c2b7de89ea661cdceb5e89a3ce2 Signed-off-by: sungwook79.park --- src/w-input-emoticon.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/w-input-emoticon.cpp b/src/w-input-emoticon.cpp index a7f9a9c..995a955 100755 --- a/src/w-input-emoticon.cpp +++ b/src/w-input-emoticon.cpp @@ -398,8 +398,7 @@ static void _drawing_item_clicked_cb(void *data, Evas_Object * obj, void *event_ /* launch */ app_control_h request = NULL; app_control_create(&request); - app_control_set_app_id(request, "com.samsung.sketch"); - //app_control_set_app_id(request, "wearable-input.sketch"); + app_control_set_app_id(request, "org.tizen.sketch"); int ret = app_control_send_launch_request(request, _drawing_app_control_reply_cb, NULL); if (ret != APP_CONTROL_ERROR_NONE) { -- 2.7.4 From 795bc9917b27c02fce3e6caa1578d59035b167af Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Mon, 31 Jul 2017 13:56:43 +0900 Subject: [PATCH 04/16] Modify the operation for app control to path for image input Change-Id: I15b9cd62c811e29ef6be405ed778ad7210ddd797 Signed-off-by: sungwook79.park --- src/w-input-emoticon.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/w-input-emoticon.cpp b/src/w-input-emoticon.cpp index 995a955..ea1140a 100755 --- a/src/w-input-emoticon.cpp +++ b/src/w-input-emoticon.cpp @@ -378,8 +378,9 @@ static void _drawing_app_control_reply_cb(app_control_h request, app_control_h r if(path){ PRINTFUNC(DLOG_DEBUG, "path=%s", path); + char *pathes[] = {path, }; + reply_to_sender_by_callback(NULL, "image", (const char **)pathes); free(path); - reply_to_sender_by_callback((const char*)path, "image", NULL); } ui_app_exit(); } -- 2.7.4 From b1ad982d7d88ca1280fb36217816cd5758c78f2a Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Mon, 31 Jul 2017 15:46:01 +0900 Subject: [PATCH 05/16] Fix issue that detected by static analysis tool Change-Id: I4b6698fff33df9a627943ec0c9e8315adadacaf6 Signed-off-by: sungwook79.park --- inc/w-input-stt-voice.h | 1 + src/w-input-stt-ise.cpp | 2 +- src/w-input-stt-voice.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/inc/w-input-stt-voice.h b/inc/w-input-stt-voice.h index 435b4f9..685f252 100755 --- a/inc/w-input-stt-voice.h +++ b/inc/w-input-stt-voice.h @@ -76,6 +76,7 @@ #define EVAS_CANDIDATE_LAYER 32000 +int init_voicedata(VoiceData *r_voicedata); 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); diff --git a/src/w-input-stt-ise.cpp b/src/w-input-stt-ise.cpp index da6e71f..3dab87d 100755 --- a/src/w-input-stt-ise.cpp +++ b/src/w-input-stt-ise.cpp @@ -49,7 +49,7 @@ void show_voice_input(Evas_Object *parent, const char *lang, void (*get_string)( PRINTFUNC(DLOG_ERROR, "%d::::Heap Overflow, Voice Input cannot be shown!", __LINE__); return; } - memset(my_voicedata, 0, sizeof(VoiceData)); + init_voicedata(my_voicedata); } if (my_voicedata) { diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index 3f8e754..77b8bb1 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -1770,6 +1770,44 @@ int is_lang_supported_by_stt(char lang[]) return FALSE; } +int init_voicedata(VoiceData *r_voicedata) +{ + VoiceData *voicedata = (VoiceData *)r_voicedata; + if (!voicedata) { + return FALSE; + } + + voicedata->voicefw_state = 0; + voicedata->voicefw_handle = NULL; + voicedata->naviframe = NULL; + voicedata->layout_main = NULL; + voicedata->progressbar = NULL; + voicedata->scroller = NULL; + voicedata->main_entry = NULL; + voicedata->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; + voicedata->result_type = 0; + voicedata->disclaimer = 0; + voicedata->mo = NULL; + voicedata->sttfeedback = NULL; + voicedata->sttmanager = NULL; + voicedata->ieffect = NULL; + voicedata->effector = NULL; + + return TRUE; +} + int init_voice(Evas_Object *parent, const char *lang, VoiceData *r_voicedata) { PRINTFUNC(DLOG_DEBUG, "[init_voice]"); -- 2.7.4 From d820c96713094f1d9c9ad0278f9055bdfc71b313 Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Tue, 1 Aug 2017 09:41:13 +0900 Subject: [PATCH 06/16] Modify the operation of app control for prediction hint Change-Id: I2bbc82e6aae5d37a2339bf7e294c6880af5ff989 Signed-off-by: sungwook79.park --- src/w-input-smartreply.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/w-input-smartreply.cpp b/src/w-input-smartreply.cpp index aae5a0e..3a0624a 100644 --- a/src/w-input-smartreply.cpp +++ b/src/w-input-smartreply.cpp @@ -147,10 +147,10 @@ bool input_smartreply_init(app_control_h app_control) */ ret = app_control_get_extra_data(app_control, - "template_context", &message); + APP_CONTROL_DATA_INPUT_PREDICTION_HINT, &message); if (ret != APP_CONTROL_ERROR_NONE) { - PRINTFUNC(DLOG_WARN, "Can not get template_context %d", ret); + PRINTFUNC(DLOG_WARN, "Can not get APP_CONTROL_DATA_INPUT_PREDICTION_HINT %d", ret); return false; } -- 2.7.4 From 1e84304beb0ae72a1b49a07d62a73aeac2308fce Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Wed, 2 Aug 2017 17:52:08 +0900 Subject: [PATCH 07/16] Adopt to execute app control with mime type Change-Id: I9fac1058198ea2c588d1c7f0985627d63905bed3 Signed-off-by: sungwook79.park --- inc/w-input-emoticon.h | 1 + inc/w-input-selector.h | 10 ++++++++++ org.tizen.inputdelegator.xml | 1 + src/w-input-emoticon.cpp | 30 ++++++++++++++++++++++-------- src/w-input-selector.cpp | 11 ++++++++++- 5 files changed, 44 insertions(+), 9 deletions(-) diff --git a/inc/w-input-emoticon.h b/inc/w-input-emoticon.h index 709fd76..047081a 100755 --- a/inc/w-input-emoticon.h +++ b/inc/w-input-emoticon.h @@ -17,6 +17,7 @@ #define W_INPUT_EMOTICON_H_ void ise_show_emoticon_list(void *data); +void launch_drawing_app(void *data); #endif /* W_INPUT_EMOTICON_H_ */ diff --git a/inc/w-input-selector.h b/inc/w-input-selector.h index c5afd21..e79cbf5 100755 --- a/inc/w-input-selector.h +++ b/inc/w-input-selector.h @@ -52,6 +52,8 @@ enum { APP_TYPE_REPLY, APP_TYPE_HANDWRITING, APP_TYPE_KEYBOARD, + APP_TYPE_DRAWING, + APP_TYPE_RECORDING, }; enum { @@ -59,6 +61,13 @@ enum { REPLY_APP_CONTROL, }; +enum { + MIME_TYPE_ALL = 0, + MIME_TYPE_IMAGE, + MIME_TYPE_AUDIO, + MIME_TYPE_TEXT, +}; + typedef enum { TIZEN_PROFILE_UNKNOWN = 0, TIZEN_PROFILE_MOBILE = 0x1, @@ -88,6 +97,7 @@ typedef struct appdata{ app_control_h source_app_control; int app_type; + int mime_type; int reply_type; char* res_path; char* shared_res_path; diff --git a/org.tizen.inputdelegator.xml b/org.tizen.inputdelegator.xml index bad1540..5b2829b 100755 --- a/org.tizen.inputdelegator.xml +++ b/org.tizen.inputdelegator.xml @@ -10,6 +10,7 @@ + diff --git a/src/w-input-emoticon.cpp b/src/w-input-emoticon.cpp index ea1140a..a2ab3c9 100755 --- a/src/w-input-emoticon.cpp +++ b/src/w-input-emoticon.cpp @@ -883,12 +883,15 @@ void _update_emoticon_items(void *data) itc_dummy->func.state_get = NULL; itc_dummy->func.del = NULL; - Elm_Genlist_Item_Class *itc_1text_1icon = elm_genlist_item_class_new(); - itc_1text_1icon->item_style = "drawing"; - itc_1text_1icon->func.text_get = __emoticon_gl_text_get; - itc_1text_1icon->func.content_get = __emoticon_gl_1_content_get; - itc_1text_1icon->func.state_get = NULL; - itc_1text_1icon->func.del = NULL; + Elm_Genlist_Item_Class *itc_1text_1icon = NULL; + if (app_data->mime_type == MIME_TYPE_ALL) { + itc_1text_1icon = elm_genlist_item_class_new(); + itc_1text_1icon->item_style = "drawing"; + itc_1text_1icon->func.text_get = __emoticon_gl_text_get; + itc_1text_1icon->func.content_get = __emoticon_gl_1_content_get; + itc_1text_1icon->func.state_get = NULL; + itc_1text_1icon->func.del = NULL; + } Elm_Genlist_Item_Class *itc_group = elm_genlist_item_class_new(); itc_group->item_style = "groupindex"; @@ -915,8 +918,10 @@ void _update_emoticon_items(void *data) it_emoticon_empty = elm_genlist_item_append(gl, itc_dummy, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); // Drawing - it_drawing = elm_genlist_item_append(gl, itc_1text_1icon, "Doodle", NULL, ELM_GENLIST_ITEM_NONE, _drawing_item_clicked_cb, (void *)app_data); - first_it = it_drawing; + if (app_data->mime_type == MIME_TYPE_ALL) { + it_drawing = elm_genlist_item_append(gl, itc_1text_1icon, "Doodle", NULL, ELM_GENLIST_ITEM_NONE, _drawing_item_clicked_cb, (void *)app_data); + first_it = it_drawing; + } if (recent_emoji_list.size() > 0) { if (is_content_reuse_on) { @@ -989,3 +994,12 @@ void ise_show_emoticon_list(void *data) } _update_emoticon_items(emoticon_list); } + +void launch_drawing_app(void *data) +{ + App_Data* ad = (App_Data*) data; + if (!ad) + return; + + _drawing_item_clicked_cb(ad, NULL, NULL); +} diff --git a/src/w-input-selector.cpp b/src/w-input-selector.cpp index e22274d..8646781 100755 --- a/src/w-input-selector.cpp +++ b/src/w-input-selector.cpp @@ -1117,6 +1117,7 @@ void _app_service(app_control_h service, void* user_data) app_control_clone(&(app_data->source_app_control), service); app_data->reply_type = REPLY_APP_NORMAL; + app_data->mime_type = MIME_TYPE_ALL; ret = app_control_get_mime(service, &mime_type); if (ret != APP_CONTROL_ERROR_NONE) { @@ -1125,13 +1126,21 @@ void _app_service(app_control_h service, void* user_data) if (mime_type) { LOGD("mime type = %s", mime_type); if (!strncmp(mime_type, "image/", strlen("image/"))) { - + app_data->mime_type = MIME_TYPE_IMAGE; + app_data->app_type = APP_TYPE_DRAWING; + launch_drawing_app((void *)app_data); + if (mime_type) + free(mime_type); + goto ACTIVATE; } 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/"))) { + app_data->mime_type = MIME_TYPE_TEXT; } } } -- 2.7.4 From db968048096c6791747016f6f5deaf5c371f1a03 Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Mon, 21 Aug 2017 19:27:33 +0900 Subject: [PATCH 08/16] Fix issue that Black screen displayed when exiting Voice input screen Change-Id: I965ceca6ae0527cefffbeaa6b25093be1f8461e4 Signed-off-by: sungwook79.park --- src/MoreOption.cpp | 2 +- src/w-input-stt-voice.cpp | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/MoreOption.cpp b/src/MoreOption.cpp index 5159e0c..7550d75 100755 --- a/src/MoreOption.cpp +++ b/src/MoreOption.cpp @@ -131,7 +131,7 @@ void MoreOption::SetContentLayout(Evas_Object *content) { MoreOption *opt = (MoreOption *)data; VoiceData *vd = (VoiceData *) opt->voicedata; - if(vd->disclaimer == 1){ + if(vd->disclaimer == 1){ PRINTFUNC(DLOG_ERROR, "pop to top"); //inb case of (selector view -> disclaimer view-> stt view) if(opt->option_opened == EINA_FALSE){ diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index 77b8bb1..d39c87c 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -1631,6 +1631,13 @@ static Evas_Object *create_progressbar(Evas_Object *parent) return progressbar; } +static Eina_Bool _custom_back_cb(void *data, Elm_Object_Item *it) +{ + PRINTFUNC(DLOG_DEBUG, ""); + _back_to_genlist_for_selector(); + return EINA_TRUE; +} + static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata) { PRINTFUNC(NO_PRINT, ""); @@ -1694,7 +1701,6 @@ 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"); @@ -1795,10 +1801,9 @@ int init_voicedata(VoiceData *r_voicedata) 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; @@ -1866,6 +1871,12 @@ 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) { -- 2.7.4 From 0565f55d16d2dd3f6678e71f70cc1f5f7e9f2e1a Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Tue, 22 Aug 2017 10:38:48 +0900 Subject: [PATCH 09/16] update package version to 0.1.170822 Change-Id: I30ef4a038c05643c0eb523d17d7c06907b97b0f5 Signed-off-by: sungwook79.park --- org.tizen.inputdelegator.xml | 2 +- packaging/org.tizen.inputdelegator.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.inputdelegator.xml b/org.tizen.inputdelegator.xml index 5b2829b..fd710e6 100755 --- a/org.tizen.inputdelegator.xml +++ b/org.tizen.inputdelegator.xml @@ -1,5 +1,5 @@ - + diff --git a/packaging/org.tizen.inputdelegator.spec b/packaging/org.tizen.inputdelegator.spec index 47f117f..493425d 100755 --- a/packaging/org.tizen.inputdelegator.spec +++ b/packaging/org.tizen.inputdelegator.spec @@ -9,7 +9,7 @@ Name: org.tizen.inputdelegator Summary: Input Delegator Application -Version: 0.1.170718 +Version: 0.1.170822 Release: 1 Group: Applications License: Apache-2.0 -- 2.7.4 From 2be8b14bbc2d7ad3c6ec19f782c6591538df0954 Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Tue, 22 Aug 2017 15:23:23 +0900 Subject: [PATCH 10/16] Initialize voidedata with new operation Change-Id: Ic191278ffd51bb6d2119e5a6eddcb8475352a037 Signed-off-by: sungwook79.park --- src/w-input-stt-ise.cpp | 2 +- src/w-input-stt-voice.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/w-input-stt-ise.cpp b/src/w-input-stt-ise.cpp index 3dab87d..db786c4 100755 --- a/src/w-input-stt-ise.cpp +++ b/src/w-input-stt-ise.cpp @@ -44,7 +44,7 @@ void show_voice_input(Evas_Object *parent, const char *lang, void (*get_string)( //stt_feedback_initialize(); if (!my_voicedata) { - my_voicedata = (VoiceData*)malloc(sizeof(VoiceData)); + my_voicedata = new VoiceData; if (my_voicedata == NULL) { PRINTFUNC(DLOG_ERROR, "%d::::Heap Overflow, Voice Input cannot be shown!", __LINE__); return; diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index d39c87c..fb0c086 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -1800,7 +1800,7 @@ int init_voicedata(VoiceData *r_voicedata) 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 = 1; @@ -2040,7 +2040,7 @@ void on_destroy(VoiceData *r_voicedata) voicedata->sttfeedback = NULL; } - free(voicedata); + delete voicedata; } } -- 2.7.4 From 21979ed92d01c3c2b0088f3a6a938256e262fc8e Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Tue, 29 Aug 2017 10:10:26 +0900 Subject: [PATCH 11/16] Remove unused variables Change-Id: I9227819101e8f3a6330092080b9160a044e099c1 Signed-off-by: Jihoon Kim --- src/w-input-selector.cpp | 7 +------ src/w-input-smartreply.cpp | 4 +--- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/w-input-selector.cpp b/src/w-input-selector.cpp index 8646781..d72a097 100755 --- a/src/w-input-selector.cpp +++ b/src/w-input-selector.cpp @@ -210,7 +210,6 @@ static void _keyboard_clicked_cb(void *data, Evas_Object * obj, void *event_info static void __ise_smartreply_gl_sel(void *data, Evas_Object *obj, void *event_info) { - App_Data* app_data = (App_Data*) data; Elm_Object_Item *item = (Elm_Object_Item *) event_info; if (item) { @@ -842,7 +841,6 @@ unsigned int _update_smartreply_items(void *user_data) Elm_Object_Item *first; Elm_Object_Item *menu; - Elm_Object_Item *pos; unsigned int i = 0; unsigned int len = 0; @@ -883,8 +881,6 @@ unsigned int _update_smartreply_items(void *user_data) itc->func.state_get = NULL; itc->func.del = NULL; - pos = menu; - for (i = 0; i < len; i++) { char *reply = "hello"; unsigned int j; @@ -898,7 +894,6 @@ unsigned int _update_smartreply_items(void *user_data) continue; PRINTFUNC(DLOG_DEBUG, "SmartReply = [%d]%s", i, reply); - for (j = 0; j < template_list.size(); j++) { const char *template_str; @@ -916,7 +911,7 @@ unsigned int _update_smartreply_items(void *user_data) if (matched == true) continue; - pos = elm_genlist_item_append(app_data->genlist, + elm_genlist_item_append(app_data->genlist, itc, (void *)(uintptr_t)i, NULL, diff --git a/src/w-input-smartreply.cpp b/src/w-input-smartreply.cpp index 3a0624a..aa1f5e6 100644 --- a/src/w-input-smartreply.cpp +++ b/src/w-input-smartreply.cpp @@ -317,8 +317,6 @@ bool input_smartreply_get_reply(void) bool input_smartreply_get_reply_async(void) { - int ret; - if (g_input_smartreply_data == NULL) { PRINTFUNC(DLOG_ERROR, "InputSmartreplyData uninitialized"); return false; @@ -334,7 +332,7 @@ bool input_smartreply_get_reply_async(void) return false; } - ret = smartreply_service_get_replies_async(g_input_smartreply_data->caller_id, + smartreply_service_get_replies_async(g_input_smartreply_data->caller_id, g_input_smartreply_data->sender, g_input_smartreply_data->message, _input_smartreply_get_reply_callback); -- 2.7.4 From 349ded7a02c15cd04a2d3a1ec6a2b5d172c38647 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Tue, 29 Aug 2017 20:12:48 +0900 Subject: [PATCH 12/16] Update package version to 0.1.170829 Change-Id: I00a0cd9b6ad1bcc4f2fcdd6ae50afe4abc77abf6 Signed-off-by: Jihoon Kim --- org.tizen.inputdelegator.xml | 2 +- packaging/org.tizen.inputdelegator.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.inputdelegator.xml b/org.tizen.inputdelegator.xml index fd710e6..5832351 100755 --- a/org.tizen.inputdelegator.xml +++ b/org.tizen.inputdelegator.xml @@ -1,5 +1,5 @@ - + diff --git a/packaging/org.tizen.inputdelegator.spec b/packaging/org.tizen.inputdelegator.spec index 493425d..e59273c 100755 --- a/packaging/org.tizen.inputdelegator.spec +++ b/packaging/org.tizen.inputdelegator.spec @@ -9,7 +9,7 @@ Name: org.tizen.inputdelegator Summary: Input Delegator Application -Version: 0.1.170822 +Version: 0.1.170829 Release: 1 Group: Applications License: Apache-2.0 -- 2.7.4 From f7fc0aa295fc1e0a8c51c7f54e7b44b30a4c2dbe Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Fri, 1 Sep 2017 15:57:54 +0900 Subject: [PATCH 13/16] Support API for set/get cursor position Change-Id: Ie28b7e1215d0309ec3ef2ec53a5a54f4da871713 Signed-off-by: sungwook79.park --- inc/w-input-selector.h | 3 ++- src/w-input-emoticon.cpp | 4 ++-- src/w-input-keyboard.cpp | 18 ++++++++++++++++-- src/w-input-selector.cpp | 11 +++++++---- src/w-input-stt-voice.cpp | 2 +- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/inc/w-input-selector.h b/inc/w-input-selector.h index e79cbf5..7ff2ed2 100755 --- a/inc/w-input-selector.h +++ b/inc/w-input-selector.h @@ -118,6 +118,7 @@ struct _InputKeyboardData char *default_text; char *return_key_type; int max_text_length; + int cursor_position_set; }; typedef struct _InputKeyboardData InputKeyboardData; @@ -130,7 +131,7 @@ typedef struct _InputTypeData InputTypeData; void _app_terminate(void* user_data); void reply_to_sender_by_callback_for_back(); -void reply_to_sender_by_callback(const char *value, const char *type, const char *path[]); +void reply_to_sender_by_callback(const char *value, const char *type, const char *path[], const char *cursor_pos); char* get_resource_path(); char* get_shared_resource_path(); void show_gl_focus(Eina_Bool bVisible); diff --git a/src/w-input-emoticon.cpp b/src/w-input-emoticon.cpp index a2ab3c9..d94c553 100755 --- a/src/w-input-emoticon.cpp +++ b/src/w-input-emoticon.cpp @@ -379,7 +379,7 @@ static void _drawing_app_control_reply_cb(app_control_h request, app_control_h r if(path){ PRINTFUNC(DLOG_DEBUG, "path=%s", path); char *pathes[] = {path, }; - reply_to_sender_by_callback(NULL, "image", (const char **)pathes); + reply_to_sender_by_callback(NULL, "image", (const char **)pathes, NULL); free(path); } ui_app_exit(); @@ -421,7 +421,7 @@ static void _emoticon_item_clicked_cb(void *data, Evas_Object * obj, void *event const Eina_Unicode unicode_event[2] = { (Eina_Unicode)emoticon_info[index].code, 0 }; char* utf_8 = eina_unicode_unicode_to_utf8(unicode_event, &length); - reply_to_sender_by_callback((const char*)utf_8, "emoticon", NULL); + reply_to_sender_by_callback((const char*)utf_8, "emoticon", NULL, NULL); PRINTFUNC(SECURE_DEBUG, "[%d]%s", index, utf_8); if (utf_8) diff --git a/src/w-input-keyboard.cpp b/src/w-input-keyboard.cpp index cd6356f..ba9a217 100755 --- a/src/w-input-keyboard.cpp +++ b/src/w-input-keyboard.cpp @@ -36,6 +36,7 @@ bool input_keyboard_init(app_control_h app_control) char *guide_text = NULL; char *return_key_type = "SEND"; char *max_text_length = NULL; + char *cursor_position_set = "0"; input_keyboard_deinit(); @@ -55,6 +56,10 @@ bool input_keyboard_init(app_control_h app_control) if (ret == APP_CONTROL_ERROR_NONE) { g_input_keyboard_data.max_text_length = atoi(max_text_length); } + ret = app_control_get_extra_data(app_control, "cursor_position_set", &cursor_position_set); + if (ret == APP_CONTROL_ERROR_NONE) { + g_input_keyboard_data.cursor_position_set = atoi(cursor_position_set); + } return true; } @@ -74,6 +79,7 @@ void input_keyboard_deinit(void) g_input_keyboard_data.guide_text = NULL; g_input_keyboard_data.return_key_type = "SEND"; g_input_keyboard_data.max_text_length = KEYBOARD_EDITOR_CHAR_COUNT_MAX; + g_input_keyboard_data.cursor_position_set = 0; return; } @@ -90,6 +96,9 @@ void exit_keyboard() const char *getText = elm_entry_entry_get(entry); LOGD("button key clicked!! : getText = %s", getText); + char cursorPosition[512]; + snprintf(cursorPosition, sizeof(cursorPosition), "%d", elm_entry_cursor_pos_get(entry)); + char *app_id = NULL; app_control_get_caller(app_data->source_app_control, &app_id); if (app_id != NULL) @@ -97,9 +106,8 @@ void exit_keyboard() app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT); set_source_caller_app_id(app_control); free(app_id); - reply_to_sender_by_callback(getText, "keyboard", NULL); + reply_to_sender_by_callback(getText, "keyboard", NULL, cursorPosition); ui_app_exit(); - } void btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) @@ -166,6 +174,9 @@ void create_fullscreen_editor(void *data) elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); evas_object_smart_callback_add(entry, "activated", enter_keydown_cb, ad); } + if (g_input_keyboard_data.cursor_position_set != 0) { + elm_entry_cursor_pos_set(entry, g_input_keyboard_data.cursor_position_set); + } evas_object_show(entry); elm_box_pack_end(box, entry); @@ -229,6 +240,9 @@ static Evas_Object *create_multiline_editfield_layout(Evas_Object *parent, void elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); evas_object_smart_callback_add(entry, "activated", enter_keydown_cb, ad); } + if (g_input_keyboard_data.cursor_position_set != 0) { + elm_entry_cursor_pos_set(entry, g_input_keyboard_data.cursor_position_set); + } evas_object_show(entry); elm_object_part_content_set(editfield, "elm.swallow.content", entry); diff --git a/src/w-input-selector.cpp b/src/w-input-selector.cpp index d72a097..57320ec 100755 --- a/src/w-input-selector.cpp +++ b/src/w-input-selector.cpp @@ -221,7 +221,7 @@ static void __ise_smartreply_gl_sel(void *data, Evas_Object *obj, void *event_in char *reply = input_smartreply_get_nth_item(index, &type); if (reply) { input_smartreply_send_feedback(reply); - reply_to_sender_by_callback(reply, "smartreply", NULL); + reply_to_sender_by_callback(reply, "smartreply", NULL, NULL); free(reply); elm_exit(); } @@ -240,7 +240,7 @@ static void __ise_template_gl_sel(void *data, Evas_Object *obj, void *event_info const std::vector template_list = input_template_get_list(); if (index < (int)template_list.size()) { - reply_to_sender_by_callback(gettext(template_list[index].text.c_str()), "template", NULL); + reply_to_sender_by_callback(gettext(template_list[index].text.c_str()), "template", NULL, NULL); ui_app_exit(); } } @@ -479,7 +479,7 @@ void set_source_caller_app_id(app_control_h app_control) } } -void reply_to_sender_by_callback(const char *value, const char *type, const char *path[]) +void reply_to_sender_by_callback(const char *value, const char *type, const char *path[], const char *cursor_position) { PRINTFUNC(DLOG_DEBUG, ""); @@ -498,6 +498,9 @@ void reply_to_sender_by_callback(const char *value, const char *type, const char app_control_add_extra_data_array(app_control, APP_CONTROL_DATA_PATH, path, 1); } + if (cursor_position != NULL) + app_control_add_extra_data(app_control, "cursor_position_get", cursor_position); + set_source_caller_app_id(app_control); ret = app_control_reply_to_launch_request(app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED); @@ -627,7 +630,7 @@ void _back_to_genlist_for_selector() } if (app_data->app_type == APP_TYPE_STT || app_data->app_type == APP_TYPE_EMOTICON || app_data->app_type == APP_TYPE_KEYBOARD){ PRINTFUNC(DLOG_DEBUG, "launched as STT/EMOTICON/KEYBOARD mode, So exit here."); - reply_to_sender_by_callback(NULL, NULL, NULL); + reply_to_sender_by_callback(NULL, NULL, NULL, NULL); ui_app_exit(); } } diff --git a/src/w-input-stt-voice.cpp b/src/w-input-stt-voice.cpp index fb0c086..1795cc8 100755 --- a/src/w-input-stt-voice.cpp +++ b/src/w-input-stt-voice.cpp @@ -479,7 +479,7 @@ static void on_confirm_button_clicked_cb(void *data, Evas_Object *obj, void *eve 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(); -- 2.7.4 From 5798b48ceb06da18d6331298eb37cb41a39cbc1f Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Mon, 4 Sep 2017 14:03:19 +0900 Subject: [PATCH 14/16] Update package version to 0.1.170904 Change-Id: I0c1c9adf0d23176674f666d90eb89041ea7dbd92 Signed-off-by: sungwook79.park --- org.tizen.inputdelegator.xml | 2 +- packaging/org.tizen.inputdelegator.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.inputdelegator.xml b/org.tizen.inputdelegator.xml index 5832351..801deaf 100755 --- a/org.tizen.inputdelegator.xml +++ b/org.tizen.inputdelegator.xml @@ -1,5 +1,5 @@ - + diff --git a/packaging/org.tizen.inputdelegator.spec b/packaging/org.tizen.inputdelegator.spec index e59273c..8816db5 100755 --- a/packaging/org.tizen.inputdelegator.spec +++ b/packaging/org.tizen.inputdelegator.spec @@ -9,7 +9,7 @@ Name: org.tizen.inputdelegator Summary: Input Delegator Application -Version: 0.1.170829 +Version: 0.1.170904 Release: 1 Group: Applications License: Apache-2.0 -- 2.7.4 From 24f5f31a600ec6887592f2e6291e73c8a2161304 Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Thu, 7 Sep 2017 13:28:52 +0900 Subject: [PATCH 15/16] 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 From cd7a7f9cd81ec863a4141712b3daf2aa09d2cc84 Mon Sep 17 00:00:00 2001 From: "sungwook79.park" Date: Thu, 7 Sep 2017 17:07:40 +0900 Subject: [PATCH 16/16] Update package version to 0.1.170907 Change-Id: I35ee090d6dcb3ed528657b1e2b6afac07425a3d3 Signed-off-by: sungwook79.park --- org.tizen.inputdelegator.xml | 2 +- packaging/org.tizen.inputdelegator.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.inputdelegator.xml b/org.tizen.inputdelegator.xml index 801deaf..e1ed2ee 100755 --- a/org.tizen.inputdelegator.xml +++ b/org.tizen.inputdelegator.xml @@ -1,5 +1,5 @@ - + diff --git a/packaging/org.tizen.inputdelegator.spec b/packaging/org.tizen.inputdelegator.spec index 8816db5..7770803 100755 --- a/packaging/org.tizen.inputdelegator.spec +++ b/packaging/org.tizen.inputdelegator.spec @@ -9,7 +9,7 @@ Name: org.tizen.inputdelegator Summary: Input Delegator Application -Version: 0.1.170904 +Version: 0.1.170907 Release: 1 Group: Applications License: Apache-2.0 -- 2.7.4