Fix issue detected by static analysis tool
[platform/core/uifw/inputdelegator.git] / src / w-input-stt-voice.cpp
index 642224b..17524fa 100755 (executable)
@@ -19,9 +19,9 @@
 #include <Ecore_IMF.h>
 #include <Ecore.h>
 #include <device/power.h>
-#include <efl_assist.h>
 #include <app_common.h>
 #include <app.h>
+#include <app_preference.h>
 #include <string>
 #include <efl_extension.h>
 #include <feedback.h>
@@ -64,10 +64,10 @@ 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 void set_guide_text(VoiceData *vd, const char* text, bool translatable = false);
 
-const char *supported_language[7] = {
+const char *supported_language[] = {
                 "auto",
                 "en_US",
                 "es_US",
@@ -78,7 +78,7 @@ const char *supported_language[7] = {
 };
 
 
-const char *disp_lang_array[7] = {
+const char *disp_lang_array[] = {
                 "",
                 "English (United States)",
                 "Español (América Latina)",
@@ -313,7 +313,6 @@ static Eina_Bool _update_textblock_timer_cb(void *data)
 
        if(voicedata->state == STT_STATE_VAL_LISTENING){
                if(voicedata->guide_text_timer != NULL){
-                       PRINTFUNC(DLOG_DEBUG, "Skip hide_guide_text");
                        ecore_timer_del(voicedata->guide_text_timer);
                        voicedata->guide_text_timer = NULL;
                }
@@ -393,21 +392,48 @@ static Eina_Bool _recognition_failure_cb(void *data)
 
 void start_by_press(VoiceData *voicedata)
 {
-       PRINTFUNC(DLOG_DEBUG, "");
-
+       LOGD("start_by_press ");
        edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
-
-       return;
 }
 
 static void on_mic_button_press_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       PRINTFUNC(NO_PRINT, "");
-
+       LOGD("on_mic_button_press_cb");
        VoiceData *voicedata = (VoiceData *)data;
-       edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
+       if (!voicedata) return;
 
-       return;
+       if (voicedata->sttmanager != NULL &&
+               (voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING
+               || voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING)) {
+               try {
+                       voicedata->state = STT_STATE_VAL_INIT;
+                       voicedata->sttmanager->Stop();
+               }
+               catch (is::stt::SttException &e) {
+               }
+
+               if (voicedata->effector)
+                       voicedata->effector->Stop(true);
+
+               if (NULL != voicedata->start_timer) {
+                       ecore_timer_del(voicedata->start_timer);
+                       voicedata->start_timer = NULL;
+               }
+               if (NULL != voicedata->guide_text_timer) {
+                       ecore_timer_del(voicedata->guide_text_timer);
+                       voicedata->guide_text_timer = NULL;
+               }
+               if (NULL != voicedata->refresh_timer) {
+                       ecore_timer_del(voicedata->refresh_timer);
+                       voicedata->refresh_timer = NULL;
+               }
+       } else {
+               if (NULL != voicedata->guide_text_timer) {
+                       ecore_timer_del(voicedata->guide_text_timer);
+                       voicedata->guide_text_timer = NULL;
+               }
+               edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
+       }
 }
 
 
@@ -449,7 +475,7 @@ static void on_confirm_button_clicked_cb(void *data, Evas_Object *obj, void *eve
        reply_to_sender_by_callback(result_text.c_str(), "voice");
        destroy_voice();
        powerUnlock();
-       elm_exit();
+       ui_app_exit();
 
        return;
 }
@@ -525,32 +551,32 @@ static Eina_Bool _idler_cb(void *data)
 
 
        if(true == _app_stt_initialize(voicedata)) {
-               PRINTFUNC(NO_PRINT, "_app_stt_initialize None Error");
+               LOGD("_app_stt_initialize None Error");
                voicedata->voicefw_state = 1;
                voicedata->state = STT_STATE_VAL_INIT;
        } else {
                voicedata->voicefw_state = 0;
-               PRINTFUNC(DLOG_ERROR, "Initialization Fail!<br>Check STT-daemon is running");
+               LOGD("Initialization Fail!<br>Check STT-daemon is running");
        }
 
        Evas_Object *canvas = elm_object_part_content_get(voicedata->layout_main, "EFFECT_BG");
 
-
        is::ui::WInputSttMicEffect *ieffect = new is::ui::WInputSttMicEffect();
-       ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+       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;
 
-       ieffect->SetProgressBar(voicedata->progressbar);
-       ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+               ieffect->SetProgressBar(voicedata->progressbar);
+               ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
+       }
 
        voicedata->mo->Update();
 
        elm_access_highlight_set(voicedata->mic_button);
 
-
        return ECORE_CALLBACK_CANCEL;
 }
 
@@ -606,23 +632,21 @@ 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 Eina_Bool hide_guide_text(void *data){
-       if(data) {
-               VoiceData *voicedata = (VoiceData *) data;
-
-               voicedata->guide_text_timer = NULL;
-
+       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);
 
-               PRINTFUNC(DLOG_ERROR, "");
-               elm_object_part_text_set(voicedata->layout_main, "elm.text", "");
-       }
        return ECORE_CALLBACK_CANCEL;
 }
 
+
 static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
 {
-       //elm_object_signal_emit(vd->layout_main, "idle,state,text,visible", "elm");
+       elm_object_signal_emit(vd->layout_main, "idle,state,guide_text,bottom", "elm");
 
        if(translatable)
                elm_object_domain_translatable_part_text_set(vd->layout_main, "elm.text", PACKAGE, text);
@@ -631,7 +655,7 @@ static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
 
        if(!strcmp(text, SK_SPEAK_NOW)){
                if(vd->guide_text_timer == NULL)
-                       vd->guide_text_timer = ecore_timer_add(2.0, hide_guide_text, vd);
+                       vd->guide_text_timer = ecore_timer_add(2.0, change_guide_text, vd);
        }
 }
 
@@ -642,22 +666,6 @@ static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
  */
 void set_animation_state(VoiceData *voicedata)
 {
-       PRINTFUNC(DLOG_DEBUG, "");
-
-       PRINTFUNC(DLOG_ERROR, "voicedata->state == %s",
-               voicedata->state == STT_STATE_VAL_INIT ?
-                       "STT_STATE_VAL_INIT" :
-               voicedata->state == STT_STATE_VAL_LISTENING ?
-                       "STT_STATE_VAL_LISTENING" :
-               voicedata->state == STT_STATE_VAL_PREPARE_LISTENING ?
-                       "STT_STATE_VAL_PREPARE_LISTENING" :
-               voicedata->state == STT_STATE_VAL_PROCESSING ?
-                       "STT_STATE_VAL_PROCESSING" :
-               voicedata->state == STT_STATE_VAL_PREPARE_PROCESSING ?
-                       "STT_STATE_VAL_PREPARE_PROCESSING" :
-               voicedata->state == STT_STATE_VAL_TERMINATING ?
-                       "STT_STATE_VAL_TERMINATING" : "STT_STATE_VAL_NOT_RECOGNISED");
-
        if (voicedata->state == STT_STATE_VAL_INIT) {
 #if 0
                if (voicedata->sttmanager->GetCurrent() == STT_STATE_READY) {
@@ -673,9 +681,8 @@ void set_animation_state(VoiceData *voicedata)
                if(voicedata->effector)
                        voicedata->effector->Stop(true);
 
-               set_guide_text(voicedata, "");
+               set_guide_text(voicedata, "Tap mic to speak");
 
-               PRINTFUNC(DLOG_DEBUG, "%d", voicedata->stt_results.size());
                powerLock((void*)voicedata, false);
        } else if (voicedata->state == STT_STATE_VAL_LISTENING) {
                set_guide_text(voicedata, SK_SPEAK_NOW, true);
@@ -691,7 +698,6 @@ void set_animation_state(VoiceData *voicedata)
 
                stt_feedback(VIBRATION_STOP);
        } else {
-               PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR");
                set_guide_text(voicedata, _(SK_RECOGNITION_FAILED));
                //_elm_access_say(voicedata->layout_main, _(SK_RECOGNITION_FAILED));
 
@@ -705,8 +711,6 @@ void set_animation_state(VoiceData *voicedata)
                        voicedata->effector->Stop(true);
 
                voicedata->refresh_timer = ecore_timer_add(2.0, _recognition_failure_cb, voicedata);
-
-               //powerLock((void*)voicedata, false);
        }
 }
 
@@ -759,20 +763,15 @@ 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) {
-                               PRINTFUNC(DLOG_WARN, "STT is used by another application");
-                               show_popup_toast(_(SK_STT_BUSY), false);
+                               set_guide_text(voicedata, _(SK_STT_BUSY));
                                voicedata->state = STT_STATE_VAL_INIT;
                        } else {
-                               PRINTFUNC(DLOG_WARN, "Check error code");
-                               show_popup_toast(_(SK_STT_BUSY), false);
+                               set_guide_text(voicedata, _(SK_STT_BUSY));
                                voicedata->state = STT_STATE_VAL_INIT;
                        }
                }
@@ -791,6 +790,8 @@ void on_initial_anim_press_cb(void *data, Evas_Object *obj, const char *emission
        PRINTFUNC(NO_PRINT, "");
 
        VoiceData *vd = (VoiceData *)data;
+       if (vd == NULL)
+               return;
 
        int tempVal = vd->sttmanager->GetCurrent();
        if(tempVal == STT_STATE_CREATED) {
@@ -856,6 +857,8 @@ 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;
 
@@ -949,6 +952,7 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
                                        strncpy(text, p+1, strlen(s)-(p-s)-2);
                                } else {
                                        strncpy(text, s, strlen(s));
+                                       text[strlen(s)] = '\0';
                                }
                        } else {
                                strncpy(text, "", strlen(""));
@@ -961,47 +965,38 @@ char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
 
 static Evas_Object *__get_genlist_item_content(void *data, Evas_Object *obj, const char *part)
 {
-       int index = (int)data;
+       int index = (intptr_t)data;
        Evas_Object * content = NULL;
 
-       if (!strcmp(part, "elm.icon")) {
+       if (!strcmp(part, "elm.icon") ||
+           !strcmp(part, "elm.swallow.end")) {
                content = elm_radio_add(obj);
+               elm_object_style_set(content, "list");
                elm_radio_state_value_set(content, index);
                elm_radio_group_add(content, radio_gp);
                evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
                evas_object_propagate_events_set(content, EINA_TRUE);
                evas_object_size_hint_align_set(content, EVAS_HINT_FILL, EVAS_HINT_FILL);
-               elm_object_style_set(content, "list");
        }
        return content;
 }
 
 static int get_language_value()
 {
-#if 1
        int lang = 0, ret = 0;
 
        ret = preference_get_int(PREFERENCE_ISE_STT_LANGUAGE, &lang);
-       if(PREFERENCE_ERROR_NONE != ret){
+       if (PREFERENCE_ERROR_NONE != ret) {
                PRINTFUNC(DLOG_ERROR, "preference_get_int error!(%d)", ret);
-               preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, (int)2); //auto
-               lang = 2;
+               preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, STT_VOICE_N66_AUTO); //auto
+               lang = STT_VOICE_N66_AUTO;
        }
-#else
-       int lang = 0, ret = 0;
 
-       ret = vconf_get_int(VCONFKEY_ISE_STT_LANGUAGE, &lang);
-       if (ret !=0) {
-               PRINTFUNC(DLOG_ERROR, "Vconf_get_int error!(%d)", ret);
-       }
-#endif
-       if(g_is_n66) {
-               if(lang < 0 || lang > 6) {
-                       PRINTFUNC(DLOG_WARN, "vconf lang orig(%d) to be 0", lang);
-                       lang = 0;
-               }
-               PRINTFUNC(DLOG_DEBUG, "n66 current language value for stt (%s).", disp_lang_array[lang]);
+       if (lang < 0 || lang > (int)(sizeof(supported_language)/sizeof(supported_language[0])-1)) {
+               PRINTFUNC(DLOG_WARN, "vconf lang orig(%d) to be 0", lang);
+               lang = 0;
        }
+       PRINTFUNC(DLOG_DEBUG, "n66 current language value for stt (%s).", disp_lang_array[lang]);
 
        return lang;
 }
@@ -1011,19 +1006,11 @@ static void set_language_value(int type)
        // Add implementation to store language type.
        int ret = 0;
 
-#if 1
        ret = preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, (int)type);
        if(PREFERENCE_ERROR_NONE != ret){
                PRINTFUNC(DLOG_ERROR, "preference_set_int error!(%d)", ret);
        }
 
-#else
-       ret = vconf_set_int(VCONFKEY_ISE_STT_LANGUAGE, (int) type);
-       if (ret != 0) {
-               PRINTFUNC(DLOG_ERROR, "Vconf_set_int error!(%d)", ret);
-               return;
-       }
-#endif
        PRINTFUNC(DLOG_DEBUG, "language type (%d)", type);
 
        // Update string
@@ -1157,14 +1144,15 @@ static Evas_Object *create_language_list(Evas_Object *parent)
 
        elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
        elm_genlist_homogeneous_set(genlist, EINA_TRUE);
-//     uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE);
-
+#ifdef _CIRCLE
        Evas_Object *circle_language_genlist = eext_circle_object_genlist_add(genlist, NULL);
        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);
        eext_rotary_object_event_activated_set(circle_language_genlist, EINA_TRUE);
-
+#else
+       evas_object_show(genlist);
+#endif
        int i = 0;
        int lang_val = 0;
        Elm_Object_Item * item = NULL;
@@ -1181,11 +1169,16 @@ static Evas_Object *create_language_list(Evas_Object *parent)
        itc_title.item_style = "title";
        itc_title.func.text_get = __get_genlist_title_label;
        itc_title.func.content_get = NULL;
-
+#ifdef _WEARABLE
        item = elm_genlist_item_append(genlist, &itc_title, (void *)-1, NULL, ELM_GENLIST_ITEM_GROUP, NULL, genlist);
+#endif
 
        // 2 line text
+#ifdef _WEARABLE
        itc_2text.item_style = "2text.1icon.1/sub1.multiline";
+#else
+       itc_2text.item_style = "type1";
+#endif
        itc_2text.func.text_get = __get_genlist_item_label;
        itc_2text.func.content_get = __get_genlist_item_content;
 
@@ -1202,40 +1195,52 @@ static Evas_Object *create_language_list(Evas_Object *parent)
        }
 
        // 1 line text
+#ifdef _WEARABLE
        itc_1text.item_style = "1text.1icon.1";
+#else
+       itc_1text.item_style = "type1";
+#endif
        itc_1text.func.text_get = __get_genlist_item_label;
        itc_1text.func.content_get = __get_genlist_item_content;
 
-       if(g_is_n66) {
-               for (i = 1; i < 7; i++)
-               {
-                       char *s = (char *)disp_lang_array[i];
+       for (i = 1; i < (long)(sizeof(disp_lang_array)/sizeof(disp_lang_array[0])); i++)
+       {
+               char *s = (char *)disp_lang_array[i];
 
-                       if(strchr(s, '(')){
-                               item = item_append(genlist, itc_2text, i, language_set_genlist_radio_cb, genlist);
-                       } else {
-                               item = item_append(genlist, itc_1text, i, language_set_genlist_radio_cb, genlist);
-                       }
+               if(strchr(s, '(')){
+                       item = item_append(genlist, itc_2text, i, language_set_genlist_radio_cb, genlist);
+               } else {
+                       item = item_append(genlist, itc_1text, i, language_set_genlist_radio_cb, genlist);
+               }
 
-                       if(lang_val == i) {
-                               PRINTFUNC(DLOG_DEBUG, "%d item is choiced.", i);
-                               elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
-                       }
+               if(lang_val == i) {
+                       PRINTFUNC(DLOG_DEBUG, "%d item is choiced.", i);
+                       elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+               }
 
-                       if ( item == NULL ) {
-                               PRINTFUNC(DLOG_DEBUG, "elm_genlist_item_append was failed");
-                               break;
-                       }
+               if ( item == NULL ) {
+                       PRINTFUNC(DLOG_DEBUG, "elm_genlist_item_append was failed");
+                       break;
                }
        }
+       Elm_Object_Item *dummy;
+       Elm_Genlist_Item_Class *itc_dummy = elm_genlist_item_class_new();
+       if (itc_dummy) {
+               itc_dummy->item_style = "title";
+               itc_dummy->func.text_get = NULL;
+               itc_dummy->func.content_get = NULL;
+       }
+       dummy = elm_genlist_item_append(genlist, itc_dummy, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+       elm_genlist_item_select_mode_set(dummy, ELM_OBJECT_SELECT_MODE_NONE);
 
+       LOGD("before elm_radio_value_set > lang_val = %d", lang_val);
+       radio_gp = elm_radio_add(genlist);
+       elm_radio_state_value_set(radio_gp, lang_val);
        elm_radio_value_set(radio_gp, lang_val);
 
        elm_object_signal_callback_add(genlist, "elm,system,language,change", "elm", language_changed_cb, NULL);
-//     eext_rotary_event_callback_set(genlist, _language_list_rotary_cb, NULL);
        evas_object_smart_callback_add(genlist, "realized", _language_list_item_realized, NULL);
 
-
        g_evt_key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _ise_keydown_cb, NULL);
        return genlist;
 }