Merge branch 'tizen_5.5' into tizen
[platform/core/uifw/multi-assistant-service.git] / src / service_main.cpp
index cad2c4a..656a91c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018-2019 Samsung Electronics Co., Ltd
+ * Copyright 2020 Samsung Electronics Co., Ltd
  *
  * Licensed under the Flora License, Version 1.1 (the License);
  * you may not use this file except in compliance with the License.
 #include <service_app.h>
 #include <app_manager.h>
 #include <app.h>
-#include <aul.h>
-#include <aul_svc.h>
 #include <malloc.h>
 #include <Ecore.h>
 #include <vconf.h>
-#include <pkgmgr-info.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -77,7 +74,7 @@ bool CServiceMain::is_current_preprocessing_assistant(const char* appid)
        return ret;
 }
 
-int CServiceMain::mas_client_get_audio_format(int pid, int* rate, int* channel, int* audio_type)
+int CServiceMain::client_get_audio_format(pid_t pid, int* rate, int* channel, int* audio_type)
 {
        MAS_LOGD("[Enter] pid(%d)", pid);
 
@@ -90,7 +87,7 @@ int CServiceMain::mas_client_get_audio_format(int pid, int* rate, int* channel,
 }
 
 #define MAX_LOCAL_VARIABLE_STRING_LEN 256
-int CServiceMain::mas_client_get_audio_source_type(int pid, char** type)
+int CServiceMain::client_get_audio_source_type(pid_t pid, char** type)
 {
        MAS_LOGD("[Enter] pid(%d)", pid);
 
@@ -109,7 +106,7 @@ int CServiceMain::mas_client_get_audio_source_type(int pid, char** type)
        return ret;
 }
 
-int CServiceMain::mas_client_send_preprocessing_information(int pid)
+int CServiceMain::client_send_preprocessing_information(pid_t pid)
 {
        int ret = -1;
        MAS_LOGD("[Enter] pid(%d)", pid);
@@ -124,12 +121,12 @@ int CServiceMain::mas_client_send_preprocessing_information(int pid)
        return ret;
 }
 
-int CServiceMain::mas_client_send_voice_key_status_change(int pid, ma_voice_key_status_e status)
+int CServiceMain::client_send_voice_key_status_change(pid_t pid, ma_voice_key_status_e status)
 {
        int ret = -1;
        MAS_LOGD("[Enter] pid(%d)", pid);
 
-       ret = mServiceIpc.voice_key_status_change(pid, status);
+       ret = mServiceIpc.change_voice_key_status(pid, status);
        if (0 != ret) {
                MAS_LOGE("[ERROR] Fail to send voice key status changed information, ret(%d)", ret);
        }
@@ -138,7 +135,7 @@ int CServiceMain::mas_client_send_voice_key_status_change(int pid, ma_voice_key_
        return ret;
 }
 
-int CServiceMain::mas_client_send_asr_result(int pid, int event, const char* asr_result)
+int CServiceMain::client_send_asr_result(pid_t pid, int event, const char* asr_result)
 {
        MAS_LOGD("[Enter] pid(%d), event(%d), asr_result(%s)", pid, event, asr_result);
        int ret = mServiceIpc.masc_ui_dbus_send_asr_result(pid, event, asr_result);
@@ -151,7 +148,7 @@ int CServiceMain::mas_client_send_asr_result(int pid, int event, const char* asr
        return ret;
 }
 
-int CServiceMain::mas_client_send_result(int pid, const char* display_text,
+int CServiceMain::client_send_result(pid_t pid, const char* display_text,
        const char* utterance_text, const char* result_json)
 {
        MAS_LOGD("[Enter] pid(%d), display_text(%s), utterance_text(%s), result_json(%s)", pid, display_text, utterance_text, result_json);
@@ -160,18 +157,17 @@ int CServiceMain::mas_client_send_result(int pid, const char* display_text,
                MAS_LOGE("[ERROR] Fail to send result, ret(%d)", ret);
        }
 
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
-       mServicePlugin.update_recognition_result(pid_appid, MA_RECOGNITION_RESULT_EVENT_SUCCESS);
+       mServicePlugin.update_recognition_result(pid_appid.c_str(), MA_RECOGNITION_RESULT_EVENT_SUCCESS);
 
        return ret;
 }
 
-int CServiceMain::mas_client_send_recognition_result(int pid, int result)
+int CServiceMain::client_send_recognition_result(pid_t pid, int result)
 {
        MAS_LOGD("[Enter] pid(%d), result(%d)", pid, result);
        int ret = mServiceIpc.masc_ui_dbus_send_recognition_result(pid, result);
@@ -179,24 +175,23 @@ int CServiceMain::mas_client_send_recognition_result(int pid, int result)
                MAS_LOGE("[ERROR] Fail to send recognition result, ret(%d)", ret);
        }
 
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
-       mServicePlugin.update_recognition_result(pid_appid, result);
+       mServicePlugin.update_recognition_result(pid_appid.c_str(), result);
 
        return ret;
 }
 
-int CServiceMain::mas_client_start_streaming_audio_data(int pid, int type)
+int CServiceMain::client_start_streaming_audio_data(pid_t pid, int type)
 {
        int ret = -1;
        switch(type) {
                case MA_AUDIO_STREAMING_DATA_TYPE_CURRENT_UTTERANCE:
                        ret = mServicePlugin.start_streaming_utterance_data();
-                       mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_UTTERANCE_STREAMING_STARTED);
+                       process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_UTTERANCE_STREAMING_STARTED);
                        break;
                case MA_AUDIO_STREAMING_DATA_TYPE_PREVIOUS_UTTERANCE:
                        ret = mServicePlugin.start_streaming_previous_utterance_data();
@@ -204,13 +199,13 @@ int CServiceMain::mas_client_start_streaming_audio_data(int pid, int type)
                        break;
                case MA_AUDIO_STREAMING_DATA_TYPE_FOLLOW_UP_SPEECH:
                        ret = mServicePlugin.start_streaming_follow_up_data();
-                       mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_FOLLOW_UP_STREAMING_STARTED);
+                       process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_FOLLOW_UP_STREAMING_STARTED);
                        break;
        }
        return ret;
 }
 
-int CServiceMain::mas_client_stop_streaming_audio_data(int pid, int type)
+int CServiceMain::client_stop_streaming_audio_data(pid_t pid, int type)
 {
        int ret = -1;
        switch(type) {
@@ -227,54 +222,50 @@ int CServiceMain::mas_client_stop_streaming_audio_data(int pid, int type)
        return ret;
 }
 
-int CServiceMain::mas_client_update_voice_feedback_state(int pid, int state)
+int CServiceMain::client_update_voice_feedback_state(pid_t pid, int state)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
-       mServicePlugin.update_voice_feedback_state(pid_appid, state);
+       mServicePlugin.update_voice_feedback_state(pid_appid.c_str(), state);
        return 0;
 }
 
-int CServiceMain::mas_client_set_assistant_specific_command(int pid, const char *command)
+int CServiceMain::client_set_assistant_specific_command(pid_t pid, const char *command)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
-       mServicePlugin.set_assistant_specific_command(pid_appid, command);
+       mServicePlugin.set_assistant_specific_command(pid_appid.c_str(), command);
        return 0;
 }
 
-int CServiceMain::mas_client_set_background_volume(int pid, double ratio)
+int CServiceMain::client_set_background_volume(pid_t pid, double ratio)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
-       mServicePlugin.set_background_volume(pid_appid, ratio);
+       mServicePlugin.set_background_volume(pid_appid.c_str(), ratio);
        return 0;
 }
 
-int CServiceMain::mas_client_set_preprocessing_allow_mode(int pid, ma_preprocessing_allow_mode_e mode, const char* appid)
+int CServiceMain::client_set_preprocessing_allow_mode(pid_t pid, ma_preprocessing_allow_mode_e mode, const char* appid)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
 
        for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) {
                if (mClientInfo[loop].used) {
-                       if (pid_appid && strncmp(pid_appid, mClientInfo[loop].appid, MAX_APPID_LEN) == 0) {
+                       if (0 == pid_appid.compare(mClientInfo[loop].appid)) {
                                mClientInfo[loop].preprocessing_allow_mode = mode;
                                if (appid) {
                                        strncpy(mClientInfo[loop].preprocessing_allow_appid, appid, MAX_APPID_LEN);
@@ -286,20 +277,19 @@ int CServiceMain::mas_client_set_preprocessing_allow_mode(int pid, ma_preprocess
                }
        }
 
-       mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_ALLOW_MODE_CHANGED);
+       process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_ALLOW_MODE_CHANGED);
 
        return 0;
 }
 
-int CServiceMain::mas_client_send_preprocessing_result(int pid, bool result)
+int CServiceMain::client_send_preprocessing_result(pid_t pid, bool result)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
-       if (!is_current_preprocessing_assistant(pid_appid)) return -1;
+       if (!is_current_preprocessing_assistant(pid_appid.c_str())) return -1;
 
        const char *current_maclient_appid = NULL;
        if (mCurrentClientInfo >= 0 && mCurrentClientInfo < MAX_MACLIENT_INFO_NUM) {
@@ -307,67 +297,62 @@ int CServiceMain::mas_client_send_preprocessing_result(int pid, bool result)
        }
 
        if (result) {
-               MAS_LOGD("Preprocessing succeeded, bring (%s) to foreground", pid_appid);
-               mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_SUCCEEDED);
+               MAS_LOGD("Preprocessing succeeded, bring (%s) to foreground", pid_appid.c_str());
+               process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_SUCCEEDED);
        } else {
                MAS_LOGD("Preprocessing failed, bring (%s) to foreground", current_maclient_appid);
-               mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_FAILED);
+               process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_FAILED);
        }
 
        if (current_maclient_appid) {
-               int pid = mClientManager.find_client_pid_by_appid(
+               pid_t pid_by_appid = mClientManager.find_client_pid_by_appid(
                        std::string{current_maclient_appid});
-               mServiceIpc.send_preprocessing_result(pid, result);
+               mServiceIpc.send_preprocessing_result(pid_by_appid, result);
        }
 
        return 0;
 }
 
-int CServiceMain::mas_client_set_wake_word_audio_require_flag(int pid, bool require)
+int CServiceMain::client_set_wake_word_audio_require_flag(pid_t pid, bool require)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
 
-       mServicePlugin.set_wake_word_audio_require_flag(pid_appid, require);
+       mServicePlugin.set_wake_word_audio_require_flag(pid_appid.c_str(), require);
        return 0;
 }
 
-int CServiceMain::mas_client_set_assistant_language(int pid, const char* language)
+int CServiceMain::client_set_assistant_language(pid_t pid, const char* language)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       int ret = aul_app_get_appid_bypid(pid, buf, sizeof(buf));
-       if (AUL_R_OK == ret) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
 
-       mServicePlugin.set_assistant_language(pid_appid, language);
+       mServicePlugin.set_assistant_language(pid_appid.c_str(), language);
        return 0;
 }
 
-int CServiceMain::mas_client_add_wake_word(int pid, const char* wake_word, const char* language)
+int CServiceMain::client_add_wake_word(pid_t pid, const char* wake_word, const char* language)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       int ret = aul_app_get_appid_bypid(pid, buf, sizeof(buf));
-       if (AUL_R_OK == ret) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
 
        for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) {
                if (mClientInfo[loop].used &&
-                       0 == strncmp(buf, mClientInfo[loop].appid, MAX_APPID_LEN)) {
-                       ret = mServiceConfig.add_custom_wake_word(wake_word, language,
+                       0 == pid_appid.compare(mClientInfo[loop].appid)) {
+                       int ret = mServiceConfig.add_custom_wake_word(wake_word, language,
                                mClientInfo[loop].wakeup_word,
                                mClientInfo[loop].wakeup_language);
                        if (0 == ret) {
-                               mServiceConfig.save_custom_wake_words(pid_appid,
+                               mServiceConfig.save_custom_wake_words(pid_appid.c_str(),
                                        mClientInfo[loop].wakeup_word,
                                        mClientInfo[loop].wakeup_language);
                        } else {
@@ -377,53 +362,51 @@ int CServiceMain::mas_client_add_wake_word(int pid, const char* wake_word, const
                }
        }
 
-       mServicePlugin.add_assistant_wakeup_word(pid_appid, wake_word, language);
+       mServicePlugin.add_assistant_wakeup_word(pid_appid.c_str(), wake_word, language);
        return 0;
 }
 
-int CServiceMain::mas_client_remove_wake_word(int pid, const char* wake_word, const char* language)
+int CServiceMain::client_remove_wake_word(pid_t pid, const char* wake_word, const char* language)
 {
-       const char* pid_appid = NULL;
-       char buf[MAX_APPID_LEN] = {'\0', };
-       int ret = aul_app_get_appid_bypid(pid, buf, sizeof(buf));
-       if (AUL_R_OK == ret) {
-               buf[MAX_APPID_LEN - 1] = '\0';
-               pid_appid = buf;
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
        }
 
        for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) {
                if (mClientInfo[loop].used &&
-                       0 == strncmp(buf, mClientInfo[loop].appid, MAX_APPID_LEN)) {
-                       ret = mServiceConfig.remove_custom_wake_word(wake_word, language,
+                       0 == pid_appid.compare(mClientInfo[loop].appid)) {
+                       int ret = mServiceConfig.remove_custom_wake_word(wake_word, language,
                                mClientInfo[loop].wakeup_word,
                                mClientInfo[loop].wakeup_language);
                        if (0 == ret) {
-                               mServiceConfig.save_custom_wake_words(pid_appid,
+                               mServiceConfig.save_custom_wake_words(pid_appid.c_str(),
                                        mClientInfo[loop].wakeup_word,
                                        mClientInfo[loop].wakeup_language);
                        }
                }
        }
 
-       mServicePlugin.remove_assistant_wakeup_word(pid_appid, wake_word, language);
+       mServicePlugin.remove_assistant_wakeup_word(pid_appid.c_str(), wake_word, language);
        return 0;
 }
 
-int CServiceMain::mas_ui_client_initialize(int pid)
+int CServiceMain::ui_client_initialize(pid_t pid)
 {
        MAS_LOGD("[Enter] pid(%d)", pid);
 
        return 0;
 }
 
-int CServiceMain::mas_ui_client_deinitialize(int pid)
+int CServiceMain::ui_client_deinitialize(pid_t pid)
 {
        MAS_LOGD("[Enter] pid(%d)", pid);
 
        return 0;
 }
 
-int CServiceMain::mas_ui_client_change_assistant(const char* appid)
+int CServiceMain::ui_client_change_assistant(const char* appid)
 {
        MAS_LOGD("[Enter]");
 
@@ -432,19 +415,19 @@ int CServiceMain::mas_ui_client_change_assistant(const char* appid)
                return -1;
        }
 
-       bool use_custom_ui = mas_get_client_custom_ui_option_by_appid(appid);
+       bool use_custom_ui = get_client_custom_ui_option_by_appid(appid);
        mServiceIpc.masc_ui_dbus_enable_common_ui(!use_custom_ui);
 
-       mas_set_current_client_by_appid(appid);
-       int pid = mas_get_client_pid_by_appid(appid);
+       set_current_client_by_appid(appid);
+       pid_t pid = get_client_pid_by_appid(appid);
        if (pid != -1) {
-               mas_bring_client_to_foreground(appid);
-               mas_client_send_preprocessing_information(pid);
+               bring_client_to_foreground(appid);
+               client_send_preprocessing_information(pid);
                if (MA_VOICE_KEY_STATUS_PRESSED == mLastVoiceKeyStatus) {
-                       mas_client_send_voice_key_status_change(pid, mLastVoiceKeyStatus);
+                       client_send_voice_key_status_change(pid, mLastVoiceKeyStatus);
                }
 
-               mServiceIpc.active_state_change(pid, MA_ACTIVE_STATE_ACTIVE);
+               mServiceIpc.change_active_state(pid, MA_ACTIVE_STATE_ACTIVE);
                MAS_LOGD("MA Client with appid %s exists, requesting speech data", (appid ? appid : "NULL"));
                /*
                int ret = mServicePlugin.start_streaming_utterance_data();
@@ -462,7 +445,7 @@ int CServiceMain::mas_ui_client_change_assistant(const char* appid)
                                0 < strlen(mClientInfo[loop].appid) &&
                                0 < strlen(mClientInfo[loop].wakeup_word[0])) {
                                if (strncmp(appid, mClientInfo[loop].appid, MAX_APPID_LEN) == 0) {
-                                       mas_launch_client_by_appid(mClientInfo[loop].appid, CLIENT_LAUNCH_MODE_ACTIVATION);
+                                       launch_client_by_appid(mClientInfo[loop].appid, CLIENT_LAUNCH_MODE_ACTIVATION);
                                }
                        }
                }
@@ -471,7 +454,7 @@ int CServiceMain::mas_ui_client_change_assistant(const char* appid)
        return 0;
 }
 
-static int mas_assistant_info_cb(ma_assistant_info_s* info, void* user_data) {
+static int assistant_info_cb(ma_assistant_info_s* info, void* user_data) {
        int ret = -1;
        CServiceMain* service_main = static_cast<CServiceMain*>(user_data);
        if (service_main) {
@@ -481,7 +464,7 @@ static int mas_assistant_info_cb(ma_assistant_info_s* info, void* user_data) {
 }
 
 int CServiceMain::add_assistant_info(ma_assistant_info_s* info) {
-       MAS_LOGD("__mas_assistant_info_cb called");
+       MAS_LOGD("__assistant_info_cb called");
 
        if (NULL == info) {
                MAS_LOGE("info NULL, returning");
@@ -552,11 +535,14 @@ int CServiceMain::add_assistant_info(ma_assistant_info_s* info) {
                mClientInfo[index].voice_key_support_mode = info->voice_key_support_mode;
                MAS_LOGD("voice_key_tap_duration(%f)", info->voice_key_tap_duration);
                mClientInfo[index].voice_key_tap_duration = info->voice_key_tap_duration;
+               MAS_LOGD("audio_processing_appid(%s)",
+                       (info->audio_data_processing_appid ? (info->audio_data_processing_appid)->c_str() : "[NONE]"));
+               mClientInfo[index].audio_processing_appid = info->audio_data_processing_appid;
        } else {
                MAS_LOGD("Couldn't find an empty slot for storing assistant info");
        }
 
-       MAS_LOGD("__mas_assistant_info_cb end");
+       MAS_LOGD("__assistant_info_cb end");
 
        return 0;
 }
@@ -589,6 +575,7 @@ static void active_state_changed_cb(std::string key, void* user_data)
 
 int CServiceMain::initialize_service_plugin(void)
 {
+       MAS_LOGI("[ENTER]");
        if (0 != mServicePlugin.initialize()) {
                MAS_LOGE("Fail to ws intialize");
                return -1;
@@ -599,11 +586,15 @@ int CServiceMain::initialize_service_plugin(void)
                return -1;
        }
 
-       if (0 == mServiceConfig.get_assistant_info(mas_assistant_info_cb, this)) {
+       memset(&mClientInfo, 0x00, sizeof(mClientInfo));
+       mCurrentClientInfo = -1;
+       mCurrentPreprocessingClientInfo = -1;
+       mWakeupClientAppId.clear();
+
+       if (0 == mServiceConfig.get_assistant_info(assistant_info_cb, this)) {
                for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) {
                        int inner_loop;
-                       if (mClientInfo[loop].used &&
-                               0 < strlen(mClientInfo[loop].appid)) {
+                       if (0 < strlen(mClientInfo[loop].appid)) {
                                mServiceConfig.load_custom_wake_words(mClientInfo[loop].appid,
                                        mClientInfo[loop].wakeup_word, mClientInfo[loop].wakeup_language);
                                if (0 < strlen(mClientInfo[loop].wakeup_engine)) {
@@ -623,7 +614,7 @@ int CServiceMain::initialize_service_plugin(void)
                                                }
                                        }
                                }
-                               for (inner_loop = 0; inner_loop < MAX_SUPPORTED_LANGUAGE_NUM; inner_loop++) {
+                               for (inner_loop = 0; inner_loop < MAX_SUPPORTED_LANGUAGES_NUM; inner_loop++) {
                                        if (0 < strlen(mClientInfo[loop].supported_language[inner_loop])) {
                                                MAS_LOGD("Adding language %s for app %s",
                                                        mClientInfo[loop].supported_language[inner_loop], mClientInfo[loop].appid);
@@ -688,7 +679,7 @@ int CServiceMain::process_activated_setting()
        return 0;
 }
 
-int CServiceMain::mas_get_current_client_pid()
+int CServiceMain::get_current_client_pid()
 {
        int ret = -1;
        if (mCurrentClientInfo >= 0 && mCurrentClientInfo < MAX_MACLIENT_INFO_NUM) {
@@ -700,9 +691,9 @@ int CServiceMain::mas_get_current_client_pid()
        return ret;
 }
 
-int CServiceMain::mas_get_current_preprocessing_client_pid()
+pid_t CServiceMain::get_current_preprocessing_client_pid()
 {
-       int ret = -1;
+       pid_t ret = -1;
        if (mCurrentPreprocessingClientInfo >= 0 && mCurrentPreprocessingClientInfo < MAX_MACLIENT_INFO_NUM) {
                const char *appid = mClientInfo[mCurrentPreprocessingClientInfo].appid;
                if (appid) {
@@ -712,18 +703,33 @@ int CServiceMain::mas_get_current_preprocessing_client_pid()
        return ret;
 }
 
-int CServiceMain::mas_get_client_pid_by_appid(const char *appid)
+pid_t CServiceMain::get_current_audio_processing_pid()
 {
-       int ret = -1;
+       pid_t ret = -1;
+       if (mCurrentClientInfo >= 0 && mCurrentClientInfo < MAX_MACLIENT_INFO_NUM) {
+               boost::optional<std::string> audio_processing_appid =
+                       mClientInfo[mCurrentClientInfo].audio_processing_appid;
+               if (audio_processing_appid) {
+                       boost::optional<pid_t> audio_processing_pid;
+                       audio_processing_pid = mApplicationManager.get_pid_by_appid((*audio_processing_appid).c_str());
+                       if (audio_processing_pid) {
+                               ret = *audio_processing_pid;
+                       }
+               }
+       }
+       return ret;
+}
+
+pid_t CServiceMain::get_client_pid_by_appid(const char *appid)
+{
+       pid_t ret = -1;
 
        if (appid) {
                ret = mClientManager.find_client_pid_by_appid(std::string{appid});
        }
 
-       int status = aul_app_get_status_bypid(ret);
-       if (-1 != ret && 0 > status) {
-               MAS_LOGE("The PID for %s was %d, but it seems to be terminated : %d",
-                       (appid ? appid : "NULL"), ret, status);
+       if (-1 != ret && !mApplicationManager.is_application_running(appid)) {
+               MAS_LOGE("The PID for %s was %d, but it seems to be terminated", appid, ret);
                on_deinitialize(ret);
                ret = -1;
        }
@@ -731,7 +737,7 @@ int CServiceMain::mas_get_client_pid_by_appid(const char *appid)
        return ret;
 }
 
-bool CServiceMain::mas_get_client_custom_ui_option_by_appid(const char *appid)
+bool CServiceMain::get_client_custom_ui_option_by_appid(const char *appid)
 {
        bool ret = false;
        for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) {
@@ -746,13 +752,13 @@ bool CServiceMain::mas_get_client_custom_ui_option_by_appid(const char *appid)
        return ret;
 }
 
-int CServiceMain::mas_get_client_pid_by_wakeup_word(const char *wakeup_word)
+int CServiceMain::get_client_pid_by_wakeup_word(const char *wakeup_word)
 {
-       const char *appid = mas_get_client_appid_by_wakeup_word(wakeup_word);
-       return mas_get_client_pid_by_appid(appid);
+       const char *appid = get_client_appid_by_wakeup_word(wakeup_word);
+       return get_client_pid_by_appid(appid);
 }
 
-const char* CServiceMain::mas_get_client_appid_by_wakeup_word(const char *wakeup_word)
+const char* CServiceMain::get_client_appid_by_wakeup_word(const char *wakeup_word)
 {
        int loop;
        const char *appid = NULL;
@@ -798,7 +804,7 @@ const char* CServiceMain::mas_get_client_appid_by_wakeup_word(const char *wakeup
        return appid;
 }
 
-int CServiceMain::mas_set_current_client_by_wakeup_word(const char *wakeup_word)
+int CServiceMain::set_current_client_by_wakeup_word(const char *wakeup_word)
 {
        int loop;
        int ret = -1;
@@ -843,15 +849,15 @@ int CServiceMain::mas_set_current_client_by_wakeup_word(const char *wakeup_word)
 
        if (mCurrentClientInfo != prev_selection) {
                if (prev_selection >= 0 && prev_selection < MAX_MACLIENT_INFO_NUM) {
-                       int pid = mas_get_client_pid_by_appid(mClientInfo[prev_selection].appid);
-                       mServiceIpc.active_state_change(pid, MA_ACTIVE_STATE_INACTIVE);
+                       pid_t pid = get_client_pid_by_appid(mClientInfo[prev_selection].appid);
+                       mServiceIpc.change_active_state(pid, MA_ACTIVE_STATE_INACTIVE);
                }
        }
 
        return ret;
 }
 
-int CServiceMain::mas_set_current_client_by_appid(const char *appid)
+int CServiceMain::set_current_client_by_appid(const char *appid)
 {
        int ret = -1;
        int prev_selection = mCurrentClientInfo;
@@ -869,46 +875,32 @@ int CServiceMain::mas_set_current_client_by_appid(const char *appid)
 
        if (mCurrentClientInfo != prev_selection) {
                if (prev_selection >= 0 && prev_selection < MAX_MACLIENT_INFO_NUM) {
-                       int pid = mas_get_client_pid_by_appid(mClientInfo[prev_selection].appid);
-                       mServiceIpc.active_state_change(pid, MA_ACTIVE_STATE_INACTIVE);
+                       pid_t pid = get_client_pid_by_appid(mClientInfo[prev_selection].appid);
+                       mServiceIpc.change_active_state(pid, MA_ACTIVE_STATE_INACTIVE);
                }
        }
 
        return ret;
 }
 
-int CServiceMain::mas_launch_client_by_appid(const char *appid, CLIENT_LAUNCH_MODE launch_mode)
+int CServiceMain::launch_client_by_appid(const char *appid, CLIENT_LAUNCH_MODE launch_mode)
 {
+       int result = 0;
+
        if (NULL == appid || 0 == strlen(appid)) {
                MAS_LOGE("appid invalid, failed launching MA Client");
                return -1;
        }
 
        if (CLIENT_LAUNCH_MODE_PRELAUNCH == launch_mode) {
-               if (1 == aul_app_is_running(appid)) {
+               if (mApplicationManager.is_application_running(appid)) {
                        MAS_LOGE("appid %s is already running, no need for a prelaunch", appid);
                        return -1;
                }
-       }
-
-       bundle *b = NULL;
-       b = bundle_create();
-       if (NULL == b) {
-               MAS_LOGE("Failed creating bundle for aul operation");
-               return -1;
-       }
-
-       int result = aul_svc_set_background_launch(b,
-               (CLIENT_LAUNCH_MODE_PRELAUNCH == launch_mode ? TRUE : FALSE));
-       if (result < AUL_R_OK) {
-               MAS_LOGE("ERROR : aul_svc_set_background_launch failed. app_id [%s] bundle[%p] result[%d : %s]",
-                       appid, b, result, get_error_message(result));
-       }
 
-       result = aul_launch_app_async(appid, b);
-       if (result < AUL_R_OK) {
-               MAS_LOGE("ERROR : aul_launch_app_async failed. app_id [%s] bundle[%p] result[%d : %s]",
-                       appid, b, result, get_error_message(result));
+               result = mApplicationManager.launch_app_async(appid, true);
+       } else {
+               result = mApplicationManager.launch_app_async(appid, false);
        }
 
        if (CLIENT_LAUNCH_MODE_ACTIVATION == launch_mode) {
@@ -925,46 +917,32 @@ int CServiceMain::mas_launch_client_by_appid(const char *appid, CLIENT_LAUNCH_MO
                MAS_LOGD("mWakeupClientAppId : %s, %d", mWakeupClientAppId.c_str(), found);
        }
 
-       if (b) bundle_free(b);
-       b = NULL;
-
        return result;
 }
 
-int CServiceMain::mas_bring_client_to_foreground(const char* appid)
+int CServiceMain::bring_client_to_foreground(const char* appid)
 {
-       /* Bring MA client to foreground - is there a better way other than launching? */
+       int ret = 0;
+
        if (NULL == appid || 0 == strlen(appid)) {
                MAS_LOGE("appid invalid, failed launching MA Client");
                return -1;
        }
 
-       bundle *b = NULL;
-       b = bundle_create();
-       if (NULL == b) {
-               MAS_LOGE("Failed creating bundle for aul operation");
-               return -1;
-       }
-
-       int result = aul_launch_app(appid, b);
-       if (result < AUL_R_OK) {
-               MAS_LOGE("ERROR : aul_launch_app failed. app_id [%s] bundle[%p] result[%d : %s]",
-                       appid, b, result, get_error_message(result));
+       if (!mApplicationManager.bring_app_to_foreground(appid)) {
+               ret = -1;
        }
 
-       if (b) bundle_free(b);
-       b = NULL;
-
-       return result;
+       return ret;
 }
 
-int CServiceMain::mas_launch_client_by_wakeup_word(const char *wakeup_word)
+int CServiceMain::launch_client_by_wakeup_word(const char *wakeup_word)
 {
-       const char *appid = mas_get_client_appid_by_wakeup_word(wakeup_word);
-       return mas_launch_client_by_appid(appid, CLIENT_LAUNCH_MODE_ACTIVATION);
+       const char *appid = get_client_appid_by_wakeup_word(wakeup_word);
+       return launch_client_by_appid(appid, CLIENT_LAUNCH_MODE_ACTIVATION);
 }
 
-int CServiceMain::mas_prelaunch_default_assistant()
+int CServiceMain::prelaunch_default_assistant()
 {
        /* CHECK NEEDED : should the code segment below and activation logic above be moved to wakeup manger? */
        boost::optional<bool> prelaunch_mode =
@@ -972,16 +950,17 @@ int CServiceMain::mas_prelaunch_default_assistant()
        if (prelaunch_mode && *prelaunch_mode) {
                const char *default_assistant = NULL;
                if (0 == mServicePlugin.get_default_assistant(&default_assistant)) {
-                       if (0 == aul_app_is_running(default_assistant)) {
+                       if (default_assistant &&
+                               !(mApplicationManager.is_application_running(default_assistant))) {
                                MAS_LOGD("prelaunching default_assistant_appid : %s", default_assistant);
-                               mas_launch_client_by_appid(default_assistant, CLIENT_LAUNCH_MODE_PRELAUNCH);
+                               launch_client_by_appid(default_assistant, CLIENT_LAUNCH_MODE_PRELAUNCH);
                        }
                }
        }
        return 0;
 }
 
-int CServiceMain::mas_update_voice_key_support_mode()
+int CServiceMain::update_voice_key_support_mode()
 {
        /* CHECK NEEDED : should the code segment below and activation logic above be moved to wakeup manger? */
        bool successful = false;
@@ -1027,7 +1006,7 @@ ma_preprocessing_allow_mode_e CServiceMain::get_preprocessing_allow_mode(const c
 /* This might need to be read from settings in the future, but using macro for now */
 //#define BRING_PREPROCESSING_ASSISTANT_TO_FRONT
 
-int CServiceMain::mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT event)
+int CServiceMain::process_preprocessing_state_event(PREPROCESSING_STATE_EVENT event)
 {
        const char* current_maclient_appid = NULL;
        const char* preprocessing_allow_appid = NULL;
@@ -1043,7 +1022,7 @@ int CServiceMain::mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVEN
 #ifndef BRING_PREPROCESSING_ASSISTANT_TO_FRONT
                        /* If there is no need to bring preprocessing assistant to front,
                                current_maclient should always be brought to front */
-                       mas_bring_client_to_foreground(current_maclient_appid);
+                       bring_client_to_foreground(current_maclient_appid);
 #endif
                        mCurrentPreprocessingState = PREPROCESSING_STATE_WAKEUP_PREPROCESS_DISABLED;
                        if (check_preprocessing_assistant_exists()) {
@@ -1057,7 +1036,7 @@ int CServiceMain::mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVEN
 #ifdef BRING_PREPROCESSING_ASSISTANT_TO_FRONT
                                /* If preprocessing assistant does not exist, there is no way to enable
                                        preprocessing assistant, so bring current maclient to front right away */
-                               mas_bring_client_to_foreground(current_maclient_appid);
+                               bring_client_to_foreground(current_maclient_appid);
 #endif
                        }
                }
@@ -1085,7 +1064,7 @@ int CServiceMain::mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVEN
                                        would have been brought to front already on wakeup event */
 #ifdef BRING_PREPROCESSING_ASSISTANT_TO_FRONT
                                if (check_preprocessing_assistant_exists()) {
-                                       mas_bring_client_to_foreground(current_maclient_appid);
+                                       bring_client_to_foreground(current_maclient_appid);
                                }
 #endif
                                mCurrentPreprocessingState = PREPROCESSING_STATE_NONE;
@@ -1112,7 +1091,7 @@ int CServiceMain::mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVEN
                                        mPreferenceManager.get_bool(WAKEUP_SETTINGS_KEY_PREPROCESSING_ASSISTANT_APPID);
                                if (preprocessing_assistant) {
                                        MAS_LOGD("preprocessing_assistant_appid : %s", (*preprocessing_assistant).c_str());
-                                       mas_bring_client_to_foreground((*preprocessing_assistant).c_str());
+                                       bring_client_to_foreground((*preprocessing_assistant).c_str());
                                }
                        }
 #endif
@@ -1124,7 +1103,7 @@ int CServiceMain::mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVEN
 #ifdef BRING_PREPROCESSING_ASSISTANT_TO_FRONT
                        if (PREPROCESSING_STATE_EVENT_UTTERANCE_STREAMING_STARTED == mCurrentPreprocessingState ||
                                PREPROCESSING_STATE_EVENT_FOLLOW_UP_STREAMING_STARTED == mCurrentPreprocessingState) {
-                               mas_bring_client_to_foreground(current_maclient_appid);
+                               bring_client_to_foreground(current_maclient_appid);
                        }
 #endif
                        mCurrentPreprocessingState = PREPROCESSING_STATE_NONE;
@@ -1134,20 +1113,18 @@ int CServiceMain::mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVEN
        return 0;
 }
 
-int CServiceMain::mas_set_current_service_state(ma_service_state_e state)
+int CServiceMain::set_current_service_state(ma_service_state_e state)
 {
        mCurrentServiceState = state;
 
-       ma_client_s *data = NULL;
-
        int count = mClientManager.get_client_num();
        int i;
 
        for (i = 0; i < count; i++) {
-               int pid = mClientManager.find_client_pid_by_index(i);
+               pid_t pid = mClientManager.find_client_pid_by_index(i);
 
                if (-1 != pid) {
-                       int ret = mServiceIpc.service_state_change(pid, state);
+                       int ret = mServiceIpc.change_service_state(pid, state);
                        if (0 != ret) {
                                MAS_LOGE("[ERROR] Fail to set service state change to %d, ret(%d)", pid, ret);
                        }
@@ -1156,7 +1133,7 @@ int CServiceMain::mas_set_current_service_state(ma_service_state_e state)
        return 0;
 }
 
-ma_service_state_e CServiceMain::mas_get_current_service_state()
+ma_service_state_e CServiceMain::get_current_service_state()
 {
        return mCurrentServiceState;
 }
@@ -1174,25 +1151,56 @@ bool CServiceMain::is_valid_wakeup_engine(const char* appid)
        return false;
 }
 
-int pkg_app_list_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
+bool CServiceMain::is_wakeup_engine(const pkgmgrinfo_appinfo_h handle)
 {
-       if (nullptr == g_service_main) return -1;
+       if (nullptr == g_service_main) return false;
+       bool is_wakeup_engine = false;
 
        char *appid = NULL;
 
        int ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
        if (PMINFO_R_OK == ret && NULL != appid) {
-               int *result = (int*)user_data;
-               if (result) {
-                       bool exists = g_service_main->is_valid_wakeup_engine(appid);
-                       if (exists) {
-                               *result = 1;
+               for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM;loop++) {
+                       if (mClientInfo[loop].used) {
+                               LOGD("comparing appid : %s %s", mClientInfo[loop].wakeup_engine, appid);
+                               if (0 == strncmp(mClientInfo[loop].wakeup_engine, appid, MAX_APPID_LEN)) {
+                                       is_wakeup_engine = true;
+                               }
                        }
                }
        } else {
                LOGE("pkgmgrinfo_appinfo_get_appid failed! error code=%d", ret);
        }
 
+       return is_wakeup_engine;
+}
+
+bool CServiceMain::is_voice_assistant(const pkgmgrinfo_appinfo_h handle)
+{
+       bool is_voice_assistant = false;
+       char* metadata_value = NULL;
+       const char* voice_assistant_metadata = "http://tizen.org/metadata/multi-assistant/name";
+       int ret = pkgmgrinfo_appinfo_get_metadata_value(handle, voice_assistant_metadata, &metadata_value);
+       if (PMINFO_R_OK == ret && NULL != metadata_value) {
+               is_voice_assistant = true;
+       } else {
+               LOGE("pkgmgrinfo_appinfo_get_metadata_value failed! error code=%d", ret);
+       }
+       return is_voice_assistant;
+}
+
+static int pkg_app_list_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+       if (!g_service_main) return 0;
+
+       int *result = (int*)user_data;
+       if (result) {
+               if (g_service_main->is_voice_assistant(handle)) {
+                       *result = 1;
+               } else if (g_service_main->is_wakeup_engine(handle)) {
+                       *result = 1;
+               }
+       }
        return 0;
 }
 
@@ -1224,6 +1232,7 @@ static void _package_manager_event_cb(const char *type, const char *package, pac
        pkgmgrinfo_pkginfo_h handle = NULL;
        static bool in_progress = false;
        bool should_exit = false;
+       bool pkginfo_found = true;
 
        if (!package || !type)
                return;
@@ -1234,7 +1243,8 @@ static void _package_manager_event_cb(const char *type, const char *package, pac
                return;
 
        if (PACKAGE_MANAGER_EVENT_STATE_STARTED != event_state &&
-               PACKAGE_MANAGER_EVENT_STATE_COMPLETED != event_state)
+               PACKAGE_MANAGER_EVENT_STATE_COMPLETED != event_state &&
+               PACKAGE_MANAGER_EVENT_STATE_FAILED != event_state)
                return;
 
        bool user = false;
@@ -1242,22 +1252,34 @@ static void _package_manager_event_cb(const char *type, const char *package, pac
                type, package, event_type, event_state, progress, error);
        ret = pkgmgrinfo_pkginfo_get_pkginfo(package, &handle);
        if (ret != PMINFO_R_OK || NULL == handle) {
-               MAS_LOGW("Failed to call pkgmgrinfo_pkginfo_get_pkginfo & get_usr_pkginfo(\"%s\",~) returned %d, uid : %d", package, ret, getuid());
+               MAS_LOGW("Failed to call pkgmgrinfo_pkginfo_get_pkginfo(\"%s\",~) returned %d", package, ret);
                /* Try to get in user packages */
                user = true;
                ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(package, uid, &handle);
                if (ret != PMINFO_R_OK || NULL == handle) {
-                       MAS_LOGW("Failed to call pkgmgrinfo_pkginfo_get_pkginfo & get_usr_pkginfo(\"%s\",~) returned %d, uid : %d", package, ret, getuid());
-                       return;
+                       MAS_LOGW("Failed to call pkgmgrinfo_pkginfo_get_pkginfo & get_usr_pkginfo(\"%s\",~) returned %d, uid : %d", package, ret, getuid ());
+                       pkginfo_found = false;
                }
        }
 
-       if (user) {
-               /* Try to get in user packages */
-               pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP, pkg_app_list_cb, (void *)&ret, uid);
-       }  else {
-               /* Try to get in global packages */
-               pkgmgrinfo_appinfo_get_list(handle, PMINFO_ALL_APP, pkg_app_list_cb, (void *)&ret);
+       if (pkginfo_found) {
+               if (user) {
+                       /* Try to get in user packages */
+                       pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP, pkg_app_list_cb, (void *)&ret, uid);
+               }  else {
+                       /* Try to get in global packages */
+                       pkgmgrinfo_appinfo_get_list(handle, PMINFO_ALL_APP, pkg_app_list_cb, (void *)&ret);
+               }
+       } else {
+               /* Even if we failed acquiring the pkginfo, proceed if we're uninstalling
+                       since at the time of uninstall completion, pkginfo would not exist */
+               if (in_progress) {
+                       if (PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL == event_type &&
+                               (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state ||
+                               PACKAGE_MANAGER_EVENT_STATE_FAILED == event_state)) {
+                               ret = 1;
+                       }
+               }
        }
        if (1 == ret) {
                if (PACKAGE_MANAGER_EVENT_STATE_STARTED == event_state) {
@@ -1270,8 +1292,10 @@ static void _package_manager_event_cb(const char *type, const char *package, pac
                                        MAS_LOGE("service_main is NULL");
                                }
                        }
-               } else if (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state) {
-                       MAS_LOGI("processing PACKAGE_MANAGER_EVENT_STATE_COMPLETED event : %d", event_type);
+               } else if (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state ||
+                       PACKAGE_MANAGER_EVENT_STATE_FAILED == event_state) {
+                       MAS_LOGI("processing PACKAGE_MANAGER_EVENT_STATE_COMPLETED/FAILED event : %d %d",
+                               event_state, event_type);
                        if (false == in_progress) {
                                if (service_main) {
                                        service_main->deinitialize_service_plugin();
@@ -1292,7 +1316,7 @@ static void _package_manager_event_cb(const char *type, const char *package, pac
                }
        }
 
-       pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+       if (handle) pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
 
        if (should_exit) {
                LOGI("Now restarting multi-assistant-service for reloading updated modules");
@@ -1305,13 +1329,14 @@ static void _package_manager_event_cb(const char *type, const char *package, pac
 bool CServiceMain::app_create(void *data)
 {
        // Todo: add your code here.
-       MAS_LOGD("[Enter] Service app create");
+       MAS_LOGI("[ENTER] Service app create");
 
        g_service_main = this;
 
        mClientManager.set_application_manager(&mApplicationManager);
 
        mServiceIpc.set_client_manager(&mClientManager);
+       mServiceIpc.set_application_manager(&mApplicationManager);
        mServiceIpc.set_service_ipc_observer(this);
 
        mServicePlugin.set_service_ipc(&mServiceIpc);
@@ -1326,15 +1351,15 @@ bool CServiceMain::app_create(void *data)
 
        process_activated_setting();
 
-       mas_prelaunch_default_assistant();
-       mas_update_voice_key_support_mode();
+       prelaunch_default_assistant();
+       update_voice_key_support_mode();
 
        /* For the case of preprocessing assistant, it always have to be launched beforehand */
        boost::optional<std::string> preprocessing_assistant =
                mPreferenceManager.get_string(WAKEUP_SETTINGS_KEY_PREPROCESSING_ASSISTANT_APPID);
        if (preprocessing_assistant) {
                MAS_LOGD("prelaunching preprocessing_assistant_appid : %s", (*preprocessing_assistant).c_str());
-               mas_launch_client_by_appid((*preprocessing_assistant).c_str(), CLIENT_LAUNCH_MODE_PRELAUNCH);
+               launch_client_by_appid((*preprocessing_assistant).c_str(), CLIENT_LAUNCH_MODE_PRELAUNCH);
        }
 
        if (!mPackageManagerHandle) {
@@ -1351,6 +1376,7 @@ bool CServiceMain::app_create(void *data)
                }
        }
 
+       MAS_LOGI("[END] Service app create");
        return true;
 }
 
@@ -1379,48 +1405,48 @@ void CServiceMain::app_terminate(void *data)
        return;
 }
 
-int CServiceMain::on_initialize(int pid) {
+int CServiceMain::on_initialize(pid_t pid) {
        MAS_LOGD("[Enter] pid(%d)", pid);
 
-       char appid[MAX_APPID_LEN] = {'\0', };
-       if (AUL_R_OK == aul_app_get_appid_bypid(pid, appid, sizeof(appid))) {
-               appid[MAX_APPID_LEN - 1] = '\0';
-
-               MAS_LOGD("appid for pid %d is : %s", pid, (appid ? appid : "Unknown"));
+       std::string pid_appid;
+       boost::optional<std::string> appid_by_pid = mApplicationManager.get_appid_by_pid(pid);
+       if (appid_by_pid) {
+               pid_appid = *appid_by_pid;
+               MAS_LOGD("appid for pid %d is : %s", pid, pid_appid.c_str());
 
                /* Remove existing client that has same appid, if there's any */
-               mClientManager.destroy_client_by_appid(appid);
+               mClientManager.destroy_client_by_appid(pid_appid.c_str());
 
                /* And remove a client that has same pid also */
                mClientManager.destroy_client_by_pid(pid);
 
-               mClientManager.create_client(pid, appid);
+               mClientManager.create_client(pid, pid_appid.c_str());
 
                const char *current_maclient_appid = NULL;
                if (mCurrentClientInfo >= 0 && mCurrentClientInfo < MAX_MACLIENT_INFO_NUM) {
                        current_maclient_appid = mClientInfo[mCurrentClientInfo].appid;
                }
 
-               mas_client_send_preprocessing_information(pid);
+               client_send_preprocessing_information(pid);
                if (MA_VOICE_KEY_STATUS_PRESSED == mLastVoiceKeyStatus) {
-                       mas_client_send_voice_key_status_change(pid, mLastVoiceKeyStatus);
+                       client_send_voice_key_status_change(pid, mLastVoiceKeyStatus);
                }
-               if (current_maclient_appid && 0 == strncmp(current_maclient_appid, appid, MAX_APPID_LEN)) {
+               if (current_maclient_appid && 0 == pid_appid.compare(current_maclient_appid)) {
                        MAS_LOGD("MA client with current maclient appid connected!");
 
-                       if (0 == mWakeupClientAppId.compare(appid)) {
+                       if (0 == mWakeupClientAppId.compare(pid_appid)) {
                                mWakeupClientAppId.clear();
-                               mServiceIpc.active_state_change(pid, MA_ACTIVE_STATE_ACTIVE);
-                               mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_ASSISTANT_ACTIVATED);
+                               mServiceIpc.change_active_state(pid, MA_ACTIVE_STATE_ACTIVE);
+                               process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_ASSISTANT_ACTIVATED);
                        } else {
                                MAS_LOGE("[ERROR] mWakeupClientAppId and appid differ : %s %s",
-                                       mWakeupClientAppId.c_str(), appid);
+                                       mWakeupClientAppId.c_str(), pid_appid.c_str());
                        }
                } else {
                        MAS_LOGD("MA client connected, but its appid does not match with current maclient");
                }
 
-               mServiceIpc.service_state_change(pid, mas_get_current_service_state());
+               mServiceIpc.change_service_state(pid, get_current_service_state());
        } else {
                MAS_LOGE("[ERROR] Fail to retrieve appid");
        }
@@ -1428,15 +1454,15 @@ int CServiceMain::on_initialize(int pid) {
        return 0;
 }
 
-int CServiceMain::on_deinitialize(int pid) {
+int CServiceMain::on_deinitialize(pid_t pid) {
        MAS_LOGD("[Enter] pid(%d)", pid);
        mClientManager.destroy_client_by_pid(pid);
        return 0;
 }
 
-int CServiceMain::on_get_audio_format(int pid, int& rate, int& channel, int& audio_type) {
+int CServiceMain::on_get_audio_format(pid_t pid, int& rate, int& channel, int& audio_type) {
        int main_rate, main_channel, main_audio_type;
-       int ret = mas_client_get_audio_format(pid,
+       int ret = client_get_audio_format(pid,
                &main_rate, &main_channel, &main_audio_type);
        rate = main_rate;
        channel = main_channel;
@@ -1444,85 +1470,85 @@ int CServiceMain::on_get_audio_format(int pid, int& rate, int& channel, int& aud
        return ret;
 }
 
-int CServiceMain::on_get_audio_source_type(int pid, std::string& type) {
+int CServiceMain::on_get_audio_source_type(pid_t pid, std::string& type) {
        char *main_type = nullptr;
-       int ret = mas_client_get_audio_source_type(pid, &main_type);
+       int ret = client_get_audio_source_type(pid, &main_type);
        if (0 == ret && main_type) {
                type = std::string{main_type};
        }
        return ret;
 }
 
-int CServiceMain::on_send_asr_result(int pid, int event, std::string asr_result) {
-       return mas_client_send_asr_result(pid, event, asr_result.c_str());
+int CServiceMain::on_send_asr_result(pid_t pid, int event, std::string asr_result) {
+       return client_send_asr_result(pid, event, asr_result.c_str());
 }
 
-int CServiceMain::on_send_result(int pid, std::string display_text,
+int CServiceMain::on_send_result(pid_t pid, std::string display_text,
        std::string utterance_text, std::string result_json) {
-       return mas_client_send_result(pid,
+       return client_send_result(pid,
                display_text.c_str(), utterance_text.c_str(), result_json.c_str());
 }
 
-int CServiceMain::on_send_recognition_result(int pid, int result) {
-       return mas_client_send_recognition_result(pid, result);
+int CServiceMain::on_send_recognition_result(pid_t pid, int result) {
+       return client_send_recognition_result(pid, result);
 }
 
-int CServiceMain::on_start_streaming_audio_data(int pid, int type) {
-       return mas_client_start_streaming_audio_data(pid, type);
+int CServiceMain::on_start_streaming_audio_data(pid_t pid, int type) {
+       return client_start_streaming_audio_data(pid, type);
 }
 
-int CServiceMain::on_stop_streaming_audio_data(int pid, int type) {
-       return mas_client_stop_streaming_audio_data(pid, type);
+int CServiceMain::on_stop_streaming_audio_data(pid_t pid, int type) {
+       return client_stop_streaming_audio_data(pid, type);
 }
 
-int CServiceMain::on_update_voice_feedback_state(int pid, int state) {
-       return mas_client_update_voice_feedback_state(pid, state);
+int CServiceMain::on_update_voice_feedback_state(pid_t pid, int state) {
+       return client_update_voice_feedback_state(pid, state);
 }
 
-int CServiceMain::on_send_assistant_specific_command(int pid, std::string command) {
-       return mas_client_set_assistant_specific_command(pid, command.c_str());
+int CServiceMain::on_send_assistant_specific_command(pid_t pid, std::string command) {
+       return client_set_assistant_specific_command(pid, command.c_str());
 }
 
-int CServiceMain::on_set_background_volume(int pid, double ratio) {
-       return mas_client_set_background_volume(pid, ratio);
+int CServiceMain::on_set_background_volume(pid_t pid, double ratio) {
+       return client_set_background_volume(pid, ratio);
 }
 
-int CServiceMain::on_set_preprocessing_allow_mode(int pid, int mode, std::string app_id) {
-       return mas_client_set_preprocessing_allow_mode(pid,
+int CServiceMain::on_set_preprocessing_allow_mode(pid_t pid, int mode, std::string app_id) {
+       return client_set_preprocessing_allow_mode(pid,
                static_cast<ma_preprocessing_allow_mode_e>(mode), app_id.c_str());
 }
 
-int CServiceMain::on_send_preprocessing_result(int pid, int result) {
-       return mas_client_send_preprocessing_result(pid, result);
+int CServiceMain::on_send_preprocessing_result(pid_t pid, int result) {
+       return client_send_preprocessing_result(pid, result);
 }
 
-int CServiceMain::on_set_wake_word_audio_require_flag(int pid, int require) {
-       return mas_client_set_wake_word_audio_require_flag(pid, require);
+int CServiceMain::on_set_wake_word_audio_require_flag(pid_t pid, int require) {
+       return client_set_wake_word_audio_require_flag(pid, require);
 }
 
-int CServiceMain::on_set_assistant_language(int pid, std::string language) {
-       return mas_client_set_assistant_language(pid, language.c_str());
+int CServiceMain::on_set_assistant_language(pid_t pid, std::string language) {
+       return client_set_assistant_language(pid, language.c_str());
 }
 
-int CServiceMain::on_add_wake_word(int pid, std::string wake_word, std::string language) {
-       return mas_client_add_wake_word(pid, wake_word.c_str(), language.c_str());
+int CServiceMain::on_add_wake_word(pid_t pid, std::string wake_word, std::string language) {
+       return client_add_wake_word(pid, wake_word.c_str(), language.c_str());
 }
 
-int CServiceMain::on_remove_wake_word(int pid, std::string wake_word, std::string language) {
-       return mas_client_remove_wake_word(pid, wake_word.c_str(), language.c_str());
+int CServiceMain::on_remove_wake_word(pid_t pid, std::string wake_word, std::string language) {
+       return client_remove_wake_word(pid, wake_word.c_str(), language.c_str());
 }
 
-int CServiceMain::on_ui_initialize(int pid)
+int CServiceMain::on_ui_initialize(pid_t pid)
 {
-       return mas_ui_client_initialize(pid);
+       return ui_client_initialize(pid);
 }
 
-int CServiceMain::on_ui_deinitialize(int pid)
+int CServiceMain::on_ui_deinitialize(pid_t pid)
 {
-       return mas_ui_client_deinitialize(pid);
+       return ui_client_deinitialize(pid);
 }
 
 int CServiceMain::on_ui_change_assistant(std::string app_id)
 {
-       return mas_ui_client_change_assistant(app_id.c_str());
+       return ui_client_change_assistant(app_id.c_str());
 }