diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp index 75465e83502b16ca650fdcc9219367efab652ad4..13797ef33dc9ce536b891224eedf673f1f0a7625 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp @@ -144,6 +144,7 @@ napi_value JsSceneSessionManager::Init(napi_env env, napi_value exportObj) JsSceneSessionManager::InitWithRenderServiceAdded); BindNativeFunction(env, exportObj, "getAllAbilityInfo", moduleName, JsSceneSessionManager::GetAllAbilityInfos); BindNativeFunction(env, exportObj, "getBatchAbilityInfos", moduleName, JsSceneSessionManager::GetBatchAbilityInfos); + BindNativeFunction(env, exportObj, "getAbilityInfo", moduleName, JsSceneSessionManager::GetAbilityInfo); BindNativeFunction(env, exportObj, "getAllWindowVisibilityInfos", moduleName, JsSceneSessionManager::GetAllWindowVisibilityInfos); BindNativeFunction(env, exportObj, "prepareTerminate", moduleName, JsSceneSessionManager::PrepareTerminate); @@ -816,6 +817,13 @@ napi_value JsSceneSessionManager::GetBatchAbilityInfos(napi_env env, napi_callba return (me != nullptr) ? me->OnGetBatchAbilityInfos(env, info) : nullptr; } +napi_value JsSceneSessionManager::GetAbilityInfo(napi_env env, napi_callback_info info) +{ + TLOGD(WmsLogTag::WMS_SCB, "[NAPI]"); + JsSceneSessionManager* me = CheckParamsAndGetThis(env, info); + return (me != nullptr) ? me->OnGetAbilityInfo(env, info) : nullptr; +} + napi_value JsSceneSessionManager::PrepareTerminate(napi_env env, napi_callback_info info) { WLOGFD("[NAPI]"); @@ -1422,6 +1430,55 @@ napi_value JsSceneSessionManager::OnGetBatchAbilityInfos(napi_env env, napi_call return result; } +napi_value JsSceneSessionManager::OnGetAbilityInfo(napi_env env, napi_callback_info info) +{ + size_t argc = DEFAULT_ARG_COUNT; + napi_value argv[DEFAULT_ARG_COUNT] = { nullptr }; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + if (argc != ARGC_FOUR) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Argc is invalid: %{public}zu", argc); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + std::string bundleName; + if (!ConvertFromJsValue(env, argv[0], bundleName)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to bundleName"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + std::string moduleName; + if (!ConvertFromJsValue(env, argv[ARG_INDEX_ONE], moduleName)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to moduleName"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + std::string abilityName; + if (!ConvertFromJsValue(env, argv[ARG_INDEX_TWO], abilityName)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to abilityName"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + int32_t userId = 0; + if (!ConvertFromJsValue(env, argv[ARG_INDEX_THREE], userId)) { + TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to userId"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + SCBAbilityInfo scbAbilityInfo; + WSErrorCode ret = WS_JS_TO_ERROR_CODE_MAP.at(SceneSessionManager::GetInstance().GetAbilityInfo( + bundleName, moduleName, abilityName, userId, scbAbilityInfo)); + if (ret != WSErrorCode::WS_OK) { + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_STATE_ABNORMALLY), + "System is abnormal")); + } + return CreateSCBAbilityInfo(env, scbAbilityInfo); +} + napi_value JsSceneSessionManager::OnInitUserInfo(napi_env env, napi_callback_info info) { size_t argc = 4; diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h index 650a047946f08f36d331c03929c7324661e40d8b..e11662deab3c4ab63f0bf370cb8fb529da930192 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h @@ -76,6 +76,7 @@ public: static napi_value GetAllWindowVisibilityInfos(napi_env env, napi_callback_info info); static napi_value GetAllAbilityInfos(napi_env env, napi_callback_info info); static napi_value GetBatchAbilityInfos(napi_env env, napi_callback_info info); + static napi_value GetAbilityInfo(napi_env env, napi_callback_info info); static napi_value PrepareTerminate(napi_env env, napi_callback_info info); static napi_value PerfRequestEx(napi_env env, napi_callback_info info); static napi_value UpdateWindowMode(napi_env env, napi_callback_info info); @@ -147,6 +148,7 @@ private: napi_value OnGetAllWindowVisibilityInfos(napi_env env, napi_callback_info info); napi_value OnGetAllAbilityInfos(napi_env env, napi_callback_info info); napi_value OnGetBatchAbilityInfos(napi_env env, napi_callback_info info); + napi_value OnGetAbilityInfo(napi_env env, napi_callback_info info); napi_value OnPrepareTerminate(napi_env env, napi_callback_info info); napi_value OnPerfRequestEx(napi_env env, napi_callback_info info); napi_value OnUpdateWindowMode(napi_env env, napi_callback_info info); diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index d3048602a39de8ee862b3f50175bc5c08e55ce1a..e5f6de8ac5e3bbf78c8ffd6040afa6c4f5bebc19 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -286,6 +286,8 @@ public: std::vector& scbAbilityInfos); WSError GetBatchAbilityInfos(const std::vector& bundleNames, int32_t userId, std::vector& scbAbilityInfos); + WSError GetAbilityInfo(const std::string& bundleName, const std::string& moduleName, + const std::string& abilityName, int32_t userId, SCBAbilityInfo& scbAbilityInfo); WSError PrepareTerminate(int32_t persistentId, bool& isPrepareTerminate); WSError TerminateSessionNew( @@ -692,7 +694,7 @@ private: void DestroyExtensionSession(const sptr& remoteExtSession); void EraseSceneSessionMapById(int32_t persistentId); void EraseSceneSessionAndMarkDirtyLockFree(int32_t persistentId); - WSError GetAbilityInfosFromBundleInfo(std::vector& bundleInfos, + WSError GetAbilityInfosFromBundleInfo(const std::vector& bundleInfos, std::vector& scbAbilityInfos); void GetOrientationFromResourceManager(AppExecFwk::AbilityInfo& abilityInfo); void UpdatePrivateStateAndNotifyForAllScreens(); diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 1f1625f23e675225eda61f56019f38b9cb8effa4..f257dbee40d2134b2b47779fc88f438736ba2e0b 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -6741,29 +6741,82 @@ __attribute__((no_sanitize("cfi"))) WSError SceneSessionManager::GetBatchAbility return GetAbilityInfosFromBundleInfo(bundleInfos, scbAbilityInfos); } -WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(std::vector& bundleInfos, +WSError SceneSessionManager::GetAbilityInfo(const std::string& bundleName, const std::string& moduleName, + const std::string& abilityName, int32_t userId, SCBAbilityInfo& scbAbilityInfo) +{ + if (bundleMgr_ == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "bundleMgr_ is nullptr"); + return WSError::WS_ERROR_NULLPTR; + } + auto flags = (AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION | + AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION | + AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY) | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION) | + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)); + AppExecFwk::BundleInfo bundleInfo; + if (bundleMgr_->GetBundleInfoV9(bundleName, flags, bundleInfo, userId)) { + TLOGE(WmsLogTag::DEFAULT, "Query ability info from BMS failed, ability:%{public}s", abilityName.c_str()); + return WSError::WS_ERROR_INVALID_PARAM; + } + auto& hapModulesList = bundleInfo.hapModuleInfos; + if (hapModulesList.empty()) { + TLOGD(WmsLogTag::DEFAULT, "hapModulesList is empty, ability:%{public}s", abilityName.c_str()); + return WSError::WS_ERROR_INVALID_PARAM; + } + auto sdkVersion = bundleInfo.targetVersion % 100; // % 100 to get the real version + for (auto& hapModule : hapModulesList) { + auto& abilityInfoList = hapModule.abilityInfos; + for (auto& abilityInfo : abilityInfoList) { + if (abilityInfo.moduleName == moduleName && abilityInfo.name == abilityName) { + scbAbilityInfo.abilityInfo_ = abilityInfo; + scbAbilityInfo.sdkVersion_ = sdkVersion; + scbAbilityInfo.codePath_ = bundleInfo.applicationInfo.codePath; + GetOrientationFromResourceManager(scbAbilityInfo.abilityInfo_); + return WSError::WS_OK; + } + } + } + TLOGW(WmsLogTag::DEFAULT, "Ability info not found, ability:%{public}s", abilityName.c_str()); + return WSError::WS_ERROR_INVALID_PARAM; +} + +WSError SceneSessionManager::GetAbilityInfosFromBundleInfo(const std::vector& bundleInfos, std::vector& scbAbilityInfos) { if (bundleInfos.empty()) { WLOGFE("bundleInfos is empty"); return WSError::WS_ERROR_INVALID_PARAM; } - for (auto bundleInfo: bundleInfos) { - auto hapModulesList = bundleInfo.hapModuleInfos; + for (auto& bundleInfo : bundleInfos) { + auto& hapModulesList = bundleInfo.hapModuleInfos; auto sdkVersion = bundleInfo.targetVersion % 100; // %100 to get the real version if (hapModulesList.empty()) { WLOGFD("hapModulesList is empty"); continue; } - for (auto hapModule: hapModulesList) { - auto abilityInfoList = hapModule.abilityInfos; - for (auto abilityInfo : abilityInfoList) { + if (bundleInfo.applicationInfo.codePath == std::to_string(CollaboratorType::RESERVE_TYPE) || + bundleInfo.applicationInfo.codePath == std::to_string(CollaboratorType::OTHERS_TYPE)) { + auto iter = std::find_if(hapModulesList.begin(), hapModulesList.end(), + [](const AppExecFwk::HapModuleInfo& hapModule) { return !hapModule.abilityInfos.empty(); }); + if (iter != hapModulesList.end()) { SCBAbilityInfo scbAbilityInfo; - scbAbilityInfo.abilityInfo_ = abilityInfo; + scbAbilityInfo.abilityInfo_ = iter->abilityInfos[0]; scbAbilityInfo.sdkVersion_ = sdkVersion; scbAbilityInfo.codePath_ = bundleInfo.applicationInfo.codePath; GetOrientationFromResourceManager(scbAbilityInfo.abilityInfo_); scbAbilityInfos.push_back(scbAbilityInfo); + continue; + } + } + for (auto& hapModule : hapModulesList) { + auto& abilityInfoList = hapModule.abilityInfos; + for (auto& abilityInfo : abilityInfoList) { + SCBAbilityInfo scbAbilityInfo; + scbAbilityInfo.abilityInfo_ = abilityInfo; + scbAbilityInfo.sdkVersion_ = sdkVersion; + GetOrientationFromResourceManager(scbAbilityInfo.abilityInfo_); + scbAbilityInfos.push_back(scbAbilityInfo); } } }