diff --git a/frameworks/kits/ability/ability_runtime/BUILD.gn b/frameworks/kits/ability/ability_runtime/BUILD.gn index 0d1c3dd9b927c5c0d83ad367976e5dc3ee6138e5..8926749f510e9fb05c1f2b57416768bf36efc28d 100644 --- a/frameworks/kits/ability/ability_runtime/BUILD.gn +++ b/frameworks/kits/ability/ability_runtime/BUILD.gn @@ -51,6 +51,7 @@ ohos_shared_library("ability_context_native") { ] external_deps = [ + "ability_runtime:app_manager", "ability_runtime:runtime", "bytrace_standard:bytrace_core", "hiviewdfx_hilog_native:libhilog", diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context.h b/frameworks/kits/ability/ability_runtime/include/ability_context.h index 8d36d36c6e99907b76f85186211114c24bcf52cd..5b4e07de892a0f9a1bb8ada38e8af6f5965d13c1 100755 --- a/frameworks/kits/ability/ability_runtime/include/ability_context.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context.h @@ -17,6 +17,7 @@ #define ABILITY_RUNTIME_ABILITY_CONTEXT_H #include "foundation/aafwk/standard/frameworks/kits/appkit/native/ability_runtime/context/context.h" +#include "foundation/aafwk/standard/interfaces/innerkits/app_manager/include/appmgr/configuration.h" #include "ability_connect_callback.h" #include "ability_info.h" @@ -230,6 +231,10 @@ public: */ virtual ErrCode SetMissionLabel(const std::string &label) = 0; + virtual void SetConfiguration(const std::shared_ptr &config) = 0; + + virtual std::shared_ptr GetConfiguration() const = 0; + using SelfType = AbilityContext; static const size_t CONTEXT_TYPE_ID; diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h index 8d812ee5aa6b6508c4b733254c5aa314029a2369..b35f3092c3b5275c309bbea6f6e76c42ef9bb66f 100755 --- a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h @@ -19,6 +19,7 @@ #include "ability_context.h" #include "context_impl.h" +#include "configuration.h" #include "local_call_container.h" namespace OHOS { @@ -111,6 +112,9 @@ public: return contentStorage_; } + void SetConfiguration(const std::shared_ptr &config) override; + + std::shared_ptr GetConfiguration() const override; /** * call function by callback object * @@ -137,6 +141,7 @@ private: std::map resultCallbacks_; std::map permissionRequestCallbacks_; void* contentStorage_ = nullptr; + std::shared_ptr config_; sptr localCallContainer_; }; } // namespace AbilityRuntime diff --git a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp index 76552e2e329c38926557ea2e764dc55c4da813c1..1095c4478a704727fb474d387d40bf49c8b4a0e5 100755 --- a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp +++ b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp @@ -244,6 +244,16 @@ void AbilityContextImpl::SetStageContext(const std::shared_ptr &config) +{ + config_ = config; +} + +std::shared_ptr AbilityContextImpl::GetConfiguration() const +{ + return config_; +} + void AbilityContextImpl::MinimizeAbility() { HILOG_DEBUG("%{public}s begin.", __func__); diff --git a/frameworks/kits/ability/native/BUILD.gn b/frameworks/kits/ability/native/BUILD.gn index 72b62ccbe4aefcf5a6a1596fd206d237b704a1b3..61691f2f0b031b9b65e54410d5c4bc87e4c5a66d 100644 --- a/frameworks/kits/ability/native/BUILD.gn +++ b/frameworks/kits/ability/native/BUILD.gn @@ -206,6 +206,7 @@ ohos_shared_library("abilitykit_native") { "//foundation/aafwk/standard/frameworks/kits/appkit/native/app/src/context_deal.cpp", "//foundation/aafwk/standard/frameworks/kits/appkit/native/app/src/sys_mgr_client.cpp", "//foundation/aafwk/standard/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_ability.cpp", + "//foundation/aafwk/standard/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.cpp", "//foundation/aafwk/standard/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_start_options.cpp", "//foundation/aafwk/standard/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_util.cpp", "//foundation/aafwk/standard/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_want.cpp", @@ -248,6 +249,7 @@ ohos_shared_library("abilitykit_native") { external_deps = [ "ability_runtime:ability_context_native", + "ability_runtime:app_manager", "ability_runtime:napi_base_context", "ability_runtime:runtime", "bytrace_standard:bytrace_core", diff --git a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h index a5d1f5e767aa71ff370efc5f2f41f0cae3a425f4..59db15887636c01c21f82e3bc06e5fdc1d0fc712 100755 --- a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h +++ b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h @@ -31,6 +31,7 @@ using AbilityInfo = AppExecFwk::AbilityInfo; using OHOSApplication = AppExecFwk::OHOSApplication; using Want = AppExecFwk::Want; using AbilityStartSetting = AppExecFwk::AbilityStartSetting; +using Configuration = AppExecFwk::Configuration; class JsAbility : public Ability { public: @@ -52,6 +53,7 @@ public: void OnForeground(const Want &want) override; void OnBackground() override; bool OnContinue(WantParams &wantParams) override; + void OnConfigurationUpdated(const Configuration &configuration) override; void OnNewWant(const Want &want) override; void OnAbilityResult(int requestCode, int resultCode, const Want &resultData) override; @@ -69,6 +71,7 @@ private: void GetPageStackFromWant(const Want &want, std::string &pageStack); JsRuntime &jsRuntime_; + std::shared_ptr shellContextRef_; std::unique_ptr jsAbilityObj_; }; } // namespace AbilityRuntime diff --git a/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h b/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h index b9927d393fece9db27d4874f851161d5aa03086e..7b9798d2e326119dbeff38d30601736feb5d3964 100755 --- a/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h +++ b/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h @@ -52,6 +52,9 @@ public: static NativeValue* RestoreWindowStage(NativeEngine* engine, NativeCallbackInfo* info); static NativeValue* SetMissionLabel(NativeEngine* engine, NativeCallbackInfo* info); + static void ConfigurationUpdated(NativeEngine* engine, std::shared_ptr &jsContext, + const std::shared_ptr &config); + std::shared_ptr GetAbilityContext() { return context_.lock(); diff --git a/frameworks/kits/ability/native/src/ability.cpp b/frameworks/kits/ability/native/src/ability.cpp index 9d3f200486cdc8d9816ad8107afaeba9561c9a7f..177a9b69f731a92f64053201e48f50670cceeb0f 100755 --- a/frameworks/kits/ability/native/src/ability.cpp +++ b/frameworks/kits/ability/native/src/ability.cpp @@ -885,6 +885,7 @@ void Ability::OnConfigurationUpdatedNotify(const Configuration &changeConfigurat APP_LOGE("%{public}s scene_ -> UpdateConfiguration success.", __func__); } + abilityContext_->SetConfiguration(application_->GetConfiguration()); // Notify Ability Subclass OnConfigurationUpdated(changeConfiguration); APP_LOGI("%{public}s Notify Ability Subclass.", __func__); diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp index a48789d6e1182c27bb9449cf69b2900b9fd4ad5e..314e95709ee42ba4ac6d5801cec23dfb606238d5 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -25,6 +25,7 @@ #include "js_data_struct_converter.h" #include "js_runtime.h" #include "js_runtime_utils.h" +#include "napi_common_configuration.h" #include "napi_common_want.h" #include "napi_remote_object.h" #include "string_wrapper.h" @@ -89,10 +90,11 @@ void JsAbility::Init(const std::shared_ptr &abilityInfo, auto context = GetAbilityContext(); NativeValue *contextObj = CreateJsAbilityContext(engine, context); - auto shellContextRef = jsRuntime_.LoadSystemModule("application.AbilityContext", &contextObj, 1); - contextObj = shellContextRef->Get(); + shellContextRef_ = std::shared_ptr( + jsRuntime_.LoadSystemModule("application.AbilityContext", &contextObj, 1).release()); + contextObj = shellContextRef_->Get(); - context->Bind(jsRuntime_, shellContextRef.release()); + context->Bind(jsRuntime_, shellContextRef_.get()); obj->SetProperty("context", contextObj); auto nativeObj = ConvertNativeValueTo(contextObj); @@ -251,6 +253,20 @@ bool JsAbility::OnContinue(WantParams &wantParams) return *boolResult; } +void JsAbility::OnConfigurationUpdated(const Configuration &configuration) +{ + Ability::OnConfigurationUpdated(configuration); + HILOG_INFO("%{public}s called.", __func__); + + HandleScope handleScope(jsRuntime_); + auto& nativeEngine = jsRuntime_.GetNativeEngine(); + JsAbilityContext::ConfigurationUpdated(&nativeEngine, shellContextRef_, GetAbilityContext()->GetConfiguration()); + napi_value napiConfiguration = OHOS::AppExecFwk::WrapConfiguration( + reinterpret_cast(&nativeEngine), configuration); + NativeValue* jsConfiguration = reinterpret_cast(napiConfiguration); + CallObjectMethod("onConfigurationUpdated", &jsConfiguration, 1); +} + void JsAbility::OnNewWant(const Want &want) { HILOG_INFO("%{public}s begin.", __func__); diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp index e66ebfdb22634ddb982ecac715b19c83dc2e5f7a..c3dc28b97575c4f4d355fb48c930dd6855352e47 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp @@ -800,6 +800,34 @@ NativeValue* JsAbilityContext::WrapPermissionRequestResult(NativeEngine& engine, return jsPermissionRequestResult; } +void JsAbilityContext::ConfigurationUpdated(NativeEngine* engine, std::shared_ptr &jsContext, + const std::shared_ptr &config) +{ + HILOG_INFO("ConfigurationUpdated begin."); + if (jsContext == nullptr || config == nullptr) { + HILOG_INFO("jsContext is nullptr."); + return; + } + + NativeValue* value = jsContext->Get(); + NativeObject* object = ConvertNativeValueTo(value); + if (object == nullptr) { + HILOG_INFO("object is nullptr."); + return; + } + + NativeValue* method = object->GetProperty("onUpdateConfiguration"); + if (method == nullptr) { + HILOG_ERROR("Failed to get onUpdateConfiguration from object"); + return; + } + HILOG_INFO("JSAbilityConnection::CallFunction onUpdateConfiguration, success"); + + HILOG_INFO("OnAbilityConnectDone begin NAPI_ohos_rpc_CreateJsRemoteObject"); + NativeValue* argv[] = {CreateJsConfiguration(*engine, *config)}; + engine->CallFunction(value, method, argv, ARGC_ONE); +} + NativeValue* CreateJsAbilityContext(NativeEngine& engine, std::shared_ptr context) { NativeValue* objValue = CreateJsBaseContext(engine, context); @@ -815,6 +843,11 @@ NativeValue* CreateJsAbilityContext(NativeEngine& engine, std::shared_ptrSetProperty("abilityInfo", CreateJsAbilityInfo(engine, *abilityInfo)); } + auto configuration = context->GetConfiguration(); + if (configuration != nullptr) { + object->SetProperty("configuration", CreateJsConfiguration(engine, *configuration)); + } + BindNativeFunction(engine, *object, "startAbility", JsAbilityContext::StartAbility); BindNativeFunction(engine, *object, "startAbilityWithAccount", JsAbilityContext::StartAbilityWithAccount); BindNativeFunction(engine, *object, "startAbilityByCall", JsAbilityContext::StartAbilityByCall); diff --git a/frameworks/kits/ability/native/src/ability_thread.cpp b/frameworks/kits/ability/native/src/ability_thread.cpp index f8913bb08e17c2d28f2da6f240f787ed41442ab4..f7315491023ea6f02af03db769407ddaed5035b5 100644 --- a/frameworks/kits/ability/native/src/ability_thread.cpp +++ b/frameworks/kits/ability/native/src/ability_thread.cpp @@ -1546,6 +1546,7 @@ std::shared_ptr AbilityThread::BuildAbilityConte abilityContextImpl->SetStageContext(stageContext); abilityContextImpl->SetToken(token); abilityContextImpl->SetAbilityInfo(abilityInfo); + abilityContextImpl->SetConfiguration(application->GetConfiguration()); return abilityContextImpl; } diff --git a/frameworks/kits/appkit/native/app/include/ohos_application.h b/frameworks/kits/appkit/native/app/include/ohos_application.h index f31f9dd30a9bba652fe0a4b00e41b9f9f67986ac..40399f70e006df0e05578ceed0ba87eb3977bfb0 100644 --- a/frameworks/kits/appkit/native/app/include/ohos_application.h +++ b/frameworks/kits/appkit/native/app/include/ohos_application.h @@ -262,6 +262,8 @@ public: void ScheduleAcceptWant(const AAFwk::Want &want, const std::string &moduleName, std::string &flag); + virtual std::shared_ptr GetConfiguration(); + private: std::list> abilityLifecycleCallbacks_; std::list> elementsCallbacks_; diff --git a/frameworks/kits/appkit/native/app/src/ohos_application.cpp b/frameworks/kits/appkit/native/app/src/ohos_application.cpp index a5d005e8f15bb39ca0b4d05cce59f7d4ed9502ef..d08d0e435759e43e0b306e133c735f374a23fefa 100644 --- a/frameworks/kits/appkit/native/app/src/ohos_application.cpp +++ b/frameworks/kits/appkit/native/app/src/ohos_application.cpp @@ -572,5 +572,10 @@ void OHOSApplication::ScheduleAcceptWant(const AAFwk::Want &want, const std::str } } } + +std::shared_ptr OHOSApplication::GetConfiguration() +{ + return configuration_; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/frameworks/kits/runtime/native/js_data_struct_converter.cpp b/frameworks/kits/runtime/native/js_data_struct_converter.cpp index bb26794ba1b53011487d6d9efd2eaf0917f41dac..593c3c7b4e17f69fbf8671a3ff19f7e7f16e0c3b 100644 --- a/frameworks/kits/runtime/native/js_data_struct_converter.cpp +++ b/frameworks/kits/runtime/native/js_data_struct_converter.cpp @@ -166,5 +166,16 @@ NativeValue* CreateJsLaunchParam(NativeEngine& engine, const AAFwk::LaunchParam& return objValue; } + +NativeValue* CreateJsConfiguration(NativeEngine& engine, const AppExecFwk::Configuration& configuration) +{ + NativeValue* objValue = engine.CreateObject(); + NativeObject* object = ConvertNativeValueTo(objValue); + + object->SetProperty("language", CreateJsValue(engine, configuration.GetItem("ohos.system.language"))); + object->SetProperty("orientation", CreateJsValue(engine, configuration.GetItem("ohos.system.orientation"))); + + return objValue; +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/interfaces/innerkits/app_manager/include/appmgr/configuration.h b/interfaces/innerkits/app_manager/include/appmgr/configuration.h index 52d92d899de703c641f0aaffab9942a3a3751f95..43ef49f5de5222624ada508ae38782933099b016 100644 --- a/interfaces/innerkits/app_manager/include/appmgr/configuration.h +++ b/interfaces/innerkits/app_manager/include/appmgr/configuration.h @@ -25,6 +25,18 @@ namespace OHOS { namespace AppExecFwk { +namespace ConfigurationInner { + const std::string CONNECTION_SYMBOL {"#"}; + const std::string EMPTY_STRING {""}; + + /* + * This must be synchronized with the value in GlobalConfigurationKey + */ + const std::vector SystemConfigurationKeyStore { + OHOS::AppExecFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, + OHOS::AppExecFwk::GlobalConfigurationKey::SYSTEM_ORIENTATION, + }; +} class Configuration final: public Parcelable { public: Configuration(); @@ -152,6 +164,7 @@ public: * @param inParcel Indicates the Parcel object into which the Sequenceable object has been marshaled. */ static Configuration *Unmarshalling(Parcel &parcel); + private: /** @@ -165,18 +178,19 @@ private: bool MakeTheKey(std::string &getKey, int id, const std::string ¶m) const; /** - * @brief Get value by key. + * @brief Get all current keys. * - * @param key the key to get value. + * @param keychain Out Ginseng. Contains all current keys. */ - std::string GetValue(const std::string &key) const; + void GetAllKey(std::vector &keychain) const; /** - * @brief Get all current keys. + * @brief Get value by key. * - * @param keychain Out Ginseng. Contains all current keys. + * @param key the key to get value. */ - void GetAllKey(std::vector &keychain) const; + std::string GetValue(const std::string &key) const; + private: int defaultDisplayId_ {0}; mutable std::string toStrintg_ {""}; /* For interface GetName(), Assign value only when calling the interface */ diff --git a/interfaces/innerkits/app_manager/src/appmgr/configuration.cpp b/interfaces/innerkits/app_manager/src/appmgr/configuration.cpp index 9d59cf17ee9a79bc1e15860c56c29044ce0f8765..85b24de01b3265375cd9c3f38ae671930de67da1 100755 --- a/interfaces/innerkits/app_manager/src/appmgr/configuration.cpp +++ b/interfaces/innerkits/app_manager/src/appmgr/configuration.cpp @@ -19,23 +19,10 @@ #include "app_log_wrapper.h" #include "string_ex.h" -namespace ConfigurationInner { - const std::string CONNECTION_SYMBOL {"#"}; - const std::string EMPTY_STRING {""}; - - /* - * This must be synchronized with the value in GlobalConfigurationKey - */ - const std::vector SystemConfigurationKeyStore { - OHOS::AppExecFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, - OHOS::AppExecFwk::GlobalConfigurationKey::SYSTEM_ORIENTATION, - }; -} namespace OHOS { namespace AppExecFwk { using json = nlohmann::json; - Configuration::Configuration() {} diff --git a/interfaces/innerkits/runtime/BUILD.gn b/interfaces/innerkits/runtime/BUILD.gn index 55478433047e6c43d748c568fee16cd733496b2c..5d48fb098fa90ef1b6d04e23dc6ab6fb664be5d7 100644 --- a/interfaces/innerkits/runtime/BUILD.gn +++ b/interfaces/innerkits/runtime/BUILD.gn @@ -64,6 +64,7 @@ ohos_shared_library("runtime") { ] external_deps = [ + "ability_runtime:app_manager", "ability_runtime:want", "bundle_framework:appexecfwk_base", "eventhandler:libeventhandler", diff --git a/interfaces/innerkits/runtime/include/js_data_struct_converter.h b/interfaces/innerkits/runtime/include/js_data_struct_converter.h index 67b41a09c7f6514047d10450ef06952411cea9cc..1471092d179e3e95c3c5fc5fa4db4aefad7ac8c5 100644 --- a/interfaces/innerkits/runtime/include/js_data_struct_converter.h +++ b/interfaces/innerkits/runtime/include/js_data_struct_converter.h @@ -21,6 +21,7 @@ #include "launch_param.h" #include "module_info.h" #include "want.h" +#include "configuration.h" class NativeEngine; class NativeValue; @@ -34,6 +35,7 @@ NativeValue* CreateJsApplicationInfo(NativeEngine& engine, const AppExecFwk::App NativeValue* CreateJsLaunchParam(NativeEngine& engine, const AAFwk::LaunchParam& launchParam); NativeValue* CreateJsCustomizeData(NativeEngine& engine, const AppExecFwk::CustomizeData &Info); NativeValue* CreateJsCustomizeDataArray(NativeEngine& engine, const std::vector &info); +NativeValue* CreateJsConfiguration(NativeEngine& engine, const AppExecFwk::Configuration& configuration); } // namespace AbilityRuntime } // namespace OHOS #endif // ABILITY_RUNTIME_JS_DATA_STRUCT_CONVERTER_H \ No newline at end of file diff --git a/interfaces/kits/napi/aafwk/ability/ability.js b/interfaces/kits/napi/aafwk/ability/ability.js index bd0b92157b7d5b96566a4e7c6b878f531b2f43b1..2586a5e1d1ccccce2a85c5ea73950647390805d5 100755 --- a/interfaces/kits/napi/aafwk/ability/ability.js +++ b/interfaces/kits/napi/aafwk/ability/ability.js @@ -31,6 +31,7 @@ class Ability { return this.callee; } onContinue(wantParams) {} + onConfigurationUpdated(config) {} onNewWant(want) {} } diff --git a/interfaces/kits/napi/aafwk/ability_context/ability_context.js b/interfaces/kits/napi/aafwk/ability_context/ability_context.js index c7e424fa8d80c21b0cc9258e934902a347ef1466..7922079eeaaa6a0c0c615a57a16d828d290a6fb2 100755 --- a/interfaces/kits/napi/aafwk/ability_context/ability_context.js +++ b/interfaces/kits/napi/aafwk/ability_context/ability_context.js @@ -21,6 +21,11 @@ class AbilityContext extends Context { super(obj) this.abilityInfo = obj.abilityInfo this.currentHapModuleInfo = obj.currentHapModuleInfo + this.configuration = obj.configuration + } + + onUpdateConfiguration(config) { + this.configuration = config } startAbility(want, options, callback) { diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common.h b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common.h index c33bf6311b5df63722bf3be41149236e4d1d3172..6ee0e9b394e2a64e75490d51c6d650e7012f97df 100644 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common.h +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common.h @@ -16,6 +16,7 @@ #ifndef OHOS_APPEXECFWK_NAPI_COMMON_H #define OHOS_APPEXECFWK_NAPI_COMMON_H +#include "napi_common_configuration.h" #include "napi_common_data.h" #include "napi_common_error.h" #include "napi_common_util.h" diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.cpp b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.cpp index 2afbb5c9a230232788416def3565cc360d8bb99c..993e230ee528e7c1b59fc0e11ed5d2b621ab4b79 100644 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.cpp +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.cpp @@ -20,6 +20,45 @@ namespace OHOS { namespace AppExecFwk { EXTERN_C_START + +bool InnerWrapConfigurationString( + napi_env env, napi_value jsObject, const std::string &key, const std::string &value) +{ + if (!value.empty()) { + HILOG_INFO("%{public}s called. key=%{public}s, value=%{public}s", __func__, key.c_str(), value.c_str()); + napi_value jsValue = WrapStringToJS(env, value); + if (jsValue != nullptr) { + NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false); + return true; + } + } + return false; +} + +napi_value WrapConfiguration(napi_env env, const AppExecFwk::Configuration &configuration) +{ + HILOG_INFO("%{public}s called, config size %{public}d", __func__, static_cast(configuration.GetItemSize())); + napi_value jsObject = nullptr; + NAPI_CALL(env, napi_create_object(env, &jsObject)); + + std::vector keys = OHOS::AppExecFwk::ConfigurationInner::SystemConfigurationKeyStore; + for (auto const &key : keys) { + std::string value = configuration.GetItem(key); + if (value.empty()) { + HILOG_INFO("value is empty"); + continue; + } + + std::size_t pos = key.rfind(DOT_STRING); + if (pos != std::string::npos) { + InnerWrapConfigurationString(env, jsObject, key.substr(pos+1), value); + } else { + InnerWrapConfigurationString(env, jsObject, key, value); + } + } + return jsObject; +} + bool UnwrapConfiguration(napi_env env, napi_value param, Configuration &config) { HILOG_INFO("%{public}s called.", __func__); diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.h b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.h index 520a9119944b41c73a47b055f1241436c1c6615c..d86f71e995d34e6ea22045c84a83d2993ec8f1a4 100644 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.h +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_configuration.h @@ -21,8 +21,10 @@ namespace OHOS { namespace AppExecFwk { +const std::string DOT_STRING {"."}; EXTERN_C_START +napi_value WrapConfiguration(napi_env env, const AppExecFwk::Configuration &configuration); bool UnwrapConfiguration(napi_env env, napi_value param, Configuration &config); EXTERN_C_END