Modify the screen UI for stt mode and refactoring code
[platform/core/uifw/inputdelegator.git] / src / MoreOption.cpp
index 7550d75..39bc951 100755 (executable)
 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");
 }