From 0a6b2a3832865861905d24b972b78c3252188834 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Mon, 13 Jan 2025 14:37:00 +0800 Subject: [PATCH 01/12] refactor: merge avoid area info to update rect Signed-off-by: ReCoder --- .../include/zidl/session_stage_interface.h | 3 +- .../include/zidl/session_stage_proxy.h | 3 +- .../src/zidl/session_stage_proxy.cpp | 17 ++- .../container/src/zidl/session_stage_stub.cpp | 41 +++++-- .../session/host/include/scene_session.h | 1 - window_scene/session/host/include/session.h | 3 + .../session/host/src/scene_session.cpp | 23 ++-- window_scene/session/host/src/session.cpp | 9 +- .../include/scene_session_manager.h | 5 +- .../src/scene_session_manager.cpp | 114 ++---------------- window_scene/test/mock/mock_session_stage.h | 4 +- .../unittest/scene_session_manager_test10.cpp | 25 ---- .../unittest/scene_session_manager_test6.cpp | 63 ---------- .../test/unittest/scene_session_test.cpp | 3 - wm/include/window_extension_session_impl.h | 9 +- wm/include/window_session_impl.h | 15 ++- wm/src/window_extension_session_impl.cpp | 24 ++-- wm/src/window_session_impl.cpp | 63 +++++----- 18 files changed, 146 insertions(+), 279 deletions(-) diff --git a/window_scene/session/container/include/zidl/session_stage_interface.h b/window_scene/session/container/include/zidl/session_stage_interface.h index fe09475c93..f76d59da5b 100644 --- a/window_scene/session/container/include/zidl/session_stage_interface.h +++ b/window_scene/session/container/include/zidl/session_stage_interface.h @@ -52,7 +52,8 @@ public: * @return Returns WSError::WS_OK if called success, otherwise failed. */ virtual WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }) = 0; + const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, + const std::map& avoidAreas = {}) = 0; virtual void UpdateDensity() = 0; virtual WSError UpdateOrientation() = 0; diff --git a/window_scene/session/container/include/zidl/session_stage_proxy.h b/window_scene/session/container/include/zidl/session_stage_proxy.h index 61935f2952..9611e5efc7 100644 --- a/window_scene/session/container/include/zidl/session_stage_proxy.h +++ b/window_scene/session/container/include/zidl/session_stage_proxy.h @@ -32,7 +32,8 @@ public: WSError SetActive(bool active) override; WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }) override; + const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, + const std::map& avoidAreas = {}) override; void UpdateDensity() override; WSError UpdateOrientation() override; WSError UpdateSessionViewportConfig(const SessionViewportConfig& config) override; diff --git a/window_scene/session/container/src/zidl/session_stage_proxy.cpp b/window_scene/session/container/src/zidl/session_stage_proxy.cpp index 97fbaf28a4..f38f107152 100644 --- a/window_scene/session/container/src/zidl/session_stage_proxy.cpp +++ b/window_scene/session/container/src/zidl/session_stage_proxy.cpp @@ -172,7 +172,7 @@ WSError SessionStageProxy::UpdateDisplayId(uint64_t displayId) } WSError SessionStageProxy::UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config) + const SceneAnimationConfig& config, const std::map& avoidAreas) { MessageParcel data; MessageParcel reply; @@ -214,6 +214,21 @@ WSError SessionStageProxy::UpdateRect(const WSRect& rect, SizeChangeReason reaso return WSError::WS_ERROR_IPC_FAILED; } + if (!data.WriteUint32(avoidAreas.size())) { + TLOGE(WmsLogTag::DEFAULT, "Write avoid area size failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + for (const auto& [type, avoidArea] : avoidAreas) { + if (!data.WriteUint32(static_cast(type))) { + TLOGE(WmsLogTag::DEFAULT, "Write avoid area type failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + if (!data.WriteParcelable(&avoidArea)) { + TLOGE(WmsLogTag::DEFAULT, "Write avoid area failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + } + sptr remote = Remote(); if (remote == nullptr) { WLOGFE("remote is null"); 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 d3f27e94d0..7c1b2196a5 100644 --- a/window_scene/session/container/src/zidl/session_stage_stub.cpp +++ b/window_scene/session/container/src/zidl/session_stage_stub.cpp @@ -224,29 +224,46 @@ int SessionStageStub::HandleUpdateRect(MessageParcel& data, MessageParcel& reply TLOGE(WmsLogTag::WMS_LAYOUT, "read hasRSTransaction failed."); return -1; } - int32_t animationDuration = 0; + SceneAnimationConfig config { .rsTransaction_ = nullptr, .animationDuration_ = 0 }; if (hasRSTransaction) { std::shared_ptr transaction(data.ReadParcelable()); if (!transaction) { TLOGE(WmsLogTag::WMS_LAYOUT, "transaction unMarsh failed."); return -1; } - if (!data.ReadInt32(animationDuration)) { - TLOGE(WmsLogTag::WMS_LAYOUT, "read animationDuration failed"); + config.rsTransaction_ = transaction; + } + if (!data.ReadInt32(config.animationDuration_)) { + TLOGE(WmsLogTag::WMS_LAYOUT, "read animationDuration failed"); + return -1; + } + std::map avoidAreas; + uint32_t size = 0; + if (!data.ReadUint32(size)) { + TLOGE(WmsLogTag::WMS_IMMS, "read avoid area size failed"); + return -1; + } + constexpr uint32_t AVOID_AREA_TYPE_MAX_SIZE = 100; + if (size > AVOID_AREA_TYPE_MAX_SIZE) { + TLOGE(WmsLogTag::WMS_IMMS, "avoid area size is invalid"); + return -1; + } + for (uint32_t i = 0; i < size; i++) { + uint32_t type = data.ReadUint32(); + if (type < static_cast(AvoidAreaType::TYPE_START) || + type >= static_cast(AvoidAreaType::TYPE_END)) { + TLOGE(WmsLogTag::WMS_IMMS, "read avoid area type failed"); return -1; } - SceneAnimationConfig config { .rsTransaction_ = transaction, .animationDuration_ = animationDuration }; - WSError errCode = UpdateRect(rect, reason, config); - reply.WriteUint32(static_cast(errCode)); - } else { - if (!data.ReadInt32(animationDuration)) { - TLOGE(WmsLogTag::WMS_LAYOUT, "read animationDuration failed"); + sptr area = data.ReadParcelable(); + if (area == nullptr) { + TLOGE(WmsLogTag::WMS_IMMS, "read avoid area failed"); return -1; } - SceneAnimationConfig config { .rsTransaction_ = nullptr, .animationDuration_ = animationDuration }; - WSError errCode = UpdateRect(rect, reason, config); - reply.WriteUint32(static_cast(errCode)); + avoidAreas[static_cast(type)] = *area; } + WSError errCode = UpdateRect(rect, reason, config, avoidAreas); + reply.WriteUint32(static_cast(errCode)); return ERR_NONE; } diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index 4b1470367d..80f6ee50f9 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -124,7 +124,6 @@ public: GetSceneSessionVectorByTypeAndDisplayIdCallback onGetSceneSessionVectorByTypeAndDisplayId_; GetSceneSessionVectorByTypeCallback onGetSceneSessionVectorByType_; UpdateAvoidAreaCallback onUpdateAvoidArea_; - UpdateAvoidAreaByTypeCallback onUpdateAvoidAreaByType_; GetStatusBarDefaultVisibilityByDisplayIdFunc onGetStatusBarDefaultVisibilityByDisplayId_; UpdateOccupiedAreaIfNeedCallback onUpdateOccupiedAreaIfNeed_; NotifyWindowInfoUpdateCallback onWindowInfoUpdate_; diff --git a/window_scene/session/host/include/session.h b/window_scene/session/host/include/session.h index 4f5a1e2377..debdbaaff1 100644 --- a/window_scene/session/host/include/session.h +++ b/window_scene/session/host/include/session.h @@ -268,6 +268,9 @@ public: SizeChangeReason GetSizeChangeReason() const { return reason_; } virtual WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, const std::string& updateReason, const std::shared_ptr& rsTransaction = nullptr); + virtual WSError UpdateRectWithAvoidArea(const WSRect& rect, SizeChangeReason reason, + const std::string& updateReason, const std::shared_ptr& rsTransaction = nullptr, + const std::map& avoidAreas = {}); WSError UpdateDensity(); WSError UpdateOrientation(); diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index a442a79ad1..ac2eaaaed4 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -1127,12 +1127,14 @@ WSError SceneSession::NotifyClientToUpdateRectTask(const std::string& updateReas "SceneSession::NotifyClientToUpdateRect%d [%d, %d, %u, %u] reason:%u", GetPersistentId(), winRect_.posX_, winRect_.posY_, winRect_.width_, winRect_.height_, reason_); + std::map avoidAreas; + GetAllAvoidAreas(avoidAreas); // once reason is undefined, not use rsTransaction // when rotation, sync cnt++ in marshalling. Although reason is undefined caused by resize if (reason_ == SizeChangeReason::UNDEFINED || reason_ == SizeChangeReason::RESIZE || IsMoveToOrDragMove(reason_)) { - ret = Session::UpdateRect(winRect_, reason_, updateReason, nullptr); + ret = Session::UpdateRectWithAvoidArea(winRect_, reason_, updateReason, nullptr, avoidAreas); } else { - ret = Session::UpdateRect(winRect_, reason_, updateReason, rsTransaction); + ret = Session::UpdateRectWithAvoidArea(winRect_, reason_, updateReason, rsTransaction, avoidAreas); #ifdef DEVICE_STATUS_ENABLE // When the drag is in progress, the drag window needs to be notified to rotate. if (rsTransaction != nullptr) { @@ -1153,17 +1155,7 @@ WSError SceneSession::NotifyClientToUpdateRect(const std::string& updateReason, TLOGNE(WmsLogTag::WMS_LAYOUT, "session is null"); return WSError::WS_ERROR_DESTROYED_OBJECT; } - WSError ret = session->NotifyClientToUpdateRectTask(updateReason, rsTransaction); - if (ret == WSError::WS_OK) { - if (session->specificCallback_ != nullptr) { - if (Session::IsScbCoreEnabled()) { - session->dirtyFlags_ |= static_cast(SessionUIDirtyFlag::AVOID_AREA); - } else { - session->specificCallback_->onUpdateAvoidArea_(session->GetPersistentId()); - } - } - } - return ret; + return session->NotifyClientToUpdateRectTask(updateReason, rsTransaction); }, "NotifyClientToUpdateRect"); return WSError::WS_OK; } @@ -1706,9 +1698,8 @@ WSError SceneSession::SetIsStatusBarVisibleInner(bool isVisible) return ret; } if (isLayoutFinished) { - if (specificCallback_ && specificCallback_->onUpdateAvoidAreaByType_) { - specificCallback_->onUpdateAvoidAreaByType_(GetPersistentId(), AvoidAreaType::TYPE_SYSTEM); - } + UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); + NotifyClientToUpdateRect("AvoidAreaChange", nullptr); } else { dirtyFlags_ |= static_cast(SessionUIDirtyFlag::AVOID_AREA); } diff --git a/window_scene/session/host/src/session.cpp b/window_scene/session/host/src/session.cpp index 0b183ad339..8e01f65c77 100644 --- a/window_scene/session/host/src/session.cpp +++ b/window_scene/session/host/src/session.cpp @@ -1012,6 +1012,13 @@ void Session::UpdateClientRectPosYAndDisplayId(WSRect& rect) WSError Session::UpdateRect(const WSRect& rect, SizeChangeReason reason, const std::string& updateReason, const std::shared_ptr& rsTransaction) +{ + return UpdateRectWithAvoidArea(rect, reason, updateReason, rsTransaction, {}); +} + +WSError Session::UpdateRectWithAvoidArea(const WSRect& rect, SizeChangeReason reason, + const std::string& updateReason, const std::shared_ptr& rsTransaction, + const std::map& avoidAreas) { TLOGD(WmsLogTag::WMS_LAYOUT, "session update rect: id: %{public}d, rect:%{public}s, " "reason:%{public}u %{public}s", GetPersistentId(), rect.ToString().c_str(), reason, updateReason.c_str()); @@ -1027,7 +1034,7 @@ WSError Session::UpdateRect(const WSRect& rect, SizeChangeReason reason, SceneAnimationConfig config { .rsTransaction_ = rsTransaction, .animationDuration_ = rotateAnimationDuration }; WSRect updatedRect = rect; UpdateClientRectPosYAndDisplayId(updatedRect); - sessionStage_->UpdateRect(updatedRect, reason, config); + sessionStage_->UpdateRect(updatedRect, reason, config, avoidAreas); SetClientRect(rect); RectCheckProcess(); } else { diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index 4c5d458f2e..2839f417b8 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -716,12 +716,9 @@ private: /* * Window Immersive */ - bool UpdateSessionAvoidAreaIfNeed(int32_t persistentId, - const sptr& sceneSession, const AvoidArea& avoidArea, AvoidAreaType avoidAreaType); - void UpdateAvoidSessionAvoidArea(WindowType type, bool& needUpdate); + void UpdateAvoidSessionAvoidArea(WindowType type); void UpdateNormalSessionAvoidArea(int32_t persistentId, const sptr& sceneSession, bool& needUpdate); void UpdateAvoidArea(int32_t persistentId); - void UpdateAvoidAreaByType(int32_t persistentId, AvoidAreaType type); void UpdateRootSceneSessionAvoidArea(int32_t persistentId, bool& needUpdate); WSError IsLastFrameLayoutFinished(bool& isLayoutFinished); diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index be5216ac12..985b72a5ec 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -1270,9 +1270,6 @@ void SceneSessionManager::CreateRootSceneSession() specificCb->onNotifyAvoidAreaChange_ = [this](const sptr& avoidArea, AvoidAreaType type) { onNotifyAvoidAreaChangeForRootFunc_(avoidArea, type); }; - specificCb->onUpdateAvoidAreaByType_ = [this](int32_t persistentId, AvoidAreaType type) { - this->UpdateAvoidAreaByType(persistentId, type); - }; rootSceneSession_ = sptr::MakeSptr(specificCb); rootSceneSession_->isKeyboardPanelEnabled_ = isKeyboardPanelEnabled_; rootSceneSession_->SetEventHandler(taskScheduler_->GetEventHandler()); @@ -1477,9 +1474,6 @@ sptr SceneSessionManager::CreateSpecificS specificCb->onUpdateAvoidArea_ = [this](int32_t persistentId) { this->UpdateAvoidArea(persistentId); }; - specificCb->onUpdateAvoidAreaByType_ = [this](int32_t persistentId, AvoidAreaType type) { - this->UpdateAvoidAreaByType(persistentId, type); - }; specificCb->onGetStatusBarDefaultVisibilityByDisplayId_ = [this](DisplayId displayId) { return this->GetStatusBarDefaultVisibilityByDisplayId(displayId); }; @@ -8765,54 +8759,20 @@ WSError SceneSessionManager::UpdateSessionAvoidAreaListener(int32_t persistentId return taskScheduler_->PostSyncTask(task, "UpdateSessionAvoidAreaListener:PID:" + std::to_string(persistentId)); } -bool SceneSessionManager::UpdateSessionAvoidAreaIfNeed(int32_t persistentId, - const sptr& sceneSession, const AvoidArea& avoidArea, AvoidAreaType avoidAreaType) -{ - if (sceneSession == nullptr) { - TLOGE(WmsLogTag::WMS_IMMS, "session null no need update avoid area, win %{public}d", persistentId); - return false; - } - if (lastUpdatedAvoidArea_.find(persistentId) == lastUpdatedAvoidArea_.end()) { - lastUpdatedAvoidArea_[persistentId] = {}; - } - - bool needUpdate = true; - if (auto it = lastUpdatedAvoidArea_[persistentId].find(avoidAreaType); - it != lastUpdatedAvoidArea_[persistentId].end()) { - needUpdate = it->second != avoidArea; - } else { - if (avoidArea.isEmptyAvoidArea()) { - TLOGI(WmsLogTag::WMS_IMMS, "win %{public}d type %{public}d empty avoid area", - persistentId, avoidAreaType); - needUpdate = false; - return needUpdate; - } - } - if (needUpdate) { - lastUpdatedAvoidArea_[persistentId][avoidAreaType] = avoidArea; - sceneSession->UpdateAvoidArea(new AvoidArea(avoidArea), avoidAreaType); - } - return needUpdate; -} - -void SceneSessionManager::UpdateAvoidSessionAvoidArea(WindowType type, bool& needUpdate) +void SceneSessionManager::UpdateAvoidSessionAvoidArea(WindowType type) { AvoidAreaType avoidType = (type == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT) ? AvoidAreaType::TYPE_KEYBOARD : AvoidAreaType::TYPE_SYSTEM; AvoidArea avoidArea = rootSceneSession_->GetAvoidAreaByType(static_cast(avoidType)); - bool ret = UpdateSessionAvoidAreaIfNeed( - rootSceneSession_->GetPersistentId(), rootSceneSession_, avoidArea, static_cast(avoidType)); - needUpdate |= ret; + rootSceneSession_->UpdateAvoidArea(new AvoidArea(avoidArea), static_cast(avoidType)); - for (auto persistentId : avoidAreaListenerSessionSet_) { - auto sceneSession = GetSceneSession(persistentId); + std::shared_lock lock(sceneSessionMapMutex_); + for (const auto& [_, sceneSession] : sceneSessionMap_) { if (sceneSession == nullptr || !IsSessionVisibleForeground(sceneSession)) { continue; } - AvoidArea avoidArea = sceneSession->GetAvoidAreaByType(static_cast(avoidType)); - ret = UpdateSessionAvoidAreaIfNeed( - persistentId, sceneSession, avoidArea, static_cast(avoidType)); - needUpdate |= ret; + sceneSession->UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); + sceneSession->NotifyClientToUpdateRect("AvoidAreaChange", nullptr); } } @@ -8854,19 +8814,8 @@ void SceneSessionManager::UpdateNormalSessionAvoidArea( needUpdate = false; return; } - using T = std::underlying_type_t; - for (T avoidType = static_cast(AvoidAreaType::TYPE_START); - avoidType < static_cast(AvoidAreaType::TYPE_END); avoidType++) { - AvoidArea avoidArea = sceneSession->GetAvoidAreaByType(static_cast(avoidType)); - if (avoidType == static_cast(AvoidAreaType::TYPE_NAVIGATION_INDICATOR) && - !CheckAvoidAreaForAINavigationBar(isAINavigationBarVisible_, avoidArea, - sceneSession->GetSessionRect().height_)) { - continue; - } - bool ret = UpdateSessionAvoidAreaIfNeed( - persistentId, sceneSession, avoidArea, static_cast(avoidType)); - needUpdate |= ret; - } + sceneSession->UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); + sceneSession->NotifyClientToUpdateRect("AvoidAreaChange", nullptr); } void SceneSessionManager::UpdateRootSceneSessionAvoidArea(int32_t persistentId, bool& needUpdate) @@ -8880,10 +8829,9 @@ void SceneSessionManager::UpdateRootSceneSessionAvoidArea(int32_t persistentId, rootSceneSession_->GetSessionRect().height_)) { continue; } - bool ret = UpdateSessionAvoidAreaIfNeed( - persistentId, rootSceneSession_, avoidArea, static_cast(avoidAreaType)); - needUpdate |= ret; + rootSceneSession_->UpdateAvoidArea(new AvoidArea(avoidArea), static_cast(avoidAreaType)); } + needUpdate = true; } void SceneSessionManager::NotifyMMIWindowPidChange(int32_t windowId, bool startMoving) @@ -8912,7 +8860,7 @@ void SceneSessionManager::UpdateAvoidArea(int32_t persistentId) bool needUpdate = false; auto sceneSession = GetSceneSession(persistentId); if (sceneSession != nullptr && sceneSession->IsImmersiveType()) { - UpdateAvoidSessionAvoidArea(sceneSession->GetWindowType(), needUpdate); + UpdateAvoidSessionAvoidArea(sceneSession->GetWindowType()); } else { UpdateNormalSessionAvoidArea(persistentId, sceneSession, needUpdate); } @@ -8922,35 +8870,6 @@ void SceneSessionManager::UpdateAvoidArea(int32_t persistentId) }, "UpdateAvoidArea:PID:" + std::to_string(persistentId)); } -void SceneSessionManager::UpdateAvoidAreaByType(int32_t persistentId, AvoidAreaType type) -{ - taskScheduler_->PostAsyncTask([this, persistentId, type, where = __func__] { - auto sceneSession = GetSceneSession(persistentId); - if (sceneSession == nullptr || !IsSessionVisibleForeground(sceneSession)) { - TLOGND(WmsLogTag::WMS_IMMS, "%{public}s win %{public}d is nullptr or invisible", where, persistentId); - return; - } - if (avoidAreaListenerSessionSet_.find(persistentId) == avoidAreaListenerSessionSet_.end()) { - TLOGND(WmsLogTag::WMS_IMMS, "%{public}s win %{public}d has no listener, no need update", - where, persistentId); - return; - } - if (sceneSession->IsImmersiveType()) { - TLOGND(WmsLogTag::WMS_IMMS, "%{public}s win %{public}d is immersive type", where, persistentId); - return; - } - auto avoidArea = sceneSession->GetAvoidAreaByType(type); - if (type == AvoidAreaType::TYPE_NAVIGATION_INDICATOR && !CheckAvoidAreaForAINavigationBar( - isAINavigationBarVisible_, avoidArea, sceneSession->GetSessionRect().height_)) { - TLOGNI(WmsLogTag::WMS_IMMS, "win %{public}d AI bar check false, visible %{public}d " - "avoid area %{public}s rect %{public}s", persistentId, isAINavigationBarVisible_, - avoidArea.ToString().c_str(), sceneSession->GetSessionRect().ToString().c_str()); - return; - } - UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, type); - }, "UpdateAvoidAreaByType:PID:" + std::to_string(persistentId)); -} - void SceneSessionManager::UpdateGestureBackEnabled(int32_t persistentId) { auto task = [this, persistentId, where = __func__] { @@ -9068,15 +8987,8 @@ void SceneSessionManager::NotifySessionAINavigationBarChange(int32_t persistentI TLOGI(WmsLogTag::WMS_IMMS, "win %{public}d layout finished %{public}d", persistentId, isLastFrameLayoutFinished); if (isLastFrameLayoutFinished) { - AvoidArea avoidArea = sceneSession->GetAvoidAreaByType(AvoidAreaType::TYPE_NAVIGATION_INDICATOR); - if (!CheckAvoidAreaForAINavigationBar(isAINavigationBarVisible_, avoidArea, - sceneSession->GetSessionRect().height_)) { - return; - } - TLOGI(WmsLogTag::WMS_IMMS, "win %{public}d AI bar avoid area %{public}s", - persistentId, avoidArea.ToString().c_str()); - UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, - AvoidAreaType::TYPE_NAVIGATION_INDICATOR); + sceneSession->UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); + sceneSession->NotifyClientToUpdateRect("AvoidAreaChange", nullptr); } else { sceneSession->MarkAvoidAreaAsDirty(); } diff --git a/window_scene/test/mock/mock_session_stage.h b/window_scene/test/mock/mock_session_stage.h index c993a5d082..ada03febc1 100644 --- a/window_scene/test/mock/mock_session_stage.h +++ b/window_scene/test/mock/mock_session_stage.h @@ -27,8 +27,8 @@ public: ~SessionStageMocker() {}; MOCK_METHOD1(SetActive, WSError(bool active)); - MOCK_METHOD3(UpdateRect, WSError(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config)); + MOCK_METHOD4(UpdateRect, WSError(const WSRect& rect, SizeChangeReason reason, + const SceneAnimationConfig& config, const std::map& avoidAreas)); MOCK_METHOD0(UpdateDensity, void(void)); MOCK_METHOD0(UpdateOrientation, WSError(void)); MOCK_METHOD1(UpdateSessionViewportConfig, WSError(const SessionViewportConfig& config)); diff --git a/window_scene/test/unittest/scene_session_manager_test10.cpp b/window_scene/test/unittest/scene_session_manager_test10.cpp index af3deeb717..c20bd01a3f 100644 --- a/window_scene/test/unittest/scene_session_manager_test10.cpp +++ b/window_scene/test/unittest/scene_session_manager_test10.cpp @@ -992,31 +992,6 @@ HWTEST_F(SceneSessionManagerTest10, TestIsNeedSkipWindowModeTypeCheck_04, Functi ASSERT_FALSE(ret); } -/** - * @tc.name: UpdateAvoidAreaByType - * @tc.desc: test UpdateAvoidAreaByType - * @tc.type: FUNC - */ -HWTEST_F(SceneSessionManagerTest10, UpdateAvoidAreaByType, Function | SmallTest | Level3) -{ - SessionInfo info; - info.abilityName_ = "test"; - info.bundleName_ = "test"; - sptr sceneSession = sptr::MakeSptr(info, nullptr); - ASSERT_NE(nullptr, sceneSession); - - ssm_->sceneSessionMap_.insert({sceneSession->GetPersistentId(), sceneSession}); - sceneSession->isVisible_ = true; - sceneSession->state_ = SessionState::STATE_ACTIVE; - ssm_->UpdateAvoidAreaByType(sceneSession->GetPersistentId(), AvoidAreaType::TYPE_NAVIGATION_INDICATOR); - EXPECT_EQ(ssm_->lastUpdatedAvoidArea_.find(sceneSession->GetPersistentId()), ssm_->lastUpdatedAvoidArea_.end()); - ssm_->avoidAreaListenerSessionSet_.insert(sceneSession->GetPersistentId()); - ssm_->UpdateAvoidAreaByType(sceneSession->GetPersistentId(), AvoidAreaType::TYPE_NAVIGATION_INDICATOR); - EXPECT_EQ(ssm_->lastUpdatedAvoidArea_.find(sceneSession->GetPersistentId()), ssm_->lastUpdatedAvoidArea_.end()); - ssm_->avoidAreaListenerSessionSet_.erase(sceneSession->GetPersistentId()); - ssm_->sceneSessionMap_.erase(sceneSession->GetPersistentId()); -} - /** * @tc.name: NotifyStatusBarShowStatus * @tc.desc: test NotifyStatusBarShowStatus diff --git a/window_scene/test/unittest/scene_session_manager_test6.cpp b/window_scene/test/unittest/scene_session_manager_test6.cpp index a1c8b144ba..e1c1e3a127 100644 --- a/window_scene/test/unittest/scene_session_manager_test6.cpp +++ b/window_scene/test/unittest/scene_session_manager_test6.cpp @@ -1826,69 +1826,6 @@ HWTEST_F(SceneSessionManagerTest6, OnDisplayStateChange, Function | SmallTest | listener.OnDisplayStateChange(displayId, displayInfo, displayInfoMap, type); } -/** - * @tc.name: UpdateSessionAvoidAreaIfNeed - * @tc.desc: UpdateSessionAvoidAreaIfNeed - * @tc.type: FUNC - */ -HWTEST_F(SceneSessionManagerTest6, UpdateSessionAvoidAreaIfNeed, Function | SmallTest | Level3) -{ - int32_t persistentId = 0; - sptr sceneSession = nullptr; - AvoidArea avoidArea; - AvoidAreaType avoidAreaType = AvoidAreaType::TYPE_KEYBOARD; - ASSERT_NE(nullptr, ssm_); - ssm_->enterRecent_ = false; - auto ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, false); - ssm_->enterRecent_ = true; - ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, false); - SessionInfo sessionInfo; - sessionInfo.bundleName_ = "SceneSessionManagerTest6"; - sessionInfo.abilityName_ = "UpdateSessionAvoidAreaIfNeed"; - sceneSession = sptr::MakeSptr(sessionInfo, nullptr); - ASSERT_NE(nullptr, sceneSession); - ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, false); - ssm_->enterRecent_ = false; - ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, false); - ssm_->lastUpdatedAvoidArea_.clear(); - ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, false); -} - -/** - * @tc.name: UpdateSessionAvoidAreaIfNeed01 - * @tc.desc: UpdateSessionAvoidAreaIfNeed - * @tc.type: FUNC - */ -HWTEST_F(SceneSessionManagerTest6, UpdateSessionAvoidAreaIfNeed01, Function | SmallTest | Level3) -{ - int32_t persistentId = 0; - AvoidArea avoidArea; - AvoidAreaType avoidAreaType = AvoidAreaType::TYPE_KEYBOARD; - SessionInfo sessionInfo; - sessionInfo.bundleName_ = "SceneSessionManagerTest6"; - sessionInfo.abilityName_ = "UpdateSessionAvoidAreaIfNeed"; - sptr sceneSession = sptr::MakeSptr(sessionInfo, nullptr); - ASSERT_NE(nullptr, sceneSession); - ASSERT_NE(nullptr, ssm_); - ssm_->enterRecent_ = false; - std::map mapAvoidAreaType; - mapAvoidAreaType.insert(std::make_pair(avoidAreaType, avoidArea)); - ssm_->lastUpdatedAvoidArea_.insert(std::make_pair(persistentId, mapAvoidAreaType)); - auto ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, false); - avoidAreaType = AvoidAreaType::TYPE_SYSTEM; - ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, false); - avoidArea.topRect_.posX_ = 1; - ret = ssm_->UpdateSessionAvoidAreaIfNeed(persistentId, sceneSession, avoidArea, avoidAreaType); - EXPECT_EQ(ret, true); -} - /** * @tc.name: CheckIfReuseSession * @tc.desc: CheckIfReuseSession diff --git a/window_scene/test/unittest/scene_session_test.cpp b/window_scene/test/unittest/scene_session_test.cpp index edce066f26..77aa4a5b6c 100644 --- a/window_scene/test/unittest/scene_session_test.cpp +++ b/window_scene/test/unittest/scene_session_test.cpp @@ -1934,9 +1934,6 @@ HWTEST_F(SceneSessionTest, SetIsStatusBarVisibleInner01, Function | SmallTest | isLayoutFinished = true; return WSError::WS_OK; }; - sceneSession->specificCallback_->onUpdateAvoidAreaByType_ = [](int32_t persistentId, AvoidAreaType type) {}; - EXPECT_EQ(sceneSession->SetIsStatusBarVisibleInner(true), WSError::WS_OK); - sceneSession->specificCallback_ = nullptr; EXPECT_EQ(sceneSession->SetIsStatusBarVisibleInner(false), WSError::WS_OK); } diff --git a/wm/include/window_extension_session_impl.h b/wm/include/window_extension_session_impl.h index 59ecc7439a..9ce84c22ee 100644 --- a/wm/include/window_extension_session_impl.h +++ b/wm/include/window_extension_session_impl.h @@ -67,7 +67,8 @@ public: BackupAndRestoreType type, sptr token, AppExecFwk::Ability* ability) override; void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override {} WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }) override; + const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, + const std::map& avoidAreas = {}) override; WMError GetAvoidAreaByType(AvoidAreaType type, AvoidArea& avoidArea, const Rect& rect = Rect::EMPTY_RECT) override; WSError NotifyAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType, int32_t eventType, @@ -145,8 +146,10 @@ private: void CheckAndRemoveExtWindowFlags(); WMError UpdateExtWindowFlags(const ExtensionWindowFlags& flags, const ExtensionWindowFlags& actions); void UpdateRectForRotation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, - const std::shared_ptr& rsTransaction = nullptr); - void UpdateRectForOtherReason(const Rect &wmRect, WindowSizeChangeReason wmReason); + const std::shared_ptr& rsTransaction = nullptr, + const std::map& avoidAreas = {}); + void UpdateRectForOtherReason(const Rect &wmRect, WindowSizeChangeReason wmReason, + const std::map& avoidAreas = {}); WMError GetSystemViewportConfig(SessionViewportConfig& config); void UpdateSystemViewportConfig(); void UpdateExtensionDensity(SessionViewportConfig& config); diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index 92f16b1979..35ae40d127 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -152,7 +152,8 @@ public: */ WSError SetActive(bool active) override; WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }) override; + const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, + const std::map& avoidAreas = {}) override; void UpdateDensity() override; void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override; WSError UpdateOrientation() override; @@ -484,6 +485,7 @@ protected: /* * Window Immersive */ + std::map lastAvoidAreaMap_; uint32_t GetStatusBarHeight() override; /* @@ -567,13 +569,16 @@ private: bool CheckIfNeedCommitRsTransaction(WindowSizeChangeReason wmReason); void UpdateRectForRotation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, - const SceneAnimationConfig& config); + const SceneAnimationConfig& config, const std::map& avoidAreas = {}); void UpdateRectForOtherReason(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, - const std::shared_ptr& rsTransaction = nullptr); + const std::shared_ptr& rsTransaction = nullptr, + const std::map& avoidAreas = {}); void UpdateRectForOtherReasonTask(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, - const std::shared_ptr& rsTransaction); + const std::shared_ptr& rsTransaction, + const std::map& avoidAreas); void UpdateRectForResizeWithAnimation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, - const RectAnimationConfig& rectAnimationConfig, const std::shared_ptr& rsTransaction = nullptr); + const RectAnimationConfig& rectAnimationConfig, const std::shared_ptr& rsTransaction = nullptr, + const std::map& avoidAreas = {}); void NotifyRotationAnimationEnd(); void SubmitNoInteractionMonitorTask(int32_t eventId, const IWindowNoInteractionListenerSptr& listener); bool IsUserOrientation(Orientation orientation) const; diff --git a/wm/src/window_extension_session_impl.cpp b/wm/src/window_extension_session_impl.cpp index f9b6945304..87dd2a4fe0 100644 --- a/wm/src/window_extension_session_impl.cpp +++ b/wm/src/window_extension_session_impl.cpp @@ -603,7 +603,7 @@ WMError WindowExtensionSessionImpl::SetUIContentInner(const std::string& content } WSError WindowExtensionSessionImpl::UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config) + const SceneAnimationConfig& config, const std::map& avoidAreas) { auto wmReason = static_cast(reason); Rect wmRect = {rect.posX_, rect.posY_, rect.width_, rect.height_}; @@ -627,23 +627,24 @@ WSError WindowExtensionSessionImpl::UpdateRect(const WSRect& rect, SizeChangeRea if (wmReason == WindowSizeChangeReason::ROTATION) { const std::shared_ptr& rsTransaction = config.rsTransaction_; - UpdateRectForRotation(wmRect, preRect, wmReason, rsTransaction); + UpdateRectForRotation(wmRect, preRect, wmReason, rsTransaction, avoidAreas); } else if (handler_ != nullptr) { - UpdateRectForOtherReason(wmRect, wmReason); + UpdateRectForOtherReason(wmRect, wmReason, avoidAreas); } else { NotifySizeChange(wmRect, wmReason); - UpdateViewportConfig(wmRect, wmReason); + UpdateViewportConfig(wmRect, wmReason, nullptr, nullptr, avoidAreas); } return WSError::WS_OK; } void WindowExtensionSessionImpl::UpdateRectForRotation(const Rect& wmRect, const Rect& preRect, - WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction) + WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction, + const std::map& avoidAreas) { if (!handler_) { return; } - auto task = [weak = wptr(this), wmReason, wmRect, preRect, rsTransaction]() mutable { + auto task = [weak = wptr(this), wmReason, wmRect, preRect, rsTransaction, avoidAreas]() mutable { HITRACE_METER_NAME(HITRACE_TAG_WINDOW_MANAGER, "WindowExtensionSessionImpl::UpdateRectForRotation"); auto window = weak.promote(); if (!window) { @@ -672,7 +673,7 @@ void WindowExtensionSessionImpl::UpdateRectForRotation(const Rect& wmRect, const if (wmRect != preRect) { window->NotifySizeChange(wmRect, wmReason); } - window->UpdateViewportConfig(wmRect, wmReason, rsTransaction); + window->UpdateViewportConfig(wmRect, wmReason, rsTransaction, nullptr, avoidAreas); RSNode::CloseImplicitAnimation(); if (needSync) { rsTransaction->Commit(); @@ -683,16 +684,17 @@ void WindowExtensionSessionImpl::UpdateRectForRotation(const Rect& wmRect, const handler_->PostTask(task, "WMS_WindowExtensionSessionImpl_UpdateRectForRotation"); } -void WindowExtensionSessionImpl::UpdateRectForOtherReason(const Rect& wmRect, WindowSizeChangeReason wmReason) +void WindowExtensionSessionImpl::UpdateRectForOtherReason(const Rect& wmRect, WindowSizeChangeReason wmReason, + const std::map& avoidAreas) { - auto task = [weak = wptr(this), wmReason, wmRect] { + auto task = [weak = wptr(this), wmReason, wmRect, avoidAreas] { auto window = weak.promote(); if (!window) { TLOGE(WmsLogTag::WMS_LAYOUT, "window is null, updateViewPortConfig failed"); return; } window->NotifySizeChange(wmRect, wmReason); - window->UpdateViewportConfig(wmRect, wmReason); + window->UpdateViewportConfig(wmRect, wmReason, nullptr, nullptr, avoidAreas); }; if (handler_) { handler_->PostTask(task, "WMS_WindowExtensionSessionImpl_UpdateRectForOtherReason"); @@ -842,7 +844,7 @@ WSError WindowExtensionSessionImpl::UpdateSessionViewportConfigInner(const Sessi TLOGW(WmsLogTag::WMS_UIEXT, "uiContent is null!"); return WSError::WS_ERROR_NULLPTR; } - uiContent->UpdateViewportConfig(viewportConfig, WindowSizeChangeReason::UNDEFINED, nullptr); + uiContent->UpdateViewportConfig(viewportConfig, WindowSizeChangeReason::UNDEFINED, nullptr, lastAvoidAreaMap_); return WSError::WS_OK; } diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index 92642d0cc0..e954dbf2da 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -701,7 +701,7 @@ WSError WindowSessionImpl::SetActive(bool active) /** @note @window.layout */ WSError WindowSessionImpl::UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config) + const SceneAnimationConfig& config, const std::map& avoidAreas) { // delete after replace ws_common.h with wm_common.h auto wmReason = static_cast(reason); @@ -722,14 +722,15 @@ WSError WindowSessionImpl::UpdateRect(const WSRect& rect, SizeChangeReason reaso wmRect.posX_, wmRect.posY_, wmRect.width_, wmRect.height_, wmReason, config.rsTransaction_ != nullptr); if (handler_ != nullptr && wmReason == WindowSizeChangeReason::ROTATION) { postTaskDone_ = false; - UpdateRectForRotation(wmRect, preRect, wmReason, config); + UpdateRectForRotation(wmRect, preRect, wmReason, config, avoidAreas); } else if (handler_ != nullptr && wmReason == WindowSizeChangeReason::RESIZE_WITH_ANIMATION) { RectAnimationConfig rectAnimationConfig = property_->GetRectAnimationConfig(); TLOGI(WmsLogTag::WMS_LAYOUT, "rectAnimationConfig.duration: %{public}d", rectAnimationConfig.duration); postTaskDone_ = false; - UpdateRectForResizeWithAnimation(wmRect, preRect, wmReason, rectAnimationConfig, config.rsTransaction_); + UpdateRectForResizeWithAnimation(wmRect, preRect, wmReason, rectAnimationConfig, + config.rsTransaction_, avoidAreas); } else { - UpdateRectForOtherReason(wmRect, preRect, wmReason, config.rsTransaction_); + UpdateRectForOtherReason(wmRect, preRect, wmReason, config.rsTransaction_, avoidAreas); } if (wmReason == WindowSizeChangeReason::MOVE || wmReason == WindowSizeChangeReason::RESIZE || @@ -758,9 +759,10 @@ void WindowSessionImpl::UpdateVirtualPixelRatio(const sptr& display) } void WindowSessionImpl::UpdateRectForRotation(const Rect& wmRect, const Rect& preRect, - WindowSizeChangeReason wmReason, const SceneAnimationConfig& config) + WindowSizeChangeReason wmReason, const SceneAnimationConfig& config, + const std::map& avoidAreas) { - handler_->PostImmediateTask([weak = wptr(this), wmReason, wmRect, preRect, config]() mutable { + handler_->PostImmediateTask([weak = wptr(this), wmReason, wmRect, preRect, config, avoidAreas]() mutable { HITRACE_METER_NAME(HITRACE_TAG_WINDOW_MANAGER, "WindowSessionImpl::UpdateRectForRotation"); auto window = weak.promote(); if (!window) { @@ -793,7 +795,7 @@ void WindowSessionImpl::UpdateRectForRotation(const Rect& wmRect, const Rect& pr window->NotifySizeChange(wmRect, wmReason); window->lastSizeChangeReason_ = wmReason; } - window->UpdateViewportConfig(wmRect, wmReason, rsTransaction, displayInfo); + window->UpdateViewportConfig(wmRect, wmReason, rsTransaction, displayInfo, avoidAreas); RSNode::CloseImplicitAnimation(); if (rsTransaction) { rsTransaction->Commit(); @@ -805,14 +807,15 @@ void WindowSessionImpl::UpdateRectForRotation(const Rect& wmRect, const Rect& pr } void WindowSessionImpl::UpdateRectForOtherReasonTask(const Rect& wmRect, const Rect& preRect, - WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction) + WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction, + const std::map& avoidAreas) { if ((wmRect != preRect) || (wmReason != lastSizeChangeReason_) || !postTaskDone_) { NotifySizeChange(wmRect, wmReason); lastSizeChangeReason_ = wmReason; postTaskDone_ = true; } - UpdateViewportConfig(wmRect, wmReason, rsTransaction); + UpdateViewportConfig(wmRect, wmReason, rsTransaction, nullptr, avoidAreas); UpdateFrameLayoutCallbackIfNeeded(wmReason); } @@ -827,14 +830,15 @@ bool WindowSessionImpl::CheckIfNeedCommitRsTransaction(WindowSizeChangeReason wm } void WindowSessionImpl::UpdateRectForOtherReason(const Rect& wmRect, const Rect& preRect, - WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction) + WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction, + const std::map& avoidAreas) { if (handler_ == nullptr) { - UpdateRectForOtherReasonTask(wmRect, preRect, wmReason, rsTransaction); + UpdateRectForOtherReasonTask(wmRect, preRect, wmReason, rsTransaction, avoidAreas); return; } - auto task = [weak = wptr(this), wmReason, wmRect, preRect, rsTransaction] { + auto task = [weak = wptr(this), wmReason, wmRect, preRect, rsTransaction, avoidAreas] { auto window = weak.promote(); if (!window) { TLOGE(WmsLogTag::WMS_LAYOUT, "window is null, updateViewPortConfig failed"); @@ -846,10 +850,10 @@ void WindowSessionImpl::UpdateRectForOtherReason(const Rect& wmRect, const Rect& rsTransaction->Begin(); } if (wmReason == WindowSizeChangeReason::DRAG) { - window->UpdateRectForOtherReasonTask(window->GetRect(), preRect, wmReason, rsTransaction); + window->UpdateRectForOtherReasonTask(window->GetRect(), preRect, wmReason, rsTransaction, avoidAreas); window->isDragTaskPostDone_.store(true); } else { - window->UpdateRectForOtherReasonTask(wmRect, preRect, wmReason, rsTransaction); + window->UpdateRectForOtherReasonTask(wmRect, preRect, wmReason, rsTransaction, avoidAreas); } if (rsTransaction && ifNeedCommitRsTransaction) { rsTransaction->Commit(); @@ -867,13 +871,15 @@ void WindowSessionImpl::UpdateRectForOtherReason(const Rect& wmRect, const Rect& void WindowSessionImpl::UpdateRectForResizeWithAnimation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, const RectAnimationConfig& rectAnimationConfig, - const std::shared_ptr& rsTransaction) + const std::shared_ptr& rsTransaction, + const std::map& avoidAreas) { if (handler_ == nullptr) { TLOGE(WmsLogTag::WMS_LAYOUT, "handler is null!"); return; } - auto task = [weakThis = wptr(this), wmReason, wmRect, preRect, rectAnimationConfig, rsTransaction]() mutable { + auto task = [weakThis = wptr(this), wmReason, wmRect, preRect, rectAnimationConfig, + rsTransaction, avoidAreas]() mutable { HITRACE_METER_NAME(HITRACE_TAG_WINDOW_MANAGER, "WindowSessionImpl::UpdateRectForResizeWithAnimation"); auto window = weakThis.promote(); if (!window) { @@ -893,7 +899,7 @@ void WindowSessionImpl::UpdateRectForResizeWithAnimation(const Rect& wmRect, con window->NotifySizeChange(wmRect, wmReason); window->lastSizeChangeReason_ = wmReason; } - window->UpdateViewportConfig(wmRect, wmReason, rsTransaction); + window->UpdateViewportConfig(wmRect, wmReason, rsTransaction, nullptr, avoidAreas); RSNode::CloseImplicitAnimation(); if (rsTransaction) { rsTransaction->Commit(); @@ -1232,19 +1238,15 @@ void WindowSessionImpl::UpdateViewportConfig(const Rect& rect, WindowSizeChangeR WLOGFW("uiContent is null!"); return; } - std::map avoidAreasToUpdate; - if (reason == WindowSizeChangeReason::ROTATION) { - if (auto hostSession = GetHostSession()) { - hostSession->GetAllAvoidAreas(avoidAreasToUpdate); - } - } else { - avoidAreasToUpdate = avoidAreas; - } - for (const auto& [type, avoidArea] : avoidAreasToUpdate) { + for (const auto& [type, avoidArea] : avoidAreas) { TLOGD(WmsLogTag::WMS_IMMS, "avoid type %{public}u area %{public}s", type, avoidArea.ToString().c_str()); + if (lastAvoidAreaMap_[type] != avoidArea) { + lastAvoidAreaMap_[type] = avoidArea; + NotifyAvoidAreaChange(new AvoidArea(avoidArea), type); + } } - uiContent->UpdateViewportConfig(config, reason, rsTransaction, avoidAreasToUpdate); + uiContent->UpdateViewportConfig(config, reason, rsTransaction, lastAvoidAreaMap_); if (WindowHelper::IsUIExtensionWindow(GetType())) { TLOGD(WmsLogTag::WMS_LAYOUT, "Id: %{public}d, reason: %{public}d, windowRect: %{public}s, " @@ -3457,8 +3459,11 @@ WSErrorCode WindowSessionImpl::NotifyTransferComponentDataSync(const AAFwk::Want WSError WindowSessionImpl::UpdateAvoidArea(const sptr& avoidArea, AvoidAreaType type) { - UpdateViewportConfig(GetRect(), WindowSizeChangeReason::UNDEFINED, nullptr, nullptr, {{type, *avoidArea}}); - NotifyAvoidAreaChange(avoidArea, type); + if (lastAvoidAreaMap_[type] != *avoidArea) { + lastAvoidAreaMap_[type] = *avoidArea; + NotifyAvoidAreaChange(new AvoidArea(avoidArea), type); + UpdateViewportConfig(GetRect(), WindowSizeChangeReason::UNDEFINED); + } return WSError::WS_OK; } -- Gitee From 7b990f7d6c95ae52058e9e0c09f23f86952f003d Mon Sep 17 00:00:00 2001 From: ReCoder Date: Mon, 13 Jan 2025 15:26:20 +0800 Subject: [PATCH 02/12] fix: tdd Signed-off-by: ReCoder --- .../session/container/src/zidl/session_stage_proxy.cpp | 6 +++--- window_scene/test/unittest/session_layout_test.cpp | 2 +- wm/src/window_session_impl.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/window_scene/session/container/src/zidl/session_stage_proxy.cpp b/window_scene/session/container/src/zidl/session_stage_proxy.cpp index f38f107152..707a98418d 100644 --- a/window_scene/session/container/src/zidl/session_stage_proxy.cpp +++ b/window_scene/session/container/src/zidl/session_stage_proxy.cpp @@ -215,16 +215,16 @@ WSError SessionStageProxy::UpdateRect(const WSRect& rect, SizeChangeReason reaso } if (!data.WriteUint32(avoidAreas.size())) { - TLOGE(WmsLogTag::DEFAULT, "Write avoid area size failed"); + TLOGE(WmsLogTag::WMS_IMMS, "Write avoid area size failed"); return WSError::WS_ERROR_IPC_FAILED; } for (const auto& [type, avoidArea] : avoidAreas) { if (!data.WriteUint32(static_cast(type))) { - TLOGE(WmsLogTag::DEFAULT, "Write avoid area type failed"); + TLOGE(WmsLogTag::WMS_IMMS, "Write avoid area type failed"); return WSError::WS_ERROR_IPC_FAILED; } if (!data.WriteParcelable(&avoidArea)) { - TLOGE(WmsLogTag::DEFAULT, "Write avoid area failed"); + TLOGE(WmsLogTag::WMS_IMMS, "Write avoid area failed"); return WSError::WS_ERROR_IPC_FAILED; } } diff --git a/window_scene/test/unittest/session_layout_test.cpp b/window_scene/test/unittest/session_layout_test.cpp index 942c8866c8..3ed270ad12 100644 --- a/window_scene/test/unittest/session_layout_test.cpp +++ b/window_scene/test/unittest/session_layout_test.cpp @@ -142,7 +142,7 @@ HWTEST_F(SessionLayoutTest, UpdateRect01, Function | SmallTest | Level2) { sptr mockSessionStage = sptr::MakeSptr(); session_->sessionStage_ = mockSessionStage; - EXPECT_CALL(*(mockSessionStage), UpdateRect(_, _, _)).Times(AtLeast(1)).WillOnce(Return(WSError::WS_OK)); + EXPECT_CALL(*(mockSessionStage), UpdateRect(_, _, _, _)).Times(AtLeast(1)).WillOnce(Return(WSError::WS_OK)); WSRect rect = {0, 0, 0, 0}; ASSERT_EQ(WSError::WS_ERROR_INVALID_SESSION, session_->UpdateRect(rect, diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index e954dbf2da..5bb3098393 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -3461,7 +3461,7 @@ WSError WindowSessionImpl::UpdateAvoidArea(const sptr& avoidArea, Avo { if (lastAvoidAreaMap_[type] != *avoidArea) { lastAvoidAreaMap_[type] = *avoidArea; - NotifyAvoidAreaChange(new AvoidArea(avoidArea), type); + NotifyAvoidAreaChange(avoidArea, type); UpdateViewportConfig(GetRect(), WindowSizeChangeReason::UNDEFINED); } return WSError::WS_OK; -- Gitee From b1e1666372703c660a10fafd4a01b9a7d5d27715 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Mon, 13 Jan 2025 15:57:28 +0800 Subject: [PATCH 03/12] fix: tdd Signed-off-by: ReCoder --- window_scene/test/unittest/scene_session_manager_test4.cpp | 5 ++--- window_scene/test/unittest/session_test.cpp | 2 +- wm/include/window_session_impl.h | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/window_scene/test/unittest/scene_session_manager_test4.cpp b/window_scene/test/unittest/scene_session_manager_test4.cpp index a050d33e30..b69fd1181f 100644 --- a/window_scene/test/unittest/scene_session_manager_test4.cpp +++ b/window_scene/test/unittest/scene_session_manager_test4.cpp @@ -840,13 +840,12 @@ HWTEST_F(SceneSessionManagerTest4, UpdateAvoidSessionAvoidArea, Function | Small ASSERT_NE(sceneSession, nullptr); ssm_->sceneSessionMap_.insert(std::make_pair(1, sceneSession)); WindowType type = WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT; - bool needUpdate = true; - ssm_->UpdateAvoidSessionAvoidArea(type, needUpdate); + ssm_->UpdateAvoidSessionAvoidArea(type); ASSERT_NE(sceneSession->property_, nullptr); sceneSession->property_->type_ = WindowType::APP_MAIN_WINDOW_END; sceneSession->isVisible_ = true; - ssm_->UpdateAvoidSessionAvoidArea(type, needUpdate); + ssm_->UpdateAvoidSessionAvoidArea(type); EXPECT_EQ(WSError::WS_ERROR_INVALID_SESSION, ssm_->HandleSecureSessionShouldHide(nullptr)); } diff --git a/window_scene/test/unittest/session_test.cpp b/window_scene/test/unittest/session_test.cpp index 46c52453d2..fdff5b9ebd 100644 --- a/window_scene/test/unittest/session_test.cpp +++ b/window_scene/test/unittest/session_test.cpp @@ -163,7 +163,7 @@ HWTEST_F(WindowSessionTest, SetActive01, Function | SmallTest | Level2) sptr mockSessionStage = sptr::MakeSptr(); EXPECT_NE(nullptr, mockSessionStage); EXPECT_CALL(*(mockSessionStage), SetActive(_)).WillOnce(Return(WSError::WS_OK)); - EXPECT_CALL(*(mockSessionStage), UpdateRect(_, _, _)).Times(0).WillOnce(Return(WSError::WS_OK)); + EXPECT_CALL(*(mockSessionStage), UpdateRect(_, _, _, _)).Times(0).WillOnce(Return(WSError::WS_OK)); session_->sessionStage_ = mockSessionStage; ASSERT_EQ(WSError::WS_ERROR_INVALID_SESSION, session_->SetActive(true)); diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index 35ae40d127..8cc057b607 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -575,7 +575,7 @@ private: const std::map& avoidAreas = {}); void UpdateRectForOtherReasonTask(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction, - const std::map& avoidAreas); + const std::map& avoidAreas = {}); void UpdateRectForResizeWithAnimation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, const RectAnimationConfig& rectAnimationConfig, const std::shared_ptr& rsTransaction = nullptr, const std::map& avoidAreas = {}); -- Gitee From b8e2556f3794a1b283b754edfd3c604cc17961c4 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Wed, 15 Jan 2025 11:08:34 +0800 Subject: [PATCH 04/12] fix: ai bar avoid area Signed-off-by: ReCoder --- .../session/host/include/scene_session.h | 3 +- .../session/host/src/scene_session.cpp | 12 ++++++- .../src/scene_session_manager.cpp | 31 ++++++++++--------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index 94e20ef94d..5880d41c03 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -47,7 +47,7 @@ using GetSceneSessionVectorByTypeAndDisplayIdCallback = std::function; using GetSceneSessionVectorByTypeCallback = std::function>(WindowType type)>; using UpdateAvoidAreaCallback = std::function; -using UpdateAvoidAreaByTypeCallback = std::function; +using GetIsAINavigationBarAvoidAreaValidFunc = std::function; using UpdateOccupiedAreaIfNeedCallback = std::function; using NotifyWindowInfoUpdateCallback = std::function; using NotifyWindowPidChangeCallback = std::function; @@ -125,6 +125,7 @@ public: GetSceneSessionVectorByTypeAndDisplayIdCallback onGetSceneSessionVectorByTypeAndDisplayId_; GetSceneSessionVectorByTypeCallback onGetSceneSessionVectorByType_; UpdateAvoidAreaCallback onUpdateAvoidArea_; + GetIsAINavigationBarAvoidAreaValidFunc onGetIsAINavigationBarAvoidAreaValid_; GetStatusBarDefaultVisibilityByDisplayIdFunc onGetStatusBarDefaultVisibilityByDisplayId_; UpdateOccupiedAreaIfNeedCallback onUpdateOccupiedAreaIfNeed_; NotifyWindowInfoUpdateCallback onWindowInfoUpdate_; diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 301aa15c38..04be8b72e5 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -2157,7 +2157,17 @@ WSError SceneSession::GetAllAvoidAreas(std::map& avoid for (T avoidType = static_cast(AvoidAreaType::TYPE_START); avoidType < static_cast(AvoidAreaType::TYPE_END); avoidType++) { auto type = static_cast(avoidType); - avoidAreas[type] = session->GetAvoidAreaByTypeInner(type); + auto area = session->GetAvoidAreaByTypeInner(type); + // code below aims to check if ai bar avoid area reaches window rect's bottom + // it should not be removed until unexpected window rect update issues were solved + if (type == AvoidAreaType::TYPE_NAVIGATION_INDICATOR) { + if (session->specificCallback_ && session->specificCallback_->onGetIsAINavigationBarAvoidAreaValid_ && + !(session->specificCallback_->onGetIsAINavigationBarAvoidAreaValid_( + area, session->GetSessionRect().height_))) { + continue; + } + } + avoidAreas[type] = area; } return WSError::WS_OK; }, __func__); diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index c5e02e065b..3debf04859 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -277,6 +277,20 @@ public: SceneSessionManager::GetInstance().OnBundleUpdated(bundleName, userId); } }; + +static bool CheckAvoidAreaForAINavigationBar(bool isVisible, const AvoidArea& avoidArea, int32_t sessionBottom) +{ + if (!avoidArea.topRect_.IsUninitializedRect() || !avoidArea.leftRect_.IsUninitializedRect() || + !avoidArea.rightRect_.IsUninitializedRect()) { + return false; + } + if (avoidArea.bottomRect_.IsUninitializedRect()) { + return true; + } + auto diff = + std::abs(avoidArea.bottomRect_.posY_ + static_cast(avoidArea.bottomRect_.height_) - sessionBottom); + return isVisible && diff <= 1; +} } // namespace sptr SceneSessionManager::CreateInstance() @@ -1267,6 +1281,9 @@ void SceneSessionManager::CreateRootSceneSession() specificCb->onUpdateAvoidArea_ = [this](int32_t persistentId) { this->UpdateAvoidArea(persistentId); }; + specificCb->onGetIsAINavigationBarAvoidAreaValid_ = [this](const AvoidArea& avoidArea, int32_t sessionBottom) { + return CheckAvoidAreaForAINavigationBar(isAINavigationBarVisible_, avoidArea, sessionBottom); + }; specificCb->onNotifyAvoidAreaChange_ = [this](const sptr& avoidArea, AvoidAreaType type) { onNotifyAvoidAreaChangeForRootFunc_(avoidArea, type); }; @@ -8781,20 +8798,6 @@ void SceneSessionManager::UpdateAvoidSessionAvoidArea(WindowType type) } } -static bool CheckAvoidAreaForAINavigationBar(bool isVisible, const AvoidArea& avoidArea, int32_t sessionBottom) -{ - if (!avoidArea.topRect_.IsUninitializedRect() || !avoidArea.leftRect_.IsUninitializedRect() || - !avoidArea.rightRect_.IsUninitializedRect()) { - return false; - } - if (avoidArea.bottomRect_.IsUninitializedRect()) { - return true; - } - auto diff = - std::abs(avoidArea.bottomRect_.posY_ + static_cast(avoidArea.bottomRect_.height_) - sessionBottom); - return isVisible && diff <= 1; -} - void SceneSessionManager::UpdateNormalSessionAvoidArea( int32_t persistentId, const sptr& sceneSession, bool& needUpdate) { -- Gitee From 98cbfbc9f8a42d499631369883858b4b28227d18 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Wed, 15 Jan 2025 14:40:39 +0800 Subject: [PATCH 05/12] fix: avoid area update in recent Signed-off-by: ReCoder --- window_scene/session/host/src/scene_session.cpp | 10 +++++++++- .../session_manager/src/scene_session_manager.cpp | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 04be8b72e5..2c808d5206 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -1115,7 +1115,11 @@ WSError SceneSession::NotifyClientToUpdateRectTask(const std::string& updateReas GetPersistentId(), winRect_.posX_, winRect_.posY_, winRect_.width_, winRect_.height_, reason_); std::map avoidAreas; - GetAllAvoidAreas(avoidAreas); + if (GetForegroundInteractiveStatus()) { + GetAllAvoidAreas(avoidAreas); + } else { + TLOGD(WmsLogTag::WMS_IMMS, "avoid area update rejected by recent"); + } // once reason is undefined, not use rsTransaction // when rotation, sync cnt++ in marshalling. Although reason is undefined caused by resize if (reason_ == SizeChangeReason::UNDEFINED || reason_ == SizeChangeReason::RESIZE || IsMoveToOrDragMove(reason_)) { @@ -2178,6 +2182,10 @@ WSError SceneSession::UpdateAvoidArea(const sptr& avoidArea, AvoidAre if (!sessionStage_) { return WSError::WS_ERROR_NULLPTR; } + if (!GetForegroundInteractiveStatus()) { + TLOGD(WmsLogTag::WMS_IMMS, "avoid area update rejected by recent"); + return WSError::WS_DO_NOTHING; + } return sessionStage_->UpdateAvoidArea(avoidArea, type); } diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 3debf04859..0433abfd69 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -8785,16 +8785,16 @@ void SceneSessionManager::UpdateAvoidSessionAvoidArea(WindowType type) { AvoidAreaType avoidType = (type == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT) ? AvoidAreaType::TYPE_KEYBOARD : AvoidAreaType::TYPE_SYSTEM; - AvoidArea avoidArea = rootSceneSession_->GetAvoidAreaByType(static_cast(avoidType)); - rootSceneSession_->UpdateAvoidArea(new AvoidArea(avoidArea), static_cast(avoidType)); + AvoidArea avoidArea = rootSceneSession_->GetAvoidAreaByType(avoidType); + rootSceneSession_->UpdateAvoidArea(new AvoidArea(avoidArea), avoidType); std::shared_lock lock(sceneSessionMapMutex_); for (const auto& [_, sceneSession] : sceneSessionMap_) { if (sceneSession == nullptr || !IsSessionVisibleForeground(sceneSession)) { continue; } - sceneSession->UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); - sceneSession->NotifyClientToUpdateRect("AvoidAreaChange", nullptr); + AvoidArea avoidArea = sceneSession->GetAvoidAreaByType(avoidType); + sceneSession->UpdateAvoidArea(new AvoidArea(avoidArea), avoidType); } } -- Gitee From c6b42a4880c8338efe01960bc1f99f63c24a5077 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Sat, 18 Jan 2025 14:44:06 +0800 Subject: [PATCH 06/12] fix: comments Signed-off-by: ReCoder --- .../session/host/include/scene_session.h | 5 ++-- .../session/host/src/scene_session.cpp | 30 +++++++++++-------- .../src/scene_session_manager.cpp | 12 ++++---- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index 5880d41c03..4b4357672f 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -47,7 +47,6 @@ using GetSceneSessionVectorByTypeAndDisplayIdCallback = std::function; using GetSceneSessionVectorByTypeCallback = std::function>(WindowType type)>; using UpdateAvoidAreaCallback = std::function; -using GetIsAINavigationBarAvoidAreaValidFunc = std::function; using UpdateOccupiedAreaIfNeedCallback = std::function; using NotifyWindowInfoUpdateCallback = std::function; using NotifyWindowPidChangeCallback = std::function; @@ -98,6 +97,7 @@ using NotifyPrivacyModeChangeFunc = std::function; using UpdateGestureBackEnabledCallback = std::function; using NotifyVisibleChangeFunc = std::function; using IsLastFrameLayoutFinishedFunc = std::function; +using IsAINavigationBarAvoidAreaValidFunc = std::function; using GetStatusBarDefaultVisibilityByDisplayIdFunc = std::function; using NotifySetWindowRectAutoSaveFunc = std::function; using UpdateAppUseControlFunc = std::function; @@ -125,7 +125,6 @@ public: GetSceneSessionVectorByTypeAndDisplayIdCallback onGetSceneSessionVectorByTypeAndDisplayId_; GetSceneSessionVectorByTypeCallback onGetSceneSessionVectorByType_; UpdateAvoidAreaCallback onUpdateAvoidArea_; - GetIsAINavigationBarAvoidAreaValidFunc onGetIsAINavigationBarAvoidAreaValid_; GetStatusBarDefaultVisibilityByDisplayIdFunc onGetStatusBarDefaultVisibilityByDisplayId_; UpdateOccupiedAreaIfNeedCallback onUpdateOccupiedAreaIfNeed_; NotifyWindowInfoUpdateCallback onWindowInfoUpdate_; @@ -334,6 +333,7 @@ public: bool GetIsDisplayStatusBarTemporarily() const; void SetIsDisplayStatusBarTemporarily(bool isTemporary); void SetIsLastFrameLayoutFinishedFunc(IsLastFrameLayoutFinishedFunc&& func); + void SetIsAINavigationBarAvoidAreaValidFunc(IsAINavigationBarAvoidAreaValidFunc&& func); void RetrieveStatusBarDefaultVisibility(); void RegisterNeedAvoidCallback(NotifyNeedAvoidFunc&& callback); void RegisterSystemBarPropertyChangeCallback(NotifySystemBarPropertyChangeFunc&& callback); @@ -1000,6 +1000,7 @@ private: std::atomic_bool isDisplayStatusBarTemporarily_ { false }; bool isStatusBarVisible_ = true; IsLastFrameLayoutFinishedFunc isLastFrameLayoutFinishedFunc_; + IsAINavigationBarAvoidAreaValidFunc isAINavigationBarAvoidAreaValid_; /* * PC Window Layout diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 2c808d5206..5a59674cac 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -378,7 +378,7 @@ WSError SceneSession::ForegroundTask(const sptr& property } if (session->specificCallback_ != nullptr) { if (Session::IsScbCoreEnabled()) { - session->dirtyFlags_ |= static_cast(SessionUIDirtyFlag::AVOID_AREA); + session->MarkAvoidAreaAsDirty(); } else { session->specificCallback_->onUpdateAvoidArea_(persistentId); } @@ -468,7 +468,7 @@ WSError SceneSession::BackgroundTask(const bool isSaveSnapshot) } if (session->specificCallback_ != nullptr) { if (Session::IsScbCoreEnabled()) { - session->dirtyFlags_ |= static_cast(SessionUIDirtyFlag::AVOID_AREA); + session->MarkAvoidAreaAsDirty(); } else { session->specificCallback_->onUpdateAvoidArea_(session->GetPersistentId()); } @@ -1118,7 +1118,7 @@ WSError SceneSession::NotifyClientToUpdateRectTask(const std::string& updateReas if (GetForegroundInteractiveStatus()) { GetAllAvoidAreas(avoidAreas); } else { - TLOGD(WmsLogTag::WMS_IMMS, "avoid area update rejected by recent"); + TLOGD(WmsLogTag::WMS_IMMS, "win [%{public}d] avoid area update rejected by recent", GetPersistentId()); } // once reason is undefined, not use rsTransaction // when rotation, sync cnt++ in marshalling. Although reason is undefined caused by resize @@ -1685,10 +1685,9 @@ WSError SceneSession::SetIsStatusBarVisibleInner(bool isVisible) return ret; } if (isLayoutFinished) { - UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); - NotifyClientToUpdateRect("AvoidAreaChange", nullptr); + UpdateAvoidArea(new AvoidArea(GetAvoidAreaByType(AvoidAreaType::TYPE_SYSTEM)), AvoidAreaType::TYPE_SYSTEM); } else { - dirtyFlags_ |= static_cast(SessionUIDirtyFlag::AVOID_AREA); + MarkAvoidAreaAsDirty(); } return WSError::WS_OK; } @@ -2165,9 +2164,8 @@ WSError SceneSession::GetAllAvoidAreas(std::map& avoid // code below aims to check if ai bar avoid area reaches window rect's bottom // it should not be removed until unexpected window rect update issues were solved if (type == AvoidAreaType::TYPE_NAVIGATION_INDICATOR) { - if (session->specificCallback_ && session->specificCallback_->onGetIsAINavigationBarAvoidAreaValid_ && - !(session->specificCallback_->onGetIsAINavigationBarAvoidAreaValid_( - area, session->GetSessionRect().height_))) { + if (session->isAINavigationBarAvoidAreaValid_ && + !session->isAINavigationBarAvoidAreaValid_(area, session->GetSessionRect().height_)) { continue; } } @@ -2183,7 +2181,7 @@ WSError SceneSession::UpdateAvoidArea(const sptr& avoidArea, AvoidAre return WSError::WS_ERROR_NULLPTR; } if (!GetForegroundInteractiveStatus()) { - TLOGD(WmsLogTag::WMS_IMMS, "avoid area update rejected by recent"); + TLOGD(WmsLogTag::WMS_IMMS, "win [%{public}d] avoid area update rejected by recent", GetPersistentId()); return WSError::WS_DO_NOTHING; } return sessionStage_->UpdateAvoidArea(avoidArea, type); @@ -3202,7 +3200,7 @@ void SceneSession::SetFloatingScale(float floatingScale) if (specificCallback_ != nullptr) { specificCallback_->onWindowInfoUpdate_(GetPersistentId(), WindowUpdateType::WINDOW_UPDATE_PROPERTY); if (Session::IsScbCoreEnabled()) { - dirtyFlags_ |= static_cast(SessionUIDirtyFlag::AVOID_AREA); + MarkAvoidAreaAsDirty(); } else { specificCallback_->onUpdateAvoidArea_(GetPersistentId()); } @@ -3326,7 +3324,7 @@ void SceneSession::UpdateRotationAvoidArea() { if (specificCallback_) { if (Session::IsScbCoreEnabled()) { - dirtyFlags_ |= static_cast(SessionUIDirtyFlag::AVOID_AREA); + MarkAvoidAreaAsDirty(); } else { specificCallback_->onUpdateAvoidArea_(GetPersistentId()); } @@ -5480,6 +5478,11 @@ void SceneSession::SetIsLastFrameLayoutFinishedFunc(IsLastFrameLayoutFinishedFun isLastFrameLayoutFinishedFunc_ = std::move(func); } +void SceneSession::SetIsAINavigationBarAvoidAreaValidFunc(IsAINavigationBarAvoidAreaValidFunc&& func) +{ + isAINavigationBarAvoidAreaValid_ = std::move(func); +} + void SceneSession::SetStartingWindowExitAnimationFlag(bool enable) { TLOGI(WmsLogTag::WMS_PATTERN, "SetStartingWindowExitAnimationFlag %{public}d", enable); @@ -5909,7 +5912,8 @@ void SceneSession::NotifyClientToUpdateAvoidArea() if (specificCallback_ == nullptr) { return; } - if (specificCallback_->onUpdateAvoidArea_) { + // flush avoid areas on (avoid area dirty & rect NOT dirty) + if (!IsDirtyWindow() && specificCallback_->onUpdateAvoidArea_) { specificCallback_->onUpdateAvoidArea_(GetPersistentId()); } if (specificCallback_->onUpdateOccupiedAreaIfNeed_) { diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 0433abfd69..3822552047 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -1281,9 +1281,6 @@ void SceneSessionManager::CreateRootSceneSession() specificCb->onUpdateAvoidArea_ = [this](int32_t persistentId) { this->UpdateAvoidArea(persistentId); }; - specificCb->onGetIsAINavigationBarAvoidAreaValid_ = [this](const AvoidArea& avoidArea, int32_t sessionBottom) { - return CheckAvoidAreaForAINavigationBar(isAINavigationBarVisible_, avoidArea, sessionBottom); - }; specificCb->onNotifyAvoidAreaChange_ = [this](const sptr& avoidArea, AvoidAreaType type) { onNotifyAvoidAreaChangeForRootFunc_(avoidArea, type); }; @@ -1868,6 +1865,10 @@ sptr SceneSessionManager::CreateSceneSession(const SessionInfo& se sceneSession->SetIsLastFrameLayoutFinishedFunc([this](bool& isLayoutFinished) { return this->IsLastFrameLayoutFinished(isLayoutFinished); }); + sceneSession->SetIsAINavigationBarAvoidAreaValidFunc([this](const AvoidArea& avoidArea, int32_t sessionBottom) + { + return CheckAvoidAreaForAINavigationBar(isAINavigationBarVisible_, avoidArea, sessionBottom); + }); sceneSession->RegisterGetStatusBarAvoidHeightFunc([this](WSRect& barArea) { return this->GetStatusBarAvoidHeight(barArea); }); @@ -8995,8 +8996,9 @@ void SceneSessionManager::NotifySessionAINavigationBarChange(int32_t persistentI TLOGI(WmsLogTag::WMS_IMMS, "win %{public}d layout finished %{public}d", persistentId, isLastFrameLayoutFinished); if (isLastFrameLayoutFinished) { - sceneSession->UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); - sceneSession->NotifyClientToUpdateRect("AvoidAreaChange", nullptr); + sceneSession->UpdateAvoidArea( + new AvoidArea(sceneSession->GetAvoidAreaByType(AvoidAreaType::TYPE_NAVIGATION_INDICATOR)), + AvoidAreaType::TYPE_NAVIGATION_INDICATOR); } else { sceneSession->MarkAvoidAreaAsDirty(); } -- Gitee From f43af3447e177fe49df5f04a6caa705f39b7803e Mon Sep 17 00:00:00 2001 From: ReCoder Date: Mon, 20 Jan 2025 20:55:41 +0800 Subject: [PATCH 07/12] refactor: add AVOID_AREA_CHANGE window size change enum Signed-off-by: ReCoder --- interfaces/innerkits/wm/wm_common.h | 1 + previewer/include/wm_common.h | 1 + window_scene/interfaces/include/ws_common.h | 1 + window_scene/session_manager/src/scene_session_manager.cpp | 2 +- window_scene/test/unittest/scene_session_test2.cpp | 3 +++ 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index ad5fa84e19..a878dd0cf5 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -398,6 +398,7 @@ enum class WindowSizeChangeReason : uint32_t { PIP_RESTORE, UPDATE_DPI_SYNC, DRAG_MOVE, + AVOID_AREA_CHANGE, END, }; diff --git a/previewer/include/wm_common.h b/previewer/include/wm_common.h index 7784fa08f6..87fd9f3201 100644 --- a/previewer/include/wm_common.h +++ b/previewer/include/wm_common.h @@ -343,6 +343,7 @@ enum class WindowSizeChangeReason : uint32_t { PIP_RESTORE, UPDATE_DPI_SYNC, DRAG_MOVE, + AVOID_AREA_CHANGE, END }; diff --git a/window_scene/interfaces/include/ws_common.h b/window_scene/interfaces/include/ws_common.h index 2eac26db91..53be0fc575 100644 --- a/window_scene/interfaces/include/ws_common.h +++ b/window_scene/interfaces/include/ws_common.h @@ -431,6 +431,7 @@ enum class SizeChangeReason : uint32_t { PIP_RESTORE, UPDATE_DPI_SYNC, DRAG_MOVE, + AVOID_AREA_CHANGE, END, }; diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 3822552047..346074dbd2 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -8823,7 +8823,7 @@ void SceneSessionManager::UpdateNormalSessionAvoidArea( needUpdate = false; return; } - sceneSession->UpdateSizeChangeReason(SizeChangeReason::UNDEFINED); + sceneSession->UpdateSizeChangeReason(SizeChangeReason::AVOID_AREA_CHANGE); sceneSession->NotifyClientToUpdateRect("AvoidAreaChange", nullptr); } diff --git a/window_scene/test/unittest/scene_session_test2.cpp b/window_scene/test/unittest/scene_session_test2.cpp index 0fe94172d5..9c7c5ecda9 100644 --- a/window_scene/test/unittest/scene_session_test2.cpp +++ b/window_scene/test/unittest/scene_session_test2.cpp @@ -613,6 +613,9 @@ HWTEST_F(SceneSessionTest2, UpdateAvoidArea, Function | SmallTest | Level2) EXPECT_NE(nullptr, sceneSession->sessionStage_); result = sceneSession->UpdateAvoidArea(nullptr, AvoidAreaType::TYPE_SYSTEM); EXPECT_EQ(WSError::WS_OK, result); + sceneSession->foregroundInteractiveStatus_.store(false); + result = sceneSession->UpdateAvoidArea(nullptr, AvoidAreaType::TYPE_SYSTEM); + EXPECT_EQ(WSError::WS_DO_NOTHING, result); } /** -- Gitee From 3f8ccec3e16df192c34c255e9c84321e17ff8a57 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Mon, 20 Jan 2025 21:44:11 +0800 Subject: [PATCH 08/12] fix: size change reason Signed-off-by: ReCoder --- wm/src/window_impl.cpp | 2 +- wm/src/window_session_impl.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 744daab6e3..bb01ee367f 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -3442,7 +3442,7 @@ void WindowImpl::UpdateAvoidArea(const sptr& avoidArea, AvoidAreaType WLOGI("Update AvoidArea, id: %{public}u", property_->GetWindowId()); auto display = SingletonContainer::IsDestroyed() ? nullptr : SingletonContainer::Get().GetDisplayById(property_->GetDisplayId()); - UpdateViewportConfig(GetRect(), display, WindowSizeChangeReason::UNDEFINED, nullptr, {{type, *avoidArea}}); + UpdateViewportConfig(GetRect(), display, WindowSizeChangeReason::AVOID_AREA_CHANGE, nullptr, {{type, *avoidArea}}); NotifyAvoidAreaChange(avoidArea, type); } diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index f66819d04e..be47fe2f05 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -3482,7 +3482,7 @@ WSError WindowSessionImpl::UpdateAvoidArea(const sptr& avoidArea, Avo if (lastAvoidAreaMap_[type] != *avoidArea) { lastAvoidAreaMap_[type] = *avoidArea; NotifyAvoidAreaChange(avoidArea, type); - UpdateViewportConfig(GetRect(), WindowSizeChangeReason::UNDEFINED); + UpdateViewportConfig(GetRect(), WindowSizeChangeReason::AVOID_AREA_CHANGE); } return WSError::WS_OK; } -- Gitee From ce6858dc7a9329f43ece977b2076abea66182670 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Tue, 21 Jan 2025 10:51:05 +0800 Subject: [PATCH 09/12] refactor: remove unnecessary lastUpdateAvoidAreaMap Signed-off-by: ReCoder --- window_scene/session/host/src/scene_session.cpp | 4 ++-- .../session_manager/include/scene_session_manager.h | 1 - window_scene/session_manager/src/scene_session_manager.cpp | 7 +++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 5a59674cac..758a2e2374 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -5912,8 +5912,8 @@ void SceneSession::NotifyClientToUpdateAvoidArea() if (specificCallback_ == nullptr) { return; } - // flush avoid areas on (avoid area dirty & rect NOT dirty) - if (!IsDirtyWindow() && specificCallback_->onUpdateAvoidArea_) { + // flush avoid areas on (avoid area dirty && (normal session rect NOT dirty || avoid session)) + if ((IsImmersiveType() || !IsDirtyWindow()) && specificCallback_->onUpdateAvoidArea_) { specificCallback_->onUpdateAvoidArea_(GetPersistentId()); } if (specificCallback_->onUpdateOccupiedAreaIfNeed_) { diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index f016370588..c3d2fb97cf 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -1168,7 +1168,6 @@ private: std::map currAINavigationBarAreaMap_; std::unordered_map statusBarDefaultVisibilityPerDisplay_; std::set avoidAreaListenerSessionSet_; - std::map> lastUpdatedAvoidArea_; static constexpr int32_t INVALID_STATUS_BAR_AVOID_HEIGHT = -1; int32_t statusBarAvoidHeight_ = INVALID_STATUS_BAR_AVOID_HEIGHT; diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 346074dbd2..6a1ac12b42 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -2638,7 +2638,7 @@ WSError SceneSessionManager::RequestSceneSessionDestruction(const sptrGetAvoidAreaByType(avoidType); rootSceneSession_->UpdateAvoidArea(new AvoidArea(avoidArea), avoidType); - std::shared_lock lock(sceneSessionMapMutex_); - for (const auto& [_, sceneSession] : sceneSessionMap_) { + for (auto persistentId : avoidAreaListenerSessionSet_) { + auto sceneSession = GetSceneSession(persistentId); if (sceneSession == nullptr || !IsSessionVisibleForeground(sceneSession)) { continue; } -- Gitee From 8f98729e40d1923bb412ffd522b3119f47dab8a9 Mon Sep 17 00:00:00 2001 From: ReCoder Date: Wed, 5 Feb 2025 16:39:06 +0800 Subject: [PATCH 10/12] fix: comments Signed-off-by: ReCoder --- window_scene/session/host/src/scene_session.cpp | 4 +++- .../session_manager/src/scene_session_manager.cpp | 11 ++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 758a2e2374..325b16a728 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -1685,7 +1685,9 @@ WSError SceneSession::SetIsStatusBarVisibleInner(bool isVisible) return ret; } if (isLayoutFinished) { - UpdateAvoidArea(new AvoidArea(GetAvoidAreaByType(AvoidAreaType::TYPE_SYSTEM)), AvoidAreaType::TYPE_SYSTEM); + UpdateAvoidArea( + sptr::MakeSptr(GetAvoidAreaByType(AvoidAreaType::TYPE_SYSTEM)), + AvoidAreaType::TYPE_SYSTEM); } else { MarkAvoidAreaAsDirty(); } diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 6a1ac12b42..6a733ec1f2 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -278,7 +278,7 @@ public: } }; -static bool CheckAvoidAreaForAINavigationBar(bool isVisible, const AvoidArea& avoidArea, int32_t sessionBottom) +bool CheckAvoidAreaForAINavigationBar(bool isVisible, const AvoidArea& avoidArea, int32_t sessionBottom) { if (!avoidArea.topRect_.IsUninitializedRect() || !avoidArea.leftRect_.IsUninitializedRect() || !avoidArea.rightRect_.IsUninitializedRect()) { @@ -8786,7 +8786,7 @@ void SceneSessionManager::UpdateAvoidSessionAvoidArea(WindowType type) AvoidAreaType avoidType = (type == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT) ? AvoidAreaType::TYPE_KEYBOARD : AvoidAreaType::TYPE_SYSTEM; AvoidArea avoidArea = rootSceneSession_->GetAvoidAreaByType(avoidType); - rootSceneSession_->UpdateAvoidArea(new AvoidArea(avoidArea), avoidType); + rootSceneSession_->UpdateAvoidArea(sptr::MakeSptr(avoidArea), avoidType); for (auto persistentId : avoidAreaListenerSessionSet_) { auto sceneSession = GetSceneSession(persistentId); @@ -8794,7 +8794,7 @@ void SceneSessionManager::UpdateAvoidSessionAvoidArea(WindowType type) continue; } AvoidArea avoidArea = sceneSession->GetAvoidAreaByType(avoidType); - sceneSession->UpdateAvoidArea(new AvoidArea(avoidArea), avoidType); + sceneSession->UpdateAvoidArea(sptr::MakeSptr(avoidArea), avoidType); } } @@ -8837,7 +8837,8 @@ void SceneSessionManager::UpdateRootSceneSessionAvoidArea(int32_t persistentId, rootSceneSession_->GetSessionRect().height_)) { continue; } - rootSceneSession_->UpdateAvoidArea(new AvoidArea(avoidArea), static_cast(avoidAreaType)); + rootSceneSession_->UpdateAvoidArea( + sptr::MakeSptr(avoidArea), static_cast(avoidAreaType)); } needUpdate = true; } @@ -8996,7 +8997,7 @@ void SceneSessionManager::NotifySessionAINavigationBarChange(int32_t persistentI persistentId, isLastFrameLayoutFinished); if (isLastFrameLayoutFinished) { sceneSession->UpdateAvoidArea( - new AvoidArea(sceneSession->GetAvoidAreaByType(AvoidAreaType::TYPE_NAVIGATION_INDICATOR)), + sptr::MakeSptr(sceneSession->GetAvoidAreaByType(AvoidAreaType::TYPE_NAVIGATION_INDICATOR)), AvoidAreaType::TYPE_NAVIGATION_INDICATOR); } else { sceneSession->MarkAvoidAreaAsDirty(); -- Gitee From 16e313256a3910f7ddc4a261e50b40af58fe8b9f Mon Sep 17 00:00:00 2001 From: ReCoder Date: Thu, 6 Feb 2025 14:18:36 +0800 Subject: [PATCH 11/12] fix: comments Signed-off-by: ReCoder --- window_scene/session_manager/src/scene_session_manager.cpp | 3 +-- wm/include/window_extension_session_impl.h | 2 +- wm/src/window_session_impl.cpp | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 6a733ec1f2..a9f99cfa9b 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -1865,8 +1865,7 @@ sptr SceneSessionManager::CreateSceneSession(const SessionInfo& se sceneSession->SetIsLastFrameLayoutFinishedFunc([this](bool& isLayoutFinished) { return this->IsLastFrameLayoutFinished(isLayoutFinished); }); - sceneSession->SetIsAINavigationBarAvoidAreaValidFunc([this](const AvoidArea& avoidArea, int32_t sessionBottom) - { + sceneSession->SetIsAINavigationBarAvoidAreaValidFunc([this](const AvoidArea& avoidArea, int32_t sessionBottom) { return CheckAvoidAreaForAINavigationBar(isAINavigationBarVisible_, avoidArea, sessionBottom); }); sceneSession->RegisterGetStatusBarAvoidHeightFunc([this](WSRect& barArea) { diff --git a/wm/include/window_extension_session_impl.h b/wm/include/window_extension_session_impl.h index e04d08b497..0365028039 100644 --- a/wm/include/window_extension_session_impl.h +++ b/wm/include/window_extension_session_impl.h @@ -148,7 +148,7 @@ private: void UpdateRectForRotation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, const std::shared_ptr& rsTransaction = nullptr, const std::map& avoidAreas = {}); - void UpdateRectForOtherReason(const Rect &wmRect, WindowSizeChangeReason wmReason, + void UpdateRectForOtherReason(const Rect& wmRect, WindowSizeChangeReason wmReason, const std::map& avoidAreas = {}); WMError GetSystemViewportConfig(SessionViewportConfig& config); void UpdateSystemViewportConfig(); diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index be47fe2f05..0c4fe6752f 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -1243,7 +1243,7 @@ void WindowSessionImpl::UpdateViewportConfig(const Rect& rect, WindowSizeChangeR type, avoidArea.ToString().c_str()); if (lastAvoidAreaMap_[type] != avoidArea) { lastAvoidAreaMap_[type] = avoidArea; - NotifyAvoidAreaChange(new AvoidArea(avoidArea), type); + NotifyAvoidAreaChange(sptr::MakeSptr(avoidArea), type); } } uiContent->UpdateViewportConfig(config, reason, rsTransaction, lastAvoidAreaMap_); -- Gitee From 2b4c2eebe14de744f645e794f2ff9c31baa36afc Mon Sep 17 00:00:00 2001 From: ReCoder Date: Mon, 10 Feb 2025 10:39:53 +0800 Subject: [PATCH 12/12] fix: comments Signed-off-by: ReCoder --- window_scene/session/host/include/session.h | 2 +- window_scene/session/host/src/scene_session.cpp | 4 ++-- window_scene/session/host/src/session.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/window_scene/session/host/include/session.h b/window_scene/session/host/include/session.h index 4f486d6751..18ed13addb 100644 --- a/window_scene/session/host/include/session.h +++ b/window_scene/session/host/include/session.h @@ -272,7 +272,7 @@ public: SizeChangeReason GetSizeChangeReason() const { return reason_; } virtual WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, const std::string& updateReason, const std::shared_ptr& rsTransaction = nullptr); - virtual WSError UpdateRectWithAvoidArea(const WSRect& rect, SizeChangeReason reason, + virtual WSError UpdateRectWithLayoutInfo(const WSRect& rect, SizeChangeReason reason, const std::string& updateReason, const std::shared_ptr& rsTransaction = nullptr, const std::map& avoidAreas = {}); WSError UpdateDensity(); diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 325b16a728..f75009a36e 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -1123,9 +1123,9 @@ WSError SceneSession::NotifyClientToUpdateRectTask(const std::string& updateReas // once reason is undefined, not use rsTransaction // when rotation, sync cnt++ in marshalling. Although reason is undefined caused by resize if (reason_ == SizeChangeReason::UNDEFINED || reason_ == SizeChangeReason::RESIZE || IsMoveToOrDragMove(reason_)) { - ret = Session::UpdateRectWithAvoidArea(winRect_, reason_, updateReason, nullptr, avoidAreas); + ret = Session::UpdateRectWithLayoutInfo(winRect_, reason_, updateReason, nullptr, avoidAreas); } else { - ret = Session::UpdateRectWithAvoidArea(winRect_, reason_, updateReason, rsTransaction, avoidAreas); + ret = Session::UpdateRectWithLayoutInfo(winRect_, reason_, updateReason, rsTransaction, avoidAreas); #ifdef DEVICE_STATUS_ENABLE // When the drag is in progress, the drag window needs to be notified to rotate. if (rsTransaction != nullptr) { diff --git a/window_scene/session/host/src/session.cpp b/window_scene/session/host/src/session.cpp index 68bd78c685..bd533a4a91 100644 --- a/window_scene/session/host/src/session.cpp +++ b/window_scene/session/host/src/session.cpp @@ -1036,10 +1036,10 @@ void Session::UpdateClientRectPosYAndDisplayId(WSRect& rect) WSError Session::UpdateRect(const WSRect& rect, SizeChangeReason reason, const std::string& updateReason, const std::shared_ptr& rsTransaction) { - return UpdateRectWithAvoidArea(rect, reason, updateReason, rsTransaction, {}); + return UpdateRectWithLayoutInfo(rect, reason, updateReason, rsTransaction, {}); } -WSError Session::UpdateRectWithAvoidArea(const WSRect& rect, SizeChangeReason reason, +WSError Session::UpdateRectWithLayoutInfo(const WSRect& rect, SizeChangeReason reason, const std::string& updateReason, const std::shared_ptr& rsTransaction, const std::map& avoidAreas) { -- Gitee