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