diff --git a/frameworks/c/ability_runtime/src/application_context.cpp b/frameworks/c/ability_runtime/src/application_context.cpp index b4a34372ee47b35034dab5ea4b5814cb6bd82b50..cd2a9e5ceb3d9469e1c6920e10042604d612baee 100644 --- a/frameworks/c/ability_runtime/src/application_context.cpp +++ b/frameworks/c/ability_runtime/src/application_context.cpp @@ -342,4 +342,25 @@ AbilityRuntime_ErrorCode OH_AbilityRuntime_StartSelfUIAbilityWithStartOptions(Ab OHOS::AAFwk::StartOptions startOptions = options->GetInnerStartOptions(); return ConvertToAPI18BusinessErrorCode(AbilityManagerClient::GetInstance()->StartSelfUIAbilityWithStartOptions( abilityWant, startOptions)); +} + +AbilityRuntime_ErrorCode OH_AbilityRuntime_ApplicationContextGetVersionCode(int64_t* versionCode) +{ + TAG_LOGD(AAFwkTag::APPKIT, "getVersionCode called"); + if (versionCode == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "versionCode is null"); + return ABILITY_RUNTIME_ERROR_CODE_PARAM_INVALID; + } + const auto appContext = Context::GetApplicationContext(); + if (appContext == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "appContext is null"); + return ABILITY_RUNTIME_ERROR_CODE_CONTEXT_NOT_EXIST; + } + const auto appApplicationInfo = appContext->GetApplicationInfo(); + if (appApplicationInfo == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "applicationInfo is null"); + return ABILITY_RUNTIME_ERROR_CODE_GET_APPLICATION_INFO_FAILED; + } + *versionCode = static_cast(appApplicationInfo->versionCode); + return ABILITY_RUNTIME_ERROR_CODE_NO_ERROR; } \ No newline at end of file diff --git a/interfaces/kits/c/ability_runtime/ability_runtime_common.h b/interfaces/kits/c/ability_runtime/ability_runtime_common.h index 704d6c80fb98a2a918510be289f3a1c486635144..673e6f8cb640fe8210f2ac1445a9622e541ce34e 100644 --- a/interfaces/kits/c/ability_runtime/ability_runtime_common.h +++ b/interfaces/kits/c/ability_runtime/ability_runtime_common.h @@ -138,6 +138,11 @@ typedef enum { * @since 17 */ ABILITY_RUNTIME_ERROR_CODE_APP_INSTANCE_KEY_NOT_SUPPORTED = 16000079, + /** + * @error The application info does not exist. + * @since 21 + */ + ABILITY_RUNTIME_ERROR_CODE_GET_APPLICATION_INFO_FAILED = 16000080, } AbilityRuntime_ErrorCode; #ifdef __cplusplus diff --git a/interfaces/kits/c/ability_runtime/application_context.h b/interfaces/kits/c/ability_runtime/application_context.h index 95356eb126699f51858cdcb439804e388904c0b2..0fcab7b5023f7cde45c1d592b90a78cd542cc79c 100644 --- a/interfaces/kits/c/ability_runtime/application_context.h +++ b/interfaces/kits/c/ability_runtime/application_context.h @@ -297,6 +297,19 @@ AbilityRuntime_ErrorCode OH_AbilityRuntime_StartSelfUIAbilityWithStartOptions(Ab AbilityRuntime_ErrorCode OH_AbilityRuntime_ApplicationContextGetResourceDir(const char* moduleName, char* buffer, const int32_t bufferSize, int32_t* writeLength); +/** + * @brief Obtain the version code of the application. + * + * @param versionCode The version code of the application. + * @return The error code. + * {@link ABILITY_RUNTIME_ERROR_CODE_NO_ERROR} if the operation is successful. + * {@link ABILITY_RUNTIME_ERROR_CODE_PARAM_INVALID} if the versionCode is null. + * {@link ABILITY_RUNTIME_ERROR_CODE_CONTEXT_NOT_EXIST} if the application context does not exist. + * {@link ABILITY_RUNTIME_ERROR_CODE_GET_APPLICATION_INFO_FAILED} if the application info does not exist. + * @since 21 + */ +AbilityRuntime_ErrorCode OH_AbilityRuntime_ApplicationContextGetVersionCode(int64_t* versionCode); + #ifdef __cplusplus } // extern "C" #endif diff --git a/test/unittest/capi_ability_runtime_application_context_test/capi_ability_runtime_application_context_test.cpp b/test/unittest/capi_ability_runtime_application_context_test/capi_ability_runtime_application_context_test.cpp index 97c9b3d77f952b18d7a982b279f89f6e14e31228..2571a5e36c8495ba92ea2c90eeb84a1b7843f862 100644 --- a/test/unittest/capi_ability_runtime_application_context_test/capi_ability_runtime_application_context_test.cpp +++ b/test/unittest/capi_ability_runtime_application_context_test/capi_ability_runtime_application_context_test.cpp @@ -2624,4 +2624,27 @@ HWTEST_F(CapiAbilityRuntimeApplicationContextTest, ConvertToAPI18BusinessErrorCo errCode = ConvertToAPI18BusinessErrorCode(abilityManagerError); EXPECT_EQ(errCode, ABILITY_RUNTIME_ERROR_CODE_INTERNAL); } + +/** + * @tc.number: GetVersionCode_001 + * @tc.desc: Function test with applicationContextImpl is nullptr + * @tc.type: FUNC + */ +HWTEST_F(CapiAbilityRuntimeApplicationContextTest, GetVersionCode_001, TestSize.Level2) +{ + auto contextImpl = InitApplicationContextImpl(TEST_BUNDLE_NAME); + ASSERT_NE(contextImpl, nullptr); + + auto applicationInfo = std::make_shared(); + applicationInfo->versionCode = 111; + contextImpl->SetApplicationInfo(applicationInfo); + + int64_t versionCode; + AbilityRuntime_ErrorCode code = OH_AbilityRuntime_ApplicationContextGetVersionCode(nullptr); + ASSERT_EQ(code, ABILITY_RUNTIME_ERROR_CODE_PARAM_INVALID); + + code = OH_AbilityRuntime_ApplicationContextGetVersionCode(&versionCode); + ASSERT_EQ(code, ABILITY_RUNTIME_ERROR_CODE_NO_ERROR); + ASSERT_EQ(versionCode, 111); +} } // namespace OHOS::AbilityRuntime