180922886Sopenharmony_ci/*
280922886Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
380922886Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
480922886Sopenharmony_ci * you may not use this file except in compliance with the License.
580922886Sopenharmony_ci * You may obtain a copy of the License at
680922886Sopenharmony_ci *
780922886Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
880922886Sopenharmony_ci *
980922886Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1080922886Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1180922886Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1280922886Sopenharmony_ci * See the License for the specific language governing permissions and
1380922886Sopenharmony_ci * limitations under the License.
1480922886Sopenharmony_ci */
1580922886Sopenharmony_ci
1680922886Sopenharmony_ci#include "ability_manager_interface.h"
1780922886Sopenharmony_ci#include "ability_manager_client.h"
1880922886Sopenharmony_ci#include "bundle_mgr_proxy.h"
1980922886Sopenharmony_ci#include "iremote_stub.h"
2080922886Sopenharmony_ci#include "iservice_registry.h"
2180922886Sopenharmony_ci#include "array_wrapper.h"
2280922886Sopenharmony_ci#include "string_wrapper.h"
2380922886Sopenharmony_ci#include "want_params_wrapper.h"
2480922886Sopenharmony_ci#include "system_ability_definition.h"
2580922886Sopenharmony_ci
2680922886Sopenharmony_ci#include "avsession_dynamic_insight.h"
2780922886Sopenharmony_ci#include "avsession_errors.h"
2880922886Sopenharmony_ci#include "avsession_log.h"
2980922886Sopenharmony_ci
3080922886Sopenharmony_cinamespace OHOS::AVSession {
3180922886Sopenharmony_ci
3280922886Sopenharmony_ciInsightAdapter::InsightAdapter()
3380922886Sopenharmony_ci{
3480922886Sopenharmony_ci    SLOGI("construct");
3580922886Sopenharmony_ci}
3680922886Sopenharmony_ci
3780922886Sopenharmony_ciInsightAdapter::~InsightAdapter()
3880922886Sopenharmony_ci{
3980922886Sopenharmony_ci    SLOGI("destroy");
4080922886Sopenharmony_ci}
4180922886Sopenharmony_ci
4280922886Sopenharmony_ciInsightAdapter& InsightAdapter::GetInsightAdapterInstance()
4380922886Sopenharmony_ci{
4480922886Sopenharmony_ci    static InsightAdapter insightAdapter;
4580922886Sopenharmony_ci    return insightAdapter;
4680922886Sopenharmony_ci}
4780922886Sopenharmony_ci
4880922886Sopenharmony_cibool InsightAdapter::CheckBundleSupport(std::string& profile)
4980922886Sopenharmony_ci{
5080922886Sopenharmony_ci    nlohmann::json profileValues = nlohmann::json::parse(profile, nullptr, false);
5180922886Sopenharmony_ci    CHECK_AND_RETURN_RET_LOG(!profileValues.is_discarded(), false, "json object is null");
5280922886Sopenharmony_ci    CHECK_AND_RETURN_RET_LOG(profileValues.contains("insightIntents"), false, "json do not contains insightIntents");
5380922886Sopenharmony_ci    for (const auto& value : profileValues["insightIntents"]) {
5480922886Sopenharmony_ci        std::string insightName = value["intentName"];
5580922886Sopenharmony_ci        CHECK_AND_RETURN_RET_LOG(value.contains("uiAbility"), false, "json do not contains uiAbility");
5680922886Sopenharmony_ci        nlohmann::json abilityValue = value["uiAbility"];
5780922886Sopenharmony_ci        if (insightName != PLAY_MUSICLIST && insightName != PLAY_AUDIO) {
5880922886Sopenharmony_ci            continue;
5980922886Sopenharmony_ci        }
6080922886Sopenharmony_ci        if (abilityValue.is_discarded()) {
6180922886Sopenharmony_ci            SLOGE("uiability discarded=%{public}d", abilityValue.is_discarded());
6280922886Sopenharmony_ci            return false;
6380922886Sopenharmony_ci        }
6480922886Sopenharmony_ci        CHECK_AND_RETURN_RET_LOG(abilityValue.contains("executeMode"), false, "json do not contains executeMode");
6580922886Sopenharmony_ci        auto modeValues = abilityValue["executeMode"];
6680922886Sopenharmony_ci        if (modeValues.is_discarded()) {
6780922886Sopenharmony_ci            SLOGE("executeMode discarded=%{public}d", modeValues.is_discarded());
6880922886Sopenharmony_ci            return false;
6980922886Sopenharmony_ci        }
7080922886Sopenharmony_ci        auto mode = std::find(modeValues.begin(), modeValues.end(), "background");
7180922886Sopenharmony_ci        return (mode != modeValues.end());
7280922886Sopenharmony_ci    }
7380922886Sopenharmony_ci    return false;
7480922886Sopenharmony_ci}
7580922886Sopenharmony_ci
7680922886Sopenharmony_ci__attribute__((no_sanitize("cfi"))) bool InsightAdapter::IsSupportPlayIntent(const std::string& bundleName,
7780922886Sopenharmony_ci    std::string& supportModule, std::string& profile)
7880922886Sopenharmony_ci{
7980922886Sopenharmony_ci    auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
8080922886Sopenharmony_ci    if (!systemAbilityManager) {
8180922886Sopenharmony_ci        SLOGI("fail to get system ability mgr");
8280922886Sopenharmony_ci        return false;
8380922886Sopenharmony_ci    }
8480922886Sopenharmony_ci
8580922886Sopenharmony_ci    auto remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
8680922886Sopenharmony_ci    if (!remoteObject) {
8780922886Sopenharmony_ci        SLOGI("fail to get bundle manager proxy");
8880922886Sopenharmony_ci        return false;
8980922886Sopenharmony_ci    }
9080922886Sopenharmony_ci
9180922886Sopenharmony_ci    sptr<AppExecFwk::BundleMgrProxy> bundleMgrProxy = iface_cast<AppExecFwk::BundleMgrProxy>(remoteObject);
9280922886Sopenharmony_ci    if (bundleMgrProxy == nullptr) {
9380922886Sopenharmony_ci        return false;
9480922886Sopenharmony_ci    }
9580922886Sopenharmony_ci    SLOGI("get bundle manager proxy success");
9680922886Sopenharmony_ci
9780922886Sopenharmony_ci    AppExecFwk::BundleInfo bundleInfo;
9880922886Sopenharmony_ci    if (!bundleMgrProxy->GetBundleInfo(bundleName, getBundleInfoWithHapModule, bundleInfo, startUserId)) {
9980922886Sopenharmony_ci        SLOGE("GetBundleInfo=%{public}s fail", bundleName.c_str());
10080922886Sopenharmony_ci        return false;
10180922886Sopenharmony_ci    }
10280922886Sopenharmony_ci    bool isSupportIntent = false;
10380922886Sopenharmony_ci    for (const std::string& module : bundleInfo.moduleNames) {
10480922886Sopenharmony_ci        auto ret = bundleMgrProxy->GetJsonProfile(AppExecFwk::ProfileType::INTENT_PROFILE, bundleName, module,
10580922886Sopenharmony_ci            profile, startUserId);
10680922886Sopenharmony_ci        if (ret == 0) {
10780922886Sopenharmony_ci            SLOGI("GetJsonProfile success, profile=%{public}s", profile.c_str());
10880922886Sopenharmony_ci            isSupportIntent = true;
10980922886Sopenharmony_ci            supportModule = module;
11080922886Sopenharmony_ci            break;
11180922886Sopenharmony_ci        }
11280922886Sopenharmony_ci    }
11380922886Sopenharmony_ci    if (!isSupportIntent) {
11480922886Sopenharmony_ci        SLOGE("Bundle=%{public}s does not support insight", bundleName.c_str());
11580922886Sopenharmony_ci        return false;
11680922886Sopenharmony_ci    }
11780922886Sopenharmony_ci    return CheckBundleSupport(profile);
11880922886Sopenharmony_ci}
11980922886Sopenharmony_ci
12080922886Sopenharmony_cibool InsightAdapter::GetPlayIntentParam(const std::string& bundleName, const std::string& assetId,
12180922886Sopenharmony_ci    AppExecFwk::InsightIntentExecuteParam &executeParam)
12280922886Sopenharmony_ci{
12380922886Sopenharmony_ci    std::string supportModule;
12480922886Sopenharmony_ci    std::string profile;
12580922886Sopenharmony_ci    if (!IsSupportPlayIntent(bundleName, supportModule, profile)) {
12680922886Sopenharmony_ci        SLOGE("bundle=%{public}s does not support play insights", bundleName.c_str());
12780922886Sopenharmony_ci        return false;
12880922886Sopenharmony_ci    }
12980922886Sopenharmony_ci    SLOGD("GetJsonProfile profile=%{public}s", profile.c_str());
13080922886Sopenharmony_ci    nlohmann::json profileValues = nlohmann::json::parse(profile, nullptr, false);
13180922886Sopenharmony_ci    CHECK_AND_RETURN_RET_LOG(!profileValues.is_discarded(), false, "json object is null");
13280922886Sopenharmony_ci    CHECK_AND_RETURN_RET_LOG(profileValues.contains("insightIntents"), false, "json do not contains insightIntents");
13380922886Sopenharmony_ci    auto res = false;
13480922886Sopenharmony_ci    for (const auto& value : profileValues["insightIntents"]) {
13580922886Sopenharmony_ci        std::string insightName = value["intentName"];
13680922886Sopenharmony_ci        nlohmann::json abilityValue = value["uiAbility"];
13780922886Sopenharmony_ci        SLOGD(" insightName=%{public}s", insightName.c_str());
13880922886Sopenharmony_ci        if (insightName != PLAY_MUSICLIST && insightName != PLAY_AUDIO) {
13980922886Sopenharmony_ci            continue;
14080922886Sopenharmony_ci        }
14180922886Sopenharmony_ci        if (!value.contains("uiAbility") || abilityValue.is_discarded()) {
14280922886Sopenharmony_ci            SLOGE("uiability discarded=%{public}d", abilityValue.is_discarded());
14380922886Sopenharmony_ci            continue;
14480922886Sopenharmony_ci        }
14580922886Sopenharmony_ci        SLOGD("insightName=%{public}s", insightName.c_str());
14680922886Sopenharmony_ci        executeParam.bundleName_ = bundleName;
14780922886Sopenharmony_ci        executeParam.moduleName_ = supportModule;
14880922886Sopenharmony_ci        executeParam.abilityName_ = abilityValue["ability"];
14980922886Sopenharmony_ci        executeParam.insightIntentName_ = insightName;
15080922886Sopenharmony_ci        executeParam.executeMode_ = AppExecFwk::ExecuteMode::UI_ABILITY_BACKGROUND;
15180922886Sopenharmony_ci        std::shared_ptr<AppExecFwk::WantParams> wantParam = std::make_shared<AppExecFwk::WantParams>();
15280922886Sopenharmony_ci        if (insightName == PLAY_MUSICLIST) {
15380922886Sopenharmony_ci            // construct items array
15480922886Sopenharmony_ci            AppExecFwk::WantParams innerParams;
15580922886Sopenharmony_ci            innerParams.SetParam("entityId", OHOS::AAFwk::String::Box(assetId));
15680922886Sopenharmony_ci            sptr<OHOS::AAFwk::IArray> array = new (std::nothrow) OHOS::AAFwk::Array(1, OHOS::AAFwk::g_IID_IWantParams);
15780922886Sopenharmony_ci            array->Set(0, OHOS::AAFwk::WantParamWrapper::Box(innerParams));
15880922886Sopenharmony_ci            wantParam->SetParam("items", array);
15980922886Sopenharmony_ci            res = true;
16080922886Sopenharmony_ci        }
16180922886Sopenharmony_ci        if (insightName == PLAY_AUDIO) {
16280922886Sopenharmony_ci            wantParam->SetParam("entityId", AppExecFwk::WantParams::GetInterfaceByType(interfaceType, assetId));
16380922886Sopenharmony_ci            res = true;
16480922886Sopenharmony_ci        }
16580922886Sopenharmony_ci        executeParam.insightIntentParam_ = wantParam;
16680922886Sopenharmony_ci    }
16780922886Sopenharmony_ci    return res;
16880922886Sopenharmony_ci}
16980922886Sopenharmony_ci
17080922886Sopenharmony_ciint32_t InsightAdapter::StartAVPlayback(AppExecFwk::InsightIntentExecuteParam &executeParam)
17180922886Sopenharmony_ci{
17280922886Sopenharmony_ci    SLOGI("bundleName=%{public}s abilityName=%{public}s moduleName=%{public}s IntentName=%{public}s",
17380922886Sopenharmony_ci        executeParam.bundleName_.c_str(), executeParam.abilityName_.c_str(),
17480922886Sopenharmony_ci        executeParam.moduleName_.c_str(), executeParam.insightIntentName_.c_str());
17580922886Sopenharmony_ci
17680922886Sopenharmony_ci    sptr<ISystemAbilityManager> systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
17780922886Sopenharmony_ci    if (systemManager == nullptr) {
17880922886Sopenharmony_ci        SLOGE("Fail to get registry");
17980922886Sopenharmony_ci        return AVSESSION_ERROR;
18080922886Sopenharmony_ci    }
18180922886Sopenharmony_ci    sptr<IRemoteObject> remote = systemManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
18280922886Sopenharmony_ci    if (remote == nullptr) {
18380922886Sopenharmony_ci        SLOGE("Fail to connect ability manager service");
18480922886Sopenharmony_ci        return AVSESSION_ERROR;
18580922886Sopenharmony_ci    }
18680922886Sopenharmony_ci
18780922886Sopenharmony_ci    auto ret = AAFwk::AbilityManagerClient::GetInstance()->ExecuteIntent((uint64_t) AVSESSION_SERVICE_ID,
18880922886Sopenharmony_ci        remote, executeParam);
18980922886Sopenharmony_ci    if (ret != AVSESSION_SUCCESS) {
19080922886Sopenharmony_ci        SLOGE("ExecuteIntent insightIntent=%{public}s fail", executeParam.insightIntentName_.c_str());
19180922886Sopenharmony_ci        return AVSESSION_ERROR;
19280922886Sopenharmony_ci    }
19380922886Sopenharmony_ci    return AVSESSION_SUCCESS;
19480922886Sopenharmony_ci}
19580922886Sopenharmony_ci
19680922886Sopenharmony_ciextern "C" bool IsSupportPlayIntent(const std::string& bundleName, const std::string& assetId)
19780922886Sopenharmony_ci{
19880922886Sopenharmony_ci    AppExecFwk::InsightIntentExecuteParam executeParam;
19980922886Sopenharmony_ci    return InsightAdapter::GetInsightAdapterInstance().GetPlayIntentParam(bundleName, assetId, executeParam);
20080922886Sopenharmony_ci}
20180922886Sopenharmony_ci
20280922886Sopenharmony_ciextern "C" int32_t StartAVPlayback(const std::string& bundleName, const std::string& assetId)
20380922886Sopenharmony_ci{
20480922886Sopenharmony_ci    AppExecFwk::InsightIntentExecuteParam executeParam;
20580922886Sopenharmony_ci    bool isSupport = InsightAdapter::GetInsightAdapterInstance().GetPlayIntentParam(bundleName, assetId, executeParam);
20680922886Sopenharmony_ci    if (isSupport) {
20780922886Sopenharmony_ci        return InsightAdapter::GetInsightAdapterInstance().StartAVPlayback(executeParam);
20880922886Sopenharmony_ci    }
20980922886Sopenharmony_ci    return AVSESSION_SUCCESS;
21080922886Sopenharmony_ci}
21180922886Sopenharmony_ci}
212