Prelaunch default assistant on setting change event 87/216587/1
authorJi-hoon Lee <dalton.lee@samsung.com>
Tue, 29 Oct 2019 07:03:40 +0000 (16:03 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Tue, 29 Oct 2019 07:03:40 +0000 (16:03 +0900)
Change-Id: I1a8f96a408bff8668d81020876cdebad0623e969

inc/multi_assistant_service.h
inc/multi_assistant_service_plugin.h
inc/multi_wakeup_recognizer.h
plugins/wakeup-manager/inc/wakeup_manager.h
plugins/wakeup-manager/inc/wakeup_manager_wrapper.h
plugins/wakeup-manager/src/wakeup_manager.cpp
plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp
src/multi_assistant_service.c
src/multi_assistant_service_plugin.c

index 0bbc37a..775245d 100644 (file)
@@ -81,6 +81,8 @@ int mas_set_current_client_by_appid(const char *appid);
 
 int mas_launch_client_by_wakeup_word(const char *wakeup_word);
 
+int mas_prelaunch_default_assistant();
+
 typedef enum {
        CLIENT_LAUNCH_MODE_ACTIVATION,
        CLIENT_LAUNCH_MODE_PRELAUNCH,
index 7bfd761..dbfd673 100644 (file)
@@ -169,6 +169,8 @@ typedef int (*wakeup_manager_set_previous_utterance_streaming_callback)(wakeup_s
 typedef int (*wakeup_manager_set_follow_up_streaming_callback)(wakeup_service_speech_streaming_cb callback, void* user_data);
 #define MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK "wakeup_manager_set_speech_status_callback"
 typedef int (*wakeup_manager_set_speech_status_callback)(wakeup_service_speech_status_cb callback, void* user_data);
+#define MA_WAKEUP_MANAGER_FUNC_SET_SETTING_CHANGED_CALLBACK "wakeup_manager_set_setting_changed_callback"
+typedef int (*wakeup_manager_set_setting_changed_callback)(wakeup_service_setting_changed_cb callback, void* user_data);
 #define MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK "wakeup_manager_set_error_callback"
 typedef int (*wakeup_manager_set_error_callback)(wakeup_service_error_cb callback, void* user_data);
 #define MA_WAKEUP_MANAGER_FUNC_SET_STREAMING_SECTION_CHANGED_CALLBACK "wakeup_manager_set_streaming_section_changed_callback"
@@ -205,6 +207,7 @@ typedef struct {
        wakeup_manager_set_previous_utterance_streaming_callback        set_previous_utterance_streaming_callback;
        wakeup_manager_set_follow_up_streaming_callback                  set_follow_up_streaming_callback;
        wakeup_manager_set_speech_status_callback                                set_speech_status_callback;
+       wakeup_manager_set_setting_changed_callback                              set_setting_changed_callback;
        wakeup_manager_set_error_callback                                                set_error_callback;
        wakeup_manager_set_streaming_section_changed_callback    set_streaming_section_changed_callback;
 } wakeup_manager_interface;
index 6c3eb6f..b0732f9 100644 (file)
@@ -99,6 +99,8 @@ typedef void (*wakeup_service_speech_streaming_cb)(wakeup_speech_streaming_event
 
 typedef void (*wakeup_service_speech_status_cb)(wakeup_speech_status_e status, void *user_data);
 
+typedef void (*wakeup_service_setting_changed_cb)(void *user_data);
+
 typedef void (*wakeup_service_error_cb)(int error, const char* err_msg, void* user_data);
 
 typedef void (*wakeup_service_streaming_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data);
index e6f5251..d574646 100644 (file)
@@ -50,6 +50,12 @@ public:
        virtual void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0;
 };
 
+class ISettingValueObserver {
+public:
+       virtual ~ISettingValueObserver() = default;
+       virtual void on_value_changed() = 0;
+};
+
 /* If a wakeup event is raised by pressing a voice key,
        the wakeup_engine attribute of wakeup_event_info will have the following value */
 #define WAKEUP_ENGINE_VOICE_KEY "voice_key"
@@ -57,7 +63,7 @@ public:
 class CWakeupManager
 {
 public:
-       CWakeupManager(IWakeupEventObserver *observer);
+       CWakeupManager(IWakeupEventObserver* wakeup_observer, ISettingValueObserver* setting_observer);
        virtual ~CWakeupManager();
 
        CWakeupManager(const CWakeupManager&) = delete;
@@ -66,8 +72,11 @@ public:
        bool initialize();
        bool deinitialize();
 
-       void subscribe(IWakeupEventObserver *observer);
-       void unsubscribe(IWakeupEventObserver *observer);
+       void subscribe_wakeup_observer(IWakeupEventObserver* observer);
+       void unsubscribe_wakeup_observer(IWakeupEventObserver* observer);
+
+       void subscribe_setting_observer(ISettingValueObserver* observer);
+       void unsubscribe_setting_observer(ISettingValueObserver* observer);
 
        bool activate();
        bool deactivate();
@@ -107,9 +116,11 @@ public:
        CAudioManager* get_audio_manager();
        CWakeupSettings* get_wakeup_settings();
 
-       vector<IWakeupEventObserver*> get_observers();
+       vector<IWakeupEventObserver*> get_wakeup_observers();
        void set_last_wakeup_event_info(wakeup_event_info wakeup_info);
 
+       vector<ISettingValueObserver*> get_setting_observers();
+
        bool change_manager_state(wakeup_manager_state_e state);
        wakeup_manager_state_e get_manager_state();
 
@@ -178,7 +189,8 @@ private:
        map<string, bool> mAssistantSupportsCurrentLanguage;
        map<string, bool> mAssistantEnabled;
 
-       vector<IWakeupEventObserver*> mObservers;
+       vector<IWakeupEventObserver*> mWakeupObservers;
+       vector<ISettingValueObserver*> mSettingObservers;
 
        unique_ptr<CWakeupPolicy> mWakeupPolicy;
 
index 7f408dc..2df503e 100644 (file)
@@ -63,6 +63,8 @@ typedef void (*wakeup_service_speech_streaming_cb)(wakeup_speech_streaming_event
 
 typedef void (*wakeup_service_speech_status_cb)(wakeup_service_speech_status_e status, void *user_data);
 
+typedef void (*wakeup_service_setting_changed_cb)( void *user_data);
+
 typedef void (*wakeup_service_error_cb)(int error, const char* err_msg, void* user_data);
 
 typedef void (*wakeup_service_audio_data_require_status_cb)(bool require, void* user_data);
@@ -146,6 +148,8 @@ EXPORT_API int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_sp
 
 EXPORT_API int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data);
 
+EXPORT_API int wakeup_manager_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data);
+
 EXPORT_API int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data);
 
 EXPORT_API int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data);
index 81ed6eb..9e16d36 100644 (file)
@@ -54,12 +54,15 @@ static bool initialize_wakeup_event_info(wakeup_event_info* wakeup_info)
        return ret;
 }
 
-CWakeupManager::CWakeupManager(IWakeupEventObserver *observer)
+CWakeupManager::CWakeupManager(IWakeupEventObserver* wakeup_observer, ISettingValueObserver* setting_observer)
 {
        initialize_wakeup_event_info(&mLastWakeupEventInfo);
 
-       if (observer) {
-               subscribe(observer);
+       if (wakeup_observer) {
+               subscribe_wakeup_observer(wakeup_observer);
+       }
+       if (setting_observer) {
+               subscribe_setting_observer(setting_observer);
        }
 }
 
@@ -136,16 +139,29 @@ bool CWakeupManager::deinitialize()
        return true;
 }
 
-void CWakeupManager::subscribe(IWakeupEventObserver *observer)
+void CWakeupManager::subscribe_wakeup_observer(IWakeupEventObserver *observer)
 {
-       mObservers.push_back(observer);
+       mWakeupObservers.push_back(observer);
 }
 
-void CWakeupManager::unsubscribe(IWakeupEventObserver *observer)
+void CWakeupManager::unsubscribe_wakeup_observer(IWakeupEventObserver *observer)
 {
-       auto iter = find(mObservers.begin(), mObservers.end(), observer);
-       if (iter != mObservers.end()) {
-               mObservers.erase(iter);
+       auto iter = find(mWakeupObservers.begin(), mWakeupObservers.end(), observer);
+       if (iter != mWakeupObservers.end()) {
+               mWakeupObservers.erase(iter);
+       }
+}
+
+void CWakeupManager::subscribe_setting_observer(ISettingValueObserver* observer)
+{
+       mSettingObservers.push_back(observer);
+}
+
+void CWakeupManager::unsubscribe_setting_observer(ISettingValueObserver* observer)
+{
+       auto iter = find(mSettingObservers.begin(), mSettingObservers.end(), observer);
+       if (iter != mSettingObservers.end()) {
+               mSettingObservers.erase(iter);
        }
 }
 
@@ -469,7 +485,7 @@ bool CWakeupManager::process_event(ma_plugin_event_e event, void* data, int len)
 
                        set_last_wakeup_event_info(wakeup_info);
                        mWakeupEngineManager.set_selected_wakeup_info(wakeup_info);
-                       for (const auto& observer : mObservers) {
+                       for (const auto& observer : mWakeupObservers) {
                                observer->on_wakeup(wakeup_info);
                        }
                }
@@ -498,9 +514,9 @@ bool CWakeupManager::process_event(ma_plugin_event_e event, void* data, int len)
        return true;
 }
 
-vector<IWakeupEventObserver*> CWakeupManager::get_observers()
+vector<IWakeupEventObserver*> CWakeupManager::get_wakeup_observers()
 {
-       return mObservers;
+       return mWakeupObservers;
 }
 
 void CWakeupManager::set_last_wakeup_event_info(wakeup_event_info wakeup_info)
@@ -508,6 +524,11 @@ void CWakeupManager::set_last_wakeup_event_info(wakeup_event_info wakeup_info)
        mLastWakeupEventInfo = wakeup_info;
 }
 
+vector<ISettingValueObserver*> CWakeupManager::get_setting_observers()
+{
+       return mSettingObservers;
+}
+
 static Eina_Bool streaming_duration_expired(void *data)
 {
        MWR_LOGD("[ENTER]");
@@ -534,7 +555,7 @@ static Eina_Bool streaming_duration_expired(void *data)
        }
 
        unsigned char final_buffer[2] = {'\0', };
-       vector<IWakeupEventObserver*> observers = wakeup_manager->get_observers();
+       vector<IWakeupEventObserver*> observers = wakeup_manager->get_wakeup_observers();
        for (const auto& observer : observers) {
                observer->on_streaming_audio_data(
                        WAKEUP_SPEECH_STREAMING_EVENT_FINISH, final_buffer, sizeof(final_buffer));
@@ -841,7 +862,7 @@ bool CWakeupManager::CEngineEventObserver::on_streaming_audio_data(
 {
        if (nullptr == mWakeupManager) return false;
 
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_observers();
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
        for (const auto& observer : observers) {
                observer->on_streaming_audio_data(event, buffer, len);
        }
@@ -857,7 +878,7 @@ bool CWakeupManager::CEngineEventObserver::on_audio_streaming_data_section(
 {
        if (nullptr == mWakeupManager) return false;
 
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_observers();
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
        for (const auto& observer : observers) {
                observer->on_audio_streaming_data_section(section);
        }
@@ -878,7 +899,7 @@ void CWakeupManager::CPolicyEventObserver::on_wakeup(wakeup_event_info wakeup_in
 
        mWakeupManager->set_last_wakeup_event_info(wakeup_info);
        engine_manager->set_selected_wakeup_info(wakeup_info);
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_observers();
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
        for (const auto& observer : observers) {
                observer->on_wakeup(wakeup_info);
        }
@@ -906,7 +927,7 @@ bool CWakeupManager::CAudioEventObserver::on_streaming_audio_data(
 {
        if (nullptr == mWakeupManager) return false;
 
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_observers();
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
        for (const auto& observer : observers) {
                observer->on_streaming_audio_data(event, buffer, len);
        }
@@ -922,6 +943,10 @@ bool CWakeupManager::CSettingsEventObserver::on_voice_input_language_changed(
 {
        if (nullptr == mWakeupManager || nullptr == language) return false;
        mWakeupManager->set_language(std::string(language));
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               observer->on_value_changed();
+       }
        return true;
 }
 
@@ -930,6 +955,10 @@ bool CWakeupManager::CSettingsEventObserver::on_assistant_enabled_info_changed(
 {
        if (nullptr == mWakeupManager || nullptr == appid) return false;
        mWakeupManager->set_assistant_enabled(std::string(appid), enabled);
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               observer->on_value_changed();
+       }
        return true;
 }
 
@@ -938,6 +967,10 @@ bool CWakeupManager::CSettingsEventObserver::on_default_assistant_appid_changed(
 {
        if (nullptr == mWakeupManager || nullptr == appid) return false;
        mWakeupManager->set_default_assistant(std::string(appid));
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               observer->on_value_changed();
+       }
        return true;
 }
 
index 9853c34..1c72602 100644 (file)
@@ -34,6 +34,9 @@ static void* g_follow_up_streaming_user_data;
 static wakeup_service_speech_status_cb g_speech_status_cb;
 static void* g_speech_status_user_data;
 
+static wakeup_service_setting_changed_cb g_setting_changed_cb;
+static void* g_setting_changed_user_data;
+
 static wakeup_service_error_cb g_error_cb;
 static void* g_error_user_data;
 
@@ -48,8 +51,14 @@ class CWakeupEventObserver : public IWakeupEventObserver
        void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override;
 };
 
+class CSettingValueObserver : public ISettingValueObserver
+{
+       void on_value_changed() override;
+};
+
 static CWakeupEventObserver g_wakeup_event_observer;
-static CWakeupManager g_wakeup_manager(&g_wakeup_event_observer);
+static CSettingValueObserver g_setting_value_observer;
+static CWakeupManager g_wakeup_manager(&g_wakeup_event_observer, &g_setting_value_observer);
 
 int wakeup_manager_initialize(void)
 {
@@ -67,6 +76,9 @@ int wakeup_manager_initialize(void)
        g_speech_status_cb = NULL;
        g_speech_status_user_data = NULL;
 
+       g_setting_changed_cb = NULL;
+       g_setting_changed_user_data = NULL;
+
        g_error_cb = NULL;
        g_error_user_data = NULL;
 
@@ -481,6 +493,22 @@ int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb ca
        return 0;
 }
 
+int wakeup_manager_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data)
+{
+       MWR_LOGD("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_setting_changed_cb = callback;
+       g_setting_changed_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
 int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data)
 {
        MWR_LOGD("[ENTER]");
@@ -549,3 +577,10 @@ void CWakeupEventObserver::on_audio_streaming_data_section(
                g_streaming_section_changed_cb(section, g_streaming_section_changed_user_data);
        }
 }
+
+void CSettingValueObserver::on_value_changed()
+{
+       if (g_setting_changed_cb) {
+               g_setting_changed_cb(g_setting_changed_user_data);
+       }
+}
\ No newline at end of file
index b2da67b..35cc1ed 100644 (file)
@@ -762,16 +762,7 @@ static int init_wakeup(void)
 #endif
        }
 
-       /* CHECK NEEDED : should the code segment below and activation logic above be moved to wakeup manger? */
-       int prelaunch_mode;
-       int res = vconf_get_bool(WAKEUP_SETTINGS_KEY_PRELAUNCH_MODE, &prelaunch_mode);
-       if (0 == res && 0 != prelaunch_mode) {
-               const char *default_assistant = NULL;
-               if (0 == multi_assistant_service_plugin_get_default_assistant(&default_assistant)) {
-                       MAS_LOGD("prelaunching default_assistant_appid : %s", default_assistant);
-                       mas_launch_client_by_appid(default_assistant, CLIENT_LAUNCH_MODE_PRELAUNCH);
-               }
-       }
+       mas_prelaunch_default_assistant();
 
        /* For the case of preprocessing assistant, it always have to be launched beforehand */
        char *vconf_str;
@@ -1080,6 +1071,23 @@ int mas_launch_client_by_wakeup_word(const char *wakeup_word)
        return mas_launch_client_by_appid(appid, CLIENT_LAUNCH_MODE_ACTIVATION);
 }
 
+int mas_prelaunch_default_assistant()
+{
+       /* CHECK NEEDED : should the code segment below and activation logic above be moved to wakeup manger? */
+       int prelaunch_mode;
+       int res = vconf_get_bool(WAKEUP_SETTINGS_KEY_PRELAUNCH_MODE, &prelaunch_mode);
+       if (0 == res && 0 != prelaunch_mode) {
+               const char *default_assistant = NULL;
+               if (0 == multi_assistant_service_plugin_get_default_assistant(&default_assistant)) {
+                       if (0 == aul_app_is_running(default_assistant)) {
+                               MAS_LOGD("prelaunching default_assistant_appid : %s", default_assistant);
+                               mas_launch_client_by_appid(default_assistant, CLIENT_LAUNCH_MODE_PRELAUNCH);
+                       }
+               }
+       }
+       return 0;
+}
+
 
 int mas_process_voice_key_event(bool pressed)
 {
index 5e9e063..8307104 100644 (file)
@@ -337,6 +337,12 @@ static void __error_cb(int error, const char* err_msg, void* user_data)
        }
 }
 
+static void __setting_changed_cb(void *user_data)
+{
+       mas_prelaunch_default_assistant();
+       MAS_LOGD( "[SUCCESS] __setting_changed_cb is called");
+}
+
 static void __streaming_section_changed_cb(ma_audio_streaming_data_section_e section, void* user_data)
 {
        MAS_LOGD( "[SUCCESS] __streaming_section_changed_cb is called, section(%d)", section);
@@ -454,6 +460,9 @@ int multi_assistant_service_plugin_initialize(void)
        _wakeup_manager_interface.set_speech_status_callback =
                (wakeup_manager_set_speech_status_callback)dlsym(g_handle,
                MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK);
+       _wakeup_manager_interface.set_setting_changed_callback =
+               (wakeup_manager_set_setting_changed_callback)dlsym(g_handle,
+               MA_WAKEUP_MANAGER_FUNC_SET_SETTING_CHANGED_CALLBACK);
        _wakeup_manager_interface.set_error_callback =
                (wakeup_manager_set_error_callback)dlsym(g_handle,
                MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK);
@@ -996,6 +1005,12 @@ int multi_assistant_service_plugin_set_callbacks(void)
                return ret;
        }
 
+       ret = multi_assistant_service_plugin_set_setting_changed_callback(__setting_changed_cb, NULL);
+       if (0 != ret) {
+               MAS_LOGE("Fail to set setting changed cb");
+               return ret;
+       }
+
        ret = multi_assistant_service_plugin_set_error_callback(__error_cb, NULL);
        if (0 != ret) {
                MAS_LOGE("Fail to set error cb");
@@ -1104,6 +1119,23 @@ int multi_assistant_service_plugin_set_speech_status_callback(wakeup_service_spe
        return ret;
 }
 
+int multi_assistant_service_plugin_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               wakeup_manager_set_setting_changed_callback func = _wakeup_manager_interface.set_setting_changed_callback;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_SETTING_CHANGED_CALLBACK);
+               } else {
+                       ret = func(callback, user_data);
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to set setting_changed callback, ret(%d)", ret);
+                       }
+               }
+       }
+       return ret;
+}
+
 int multi_assistant_service_plugin_set_error_callback(wakeup_service_error_cb callback, void* user_data)
 {
        int ret = -1;