From 553edaabda9de279b25e55a0c72da7fb1d0c2b9c Mon Sep 17 00:00:00 2001 From: travislgd Date: Thu, 11 Sep 2025 09:40:07 +0800 Subject: [PATCH] dms_ani_stage_4 Signed-off-by: travislgd --- .../display_ani/ets/@ohos.display.ets | 27 +++++ .../display_ani/include/display_ani_manager.h | 4 + .../display_ani/include/display_ani_utils.h | 2 + .../display_ani/src/display_ani.cpp | 4 + .../display_ani/src/display_ani_manager.cpp | 100 ++++++++++++++++-- .../display_ani/src/display_ani_utils.cpp | 23 ++++ 6 files changed, 154 insertions(+), 6 deletions(-) diff --git a/interfaces/kits/ani/display_runtime/display_ani/ets/@ohos.display.ets b/interfaces/kits/ani/display_runtime/display_ani/ets/@ohos.display.ets index ebe1c219c4..3f59f5adb7 100644 --- a/interfaces/kits/ani/display_runtime/display_ani/ets/@ohos.display.ets +++ b/interfaces/kits/ani/display_runtime/display_ani/ets/@ohos.display.ets @@ -685,6 +685,33 @@ export function makeUnique(screenId: long): Promise { } export native function makeUniqueNative(screenId: long, nativeObj: long): void; + +export function addVirtualScreenBlocklist(windowIds: Array): Promise { + return new Promise((resolve: (value: undefined) => void, reject: (error: BusinessError) => void): void => { + taskpool.execute((): void => { + addVirtualScreenBlocklistNative(windowIds, displayMgrRef); + }).then((ret: NullishType): void => { + resolve(undefined); + }).catch((err: NullishType): void => { + reject(err as BusinessError); + }); + }); +} + +export function removeVirtualScreenBlocklist(windowIds: Array): Promise { + return new Promise((resolve: (value: undefined) => void, reject: (error: BusinessError) => void): void => { + taskpool.execute((): void => { + removeVirtualScreenBlocklistNative(windowIds, displayMgrRef); + }).then((ret: NullishType): void => { + resolve(undefined); + }).catch((err: NullishType): void => { + reject(err as BusinessError); + }); + }); +} + +export native function addVirtualScreenBlocklistNative(windowIds: Array, nativeObj: long): Promise; +export native function removeVirtualScreenBlocklistNative(windowIds: Array, nativeObj: long): Promise; export function setFoldStatusLocked(locked: boolean): void { setFoldStatusLockedNative(locked, displayMgrRef); diff --git a/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_manager.h b/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_manager.h index 320f94db4b..1bdbec569f 100644 --- a/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_manager.h +++ b/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_manager.h @@ -56,6 +56,8 @@ public: static void DestroyVirtualScreen(ani_env* env, ani_long screenId, ani_long nativeObj); static void SetVirtualScreenSurface(ani_env* env, ani_long screenId, ani_string surfaceId, ani_long nativeObj); static void MakeUnique(ani_env* env, ani_long screenId, ani_long nativeObj); + static void AddVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj, ani_long nativeObj); + static void RemoveVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj, ani_long nativeObj); static void FinalizerDisplay(ani_env* env, ani_object displayObj, ani_long nativeObj); private: void OnRegisterCallback(ani_env* env, ani_string type, ani_ref callback); @@ -69,6 +71,8 @@ private: void OnDestroyVirtualScreen(ani_env* env, ani_long screenId); void OnSetVirtualScreenSurface(ani_env* env, ani_long screenId, ani_string surfaceId); void OnMakeUnique(ani_env* env, ani_long screenId); + void OnAddVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj); + void OnRemoveVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj); void OnFinalizerDisplay(ani_env* env, ani_object displayObj); bool IsCallbackRegistered(ani_env* env, const std::string& type, ani_ref callback); std::mutex mtx_; diff --git a/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_utils.h b/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_utils.h index 7cfc816e2c..7e39be81c5 100644 --- a/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_utils.h +++ b/interfaces/kits/ani/display_runtime/display_ani/include/display_ani_utils.h @@ -46,6 +46,8 @@ static ani_status CvtDisplay(sptr display, ani_env* env, ani_object obj static ani_status GetStdString(ani_env *env, ani_string ani_str, std::string &result); +static ani_status GetAniArrayInt(ani_env *env, ani_object arrayObj, std::vector& arrayNative); + static ani_status NewAniObject(ani_env* env, ani_class cls, const char *signature, ani_object* result, ...); static ani_status NewAniObjectNoParams(ani_env* env, ani_class cls, ani_object* object); diff --git a/interfaces/kits/ani/display_runtime/display_ani/src/display_ani.cpp b/interfaces/kits/ani/display_runtime/display_ani/src/display_ani.cpp index a820d17488..871d75953f 100644 --- a/interfaces/kits/ani/display_runtime/display_ani/src/display_ani.cpp +++ b/interfaces/kits/ani/display_runtime/display_ani/src/display_ani.cpp @@ -448,6 +448,10 @@ ani_status DisplayAni::NspBindNativeFunctions(ani_env* env, ani_namespace nsp) reinterpret_cast(DisplayManagerAni::SetVirtualScreenSurface)}, ani_native_function {"makeUniqueNative", nullptr, reinterpret_cast(DisplayManagerAni::MakeUnique)}, + ani_native_function {"addVirtualScreenBlocklistNative", nullptr, + reinterpret_cast(DisplayManagerAni::AddVirtualScreenBlocklist)}, + ani_native_function {"removeVirtualScreenBlocklistNative", nullptr, + reinterpret_cast(DisplayManagerAni::RemoveVirtualScreenBlocklist)}, ani_native_function {"isCaptured", nullptr, reinterpret_cast(DisplayManagerAni::IsCaptured)}, ani_native_function {"finalizerDisplayNative", nullptr, reinterpret_cast(DisplayManagerAni::FinalizerDisplay)}, diff --git a/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_manager.cpp b/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_manager.cpp index 9736f4322d..8d52ef622c 100644 --- a/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_manager.cpp +++ b/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_manager.cpp @@ -539,7 +539,11 @@ void DisplayManagerAni::GetAllDisplayPhysicalResolution(ani_env* env, ani_object { TLOGI(WmsLogTag::DMS, "[ANI] begin"); DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); - displayManagerAni->OnGetAllDisplayPhysicalResolution(env, arrayObj); + if (displayManagerAni != nullptr) { + displayManagerAni->OnGetAllDisplayPhysicalResolution(env, arrayObj); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } } void DisplayManagerAni::OnGetAllDisplayPhysicalResolution(ani_env* env, ani_object arrayObj) @@ -564,7 +568,11 @@ void DisplayManagerAni::CreateVirtualScreen(ani_env* env, return; } DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); - displayManagerAni->OnCreateVirtualScreen(env, virtualScreenConfig); + if (displayManagerAni != nullptr) { + displayManagerAni->OnCreateVirtualScreen(env, virtualScreenConfig); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } } ani_long DisplayManagerAni::OnCreateVirtualScreen(ani_env* env, ani_object virtualScreenConfig) @@ -604,7 +612,11 @@ void DisplayManagerAni::DestroyVirtualScreen(ani_env* env, ani_long screenId, an return; } DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); - displayManagerAni->OnDestroyVirtualScreen(env, screenId); + if (displayManagerAni != nullptr) { + displayManagerAni->OnDestroyVirtualScreen(env, screenId); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } } void DisplayManagerAni::OnDestroyVirtualScreen(ani_env* env, ani_long screenId) @@ -633,7 +645,11 @@ void DisplayManagerAni::SetVirtualScreenSurface( return; } DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); - displayManagerAni->OnSetVirtualScreenSurface(env, screenId, surfaceId); + if (displayManagerAni != nullptr) { + displayManagerAni->OnSetVirtualScreenSurface(env, screenId, surfaceId); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } } void DisplayManagerAni::OnSetVirtualScreenSurface(ani_env* env, ani_long screenId, ani_string surfaceId) @@ -669,7 +685,11 @@ void DisplayManagerAni::MakeUnique(ani_env* env, ani_long screenId, ani_long nat return; } DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); - displayManagerAni->OnMakeUnique(env, screenId); + if (displayManagerAni != nullptr) { + displayManagerAni->OnMakeUnique(env, screenId); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } } void DisplayManagerAni::OnMakeUnique(ani_env* env, ani_long screenId) @@ -692,11 +712,79 @@ void DisplayManagerAni::OnMakeUnique(ani_env* env, ani_long screenId) } } +void DisplayManagerAni::AddVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj, ani_long nativeObj) +{ + TLOGI(WmsLogTag::DMS, "[ANI] begin"); + if (env == nullptr) { + TLOGE(WmsLogTag::DMS, "[ANI] env is nullptr"); + return; + } + DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); + if (displayManagerAni != nullptr) { + displayManagerAni->OnAddVirtualScreenBlocklist(env, windowIdsObj); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } +} + +void DisplayManagerAni::OnAddVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj) +{ + TLOGI(WmsLogTag::DMS, "[ANI] begin"); + std::vector persistentIds; + ani_status ret = DisplayAniUtils::GetAniArrayInt(env, windowIdsObj, persistentIds); + if (ANI_OK != ret) { + TLOGE(WmsLogTag::DMS, "[ANI] GetAniArrayInt fail"); + return; + } + auto res = DM_JS_TO_ERROR_CODE_MAP.at( + SingletonContainer::Get().AddVirtualScreenBlockList(persistentIds)); + if (res != DmErrorCode::DM_OK) { + TLOGE(WmsLogTag::DMS, "[ANI] on add virtual screen blocklist failed."); + AniErrUtils::ThrowBusinessError(env, res, "OnAddVirtualScreenBlocklist failed."); + } +} + +void DisplayManagerAni::RemoveVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj, ani_long nativeObj) +{ + TLOGI(WmsLogTag::DMS, "[ANI] begin"); + if (env == nullptr) { + TLOGE(WmsLogTag::DMS, "[ANI] env is nullptr"); + return; + } + DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); + if (displayManagerAni != nullptr) { + displayManagerAni->OnRemoveVirtualScreenBlocklist(env, windowIdsObj); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } +} + +void DisplayManagerAni::OnRemoveVirtualScreenBlocklist(ani_env* env, ani_object windowIdsObj) +{ + TLOGI(WmsLogTag::DMS, "[ANI] begin"); + std::vector persistentIds; + ani_status ret = DisplayAniUtils::GetAniArrayInt(env, windowIdsObj, persistentIds); + if (ANI_OK != ret) { + TLOGE(WmsLogTag::DMS, "[ANI] GetAniArrayInt fail"); + return; + } + auto res = DM_JS_TO_ERROR_CODE_MAP.at( + SingletonContainer::Get().RemoveVirtualScreenBlockList(persistentIds)); + if (res != DmErrorCode::DM_OK) { + TLOGE(WmsLogTag::DMS, "[ANI] on remove virtual screen blocklist failed."); + AniErrUtils::ThrowBusinessError(env, res, "OnRemoveVirtualScreenBlocklist failed."); + } +} + void DisplayManagerAni::FinalizerDisplay(ani_env* env, ani_object displayObj, ani_long nativeObj) { TLOGI(WmsLogTag::DMS, "[ANI] DMS FinalizerDisplayNative begin"); DisplayManagerAni* displayManagerAni = reinterpret_cast(nativeObj); - displayManagerAni->OnFinalizerDisplay(env, displayObj); + if (displayManagerAni != nullptr) { + displayManagerAni->OnFinalizerDisplay(env, displayObj); + } else { + TLOGI(WmsLogTag::DMS, "[ANI] null ptr"); + } } void DisplayManagerAni::OnFinalizerDisplay(ani_env* env, ani_object displayObj) diff --git a/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_utils.cpp b/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_utils.cpp index 8313d6d9f6..ca3bef27af 100644 --- a/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_utils.cpp +++ b/interfaces/kits/ani/display_runtime/display_ani/src/display_ani_utils.cpp @@ -281,6 +281,29 @@ ani_status DisplayAniUtils::GetStdString(ani_env *env, ani_string ani_str, std:: return ret; } +ani_status DisplayAniUtils::GetAniArrayInt(ani_env* env, ani_object arrayObj, std::vector& result) +{ + ani_int length; + ani_status ret = env->Object_GetPropertyByName_Int(arrayObj, "length", &length); + if (ANI_OK != ret) { + TLOGE(WmsLogTag::DMS, "[ANI] get ani_array len fail"); + return ret; + } + auto array = reinterpret_cast(arrayObj); + std::vector nativeArray(length); + + ret = env->Array_GetRegion_Int(array, 0, length, nativeArray.data()); + if (ANI_OK != ret) { + TLOGE(WmsLogTag::DMS, "[ANI] get ani_array region fail"); + return ret; + } + result.resize(length); + for (ani_int i = 0; i < length; i++) { + result[i] = static_cast(nativeArray[i]); + } + return ret; +} + ani_status DisplayAniUtils::NewAniObject(ani_env* env, ani_class cls, const char *signature, ani_object* result, ...) { ani_method aniCtor; -- Gitee