1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "advanced_ui_component/navpushpathhelper/include/hsp_silentinstall.h"
16 #include "advanced_ui_component/navpushpathhelper/include/silent_install_callback.h"
17 
18 #include "iservice_registry.h"
19 #include "system_ability_definition.h"
20 #include "ability_runtime/context/context.h"
21 #include "want.h"
22 #include "adapter/ohos/entrance/ace_container.h"
23 #include "core/pipeline_ng/pipeline_context.h"
24 #include "base/log/log.h"
25 #include "base/utils/utils.h"
26 #include "core/components_ng/manager/navigation/navigation_manager.h"
27 #include "core/components_ng/pattern/image/image_pattern.h"
28 
29 namespace OHOS::NavPushPathHelper {
30 
GetBundleManager()31 OHOS::sptr<OHOS::AppExecFwk::IBundleMgr> HspSilentInstall::GetBundleManager()
32 {
33     auto systemAbilityMgr = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
34     if (!systemAbilityMgr) {
35         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "get system ability failed");
36         return nullptr;
37     }
38     auto bundleObj = systemAbilityMgr->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
39     if (!bundleObj) {
40         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "get bundle service failed");
41         return nullptr;
42     }
43     return OHOS::iface_cast<OHOS::AppExecFwk::IBundleMgr>(bundleObj);
44 }
45 
SilentInstall(const std::string & moduleName,const std::function<void ()> & callback,const std::function<void (int32_t,const std::string &)> & silentInstallErrorCallBack)46 int32_t HspSilentInstall::SilentInstall(const std::string& moduleName, const std::function<void()>& callback,
47     const std::function<void(int32_t, const std::string&)>& silentInstallErrorCallBack)
48 {
49     auto pipeline = OHOS::Ace::NG::PipelineContext::GetCurrentContextSafely();
50     CHECK_NULL_RETURN(pipeline, -1);
51 
52     auto runtimeContext = OHOS::Ace::Platform::AceContainer::GetRuntimeContext(pipeline->GetInstanceId());
53     CHECK_NULL_RETURN(runtimeContext, -1);
54 
55     auto bundleName = runtimeContext->GetBundleName();
56     if (bundleName.empty()) {
57         return -1;
58     }
59 
60     auto appInfo = runtimeContext->GetApplicationInfo();
61     if (!appInfo) {
62         return -1;
63     }
64     auto bms = GetBundleManager();
65     CHECK_NULL_RETURN(bms, -1);
66 
67     OHOS::AAFwk::Want want;
68     want.SetBundle(bundleName);
69     want.SetModuleName(moduleName);
70     OHOS::sptr<AtomicServiceStatusCallback> routerCallback = new AtomicServiceStatusCallback();
71     routerCallback->SetActionEventHandler(callback);
72     routerCallback->SetErrorEventHandler(silentInstallErrorCallBack);
73     if (bms->SilentInstall(want, appInfo->uid / OHOS::AppExecFwk::Constants::BASE_USER_RANGE, routerCallback)) {
74         TAG_LOGI(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "Begin to silent install");
75         return 0;
76     }
77     return -1;
78 }
79 
IsHspExist(const std::string & moduleName,const std::string & pathName)80 bool HspSilentInstall::IsHspExist(const std::string &moduleName, const std::string &pathName)
81 {
82     auto pipeline = OHOS::Ace::NG::PipelineContext::GetCurrentContextSafely();
83     CHECK_NULL_RETURN(pipeline, false);
84     auto container = OHOS::Ace::Container::Current();
85     CHECK_NULL_RETURN(container, false);
86     auto navigationRoute = container->GetNavigationRoute();
87     CHECK_NULL_RETURN(navigationRoute, false);
88     if (navigationRoute->IsNavigationItemExits(pathName)) {
89         return true;
90     }
91 
92     auto runtimeContext = OHOS::Ace::Platform::AceContainer::GetRuntimeContext(pipeline->GetInstanceId());
93     CHECK_NULL_RETURN(runtimeContext, false);
94 
95     auto appInfo = runtimeContext->GetApplicationInfo();
96     if (!appInfo) {
97         return false;
98     }
99     std::vector<OHOS::AppExecFwk::ModuleInfo> moduleList = appInfo->moduleInfos;
100     auto res = std::any_of(moduleList.begin(), moduleList.end(), [moduleName](const auto &module) {
101         return module.moduleName == moduleName;
102     });
103     if (res) {
104         return true;
105     }
106     return false;
107 }
108 
InitRouteMap()109 void HspSilentInstall::InitRouteMap()
110 {
111     auto container = OHOS::Ace::Container::CurrentSafely();
112     CHECK_NULL_VOID(container);
113     auto navigationRoute = container->GetNavigationRoute();
114     CHECK_NULL_VOID(navigationRoute);
115     navigationRoute->InitRouteMap();
116 }
117 } // namespace OHOS::NavPushPathHelper