diff --git a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h index 92c5bbd457b81c609865e3bf33a73539332175f9..c70485367a1f65eef36fadf85a7b3416525b69db 100644 --- a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h +++ b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h @@ -68,6 +68,8 @@ public: static void StartAbilityForResult(ani_env *env, ani_object aniObj, ani_object wantObj, ani_object callback); static void StartAbilityForResultWithOptions(ani_env *env, ani_object aniObj, ani_object wantObj, ani_object startOptionsObj, ani_object callback); + static void SetColorMode(ani_env *env, ani_object aniObj, ani_enum_item aniColorMode); + static void ReportDrawnCompleted(ani_env *env, ani_object aniObj, ani_object callback); static bool BindNativePtrCleaner(ani_env *env); static void Clean(ani_env *env, ani_object object); @@ -86,6 +88,8 @@ private: ani_object callback); static bool CheckConnectionParam(ani_env *env, ani_object connectOptionsObj, sptr& connection, AAFwk::Want& want); + void OnSetColorMode(ani_env *env, ani_object aniCls, ani_enum_item aniColorMode); + void OnReportDrawnCompleted(ani_env *env, ani_object aniCls, ani_object callback); protected: std::weak_ptr context_; diff --git a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp index 18df7b3119068b177a3bd44b159f0f8510d6f510..d1da885c5e1f9666f7349ccb63b9204569d73d14 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp @@ -18,6 +18,7 @@ #include "ani_common_ability_result.h" #include "ani_common_start_options.h" #include "ani_common_want.h" +#include "ani_enum_convert.h" #include "ani_remote_object.h" #include "common_fun_ani.h" #include "ets_context_utils.h" @@ -290,7 +291,7 @@ void EtsUIExtensionContext::OnStartAbilityForResult(ani_env *env, ani_object ani if (startOptionsObj) { OHOS::AppExecFwk::UnwrapStartOptions(env, startOptionsObj, startOptions); } - + ani_ref callbackRef = nullptr; env->GlobalReference_Create(callback, &callbackRef); ani_vm *etsVm = nullptr; @@ -308,7 +309,7 @@ void EtsUIExtensionContext::OnStartAbilityForResult(ani_env *env, ani_object ani TAG_LOGE(AAFwkTag::UI_EXT, "GetEnv failed, status: %{public}d", status); return; } - + ani_object abilityResult = AppExecFwk::WrapAbilityResult(env, resultCode, want); if (abilityResult == nullptr) { TAG_LOGW(AAFwkTag::UI_EXT, "null abilityResult"); @@ -497,6 +498,71 @@ void EtsUIExtensionContext::Clean(ani_env *env, ani_object object) } } +void EtsUIExtensionContext::SetColorMode(ani_env *env, ani_object aniObj, ani_enum_item aniColorMode) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "SetColorMode called"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env"); + return; + } + auto etsUiExtensionContext = GetEtsUIExtensionContext(env, aniObj); + if (etsUiExtensionContext == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsUiExtensionContext"); + return; + } + etsUiExtensionContext->OnSetColorMode(env, aniObj, aniColorMode); +} + +void EtsUIExtensionContext::ReportDrawnCompleted(ani_env *env, ani_object aniObj, ani_object callback) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "ReportDrawnCompleted called"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env"); + return; + } + auto etsUiExtensionContext = GetEtsUIExtensionContext(env, aniObj); + if (etsUiExtensionContext == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsUiExtensionContext"); + return; + } + etsUiExtensionContext->OnReportDrawnCompleted(env, aniObj, callback); +} + +void EtsUIExtensionContext::OnSetColorMode(ani_env *env, ani_object aniContext, ani_enum_item aniColorMode) +{ + auto context = context_.lock(); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null context"); + EtsErrorUtil::ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT)); + return; + } + ani_int colorMode = 0; + if (!AAFwk::AniEnumConvertUtil::EnumConvert_EtsToNative(env, aniColorMode, colorMode)) { + TAG_LOGE(AAFwkTag::UI_EXT, "param aniColorMode err"); + EtsErrorUtil::ThrowInvalidParamError(env, "Parse param colorMode failed, colorMode must be number."); + return; + } + context->SetAbilityColorMode(colorMode); + TAG_LOGD(AAFwkTag::UI_EXT, "NativeSetColorMode end"); +} + +void EtsUIExtensionContext::OnReportDrawnCompleted(ani_env* env, ani_object aniCls, ani_object callback) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "OnReportDrawnCompleted called"); + auto context = context_.lock(); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null context"); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateErrorByNativeErr(env, + static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT)), nullptr); + return; + } + int32_t innerErrorCode = context->ReportDrawnCompleted(); + AppExecFwk::AsyncCallback(env, callback, AbilityRuntime::EtsErrorUtil::CreateErrorByNativeErr(env, + static_cast(innerErrorCode)), nullptr); + TAG_LOGD(AAFwkTag::UI_EXT, "NativeReportDrawnCompleted end"); +} + bool EtsUIExtensionContext::BindNativePtrCleaner(ani_env *env) { if (env == nullptr) { @@ -562,6 +628,10 @@ ani_object CreateEtsUIExtensionContext(ani_env *env, std::shared_ptr(EtsUIExtensionContext::StartAbilityForResultWithOptions) }, + ani_native_function { "setColorMode", nullptr, + reinterpret_cast(EtsUIExtensionContext::SetColorMode)}, + ani_native_function { "nativeReportDrawnCompleted", nullptr, + reinterpret_cast(EtsUIExtensionContext::ReportDrawnCompleted)} }; if ((status = env->Class_BindNativeMethods(cls, functions.data(), functions.size())) != ANI_OK) { TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); diff --git a/frameworks/ets/ets/application/UIExtensionContext.ets b/frameworks/ets/ets/application/UIExtensionContext.ets index 7acc72d556f87f074bd66f044a21efa1237a5230..e314455bc656901eefd44093bf1edf53a47066d7 100644 --- a/frameworks/ets/ets/application/UIExtensionContext.ets +++ b/frameworks/ets/ets/application/UIExtensionContext.ets @@ -21,6 +21,7 @@ import AsyncCallbackWrapper from '../utils/AbilityUtils'; import ExtensionContext from 'application.ExtensionContext'; import StartOptions from '@ohos.app.ability.StartOptions'; import Want from '@ohos.app.ability.Want'; +import ConfigurationConstant from '@ohos.app.ability.ConfigurationConstant'; class Cleaner { static callback(cleaner: Cleaner): void { @@ -212,4 +213,14 @@ export default class UIExtensionContext extends ExtensionContext { }); return p; } + + native setColorMode(colorMode: ConfigurationConstant.ColorMode): void; + + native nativeReportDrawnCompleted(callback:AsyncCallbackWrapper): void; + reportDrawnCompleted(callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + this.nativeReportDrawnCompleted(myCall); + }); + } } \ No newline at end of file