diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp index 5237b1dcce16aad91d22334968e76cf240b721bc..52fdc088cf9d9a406df774624c950a5e227743fa 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp @@ -417,6 +417,10 @@ void JsSceneSession::BindNativeMethod(napi_env env, napi_value objValue, const c BindNativeFunction(env, objValue, "sendContainerModalEvent", moduleName, JsSceneSession::SendContainerModalEvent); BindNativeFunction(env, objValue, "setColorSpace", moduleName, JsSceneSession::SetColorSpace); BindNativeFunction(env, objValue, "setSnapshotSkip", moduleName, JsSceneSession::SetSnapshotSkip); + BindNativeFunction(env, objValue, "addSidebarMaskColorModifier", moduleName, + JsSceneSession::AddSidebarMaskColorModifier); + BindNativeFunction(env, objValue, "setSidebarMaskColorModifier", moduleName, + JsSceneSession::SetSidebarMaskColorModifier); } void JsSceneSession::BindNativeMethodForKeyboard(napi_env env, napi_value objValue, const char* moduleName) @@ -2336,6 +2340,20 @@ napi_value JsSceneSession::SetSnapshotSkip(napi_env env, napi_callback_info info return (me != nullptr) ? me->OnSetSnapshotSkip(env, info) : nullptr; } +napi_value JsSceneSession::AddSidebarMaskColorModifier(napi_env env, napi_callback_info info) +{ + TLOGD(WmsLogTag::WMS_PC, "[NAPI]"); + JsSceneSession* me = CheckParamsAndGetThis(env, info); + return (me != nullptr) ? me->OnAddSidebarMaskColorModifier(env, info) : nullptr; +} + +napi_value JsSceneSession::SetSidebarMaskColorModifier(napi_env env, napi_callback_info info) +{ + TLOGD(WmsLogTag::WMS_PC, "[NAPI]"); + JsSceneSession* me = CheckParamsAndGetThis(env, info); + return (me != nullptr) ? me->OnSetSidebarMaskColorModifier(env, info) : nullptr; +} + bool JsSceneSession::IsCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject) { HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsSceneSession::IsCallbackRegistered[%s]", type.c_str()); @@ -6363,4 +6381,42 @@ napi_value JsSceneSession::OnSetSnapshotSkip(napi_env env, napi_callback_info in } return NapiGetUndefined(env); } + +napi_value JsSceneSession::OnAddSidebarMaskColorModifier(napi_env env, napi_callback_info info) +{ + auto session = weakSession_.promote(); + if (session == nullptr) { + TLOGE(WmsLogTag::WMS_PC, "session is nullptr, id: %{public}d", persistentId_); + return NapiGetUndefined(env); + } + session->AddSidebarMaskColorModifier(); + return NapiGetUndefined(env); +} + +napi_value JsSceneSession::OnSetSidebarMaskColorModifier(napi_env env, napi_callback_info info) +{ + size_t argc = ARGC_FOUR; + napi_value argv[ARGC_FOUR] = {nullptr}; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + if (argc < ARGC_ONE) { + TLOGE(WmsLogTag::WMS_PC, "Argc is invalid: %{public}zu", argc); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + bool needBlur = false; + if (!ConvertFromJsValue(env, argv[0], needBlur)) { + TLOGE(WmsLogTag::WMS_PC, "Failed to convert parameter to bool"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + auto session = weakSession_.promote(); + if (session == nullptr) { + TLOGE(WmsLogTag::WMS_PC, "session is nullptr, id:%{public}d", persistentId_); + return NapiGetUndefined(env); + } + session->SetSidebarMaskColorModifier(needBlur); + return NapiGetUndefined(env); +} } // namespace OHOS::Rosen diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h index 52d91bea09a70588334e8ef4ffad70ea09472d5b..b718d858f1bc7feca1fda68fb42c95256449f0be 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h @@ -210,6 +210,8 @@ private: static napi_value SetColorSpace(napi_env env, napi_callback_info info); static napi_value SetSnapshotSkip(napi_env env, napi_callback_info info); static napi_value ThrowSlipDirectly(napi_env env, napi_callback_info info); + static napi_value AddSidebarMaskColorModifier(napi_env env, napi_callback_info info); + static napi_value SetSidebarMaskColorModifier(napi_env env, napi_callback_info info); napi_value OnActivateDragBySystem(napi_env env, napi_callback_info info); napi_value OnRegisterCallback(napi_env env, napi_callback_info info); @@ -284,6 +286,8 @@ private: napi_value OnSetColorSpace(napi_env env, napi_callback_info info); napi_value OnSetSnapshotSkip(napi_env env, napi_callback_info info); napi_value OnThrowSlipDirectly(napi_env env, napi_callback_info info); + napi_value OnAddSidebarMaskColorModifier(napi_env env, napi_callback_info info); + napi_value OnSetSidebarMaskColorModifier(napi_env env, napi_callback_info info); bool IsCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject); void ProcessChangeSessionVisibilityWithStatusBarRegister(); diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index f42482fd9cef3533cee71b7dff1e8d1d039572d9..e1f83b0a9b6097240ae9ee1ede0a4883d81c9efd 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -16,6 +16,10 @@ #ifndef OHOS_ROSEN_WINDOW_SCENE_SCENE_SESSION_H #define OHOS_ROSEN_WINDOW_SCENE_SCENE_SESSION_H +#include +#include +#include +#include #include #include @@ -322,6 +326,8 @@ public: void RegisterMainModalTypeChangeCallback(NotifyMainModalTypeChangeFunc&& func); void RegisterSupportWindowModesCallback(NotifySetSupportedWindowModesFunc&& func); void CloneWindow(NodeId surfaceNodeId); + void AddSidebarMaskColorModifier(); + void SetSidebarMaskColorModifier(bool needBlur); /* * PC Window Layout @@ -1060,6 +1066,13 @@ private: * Window Property */ NotifySetWindowCornerRadiusFunc onSetWindowCornerRadiusFunc_; + + /* + * PC Window Sidebar Blur + */ + uint32_t defaultMaskColor_ = 0xe5ffffff; + uint32_t snapshotMaskColor_ = 0xffe5e5e5; + std::shared_ptr> maskColorValue_; }; } // namespace OHOS::Rosen #endif // OHOS_ROSEN_WINDOW_SCENE_SCENE_SESSION_H diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 90ea878c4dcd6f765324d29bd3d6e665b047c5c1..481f48f1ea0373acc95587b02cec0735d0e544b2 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -6654,4 +6654,51 @@ void SceneSession::SetColorSpace(ColorSpace colorSpace) rsTransaction->Commit(); } } + +void SceneSession::AddSidebarMaskColorModifier() +{ + auto surfaceNode = GetSurfaceNode(); + if (!surfaceNode) { + TLOGE(WmsLogTag::WMS_PC, "surfaceNode is null"); + return; + } + + auto rsNodeTemp = Rosen::RSNodeMap::Instance().GetNode(surfaceNode->GetId()); + if (rsNodeTemp) { + maskColorValue_ = std::make_shared>( + Rosen::RSColor::FromArgbInt(defaultMaskColor_)); + std::shared_ptr modifier = + std::make_shared(maskColorValue_); + rsNodeTemp->AddModifier(modifier); + } +} + +void SceneSession::SetSidebarMaskColorModifier(bool needBlur) +{ + auto surfaceNode = GetSurfaceNode(); + if (!surfaceNode) { + TLOGE(WmsLogTag::WMS_PC, "surfaceNode is null"); + return; + } + if (!maskColorValue_) { + TLOGE(WmsLogTag::WMS_PC, "maskColorValue is null"); + return; + } + TLOGI(WmsLogTag::WMS_PC, "needBlur: %{public}d", needBlur); + // sidebar animation duration + constexpr int32_t duration = 150; + if (needBlur) { + Rosen::RSAnimationTimingProtocol timingProtocol; + timingProtocol.SetDuration(duration); + timingProtocol.SetDirection(true); + timingProtocol.SetFillMode(Rosen::FillMode::FORWARDS); + timingProtocol.SetFinishCallbackType(Rosen::FinishCallbackType::LOGICALLY); + + Rosen::RSNode::OpenImplicitAnimation(timingProtocol, Rosen::RSAnimationTimingCurve::LINEAR, nullptr); + maskColorValue_->Set(Rosen::RSColor::FromArgbInt(defaultMaskColor_)); + Rosen::RSNode::CloseImplicitAnimation(); + } else { + maskColorValue_->Set(Rosen::RSColor::FromArgbInt(snapshotMaskColor_)); + } +} } // namespace OHOS::Rosen diff --git a/window_scene/test/unittest/scene_session_test3.cpp b/window_scene/test/unittest/scene_session_test3.cpp index ecf8c36d1cf050c24e92e8c823b33b55842f19a6..1175dfe70fbbc7ecdcf9c3a3c4ed062a67e8b2ff 100644 --- a/window_scene/test/unittest/scene_session_test3.cpp +++ b/window_scene/test/unittest/scene_session_test3.cpp @@ -26,6 +26,7 @@ #include "session/host/include/scene_session.h" #include "session/host/include/sub_session.h" #include "session/host/include/system_session.h" +#include "ui/rs_surface_node.h" #include "window_helper.h" #include "wm_common.h" @@ -720,6 +721,64 @@ HWTEST_F(SceneSessionTest3, SetWindowCornerRadius, Function | SmallTest | Level2 session->onSetWindowCornerRadiusFunc_ = func; EXPECT_EQ(WSError::WS_OK, session->SetWindowCornerRadius(1.0f)); } + +/** + * @tc.name: AddSidebarMaskColorModifier + * @tc.desc: AddSidebarMaskColorModifier + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionTest3, AddSidebarMaskColorModifier, Function | SmallTest | Level2) +{ + SessionInfo info; + info.abilityName_ = "AddSidebarMaskColorModifier"; + info.bundleName_ = "AddSidebarMaskColorModifier"; + sptr session = sptr::MakeSptr(info, nullptr); + EXPECT_NE(session, nullptr); + + struct RSSurfaceNodeConfig config; + std::shared_ptr surfaceNode = RSSurfaceNode::Create(config); + session->AddSidebarMaskColorModifier(); + EXPECT_EQ(nullptr, session->GetSurfaceNode()); + EXPECT_EQ(nullptr, session->maskColorValue_); + + session->surfaceNode_ = surfaceNode; + session->AddSidebarMaskColorModifier(); + EXPECT_NE(nullptr, session->GetSurfaceNode()); + EXPECT_NE(nullptr, session->maskColorValue_); +} + +/** + * @tc.name: SetSidebarMaskColorModifier + * @tc.desc: SetSidebarMaskColorModifier + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionTest3, SetSidebarMaskColorModifier, Function | SmallTest | Level2) +{ + SessionInfo info; + info.abilityName_ = "SetSidebarMaskColorModifier"; + info.bundleName_ = "SetSidebarMaskColorModifier"; + sptr session = sptr::MakeSptr(info, nullptr); + EXPECT_NE(session, nullptr); + + struct RSSurfaceNodeConfig config; + std::shared_ptr surfaceNode = RSSurfaceNode::Create(config); + session->AddSidebarMaskColorModifier(); + EXPECT_EQ(nullptr, session->GetSurfaceNode()); + EXPECT_EQ(nullptr, session->maskColorValue_); + + session->surfaceNode_ = surfaceNode; + session->AddSidebarMaskColorModifier(); + EXPECT_NE(nullptr, session->GetSurfaceNode()); + EXPECT_NE(nullptr, session->maskColorValue_); + + session->SetSidebarMaskColorModifier(false); + Rosen::RSColor colorClose = session->maskColorValue_->Get(); + EXPECT_EQ(session->defaultMaskColor_, colorClose.AsArgbInt()); + + session->SetSidebarMaskColorModifier(true); + Rosen::RSColor colorOpen = session->maskColorValue_->Get(); + EXPECT_EQ(session->snapshotMaskColor_, colorOpen.AsArgbInt()); +} } } } \ No newline at end of file