From db90192e3b8379647e402ab744938c32e4e8f130 Mon Sep 17 00:00:00 2001 From: hanhaibin Date: Fri, 28 Jan 2022 22:57:50 +0800 Subject: [PATCH] Extension ability info code Signed-off-by: hanhaibin --- .../src/js_service_extension_context.cpp | 74 +++++++++++++++++++ .../include/extension_running_info.h | 2 + .../js_ability_manager_utils.cpp | 1 + .../service_extension_context.js | 1 + .../include/ability_connect_manager.h | 2 +- .../src/ability_connect_manager.cpp | 24 +++++- .../src/ability_manager_service.cpp | 2 +- .../abilitymgr/src/extension_running_info.cpp | 4 + 8 files changed, 106 insertions(+), 4 deletions(-) diff --git a/frameworks/kits/ability/native/src/js_service_extension_context.cpp b/frameworks/kits/ability/native/src/js_service_extension_context.cpp index c4f697433ae..b880d177e89 100755 --- a/frameworks/kits/ability/native/src/js_service_extension_context.cpp +++ b/frameworks/kits/ability/native/src/js_service_extension_context.cpp @@ -19,6 +19,7 @@ #include "hilog_wrapper.h" #include "js_extension_context.h" +#include "js_data_struct_converter.h" #include "js_runtime.h" #include "js_runtime_utils.h" #include "napi/native_api.h" @@ -419,6 +420,60 @@ private: }; } // namespace +NativeValue* CreateJsMetadata(NativeEngine& engine, const AppExecFwk::Metadata &Info) +{ + HILOG_INFO("CreateJsMetadata"); + NativeValue* objValue = engine.CreateObject(); + NativeObject* object = ConvertNativeValueTo(objValue); + + object->SetProperty("name", CreateJsValue(engine, Info.name)); + object->SetProperty("value", CreateJsValue(engine, Info.value)); + object->SetProperty("resource", CreateJsValue(engine, Info.resource)); + return objValue; +} + +NativeValue* CreateJsMetadataArray(NativeEngine& engine, const std::vector &info) +{ + HILOG_INFO("CreateJsMetadataArray"); + NativeValue* arrayValue = engine.CreateArray(info.size()); + NativeArray* array = ConvertNativeValueTo(arrayValue); + uint32_t index = 0; + for (const auto& item : info) { + array->SetElement(index++, CreateJsMetadata(engine, item)); + } + return arrayValue; +} + +NativeValue* CreateJsExtensionAbilityInfo(NativeEngine& engine, const AppExecFwk::ExtensionAbilityInfo& info) +{ + HILOG_INFO("CreateJsExtensionAbilityInfo"); + NativeValue* objValue = engine.CreateObject(); + NativeObject* object = ConvertNativeValueTo(objValue); + object->SetProperty("bundleName", CreateJsValue(engine, info.bundleName)); + object->SetProperty("moduleName", CreateJsValue(engine, info.moduleName)); + object->SetProperty("name", CreateJsValue(engine, info.name)); + object->SetProperty("labelId", CreateJsValue(engine, info.labelId)); + object->SetProperty("descriptionId", CreateJsValue(engine, info.descriptionId)); + object->SetProperty("iconId", CreateJsValue(engine, info.iconId)); + object->SetProperty("isVisible", CreateJsValue(engine, info.visible)); + object->SetProperty("extensionAbilityType", CreateJsValue(engine, info.type)); + NativeValue *permissionArrayValue = engine.CreateArray(info.permissions.size()); + NativeArray *permissionArray = ConvertNativeValueTo(permissionArrayValue); + if (permissionArray != nullptr) { + int index = 0; + for (auto permission : info.permissions) { + permissionArray->SetElement(index++, CreateJsValue(engine, permission)); + } + } + object->SetProperty("permissions", permissionArrayValue); + object->SetProperty("applicationInfo", CreateJsApplicationInfo(engine, info.applicationInfo)); + object->SetProperty("metadata", CreateJsMetadataArray(engine, info.metadata)); + object->SetProperty("enabled", CreateJsValue(engine, info.enabled)); + object->SetProperty("readPermission", CreateJsValue(engine, info.readPermission)); + object->SetProperty("writePermission", CreateJsValue(engine, info.writePermission)); + return objValue; +} + NativeValue* CreateJsServiceExtensionContext(NativeEngine& engine, std::shared_ptr context) { HILOG_INFO("CreateJsServiceExtensionContext begin"); @@ -439,6 +494,25 @@ NativeValue* CreateJsServiceExtensionContext(NativeEngine& engine, std::shared_p BindNativeFunction( engine, *object, "connectAbilityWithAccount", JsServiceExtensionContext::ConnectAbilityWithAccount); + if (context) { + HILOG_INFO("Set ExtensionAbilityInfo Property"); + auto abilityInfo = context->GetAbilityInfo(); + auto hapModuleInfo = context->GetHapModuleInfo(); + if (abilityInfo && hapModuleInfo) { + auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &info) { + HILOG_INFO("%{public}s, %{public}s", info.bundleName.c_str(), info.name.c_str()); + return info.bundleName == abilityInfo->bundleName && info.name == abilityInfo->name; + }; + auto infoIter = std::find_if( + hapModuleInfo->extensionInfos.begin(), hapModuleInfo->extensionInfos.end(), isExist); + if (infoIter == hapModuleInfo->extensionInfos.end()) { + HILOG_INFO("Get target fail."); + return objValue; + } + object->SetProperty("extensionAbilityInfo", CreateJsExtensionAbilityInfo(engine, *infoIter)); + } + } + return objValue; } diff --git a/interfaces/innerkits/ability_manager/include/extension_running_info.h b/interfaces/innerkits/ability_manager/include/extension_running_info.h index 80b39e797a1..209187ea47c 100644 --- a/interfaces/innerkits/ability_manager/include/extension_running_info.h +++ b/interfaces/innerkits/ability_manager/include/extension_running_info.h @@ -19,6 +19,7 @@ #include "parcel.h" #include "element_name.h" #include "iremote_object.h" +#include "extension_ability_info.h" namespace OHOS { namespace AAFwk { @@ -31,6 +32,7 @@ public: AppExecFwk::ElementName extension; int pid; int uid; + AppExecFwk::ExtensionAbilityType type = AppExecFwk::ExtensionAbilityType::UNSPECIFIED; std::string processName; int64_t startTime; std::vector clientPackage; diff --git a/interfaces/kits/napi/aafwk/ability_manager/js_ability_manager_utils.cpp b/interfaces/kits/napi/aafwk/ability_manager/js_ability_manager_utils.cpp index 191503be7b4..d6bd63887cc 100644 --- a/interfaces/kits/napi/aafwk/ability_manager/js_ability_manager_utils.cpp +++ b/interfaces/kits/napi/aafwk/ability_manager/js_ability_manager_utils.cpp @@ -92,6 +92,7 @@ NativeValue* CreateJsExtensionRunningInfo(NativeEngine &engine, const AAFwk::Ext object->SetProperty("extension", reinterpret_cast(napiElementName)); object->SetProperty("pid", CreateJsValue(engine, info.pid)); object->SetProperty("uid", CreateJsValue(engine, info.uid)); + object->SetProperty("type", CreateJsValue(engine, info.type)); object->SetProperty("processName", CreateJsValue(engine, info.processName)); object->SetProperty("startTime", CreateJsValue(engine, info.startTime)); object->SetProperty("clientPackage", CreateNativeArray(engine, info.clientPackage)); diff --git a/interfaces/kits/napi/aafwk/service_extension_context/service_extension_context.js b/interfaces/kits/napi/aafwk/service_extension_context/service_extension_context.js index 24a019b7b5b..5821bb3953c 100755 --- a/interfaces/kits/napi/aafwk/service_extension_context/service_extension_context.js +++ b/interfaces/kits/napi/aafwk/service_extension_context/service_extension_context.js @@ -18,6 +18,7 @@ var ExtensionContext = requireNapi("application.ExtensionContext") class ServiceExtensionContext extends ExtensionContext { constructor(obj) { super(obj); + this.extensionAbilityInfo = obj.extensionAbilityInfo } startAbility(want, options, callback) { diff --git a/services/abilitymgr/include/ability_connect_manager.h b/services/abilitymgr/include/ability_connect_manager.h index 521bf138022..1c070cc1650 100644 --- a/services/abilitymgr/include/ability_connect_manager.h +++ b/services/abilitymgr/include/ability_connect_manager.h @@ -183,7 +183,7 @@ public: ConnectListType GetConnectRecordListByCallback(sptr callback); void RemoveAll(); - void GetExtensionRunningInfos(int upperLimit, std::vector &info); + void GetExtensionRunningInfos(int upperLimit, std::vector &info, const int32_t userId); void GetAbilityRunningInfos(std::vector &info); diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index 5c8003da4ec..c07fb13c8d3 100755 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -947,11 +947,12 @@ void AbilityConnectManager::DumpState(std::vector &info, bool isCli } } -void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector &info) +void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector &info, + const int32_t userId) { HILOG_INFO("Get extension running info."); std::lock_guard guard(Lock_); - auto queryInfo = [&info, upperLimit](ServiceMapType::reference service) { + auto queryInfo = [&info, upperLimit, userId](ServiceMapType::reference service) { if (static_cast(info.size()) >= upperLimit) { return; } @@ -960,6 +961,25 @@ void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector ExtensionRunningInfo extensionInfo; AppExecFwk::RunningProcessInfo processInfo; extensionInfo.extension = abilityRecord->GetWant().GetElement(); + auto bms = AbilityUtil::GetBundleManager(); + CHECK_POINTER(bms); + std::vector extensionInfos; + bool queryResult = bms->QueryExtensionAbilityInfos(abilityRecord->GetWant(), + AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, extensionInfos); + if (queryResult) { + HILOG_INFO("Query Extension Ability Infos Success."); + auto abilityInfo = abilityRecord->GetAbilityInfo(); + auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &extensionInfo) { + HILOG_INFO("%{public}s, %{public}s", extensionInfo.bundleName.c_str(), extensionInfo.name.c_str()); + return extensionInfo.bundleName == abilityInfo.bundleName && extensionInfo.name == abilityInfo.name + && extensionInfo.applicationInfo.uid == abilityInfo.applicationInfo.uid; + }; + auto infoIter = std::find_if(extensionInfos.begin(), extensionInfos.end(), isExist); + if (infoIter != extensionInfos.end()) { + HILOG_INFO("Get target success."); + extensionInfo.type = (*infoIter).type; + } + } DelayedSingleton::GetInstance()-> GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo); extensionInfo.pid = processInfo.pid_; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index ef7f13d9803..ee1f96c7313 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -3568,7 +3568,7 @@ int AbilityManagerService::GetExtensionRunningInfos(int upperLimit, std::vector< return INNER_ERR; } - connectManager_->GetExtensionRunningInfos(upperLimit, info); + connectManager_->GetExtensionRunningInfos(upperLimit, info, GetUserId()); return ERR_OK; } diff --git a/services/abilitymgr/src/extension_running_info.cpp b/services/abilitymgr/src/extension_running_info.cpp index 5f6123a3357..adfa99e3982 100644 --- a/services/abilitymgr/src/extension_running_info.cpp +++ b/services/abilitymgr/src/extension_running_info.cpp @@ -29,6 +29,7 @@ bool ExtensionRunningInfo::ReadFromParcel(Parcel &parcel) extension = *readExtension; pid = parcel.ReadInt32(); uid = parcel.ReadInt32(); + type = static_cast(parcel.ReadInt32()); processName = Str16ToStr8(parcel.ReadString16()); startTime = parcel.ReadInt32(); int32_t clientPackageSize = parcel.ReadInt32(); @@ -63,6 +64,9 @@ bool ExtensionRunningInfo::Marshalling(Parcel &parcel) const if (!parcel.WriteInt32(uid)) { return false; } + if (!parcel.WriteInt32(static_cast(type))) { + return false; + } if (!parcel.WriteString16(Str8ToStr16(processName))) { return false; } -- Gitee