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