From 00e8b805bb5874b171ce3aa2ca2cc7db0af9bf75 Mon Sep 17 00:00:00 2001 From: nzy Date: Tue, 29 Oct 2024 23:18:36 +0800 Subject: [PATCH] =?UTF-8?q?SessionChangeCallback=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=94=B9&surfaceNode=E4=B8=BB=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E9=94=80=E6=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nzy --- .../js_scene_session.cpp | 52 ++++++++--------- .../session/host/include/scene_session.h | 14 ++++- window_scene/session/host/include/session.h | 2 +- .../session/host/src/scene_session.cpp | 58 ++++++++++++++++--- window_scene/session/host/src/session.cpp | 10 ++++ .../test/unittest/scene_session_test2.cpp | 2 +- .../test/unittest/scene_session_test3.cpp | 2 +- 7 files changed, 97 insertions(+), 43 deletions(-) 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 c3cd37ea95..832bc68e4e 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 @@ -332,15 +332,15 @@ JsSceneSession::JsSceneSession(napi_env env, const sptr& session) if (sessionchangeCallback != nullptr) { if (session != nullptr) { session->RegisterSessionChangeCallback(sessionchangeCallback); + session->RegisterClearCallbackMapCallback([weakThis = wptr(this)](bool needRemove, int32_t persistentId) { + auto jsSceneSession = weakThis.promote(); + if (!jsSceneSession) { + TLOGNE(WmsLogTag::WMS_LIFE, "clearCallbackFunc jsSceneSession is null"); + return; + } + jsSceneSession->ClearCbMap(needRemove, persistentId); + }); } - sessionchangeCallback->clearCallbackFunc_ = [weakThis = wptr(this)](bool needRemove, int32_t persistentId) { - auto jsSceneSession = weakThis.promote(); - if (!jsSceneSession) { - TLOGE(WmsLogTag::WMS_LIFE, "clearCallbackFunc jsSceneSession is null"); - return; - } - jsSceneSession->ClearCbMap(needRemove, persistentId); - }; sessionchangeCallback_ = sessionchangeCallback; WLOGFD("RegisterSessionChangeCallback success"); } @@ -1275,26 +1275,21 @@ void JsSceneSession::ProcessIsCustomAnimationPlaying() void JsSceneSession::ProcessShowWhenLockedRegister() { - auto sessionchangeCallback = sessionchangeCallback_.promote(); - if (sessionchangeCallback == nullptr) { - WLOGFE("sessionchangeCallback is nullptr"); + auto session = weakSession_.promote(); + if (session == nullptr) { + TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_); return; } - sessionchangeCallback->OnShowWhenLocked_ = [weakThis = wptr(this)](bool showWhenLocked) { + const char* const where = __func__; + session->RegisterShowWhenLockedCallback([weakThis = wptr(this), where](bool showWhenLocked) { auto jsSceneSession = weakThis.promote(); if (!jsSceneSession) { - TLOGE(WmsLogTag::WMS_LIFE, "ProcessShowWhenLockedRegister jsSceneSession is null"); + TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where); return; } jsSceneSession->OnShowWhenLocked(showWhenLocked); - }; - auto session = weakSession_.promote(); - if (session == nullptr) { - WLOGFE("session is nullptr, id:%{public}d", persistentId_); - return; - } - sessionchangeCallback->OnShowWhenLocked_(session->GetShowWhenLockedFlagValue()); - WLOGFD("ProcessShowWhenLockedRegister success"); + }); + TLOGD(WmsLogTag::WMS_LIFE, "success"); } void JsSceneSession::ProcessRequestedOrientationChange() @@ -1316,20 +1311,21 @@ void JsSceneSession::ProcessRequestedOrientationChange() void JsSceneSession::ProcessForceHideChangeRegister() { - auto sessionchangeCallback = sessionchangeCallback_.promote(); - if (sessionchangeCallback == nullptr) { - WLOGFE("sessionchangeCallback is nullptr"); + auto session = weakSession_.promote(); + if (session == nullptr) { + TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_); return; } - sessionchangeCallback->OnForceHideChange_ = [weakThis = wptr(this)](bool hide) { + const char* const where = __func__; + session->RegisterForceHideChangeCallback([weakThis = wptr(this), where](bool hide) { auto jsSceneSession = weakThis.promote(); if (!jsSceneSession) { - TLOGE(WmsLogTag::WMS_LIFE, "ProcessForceHideChangeRegister jsSceneSession is null"); + TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where); return; } jsSceneSession->OnForceHideChange(hide); - }; - WLOGFD("ProcessForceHideChangeRegister success"); + }); + TLOGD(WmsLogTag::WMS_LIFE, "success"); } void JsSceneSession::OnForceHideChange(bool hide) diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index ef634886c9..96d7f2796b 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -121,11 +121,8 @@ public: NotifySystemBarPropertyChangeFunc OnSystemBarPropertyChange_; NotifyIsCustomAnimationPlayingCallback onIsCustomAnimationPlaying_; NotifyWindowAnimationFlagChangeFunc onWindowAnimationFlagChange_; - NotifyShowWhenLockedFunc OnShowWhenLocked_; NotifyRaiseAboveTargetFunc onRaiseAboveTarget_; - NotifyForceHideChangeFunc OnForceHideChange_; NotifyTouchOutsideFunc OnTouchOutside_; - ClearCallbackMapFunc clearCallbackFunc_; NotifyLandscapeMultiWindowSessionFunc onSetLandscapeMultiWindowFunc_; NotifyLayoutFullScreenChangeFunc onLayoutFullScreenChangeFunc_; }; @@ -354,6 +351,10 @@ public: void SetNotifyVisibleChangeFunc(const NotifyVisibleChangeFunc& func); void ClearSpecificSessionCbMap(); + void RegisterShowWhenLockedCallback(NotifyShowWhenLockedFunc&& callback); + void RegisterForceHideChangeCallback(NotifyForceHideChangeFunc&& callback); + void RegisterClearCallbackMapCallback(ClearCallbackMapFunc&& callback); + void SendPointerEventToUI(std::shared_ptr pointerEvent); bool SendKeyEventToUI(std::shared_ptr keyEvent, bool isPreImeEvent = false); bool IsStartMoving() const; @@ -484,6 +485,13 @@ protected: */ NotifyPrepareClosePiPSessionFunc onPrepareClosePiPSession_; + /* + * Window Lifecycle + */ + NotifyShowWhenLockedFunc onShowWhenLockedFunc_; + NotifyForceHideChangeFunc onForceHideChangeFunc_; + ClearCallbackMapFunc clearCallbackMapFunc_; + private: void NotifyAccessibilityVisibilityChange(); void CalculateAvoidAreaRect(WSRect& rect, WSRect& avoidRect, AvoidArea& avoidArea) const; diff --git a/window_scene/session/host/include/session.h b/window_scene/session/host/include/session.h index c548de731a..7db622a479 100644 --- a/window_scene/session/host/include/session.h +++ b/window_scene/session/host/include/session.h @@ -119,7 +119,7 @@ class Session : public SessionStub { public: using Task = std::function; explicit Session(const SessionInfo& info); - virtual ~Session() = default; + virtual ~Session(); bool isKeyboardPanelEnabled_ = false; void SetEventHandler(const std::shared_ptr& handler, const std::shared_ptr& exportHandler = nullptr); diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index b5f2f1f7ce..8c2e4ed317 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -340,8 +340,8 @@ void SceneSession::ClearSpecificSessionCbMap() TLOGE(WmsLogTag::WMS_SYSTEM, "session is null"); return; } - if (session->sessionChangeCallback_ && session->sessionChangeCallback_->clearCallbackFunc_) { - session->sessionChangeCallback_->clearCallbackFunc_(true, session->GetPersistentId()); + if (session->clearCallbackMapFunc_) { + session->clearCallbackMapFunc_(true, session->GetPersistentId()); TLOGD(WmsLogTag::WMS_SYSTEM, "ClearCallbackMap, id: %{public}d", session->GetPersistentId()); } else { TLOGE(WmsLogTag::WMS_SYSTEM, "get callback failed, id: %{public}d", session->GetPersistentId()); @@ -350,6 +350,49 @@ void SceneSession::ClearSpecificSessionCbMap() PostTask(task, "ClearSpecificSessionCbMap"); } +void SceneSession::RegisterShowWhenLockedCallback(NotifyShowWhenLockedFunc&& callback) +{ + const char* const where = __func__; + auto task = [weakThis = wptr(this), callback = std::move(callback), where] { + auto session = weakThis.promote(); + if (!session) { + TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s session is nullptr", where); + return; + } + session->onShowWhenLockedFunc_ = std::move(callback); + session->onShowWhenLockedFunc_(session->GetShowWhenLockedFlagValue()); + }; + PostTask(task, where); +} + +void SceneSession::RegisterForceHideChangeCallback(NotifyForceHideChangeFunc&& callback) +{ + const char* const where = __func__; + auto task = [weakThis = wptr(this), callback = std::move(callback), where] { + auto session = weakThis.promote(); + if (!session) { + TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s session is nullptr", where); + return; + } + session->onForceHideChangeFunc_ = std::move(callback); + }; + PostTask(task, where); +} + +void SceneSession::RegisterClearCallbackMapCallback(ClearCallbackMapFunc&& callback) +{ + const char* const where = __func__; + auto task = [weakThis = wptr(this), callback = std::move(callback), where] { + auto session = weakThis.promote(); + if (!session) { + TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s session is nullptr", where); + return; + } + session->clearCallbackMapFunc_ = std::move(callback); + }; + PostTask(task, where); +} + WSError SceneSession::Disconnect(bool isFromClient, const std::string& identityToken) { if (isFromClient && SessionHelper::IsMainWindow(GetWindowType())) { @@ -1322,8 +1365,8 @@ WSError SceneSession::OnNeedAvoid(bool status) WSError SceneSession::OnShowWhenLocked(bool showWhenLocked) { WLOGFD("SceneSession ShowWhenLocked status:%{public}d", static_cast(showWhenLocked)); - if (sessionChangeCallback_ != nullptr && sessionChangeCallback_->OnShowWhenLocked_) { - sessionChangeCallback_->OnShowWhenLocked_(showWhenLocked); + if (onShowWhenLockedFunc_) { + onShowWhenLockedFunc_(showWhenLocked); } return WSError::WS_OK; } @@ -2836,8 +2879,8 @@ void SceneSession::NotifyForceHideChange(bool hide) return; } property->SetForceHide(hide); - if (sessionChangeCallback_ && sessionChangeCallback_->OnForceHideChange_) { - sessionChangeCallback_->OnForceHideChange_(hide); + if (onForceHideChangeFunc_) { + onForceHideChangeFunc_(hide); } SetForceTouchable(!hide); if (hide) { @@ -4496,11 +4539,8 @@ void SceneSession::UnregisterSessionChangeListeners() session->sessionChangeCallback_->OnSystemBarPropertyChange_ = nullptr; session->sessionChangeCallback_->onIsCustomAnimationPlaying_ = nullptr; session->sessionChangeCallback_->onWindowAnimationFlagChange_ = nullptr; - session->sessionChangeCallback_->OnShowWhenLocked_ = nullptr; session->sessionChangeCallback_->onRaiseAboveTarget_ = nullptr; - session->sessionChangeCallback_->OnForceHideChange_ = nullptr; session->sessionChangeCallback_->OnTouchOutside_ = nullptr; - session->sessionChangeCallback_->clearCallbackFunc_ = nullptr; session->sessionChangeCallback_->onSetLandscapeMultiWindowFunc_ = nullptr; session->sessionChangeCallback_->onLayoutFullScreenChangeFunc_ = nullptr; } diff --git a/window_scene/session/host/src/session.cpp b/window_scene/session/host/src/session.cpp index 6294e55061..2dde154063 100644 --- a/window_scene/session/host/src/session.cpp +++ b/window_scene/session/host/src/session.cpp @@ -101,6 +101,16 @@ Session::Session(const SessionInfo& info) : sessionInfo_(info) } } +Session::~Session() +{ + TLOGI(WmsLogTag::WMS_LIFE, "id:%{public}d", GetPersistentId()); + if (mainHandler_) { + mainHandler_->PostTask([surfaceNode = std::move(surfaceNode_)]() mutable { + // do nothing + }); + } +} + void Session::SetEventHandler(const std::shared_ptr& handler, const std::shared_ptr& exportHandler) { diff --git a/window_scene/test/unittest/scene_session_test2.cpp b/window_scene/test/unittest/scene_session_test2.cpp index eba72d1a30..697be78ea1 100644 --- a/window_scene/test/unittest/scene_session_test2.cpp +++ b/window_scene/test/unittest/scene_session_test2.cpp @@ -1140,7 +1140,7 @@ HWTEST_F(SceneSessionTest2, NotifyForceHideChange, Function | SmallTest | Level2 auto func = [scensession](bool hide) { scensession->SetPrivacyMode(hide); }; - scensession->sessionChangeCallback_->OnForceHideChange_ = func; + scensession->onForceHideChangeFunc_ = func; EXPECT_NE(nullptr, &func); scensession->NotifyForceHideChange(true); diff --git a/window_scene/test/unittest/scene_session_test3.cpp b/window_scene/test/unittest/scene_session_test3.cpp index 3551eca12e..0d22c2cc71 100644 --- a/window_scene/test/unittest/scene_session_test3.cpp +++ b/window_scene/test/unittest/scene_session_test3.cpp @@ -375,7 +375,7 @@ HWTEST_F(SceneSessionTest3, ClearSpecificSessionCbMap1, Function | SmallTest | L sptr sessionChangeCallback = new (std::nothrow) MainSession::SessionChangeCallback(); - sessionChangeCallback->clearCallbackFunc_ = [](bool, int32_t) {}; + scensession->clearCallbackMapFunc_ = [](bool, int32_t) {}; scensession->sessionChangeCallback_ = sessionChangeCallback; scensession->ClearSpecificSessionCbMap(); } -- Gitee