Register package manager event handler before loading wakeup engines 99/282299/1
authorJi-hoon Lee <dalton.lee@samsung.com>
Thu, 29 Sep 2022 11:33:06 +0000 (20:33 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Thu, 29 Sep 2022 11:41:25 +0000 (20:41 +0900)
If the wakeup engine app gets installed while
multi-assistant-service is being launched and also
is trying to load wakeup engines, the newly installed
wakeup engine will not be loaded since at the time of
launching the installation was not completed,
and the installation completion event would not be
received also, since the package manager event handler
might not be registered yet.
So if we register package manager event handler first
and then load wakeup engines, even if the wakeup engine
currently being installed fails to be loaded, the
installation completion event is guaranteed to be received
by the package manager event handler, making sure that
the multi-assistant-service would restart for re-loading.

Change-Id: I1e8f57d6a08c9290a0ae11422d1404188c97c3df

src/package_update_monitor.cpp
src/service_main.cpp

index 112fff8e1b94a25c1c546200d29e043594b65408..c2c74ffbce5f9fb3100b61c881f4c58c2f0ba155 100644 (file)
@@ -42,7 +42,7 @@ void CPackageUpdateMonitor::initialize()
                ret = package_manager_set_event_cb(mHandle,
                        CPackageUpdateMonitor::package_manager_event_cb, this);
                if (ret == PACKAGE_MANAGER_ERROR_NONE) {
-                       LOGD("package_manager_set_event_cb succeeded.");
+                       LOGE("package_manager_set_event_cb succeeded : %p", mHandle);
                } else {
                        LOGE("package_manager_set_event_cb failed(%d)", ret);
                }
@@ -74,7 +74,7 @@ static bool is_wakeup_engine(const pkgmgrinfo_appinfo_h handle, CPackageUpdateMo
                for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM;loop++) {
                        if (clientInfo.getItems()[loop].used) {
                                for (int inner_loop = 0;inner_loop < MAX_WAKEUP_ENGINES_NUM;inner_loop++) {
-                                       LOGD("comparing appid : %s %s", clientInfo.getItems()[loop].wakeup_engine[inner_loop], appid);
+                                       LOGI("comparing appid : %s %s", clientInfo.getItems()[loop].wakeup_engine[inner_loop], appid);
                                        if (0 == strncmp(clientInfo.getItems()[loop].wakeup_engine[inner_loop], appid, MAX_APPID_LEN)) {
                                                is_wakeup_engine = true;
                                        }
@@ -85,6 +85,7 @@ static bool is_wakeup_engine(const pkgmgrinfo_appinfo_h handle, CPackageUpdateMo
                LOGE("pkgmgrinfo_appinfo_get_appid failed! error code=%d", ret);
        }
 
+       LOGI("Returning : %d", is_wakeup_engine);
        return is_wakeup_engine;
 }
 
@@ -99,6 +100,7 @@ static bool is_voice_assistant(const pkgmgrinfo_appinfo_h handle, CPackageUpdate
        } else {
                LOGE("pkgmgrinfo_appinfo_get_metadata_value failed! error code=%d", ret);
        }
+       LOGI("Returning : %d", is_voice_assistant);
        return is_voice_assistant;
 }
 
@@ -152,21 +154,26 @@ void CPackageUpdateMonitor::package_manager_event_cb(const char *type, const cha
        bool should_exit = false;
        bool pkginfo_found = true;
 
-       if (!package || !type)
+       if (!package || !type){
+               LOGE("Package name or type info is NULL");
                return;
+       }
 
        if (PACKAGE_MANAGER_EVENT_TYPE_UPDATE != event_type &&
                PACKAGE_MANAGER_EVENT_TYPE_INSTALL != event_type &&
-               PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL != event_type)
+               PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL != event_type) {
+               LOGE("Unexpected event type : %d", event_type);
                return;
+       }
 
        if (PACKAGE_MANAGER_EVENT_STATE_STARTED != event_state &&
                PACKAGE_MANAGER_EVENT_STATE_COMPLETED != event_state &&
-               PACKAGE_MANAGER_EVENT_STATE_FAILED != event_state)
+               PACKAGE_MANAGER_EVENT_STATE_FAILED != event_state) {
                return;
+       }
 
        bool user = false;
-       LOGD("type=%s package=%s event_type=%d event_state=%d progress=%d error=%d",
+       LOGI("type=%s package=%s event_type=%d event_state=%d progress=%d error=%d",
                type, package, event_type, event_state, progress, error);
        ret = pkgmgrinfo_pkginfo_get_pkginfo(package, &handle);
        if (ret != PMINFO_R_OK || NULL == handle) {
@@ -199,6 +206,7 @@ void CPackageUpdateMonitor::package_manager_event_cb(const char *type, const cha
                                LOGW("Failed to get pkg list from pkginfo, returned %d", ret);
                        }
                }
+               LOGI("filter_result : %d", filter_result);
        } else {
                /* Even if we failed acquiring the pkginfo, proceed if we're uninstalling
                        since at the time of uninstall completion, pkginfo would not exist */
index 48eb1421c2526b229bbadb4ddb83288bd7df281f..14cb54beaeb952c9a1cee9fba8d2466dc0691d6f 100644 (file)
@@ -1384,6 +1384,8 @@ bool CServiceMain::app_create(void *data)
                return false;
        }
 
+       mPackageUpdateMonitor.initialize();
+
        initialize_service_plugin();
 
        process_activated_setting();
@@ -1400,8 +1402,6 @@ bool CServiceMain::app_create(void *data)
                        nullptr, 0, nullptr, CLIENT_LAUNCH_MODE_PRELAUNCH);
        }
 
-       mPackageUpdateMonitor.initialize();
-
        MAS_LOGE("[END] Service app create");
        return true;
 }