From 32be6642db1899ddd44ec1bba38aafbbef5550c8 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Fri, 1 Aug 2025 04:11:59 -0400 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8D=95=E5=9B=9E=E5=90=8807?= =?UTF-8?q?28?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzezhong --- .../src/ets_ability_manager_utils.cpp | 2 +- .../ani/ani_common/src/ani_common_util.cpp | 20 ++--- .../ani/app_manager/src/ets_app_manager.cpp | 61 +++++++++---- .../include/ets_ui_extension_context.h | 4 + .../src/ets_ui_extension.cpp | 6 +- .../src/ets_ui_extension_context.cpp | 89 +++++++++++++++++-- ...ohos.app.ability.ShareExtensionAbility.ets | 19 ++++ frameworks/ets/ets/BUILD.gn | 18 ++++ .../application/ApplicationStateObserver.ets | 6 +- .../ets/application/UIExtensionContext.ets | 10 +++ 10 files changed, 188 insertions(+), 47 deletions(-) create mode 100644 frameworks/ets/ets/@ohos.app.ability.ShareExtensionAbility.ets diff --git a/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp b/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp index 035e645ea1d..8d585f896d7 100644 --- a/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp +++ b/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp @@ -38,7 +38,7 @@ bool WrapAbilityRunningInfoArray( return false; } ani_class arrayCls = nullptr; - ani_method arrayCtor; + ani_method arrayCtor = nullptr; ani_status status = ANI_ERROR; if ((status = env->FindClass(CLASSNAME_ARRAY, &arrayCls)) != ANI_OK) { TAG_LOGE(AAFwkTag::ABILITYMGR, "status : %{public}d", status); diff --git a/frameworks/ets/ani/ani_common/src/ani_common_util.cpp b/frameworks/ets/ani/ani_common/src/ani_common_util.cpp index 34eda52d4ae..1a76532c4db 100644 --- a/frameworks/ets/ani/ani_common/src/ani_common_util.cpp +++ b/frameworks/ets/ani/ani_common/src/ani_common_util.cpp @@ -245,18 +245,8 @@ bool SetFieldIntByName(ani_env *env, ani_class cls, ani_object object, const cha return false; } ani_status status = ANI_ERROR; - ani_field field = nullptr; - if ((status = env->Class_FindField(cls, name, &field)) != ANI_OK) { - TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status); - return false; - } - ani_object obj = CreateInt(env, value); - if (obj == nullptr) { - TAG_LOGE(AAFwkTag::ANI, "obj is null"); - return false; - } - if ((status = env->Object_SetField_Ref(object, field, reinterpret_cast(obj))) != ANI_OK) { - TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status); + if ((status = env->Object_SetFieldByName_Int(object, name, value)) != ANI_OK) { + TAG_LOGE(AAFwkTag::ANI, "Object_SetFieldByName_Int status: %{public}d", status); return false; } return true; @@ -869,9 +859,9 @@ bool SetProcessInformation(ani_env *env, ani_object object, const AppExecFwk::Ru TAG_LOGE(AAFwkTag::ANI, "bundleType failed status:%{public}d", status); return false; } - status = env->Object_SetPropertyByName_Ref(object, "appCloneIndex", - CreateInt(env, processInfo.appCloneIndex)); - if (status != ANI_OK) { + if (processInfo.appCloneIndex != -1 && + (status = env->Object_SetPropertyByName_Ref( + object, "appCloneIndex", CreateInt(env, processInfo.appCloneIndex))) != ANI_OK) { TAG_LOGE(AAFwkTag::ANI, "appCloneIndex failed status:%{public}d", status); return false; } diff --git a/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp b/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp index f4f9c5ea70e..3b5cfdb37f6 100644 --- a/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp +++ b/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp @@ -505,8 +505,9 @@ void EtsAppManager::OnOff(ani_env *env, ani_string type, ani_int etsObserverId, std::string strType; if (!AppExecFwk::GetStdString(env, type, strType) || strType != ON_OFF_TYPE) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError( - env, "Parse param type failed, must be a string, value must be applicationState."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param type failed, must be a string, value must be applicationState."), nullptr); return; } TAG_LOGD(AAFwkTag::APPMGR, "observerId:%{public}d", etsObserverId); @@ -523,12 +524,16 @@ void EtsAppManager::OnOff(ani_env *env, ani_string type, ani_int etsObserverId, } if (appStateObserver_ == nullptr) { TAG_LOGE(AAFwkTag::APPMGR, "null observer"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "observer is nullptr, please register first."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "observer is nullptr, please register first."), nullptr); return; } if (!appStateObserver_->FindObserverByObserverId(observerId)) { TAG_LOGE(AAFwkTag::APPMGR, "not find observer:%{public}d", static_cast(observerId)); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "not find observerId."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "not find observerId."), nullptr); return; } int32_t ret = appMgr->UnregisterApplicationStateObserver(appStateObserver_); @@ -654,7 +659,9 @@ void EtsAppManager::KillProcessesByBundleNameInner(ani_env *env, ani_object call std::string bundleName; if (!AppExecFwk::GetStdString(env, etsBundleName, bundleName)) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param bundleName failed, must be a string."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param bundleName failed, must be a string."), nullptr); return; } int32_t appIndex = 0; @@ -663,7 +670,6 @@ void EtsAppManager::KillProcessesByBundleNameInner(ani_env *env, ani_object call TAG_LOGE(AAFwkTag::APPMGR, "Failed to check undefined status : %{public}d", status); return; } - if (!isUndefined) { if ((status = env->Object_CallMethodByName_Int(etsAppIndex, "toInt", nullptr, &appIndex)) != ANI_OK) { @@ -718,12 +724,12 @@ void EtsAppManager::KillProcessWithAccountInner(ani_env *env, ani_object callbac std::string bundleName; if (!AppExecFwk::GetStdString(env, aniBundleName, bundleName)) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param bundleName failed, must be a string."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param bundleName failed, must be a string."), nullptr); return; } - TAG_LOGD(AAFwkTag::APPMGR, "KillProcessWithAccount accountId:%{public}d", aniAccountId); - int32_t appIndex = 0; ani_status status = ANI_OK; ani_boolean isUndefined = false; @@ -793,8 +799,9 @@ void EtsAppManager::GetRunningProcessInformationByBundleType( ani_int bundleType; if (!AAFwk::AniEnumConvertUtil::EnumConvert_EtsToNative(env, aniBundleType, bundleType)) { TAG_LOGE(AAFwkTag::APPMGR, "param aniBundleType err"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, - "Parse param bundleType failed, must be a BundleType."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param bundleType failed, must be a BundleType."), emptyArray); return; } std::vector infos; @@ -841,7 +848,9 @@ void EtsAppManager::NativeIsSharedBundleRunning(ani_env *env, ani_string aniBund std::string bundleName; if (!AppExecFwk::GetStdString(env, aniBundleName, bundleName)) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param bundleName failed, must be a string."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param bundleName failed, must be a string."), AppExecFwk::CreateBoolean(env, false)); return; } bool ret = appMgr->IsSharedBundleRunning(bundleName, versionCode); @@ -871,7 +880,9 @@ void EtsAppManager::NativeGetSupportedProcessCachePids(ani_env *env, ani_string std::string bundleName; if (!AppExecFwk::GetStdString(env, aniBundleName, bundleName)) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param bundleName failed, must be a string."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param bundleName failed, must be a string."), emptyArray); return; } std::vector list; @@ -912,7 +923,9 @@ void EtsAppManager::NativeKillProcessesInBatch(ani_env *env, ani_object pids, an std::vector pidList; if (!UnWrapArrayInt(env, pids, pidList)) { TAG_LOGE(AAFwkTag::APPMGR, "Parse pids failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param pids failed, must be array of numbers."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param pids failed, must be array of numbers."), nullptr); return; } int32_t innerErrorCode = appMgr->GetAmsMgr()->KillProcessesInBatch(pidList); @@ -942,7 +955,9 @@ void EtsAppManager::NativeIsAppRunning(ani_env *env, ani_object callback, ani_st std::string bundleName; if (!AppExecFwk::GetStdString(env, aniBundleName, bundleName)) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param bundleName failed, must be a string."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param bundleName failed, must be a string."), AppExecFwk::CreateBoolean(env, false)); return; } ani_status status = ANI_OK; @@ -986,13 +1001,17 @@ void EtsAppManager::NativeSetKeepAliveForBundle(ani_env *env, ani_string aniBund auto abilityManager = GetAbilityManagerInstance(); if (abilityManager == nullptr) { TAG_LOGE(AAFwkTag::APPMGR, "abilityManager null ptr"); - AbilityRuntime::EtsErrorUtil::ThrowError(env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateError( + env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER), nullptr); return; } std::string bundleName; if (!AppExecFwk::GetStdString(env, aniBundleName, bundleName)) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param bundleName failed, must be a string."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param bundleName failed, must be a string."), nullptr); return; } TAG_LOGD(AAFwkTag::APPMGR, "KillProcessWithAccount aniUserId:%{public}d", aniUserId); @@ -1015,13 +1034,17 @@ void EtsAppManager::NativeGetKeepAliveBundles(ani_env *env, ani_object callback, auto abilityManager = GetAbilityManagerInstance(); if (abilityManager == nullptr) { TAG_LOGE(AAFwkTag::APPMGR, "abilityManager null ptr"); - AbilityRuntime::EtsErrorUtil::ThrowError(env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateError( + env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER), nullptr); return; } ani_int appType = 0; if (!AAFwk::AniEnumConvertUtil::EnumConvert_EtsToNative(env, aniType, appType)) { TAG_LOGE(AAFwkTag::APPMGR, "param mode err"); - AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param appType failed, must be a number."); + AppExecFwk::AsyncCallback(env, callback, + AbilityRuntime::EtsErrorUtil::CreateInvalidParamError( + env, "Parse param appType failed, must be a number."), nullptr); return; } ani_status status = ANI_OK; 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 c1252a34b93..4df327ef93b 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 @@ -71,6 +71,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); @@ -89,6 +91,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.cpp b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension.cpp index e49bc810f7f..58157cb3f78 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension.cpp @@ -198,18 +198,18 @@ void EtsUIExtension::BindContext(ani_env *env, std::shared_ptr want ani_field contextField = nullptr; auto status = env->Class_FindField(etsObj_->aniCls, "context", &contextField); if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::ETSRUNTIME, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); return; } ani_ref contextRef = nullptr; if ((status = env->GlobalReference_Create(contextObj, &contextRef)) != ANI_OK) { - TAG_LOGE(AAFwkTag::ETSRUNTIME, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); return; } if ((status = env->Object_SetField_Ref(etsObj_->aniObj, contextField, contextRef)) != ANI_OK) { - TAG_LOGE(AAFwkTag::ETSRUNTIME, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); } shellContextRef_ = std::make_shared(); shellContextRef_->aniObj = contextObj; 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 3b5051a2483..59228da3ffe 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 @@ -19,6 +19,7 @@ #include "ani_common_start_options.h" #include "ani_common_remote.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" @@ -291,7 +292,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; @@ -309,7 +310,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"); @@ -400,7 +401,6 @@ void EtsUIExtensionContext::OnDisconnectServiceExtensionAbility(ani_env *env, an g_connects.erase(item); } else { TAG_LOGI(AAFwkTag::UI_EXT, "Failed to found connection"); - return; } } if (!connection) { @@ -499,6 +499,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) { @@ -564,17 +629,31 @@ ani_object CreateEtsUIExtensionContext(ani_env *env, std::shared_ptr(EtsUIExtensionContext::StartAbilityForResultWithOptions) }, + ani_native_function{"setColorMode", + "L@ohos/app/ability/ConfigurationConstant/ConfigurationConstant/ColorMode;:V", + reinterpret_cast(EtsUIExtensionContext::SetColorMode)}, + ani_native_function{"nativeReportDrawnCompleted", + "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + 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); return nullptr; } - if ((status = env->Object_SetFieldByName_Long(contextObj, "nativeContext", (ani_long)context.get())) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); + auto workContext = new (std::nothrow) + std::weak_ptr(context); + if (workContext == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null workContext"); + return nullptr; + } + if (!ContextUtil::SetNativeContextLong(env, contextObj, (ani_long)workContext)) { + TAG_LOGE(AAFwkTag::UI_EXT, "SetNativeContextLong failed"); + delete workContext; return nullptr; } if (!EtsUIExtensionContext::BindNativePtrCleaner(env)) { TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); + delete workContext; return nullptr; } OHOS::AbilityRuntime::ContextUtil::CreateEtsBaseContext(env, cls, contextObj, context); diff --git a/frameworks/ets/ets/@ohos.app.ability.ShareExtensionAbility.ets b/frameworks/ets/ets/@ohos.app.ability.ShareExtensionAbility.ets new file mode 100644 index 00000000000..b238c15ea6a --- /dev/null +++ b/frameworks/ets/ets/@ohos.app.ability.ShareExtensionAbility.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import UIExtensionAbility from '@ohos.app.ability.UIExtensionAbility'; + +export default class ShareExtensionAbility extends UIExtensionAbility { +} \ No newline at end of file diff --git a/frameworks/ets/ets/BUILD.gn b/frameworks/ets/ets/BUILD.gn index efa1a659ad3..6d456a2a881 100644 --- a/frameworks/ets/ets/BUILD.gn +++ b/frameworks/ets/ets/BUILD.gn @@ -1192,6 +1192,22 @@ ohos_prebuilt_etc("ability_runtime_event_hub_abc_etc") { deps = [ ":ability_runtime_event_hub_abc" ] } +generate_static_abc("ability_runtime_share_extension_ability_abc") { + base_url = "./" + files = [ "./@ohos.app.ability.ShareExtensionAbility.ets" ] + + is_boot_abc = "True" + device_dst_file = + "/system/framework/ability_runtime_share_extension_ability_abc.abc" +} + +ohos_prebuilt_etc("ability_runtime_share_extension_ability_abc_etc") { + source = "$target_out_dir/ability_runtime_share_extension_ability_abc.abc" + module_install_dir = "framework" + subsystem_name = "ability" + part_name = "ability_runtime" + deps = [ ":ability_runtime_share_extension_ability_abc" ] +} group("ets_packages") { deps = [ @@ -1244,6 +1260,7 @@ group("ets_packages") { ":ability_runtime_insight_intent_executor_abc_etc", ":ability_runtime_mission_info_abc_etc", ":ability_runtime_openLink_options_abc_etc", + ":ability_runtime_share_extension_ability_abc_etc", ":ability_runtime_shell_cmd_result_abc_etc", ":ability_runtime_start_options_abc_etc", ":ability_runtime_trigger_info_abc_etc", @@ -1260,6 +1277,7 @@ group("ets_packages") { ":ability_runtime_want_constant_abc_etc", ":atomic_service_options_abc_etc", ":application_state_observer_abc_etc", + ":app_foreground_state_observer_abc_etc", ":form_extension_ability_etc", ":service_extension_ability_abc_etc", ":ui_extension_ability_ani_etc", diff --git a/frameworks/ets/ets/application/ApplicationStateObserver.ets b/frameworks/ets/ets/application/ApplicationStateObserver.ets index 3b59dc77f22..e67cae97100 100644 --- a/frameworks/ets/ets/application/ApplicationStateObserver.ets +++ b/frameworks/ets/ets/application/ApplicationStateObserver.ets @@ -16,7 +16,7 @@ import AppStateData from 'application.AppStateData'; import AbilityStateData from 'application.AbilityStateData'; import processData from 'application.ProcessData'; -interface ApplicationStateObserver { +export interface ApplicationStateObserver { onForegroundApplicationChanged(appStateData: AppStateData): void; @@ -33,7 +33,7 @@ interface ApplicationStateObserver { onAppStopped(appStateData: AppStateData): void; } -class ApplicationStateObserverImpl implements ApplicationStateObserver { +export default class ApplicationStateObserverImpl implements ApplicationStateObserver { onForegroundApplicationChanged(appStateData: AppStateData): void {} onAbilityStateChanged(abilityStateData: AbilityStateData): void {} @@ -50,5 +50,3 @@ class ApplicationStateObserverImpl implements ApplicationStateObserver { } export type ProcessData = processData; - -export default ApplicationStateObserver; \ No newline at end of file diff --git a/frameworks/ets/ets/application/UIExtensionContext.ets b/frameworks/ets/ets/application/UIExtensionContext.ets index 79037510d55..b7fb7e061ed 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 { @@ -61,6 +62,8 @@ export default class UIExtensionContext extends ExtensionContext { private native nativeStartAbilityForResult(want: Want, callback:AsyncCallbackWrapper): void; private native nativeStartAbilityForResult(want: Want, startOptions: StartOptions, callback:AsyncCallbackWrapper): void; + native setColorMode(colorMode: ConfigurationConstant.ColorMode): void; + native nativeReportDrawnCompleted(callback:AsyncCallbackWrapper): void; terminateSelf(callback:AsyncCallback): void { let myCall = new AsyncCallbackWrapper(callback); @@ -212,4 +215,11 @@ export default class UIExtensionContext extends ExtensionContext { }); return p; } + + reportDrawnCompleted(callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + this.nativeReportDrawnCompleted(myCall); + }); + } } \ No newline at end of file -- Gitee