#include "Debug.h"
+#include <string>
#include <assert.h>
#include <iostream>
#include <stdexcept>
#include "w-input-stt-ise.h"
#include "w-input-stt-voice.h"
+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();
+ if (_WEARABLE)
+ path = path + "wearable/";
+ else if (_TV)
+ path = path + "tv/";
+ else
+ path = path + "mobile/";
+
+ popup = elm_popup_add(voicedata->naviframe);
+ elm_object_style_set(popup, "circle");
+ 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, "WDS_WNOTI_POP_ALL_CHANGES_WILL_BE_DISCARDED");
+ 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)
- , voicedata(voicedata) {
-
+ , more_option_layout(NULL)
+ , item(NULL)
+ , option_opened(EINA_FALSE)
+ , voicedata(voicedata)
+ , discard_popup_opened(EINA_FALSE) {
/** 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() {
-
try {
AddLayout();
AddMorePage();
}
void MoreOption::AddLayout() {
-
/** validation */
if(!nf)
PRINTFUNC(DLOG_ERROR, "Invalid naviframe.");
/** 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);
-
- opt->option_opened = EINA_FALSE;
-
+ 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);
- }, this);
+ hideCue();
evas_object_show(more_option_layout);
-
-
}
void MoreOption::SetContentLayout(Evas_Object *content) {
-
/**
* Set content layout
*
elm_object_part_content_set(more_option_layout, "elm.swallow.content", content);
Elm_Object_Item *nit = NULL;
- nit = elm_naviframe_item_push(nf, NULL, NULL, NULL, more_option_layout, "empty");
+ const char *item_style = NULL;
+ if (_WEARABLE)
+ item_style = "empty";
+ nit = elm_naviframe_item_push(nf, NULL, NULL, NULL, more_option_layout, item_style);
elm_naviframe_item_title_enabled_set(nit, EINA_FALSE, EINA_FALSE);
elm_naviframe_item_pop_cb_set(nit,
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){
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){
}
}
+ 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;
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);
void MoreOption::Update()
{
+ char lang[6] = {0, };
+ strncpy(lang, ((VoiceData *)voicedata)->kbd_lang , 5);
- char lang[6] = {0,};
- strncpy(lang, ((VoiceData *)voicedata)->kbd_lang , 5);
-
- char* display_lang = get_lang_label(lang);
- eext_more_option_item_part_text_set(item, "selector,sub_text", display_lang);
+ 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) {
-
Evas_Object *icon = elm_image_add(parent);
if (!icon) {
PRINTFUNC(DLOG_ERROR, "It's failed to add image.");
}
- std::string res_path;
- char *tmp_path = app_get_resource_path();
- if (tmp_path) {
- res_path = tmp_path;
- free(tmp_path);
- }
+ string res_path = get_resource_path();
+ if (_WEARABLE)
+ res_path = res_path + "wearable/";
+ else if (_TV)
+ res_path = res_path + "tv/";
+ else
+ res_path = res_path + "mobile/";
std::string image_path = res_path + "images/prompt_ic_languages.png";
return icon;
}
-
void MoreOption::AddMorePage() {
-
Evas_Object *img;
item = eext_more_option_item_append(more_option_layout);
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)
- {
+ 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;
+ }
+
+ 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());
+ }
- PRINTFUNC(DLOG_DEBUG, "item,clicked");
- if(g_setting_window == NULL)
- create_setting_window(obj);
- },NULL);
+ // Clear guide text
+ if(vd && vd->layout_main){
+ elm_object_signal_emit((Evas_Object *)vd->layout_main, "idle,state,text,hidden", "elm");
+ }
- evas_object_smart_callback_add(more_option_layout, "item,selected",
- [](void *data, Evas_Object *obj, void *event_info)
+ 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())
{
+ Evas_Object *panel = elm_object_part_content_get(obj, "elm.swallow.right");
+ if (!panel) return;
- PRINTFUNC(DLOG_DEBUG, "item,selected");
+ Evas_Object *rotary_selector = elm_object_content_get(panel);
+ if (!rotary_selector) return;
- Eext_Object_Item *selected_item = (Eext_Object_Item *)event_info;
+ Evas_Object *content = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rotary_selector), "content");
+ if (!content) return;
- //for custom accessibility
- if (elm_config_access_get())
+ 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"))
{
- Evas_Object *panel = elm_object_part_content_get(obj, "elm.swallow.right");
- if (!panel) return;
+ 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"));
- Evas_Object *rotary_selector = elm_object_content_get(panel);
- if (!rotary_selector) return;
+ elm_access_info_set(content_access, ELM_ACCESS_INFO, text.c_str());
+ }
+ }
+}
- Evas_Object *content = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rotary_selector), "content");
- if (!content) return;
+void MoreOption::hideCue()
+{
+ Evas_Object *panel_right = NULL;
+ if (!more_option_layout) {
+ PRINTFUNC(DLOG_ERROR, "more_option_layout == NULL");
+ return;
+ }
- Evas_Object *content_access = elm_access_object_get(content);
- if (!content_access) return;
+ panel_right = elm_object_part_content_get(more_option_layout, "elm.swallow.right");
+ if (!panel_right) {
+ PRINTFUNC(DLOG_ERROR, "panel_right == NULL");
+ return;
+ }
- if (eext_more_option_item_part_text_get(selected_item, "selector,main_text"))
- {
- std::string text;
- if(eext_more_option_item_part_text_get(selected_item, "selector,main_text"))
- text = text + std::string(eext_more_option_item_part_text_get(selected_item, "selector,main_text")) + " ";
+ elm_object_signal_emit(panel_right, "cue,hide", "elm");
+}
- if(eext_more_option_item_part_text_get(selected_item, "selector,main_text"))
- text = text + std::string(eext_more_option_item_part_text_get(selected_item, "selector,sub_text"));
+void MoreOption::showCue()
+{
+ Evas_Object *panel_right = NULL;
- elm_access_info_set(content_access, ELM_ACCESS_INFO, text.c_str());
- }
- }
- },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");
}