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