From 72d2e550200ebd793ede8614699dd690edb4a3fb Mon Sep 17 00:00:00 2001 From: wangh Date: Tue, 12 Dec 2023 10:08:51 +0800 Subject: [PATCH] fix avoid area notify Signed-off-by: wangh --- .../container/src/zidl/session_stage_stub.cpp | 3 +++ .../session_manager/src/scene_session_manager.cpp | 15 ++++++++++++++- wm/src/window_session_impl.cpp | 6 +++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/window_scene/session/container/src/zidl/session_stage_stub.cpp b/window_scene/session/container/src/zidl/session_stage_stub.cpp index ffb4fffaae..0a592b2f5f 100644 --- a/window_scene/session/container/src/zidl/session_stage_stub.cpp +++ b/window_scene/session/container/src/zidl/session_stage_stub.cpp @@ -217,6 +217,9 @@ int SessionStageStub::HandleUpdateAvoidArea(MessageParcel& data, MessageParcel& { WLOGFD("HandleUpdateAvoidArea!"); sptr avoidArea = data.ReadStrongParcelable(); + if (!avoidArea) { + return ERR_INVALID_VALUE; + } uint32_t type; if (!data.ReadUint32(type)) { return ERR_INVALID_VALUE; diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 1493ead444..6900d9461c 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -5320,6 +5320,7 @@ WSError SceneSessionManager::UpdateSessionAvoidAreaListener(int32_t& persistentI } if (haveListener) { avoidAreaListenerSessionSet_.insert(persistentId); + UpdateAvoidArea(persistentId); } else { lastUpdatedAvoidArea_.erase(persistentId); avoidAreaListenerSessionSet_.erase(persistentId); @@ -5345,14 +5346,17 @@ bool SceneSessionManager::UpdateSessionAvoidAreaIfNeed(const int32_t& persistent } else { if (avoidArea.isEmptyAvoidArea()) { needUpdate = false; + return needUpdate; } } } else { if (avoidArea.isEmptyAvoidArea()) { needUpdate = false; + return needUpdate; } } - if (needUpdate) { + if (needUpdate || + avoidAreaType == AvoidAreaType::TYPE_SYSTEM || avoidAreaType == AvoidAreaType::TYPE_NAVIGATION_INDICATOR) { lastUpdatedAvoidArea_[persistentId][avoidAreaType] = avoidArea; sceneSession->UpdateAvoidArea(new AvoidArea(avoidArea), avoidAreaType); } @@ -5450,6 +5454,8 @@ WSError SceneSessionManager::NotifyAINavigationBarShowStatus(bool isVisible, WSR WLOGFD("NotifyAINavigationBarShowStatus: barArea should be empty if invisible"); currAINavigationBarArea_ = WSRect(); } + WLOGFI("NotifyAINavigationBarShowStatus: enter: %{public}u, {%{public}d,%{public}d,%{public}d,%{public}d}", + isVisible, barArea.posX_, barArea.posY_, barArea.width_, barArea.height_); for (auto persistentId : avoidAreaListenerSessionSet_) { auto sceneSession = GetSceneSession(persistentId); if (sceneSession == nullptr) { @@ -5460,6 +5466,13 @@ WSError SceneSessionManager::NotifyAINavigationBarShowStatus(bool isVisible, WSR !avoidArea.rightRect_.IsUninitializedRect()) { continue; } + if (isVisible && avoidArea.isEmptyAvoidArea()) { + continue; + } + WLOGFI("NotifyAINavigationBarShowStatus: persistentId: %{public}d, " + "{%{public}d,%{public}d,%{public}d,%{public}d}", persistentId, + avoidArea.bottomRect_.posX_, avoidArea.bottomRect_.posY_, + avoidArea.bottomRect_.width_, avoidArea.bottomRect_.height_); UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, AvoidAreaType::TYPE_NAVIGATION_INDICATOR); } diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index 0bfca55c1d..e1d49cb10e 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -1540,7 +1540,11 @@ void WindowSessionImpl::NotifyAvoidAreaChange(const sptr& avoidArea, WSError WindowSessionImpl::UpdateAvoidArea(const sptr& avoidArea, AvoidAreaType type) { - WLOGI("UpdateAvoidArea, id:%{public}d", GetPersistentId()); + WLOGI("UpdateAvoidArea: id:%{public}d, type:%{public}d, top{%{public}d,%{public}d,%{public}d,%{public}d}, " + "down{%{public}d,%{public}d,%{public}d,%{public}d}", GetPersistentId(), type, + avoidArea->topRect_.posX_, avoidArea->topRect_.posY_, avoidArea->topRect_.width_, avoidArea->topRect_.height_, + avoidArea->bottomRect_.posX_, avoidArea->bottomRect_.posY_, avoidArea->bottomRect_.width_, + avoidArea->bottomRect_.height_); NotifyAvoidAreaChange(avoidArea, type); return WSError::WS_OK; } -- Gitee