From e0b0c4c1b34c00de5a6117dee9e33d335de46ddc Mon Sep 17 00:00:00 2001 From: yanxinyu7 Date: Wed, 3 Sep 2025 21:54:54 +0800 Subject: [PATCH] ani_stage3 Signed-off-by: yanxinyu7 --- .../window_stage_ani/ets/@ohos.window.ets | 34 +++++++++ .../include/ani_window_stage.h | 4 +- .../src/ani_window_manager.cpp | 2 +- .../window_stage_ani/src/ani_window_stage.cpp | 70 ++++++++++++++++++- .../src/ani_window_stage_module.cpp | 2 + 5 files changed, 109 insertions(+), 3 deletions(-) diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/ets/@ohos.window.ets b/interfaces/kits/ani/window_runtime/window_stage_ani/ets/@ohos.window.ets index b8c30dcca3..0ba2dc3c91 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/ets/@ohos.window.ets +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/ets/@ohos.window.ets @@ -384,6 +384,26 @@ namespace window { contentColor: string; } +export enum ImageFit { + FILL, + CONTAIN, + COVER, + FIT_WIDTH, + FIT_HEIGHT, + NONE, + SCALE_DOWN, + TOP_LEFT, + TOP, + TOP_RIGHT, + LEFT, + CENTER, + RIGHT, + BOTTOM_LEFT, + BOTTOM, + BOTTOM_RIGHT, + MATRIX, +}; + export class SystemBarRegionTintInternal implements SystemBarRegionTint { type: number; isEnable: boolean; @@ -1872,6 +1892,7 @@ export class WindowStageInternal implements WindowStage { public native setShowOnLockScreenSync(nativeObj:long, showOnLockScreen: boolean): void; public native getMainWindowSync(nativeObj: long): Window; public native createSubWindowSync(nativeObj: long, name: String): Window; + public native SetImageForRecentSync(nativeObj: long, imgResourceId: long, value: int): void; native onSync(nativeObj: long, eventType: 'windowStageEvent', callback: Object): void; native offSync(nativeObj: long, eventType: 'windowStageEvent', callback?: Object): void; @@ -2030,6 +2051,18 @@ export class WindowStageInternal implements WindowStage { }); } + public SetImageForRecent(imgResourceId: long, value: ImageFit): Promise { + return new Promise((resolve: (value: undefined) => void, reject: (error: BusinessError) => void) => { + taskpool.execute((): void => { + this.SetImageForRecentSync(this.nativeObj, imgResourceId, value as int); + }).then((ret: NullishType) => { + resolve(undefined); + }).catch((err: NullishType) => { + reject(err as BusinessError); + }); + }); + } + public on(eventType: 'windowStageEvent', callback: Callback): void { this.onSync(this.nativeObj, eventType, callback); } @@ -2054,6 +2087,7 @@ export interface WindowStage { createSubWindow(name: string, callback: AsyncCallback): void; disableWindowDecor(): void; setShowOnLockScreen(showOnLockScreen: boolean): void; + SetImageForRecent(imgResourceId: long, value: int): Promise; on(eventType: 'windowStageEvent', callback: Callback): void; off(eventType: 'windowStageEvent', callback?: Callback): void; } diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_stage.h b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_stage.h index 6edf8f9cba..47586695bc 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_stage.h +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_stage.h @@ -42,7 +42,8 @@ class AniWindowStage { ani_ref callback); static void UnregisterWindowCallback(ani_env* env, ani_object obj, ani_long nativeObj, ani_string type, ani_ref callback); - + static void SetImageForRecent(ani_env* env, ani_object obj, ani_long nativeObj, ani_long imgResourceId, + ani_int value); void SetWindowRectAutoSave(ani_env* env, ani_boolean enabled, ani_boolean isSaveBySpecifiedFlag); ani_boolean IsWindowRectAutoSave(ani_env* env); void RemoveStartingWindow(ani_env* env); @@ -56,6 +57,7 @@ private: void OnSetShowOnLockScreen(ani_env* env, ani_boolean showOnLockScreen); void OnRegisterWindowCallback(ani_env* env, ani_string type, ani_ref callback); void OnUnregisterWindowCallback(ani_env* env, ani_string type, ani_ref callback); + void OnSetImageForRecent(ani_env* env, ani_long imgResourceId, ani_int value); std::weak_ptr windowScene_; std::unique_ptr registerManager_ = nullptr; }; diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_manager.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_manager.cpp index 105024a537..85b2e06a11 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_manager.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_manager.cpp @@ -450,4 +450,4 @@ void AniWindowManager::OnShiftAppWindowFocus(ani_env* env, ani_int sourceWindowI return ; } } // namespace Rosen -} // namespace OHOS +} // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage.cpp index 5945bed54e..ba7f31630b 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage.cpp @@ -35,10 +35,31 @@ using OHOS::Rosen::WindowScene; namespace OHOS { namespace Rosen { - +// methods of filling the image in recent +enum class ImageFit { + FILL, + CONTAIN, + COVER, + FIT_WIDTH, + FIT_HEIGHT, + NONE, + SCALE_DOWN, + TOP_LEFT, + TOP, + TOP_RIGHT, + LEFT, + CENTER, + RIGHT, + BOTTOM_LEFT, + BOTTOM, + BOTTOM_RIGHT, + MATRIX, +}; namespace { /* used for free, ani has no destructor right now, only free when aniObj freed */ static std::map localObjs; +const int64_t MIN_RESOURCE_ID = 0x1000000; +const int64_t MAX_RESOURCE_ID = 0xffffffff; } // namespace AniWindowStage::AniWindowStage(const std::shared_ptr& windowScene) @@ -473,6 +494,53 @@ ani_ref AniWindowStage::OnCreateSubWindow(ani_env* env, ani_string name) } return CreateAniWindowObject(env, window); } +void AniWindowStage::SetImageForRecent(ani_env* env, ani_object obj, ani_long nativeObj, + ani_long imgResourceId, ani_int value) +{ + TLOGI(WmsLogTag::DEFAULT, "[ANI]"); + AniWindowStage* aniWindowStage = reinterpret_cast(nativeObj); + if (aniWindowStage != nullptr) { + aniWindowStage->OnUnregisterWindowCallback(env, type, callback); + } else { + TLOGE(WmsLogTag::DEFAULT, "[ANI] aniWindowStage is nullptr"); + } +} + +void AniWindowStage::OnSetImageForRecent(ani_env* env, ani_long imgResourceId, ani_int value) +{ + TLOGI(WmsLogTag::DEFAULT, "[ANI]"); + auto windowScene = GetWindowScene().lock(); + if (windowScene == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "[ANI]windowScene is nullptr!"); + AniWindowUtils::AniThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY); + return; + } + int64_t resourceId = static_cast(imgResourceId); + if (imgResourceId < MIN_RESOURCE_ID || imgResourceId > MAX_RESOURCE_ID) { + TLOGE(WmsLogTag::WMS_PATTERN, "imgRsourceId invalid: %{public}d", imgResourceId); + AniWindowUtils::AniThrowError(env, WmErrorCode::WM_ERROR_ILLEGAL_PARAM); + return; + } + int32_t imageFit = static_cast(value); + if (imageFit < static_cast(ImageFit::FILL) || + imageFit > static_cast(ImageFit::MATRIX)) { + TLOGE(WmsLogTag::WMS_PATTERN, "imageFit invalid: %{public}d", imageFit); + AniWindowUtils::AniThrowError(env, WmErrorCode::WM_ERROR_ILLEGAL_PARAM); + return; + } + auto mainWindow = windowScene->GetMainWindow(); + if (mainWindow == nullptr) { + TLOGE(WmsLogTag::WMS_LIFE, "[ANI] mainWindow is nullptr!"); + AniWindowUtils::AniThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY); + return; + } + WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetImageForRecent(imgResourceId, + static_cast(value))); + if (ret != WmErrorCode::WM_OK) { + TLOGE(WmsLogTag::DEFAULT, "[ANI] Set image for recemt failed."); + AniWindowUtils::AniThrowError(env, ret); + } +} } // namespace Rosen } // namespace OHOS diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage_module.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage_module.cpp index 1aaf49acc3..4fe253d349 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage_module.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_stage_module.cpp @@ -115,6 +115,8 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) nullptr, reinterpret_cast(AniWindowStage::SetShowOnLockScreen)}, ani_native_function {"getMainWindowSync", "l:C{@ohos.window.window.Window}", reinterpret_cast(WindowGetMainWindow)}, + ani_native_function {"SetImageForRecentSync", "lli:", + reinterpret_cast(SetImageForRecent)}, ani_native_function {"createSubWindowSync", "lC{std.core.String}:C{@ohos.window.window.Window}", reinterpret_cast(CreateSubWindow)}, ani_native_function {"onSync", nullptr, -- Gitee