diff --git a/interfaces/innerkits/wm/window.h b/interfaces/innerkits/wm/window.h index 604f53765e067c1e77c673e1cb0f08d4deb31e44..6a6d03fb5439d75f09ec32d900787bb35e5b5374 100644 --- a/interfaces/innerkits/wm/window.h +++ b/interfaces/innerkits/wm/window.h @@ -273,6 +273,20 @@ public: virtual void OnWindowStatusDidChange(WindowStatus status) {} }; +/** + * @class IWindowCoordinateChangeListener + * + * @brief IWindowCoordinateChangeListener is used to observe the window coordinate when window coordinate changed + * and layout finished. + */ +class IWindowCoordinateChangeListener : virtual public RefBase { +public: + /** + * @brief Notify caller when window coordinate changed. + */ + virtual void OnWindowCoordinateChange(WindowSizeChangeReason reason) {} +}; + /** * @class IAvoidAreaChangedListener * @@ -3124,6 +3138,28 @@ public: return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; } + /** + * @brief Register window coordinate change listener. + * + * @param listener IWindowCoordinateChangeListener. + * @return WM_OK means register success, others means register failed. + */ + virtual WMError RegisterWindowCoordinateChangeListener(const sptr& listener) + { + return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; + } + + /** + * @brief Unregister window coordinate change listener. + * + * @param listener IWindowCoordinateChangeListener. + * @return WM_OK means unregister success, others means unregister failed. + */ + virtual WMError UnregisterWindowCoordinateChangeListener(const sptr& listener) + { + return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; + } + /** * @brief Set Specific System Bar(include status bar and nav bar) Enable and Animation Properties * diff --git a/previewer/include/window.h b/previewer/include/window.h index caee3495ee8867ea18ffc906557239fcad346598..b65e9f4b269ebe60a45a148ad3d7bfa0e6fb6a16 100644 --- a/previewer/include/window.h +++ b/previewer/include/window.h @@ -80,6 +80,10 @@ class IIgnoreViewSafeAreaListener : virtual public RefBase { public: virtual void SetIgnoreViewSafeArea(bool ignoreViewSafeArea) = 0; }; +class IWindowCoordinateChangeListener : virtual public RefBase { +public: + virtual void OnWindowCoordinateChange(WindowSizeChangeReason reason) {} +}; class IAvoidAreaChangedListener : virtual public RefBase { public: virtual void OnAvoidAreaChanged(const AvoidArea avoidArea, AvoidAreaType type) {} @@ -486,6 +490,14 @@ public: { return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; } + virtual WMError RegisterWindowCoordinateChangeListener(const sptr& listener) + { + return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; + } + virtual WMError UnregisterWindowCoordinateChangeListener(const sptr& listener) + { + return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; + } virtual WMError SetSingleFrameComposerEnabled(bool enable) = 0; virtual WMError SetLandscapeMultiWindow(bool isLandscapeMultiWindow) = 0; virtual WMError SetDecorVisible(bool isVisible) { return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; } 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 8497291f8949e8b9ea459f225acceb95ff5a02ff..ea1268a57e6fc70131260852b557a99d25897232 100644 --- a/window_scene/session/container/include/zidl/session_stage_interface.h +++ b/window_scene/session/container/include/zidl/session_stage_interface.h @@ -54,7 +54,7 @@ public: */ virtual WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, - const std::map& avoidAreas = {}) = 0; + const std::map& avoidAreas = {}, bool isWindowCoordinateChange = true) = 0; /** * @brief Update the window's rectangle in global coordinates from server-side state. 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 529d61df444a0d2009175667d778c9add07f1a35..ae09f615a8e73b5bab54cc94c33472a447f8d58f 100644 --- a/window_scene/session/container/include/zidl/session_stage_proxy.h +++ b/window_scene/session/container/include/zidl/session_stage_proxy.h @@ -34,7 +34,7 @@ public: WSError SetActive(bool active) override; WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, - const std::map& avoidAreas = {}) override; + const std::map& avoidAreas = {}, bool isWindowCoordinateChange = true) override; WSError UpdateGlobalDisplayRectFromServer(const WSRect& rect, SizeChangeReason reason) override; void UpdateDensity() override; WSError UpdateOrientation() 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 53ec21dbf669bed366b8051e59c420e6f70303f8..84cd75e2abcc8c5a3c147898285520394eaab9c5 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,8 @@ WSError SessionStageProxy::UpdateDisplayId(uint64_t displayId) } WSError SessionStageProxy::UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config, const std::map& avoidAreas) + const SceneAnimationConfig& config, const std::map& avoidAreas, + bool isWindowCoordinateChange) { MessageParcel data; MessageParcel reply; @@ -228,6 +229,10 @@ WSError SessionStageProxy::UpdateRect(const WSRect& rect, SizeChangeReason reaso return WSError::WS_ERROR_IPC_FAILED; } } + if (!data.WriteBool(isWindowCoordinateChange)) { + TLOGE(WmsLogTag::WMS_IMMS, "Write isWindowCoordinateChange failed"); + return WSError::WS_ERROR_IPC_FAILED; + } sptr remote = Remote(); if (remote == nullptr) { 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 04a419053839b243083cb77381f3a673100893b0..f90cc9b11eb10e05ebdbb3a0da18e0209f745119 100644 --- a/window_scene/session/container/src/zidl/session_stage_stub.cpp +++ b/window_scene/session/container/src/zidl/session_stage_stub.cpp @@ -314,6 +314,11 @@ int SessionStageStub::HandleUpdateRect(MessageParcel& data, MessageParcel& reply } avoidAreas[static_cast(type)] = *area; } + bool isWindowCoordinateChange = false; + if (!data.ReadBool(isWindowCoordinateChange)) { + TLOGE(WmsLogTag::WMS_LAYOUT, "read isWindowCoordinateChange failed"); + return ERR_INVALID_DATA; + } WSError errCode = UpdateRect(rect, reason, config, avoidAreas); reply.WriteUint32(static_cast(errCode)); return ERR_NONE; diff --git a/window_scene/session/host/src/session.cpp b/window_scene/session/host/src/session.cpp index b80ead6e7d1c35109e8b82feadc2cbd45457c991..c8b0870944e9d5281afc7e374c92a8d4a062aad2 100644 --- a/window_scene/session/host/src/session.cpp +++ b/window_scene/session/host/src/session.cpp @@ -1231,7 +1231,10 @@ WSError Session::UpdateRectWithLayoutInfo(const WSRect& rect, SizeChangeReason r int32_t rotateAnimationDuration = GetRotateAnimationDuration(); SceneAnimationConfig config { .rsTransaction_ = rsTransaction, .animationDuration_ = rotateAnimationDuration }; UpdateClientRectPosYAndDisplayId(updateRect); - sessionStage_->UpdateRect(updateRect, reason, config, avoidAreas); + updateRect = IsNeedConvertToRelativeRect(reason) ? + GetLayoutController()->ConvertGlobalRectToRelative(updateRect, GetDisplayId()) : updateRect; + bool isWindowCoordinateChanged = updateReason != "ScreenFoldStatusChanged"; + sessionStage_->UpdateRect(updateRect, reason, config, avoidAreas, isWindowCoordinateChanged); SetClientRect(rect); RectCheckProcess(); } else { diff --git a/window_scene/test/mock/mock_session_stage.h b/window_scene/test/mock/mock_session_stage.h index a0d624abb00b67fdbe65df5dd4a62318f9143e5c..55292247738dfc194283ebbc4d4736307611c739 100644 --- a/window_scene/test/mock/mock_session_stage.h +++ b/window_scene/test/mock/mock_session_stage.h @@ -27,8 +27,9 @@ public: ~SessionStageMocker() {}; MOCK_METHOD1(SetActive, WSError(bool active)); - MOCK_METHOD4(UpdateRect, WSError(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config, const std::map& avoidAreas)); + MOCK_METHOD5(UpdateRect, WSError(const WSRect& rect, SizeChangeReason reason, + const SceneAnimationConfig& config, const std::map& avoidAreas, + bool isWindowCoordinateChanged)); MOCK_METHOD(WSError, UpdateGlobalDisplayRectFromServer, (const WSRect& rect, SizeChangeReason reason), (override)); MOCK_METHOD0(UpdateDensity, void(void)); MOCK_METHOD0(UpdateOrientation, WSError(void)); diff --git a/window_scene/test/unittest/layout/session_layout_test.cpp b/window_scene/test/unittest/layout/session_layout_test.cpp index 0e52b5c96c4d3b969e66d9eeefeef212a12b3a64..beb744d8618cfb03a1dbd95f31eed8753da1ee93 100644 --- a/window_scene/test/unittest/layout/session_layout_test.cpp +++ b/window_scene/test/unittest/layout/session_layout_test.cpp @@ -140,7 +140,7 @@ HWTEST_F(SessionLayoutTest, UpdateRect01, TestSize.Level1) Session::SetBackgroundUpdateRectNotifyEnabled(true); 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, diff --git a/window_scene/test/unittest/session_stage_stub_test.cpp b/window_scene/test/unittest/session_stage_stub_test.cpp index 43c7b381be3d3a53510ab32df24cd4563516ee4f..929fe9775ff74eb504ec8c99b5581c68aa12f5fe 100644 --- a/window_scene/test/unittest/session_stage_stub_test.cpp +++ b/window_scene/test/unittest/session_stage_stub_test.cpp @@ -117,9 +117,10 @@ HWTEST_F(SessionStageStubTest, HandleUpdateRect, TestSize.Level1) data.WriteBool(false); data.WriteInt32(1); data.WriteUint32(0); + data.WriteBool(true); uint32_t code = static_cast(SessionStageInterfaceCode::TRANS_ID_NOTIFY_SIZE_CHANGE); - ASSERT_TRUE((sessionStageStub_ != nullptr)); - ASSERT_EQ(0, sessionStageStub_->OnRemoteRequest(code, data, reply, option)); + ASSERT_TRUE(sessionStageStub_ != nullptr); + EXPECT_EQ(0, sessionStageStub_->OnRemoteRequest(code, data, reply, option)); } /** diff --git a/window_scene/test/unittest/session_test.cpp b/window_scene/test/unittest/session_test.cpp index 89768221ad7aa40bc35e4d0af736c02b750ffc37..2c6d31797a7a545db3ea6dfe9eb42d3d677b3a72 100644 --- a/window_scene/test/unittest/session_test.cpp +++ b/window_scene/test/unittest/session_test.cpp @@ -160,7 +160,7 @@ HWTEST_F(WindowSessionTest, SetActive01, TestSize.Level1) 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_extension_session_impl.h b/wm/include/window_extension_session_impl.h index e133beaf0bdd46428e29cc31954aafafa6b19c72..65d3837ac59cf31d403bf97045d92fd35a1010fc 100644 --- a/wm/include/window_extension_session_impl.h +++ b/wm/include/window_extension_session_impl.h @@ -81,7 +81,7 @@ public: void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override {} WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, - const std::map& avoidAreas = {}) override; + const std::map& avoidAreas = {}, bool isWindowCoordinateChange = true) override; WMError GetAvoidAreaByType(AvoidAreaType type, AvoidArea& avoidArea, const Rect& rect = Rect::EMPTY_RECT, int32_t apiVersion = API_VERSION_INVALID) override; diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index 0009e6d412494e24b50394451603544f019118c9..df4ec559f6855856977a6a7e18d9f896de1652c4 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -219,7 +219,7 @@ public: WSError SetActive(bool active) override; WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }, - const std::map& avoidAreas = {}) override; + const std::map& avoidAreas = {}, bool isWindowCoordinateChange = true) override; void UpdateDensity() override; void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override; WSError UpdateOrientation() override; @@ -471,6 +471,8 @@ public: WMError SetDragKeyFramePolicy(const KeyFramePolicy& keyFramePolicy) override; WMError RegisterWindowStatusDidChangeListener(const sptr& listener) override; WMError UnregisterWindowStatusDidChangeListener(const sptr& listener) override; + WMError RegisterWindowCoordinateChangeListener(const sptr& listener) override; + WMError UnregisterWindowCoordinateChangeListener(const sptr& listener) override; WSError NotifyLayoutFinishAfterWindowModeChange(WindowMode mode) override { return WSError::WS_OK; } WMError UpdateWindowModeForUITest(int32_t updateMode) override { return WMError::WM_OK; } WSError NotifyAppHookWindowInfoUpdated() override { return WSError::WS_DO_NOTHING; } @@ -784,6 +786,7 @@ protected: template EnableIfSame>> GetListeners(); void NotifyWindowStatusDidChange(WindowMode mode); + void NotifyWindowCoordinateChange(WindowSizeChangeReason reason); void NotifyFirstValidLayoutUpdate(const Rect& preRect, const Rect& newRect); std::atomic_bool hasSetEnableDrag_ = false; void HookWindowSizeByHookWindowInfo(Rect& rect); @@ -903,6 +906,9 @@ private: template EnableIfSame>> GetListeners(); template + EnableIfSame>> + GetListeners(); + template EnableIfSame>> GetListeners(); template EnableIfSame>> @@ -1015,6 +1021,7 @@ private: static std::recursive_mutex windowNoInteractionListenerMutex_; static std::recursive_mutex windowStatusChangeListenerMutex_; static std::recursive_mutex windowStatusDidChangeListenerMutex_; + static std::recursive_mutex windowCoordinateChangeListenerMutex_; static std::mutex displayMoveListenerMutex_; static std::mutex windowRectChangeListenerMutex_; static std::mutex rectChangeInGlobalDisplayListenerMutex_; @@ -1054,6 +1061,7 @@ private: static std::map> windowNoInteractionListeners_; static std::map>> windowStatusChangeListeners_; static std::map>> windowStatusDidChangeListeners_; + static std::map>> windowCoordinateChangeListeners_; static std::map>> windowRectChangeListeners_; static std::map>> rectChangeInGlobalDisplayListeners_; static std::map>> secureLimitChangeListeners_; diff --git a/wm/src/window_extension_session_impl.cpp b/wm/src/window_extension_session_impl.cpp index f85e966af27b39a1227bae2290a9aa4d0d30f5e9..76c5834813ac2a69d957d1d4e9b2e34851de29e1 100644 --- a/wm/src/window_extension_session_impl.cpp +++ b/wm/src/window_extension_session_impl.cpp @@ -863,7 +863,8 @@ WMError WindowExtensionSessionImpl::SetUIContentInner(const std::string& content } WSError WindowExtensionSessionImpl::UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config, const std::map& avoidAreas) + const SceneAnimationConfig& config, const std::map& avoidAreas, + bool isWindowCoordinateChange) { auto wmReason = static_cast(reason); Rect wmRect = {rect.posX_, rect.posY_, rect.width_, rect.height_}; diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 4fbfe05c917ba0a0bbecd611933a4fe50b785f53..1f316fb3b140d2cd6095ad0609c2c85015e5a7db 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -6181,6 +6181,7 @@ WSError WindowSceneSessionImpl::UpdateDisplayId(DisplayId displayId) if (displayIdChanged) { TLOGI(WmsLogTag::WMS_ATTRIBUTE, "wid: %{public}d, displayId: %{public}" PRIu64, GetPersistentId(), displayId); NotifyDisplayIdChange(displayId); + NotifyWindowCoordinateChange(WindowSizeChangeReason::UNDEFINED); } return WSError::WS_OK; } diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index ef1d0d73bfcc3944fb9a56c5a6f6c9271ed72161..2312b81f0c3839ab36d9f1eff93035abf4216f5b 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -189,6 +189,7 @@ std::recursive_mutex WindowSessionImpl::windowVisibilityChangeListenerMutex_; std::recursive_mutex WindowSessionImpl::windowNoInteractionListenerMutex_; std::recursive_mutex WindowSessionImpl::windowStatusChangeListenerMutex_; std::recursive_mutex WindowSessionImpl::windowStatusDidChangeListenerMutex_; +std::recursive_mutex WindowSessionImpl::windowCoordinateChangeListenerMutex_; std::recursive_mutex WindowSessionImpl::windowTitleButtonRectChangeListenerMutex_; std::mutex WindowSessionImpl::displayMoveListenerMutex_; std::mutex WindowSessionImpl::windowRectChangeListenerMutex_; @@ -214,6 +215,7 @@ std::recursive_mutex WindowSessionImpl::subWindowSessionMutex_; std::map>> WindowSessionImpl::subWindowSessionMap_; std::map>> WindowSessionImpl::windowStatusChangeListeners_; std::map>> WindowSessionImpl::windowStatusDidChangeListeners_; +std::map>> WindowSessionImpl::windowCoordinateChangeListeners_; bool WindowSessionImpl::isUIExtensionAbilityProcess_ = false; std::atomic WindowSessionImpl::defaultDensityEnabledGlobalConfig_ = false; @@ -1077,7 +1079,8 @@ WSError WindowSessionImpl::SetActive(bool active) /** @note @window.layout */ WSError WindowSessionImpl::UpdateRect(const WSRect& rect, SizeChangeReason reason, - const SceneAnimationConfig& config, const std::map& avoidAreas) + const SceneAnimationConfig& config, const std::map& avoidAreas, + bool isWindowCoordinateChange) { // delete after replace ws_common.h with wm_common.h auto wmReason = static_cast(reason); @@ -1111,6 +1114,9 @@ WSError WindowSessionImpl::UpdateRect(const WSRect& rect, SizeChangeReason reaso } else { UpdateRectForOtherReason(wmRect, preRect, wmReason, config.rsTransaction_, avoidAreas); } + if (isWindowCoordinateChange) { + NotifyWindowCoordinateChange(wmReason); + } if (wmReason == WindowSizeChangeReason::MOVE || wmReason == WindowSizeChangeReason::RESIZE || wmReason == WindowSizeChangeReason::MOVE_WITH_ANIMATION || @@ -3384,6 +3390,20 @@ WMError WindowSessionImpl::UnregisterWindowStatusDidChangeListener(const sptr& listener) +{ + TLOGD(WmsLogTag::WMS_LAYOUT, "in"); + std::lock_guard lockListener(windowCoordinateChangeListenerMutex_); + return RegisterListener(windowCoordinateChangeListeners_[GetPersistentId()], listener); +} + +WMError WindowSessionImpl::UnregisterWindowCoordinateChangeListener(const sptr& listener) +{ + TLOGD(WmsLogTag::WMS_LAYOUT, "in"); + std::lock_guard lockListener(windowCoordinateChangeListenerMutex_); + return UnregisterListener(windowCoordinateChangeListeners_[GetPersistentId()], listener); +} + WMError WindowSessionImpl::SetDecorVisible(bool isVisible) { if (IsWindowSessionInvalid()) { @@ -4417,6 +4437,16 @@ EnableIfSame +EnableIfSame>> WindowSessionImpl::GetListeners() +{ + std::vector> windowCoordinateChangeListeners; + for (auto& listener : windowCoordinateChangeListeners_[GetPersistentId()]) { + windowCoordinateChangeListeners.push_back(listener); + } + return windowCoordinateChangeListeners; +} + void WindowSessionImpl::ClearListenersById(int32_t persistentId) { TLOGI(WmsLogTag::WMS_LIFE, "Called id: %{public}d.", GetPersistentId()); @@ -4460,6 +4490,10 @@ void WindowSessionImpl::ClearListenersById(int32_t persistentId) std::lock_guard lockListener(windowStatusDidChangeListenerMutex_); ClearUselessListeners(windowStatusDidChangeListeners_, persistentId); } + { + std::lock_guard lockListener(windowCoordinateChangeListenerMutex_); + ClearUselessListeners(windowCoordinateChangeListeners_, persistentId); + } { std::lock_guard lockListener(windowTitleButtonRectChangeListenerMutex_); ClearUselessListeners(windowTitleButtonRectChangeListeners_, persistentId); @@ -7176,6 +7210,24 @@ void WindowSessionImpl::NotifyWindowStatusDidChange(WindowMode mode) } } +/** @note @window.layout */ +void WindowSessionImpl::NotifyWindowCoordinateChange(WindowSizeChangeReason reason) +{ + std::vector> windowCoordinateChangeListeners; + { + std::lock_guard lockListener(windowCoordinateChangeListenerMutex_); + windowCoordinateChangeListeners = GetListeners(); + } + const auto& windowRect = GetRect(); + TLOGD(WmsLogTag::WMS_LAYOUT, "Id:%{public}d, listenerSize:%{public}zu, rect:%{public}s", + GetPersistentId(), windowCoordinateChangeListeners.size(), windowRect.ToString().c_str()); + for (auto& listener : windowCoordinateChangeListeners) { + if (listener != nullptr) { + listener->OnWindowCoordinateChange(reason); + } + } +} + void WindowSessionImpl::NotifyFirstValidLayoutUpdate(const Rect& preRect, const Rect& newRect) { bool isFirstValidLayoutUpdate = true; diff --git a/wm/test/mock/mock_window.h b/wm/test/mock/mock_window.h index 3552ccffb6f48b72dcbc665ef92d296c64965637..c789ba10253eaa708a3a48154802ce3247cb1671 100644 --- a/wm/test/mock/mock_window.h +++ b/wm/test/mock/mock_window.h @@ -79,6 +79,11 @@ public: MOCK_METHOD1(OnWindowStatusDidChange, void(WindowStatus status)); }; +class MockWindowCoordinateChangeListener : public IWindowCoordinateChangeListener { +public: + MOCK_METHOD1(OnWindowCoordinateChange, void(WindowSizeChangeReason reason)); +}; + class MockIOccupiedAreaChangeListener : public IOccupiedAreaChangeListener { public: MOCK_METHOD2(OnSizeChange, void(const sptr& info, diff --git a/wm/test/unittest/layout/window_session_impl_layout_test.cpp b/wm/test/unittest/layout/window_session_impl_layout_test.cpp index 527799e486c79c8d37b4a71dab9f38a6c867d44f..bd175f93fdfcb5292810746ca562ff9d6441deb0 100644 --- a/wm/test/unittest/layout/window_session_impl_layout_test.cpp +++ b/wm/test/unittest/layout/window_session_impl_layout_test.cpp @@ -157,15 +157,17 @@ HWTEST_F(WindowSessionImplLayoutTest, UpdateRect02, TestSize.Level0) window->property_->SetWindowRect(rectW); SizeChangeReason reason = SizeChangeReason::ROTATION; WSError res = window->UpdateRect(rect, reason); - ASSERT_EQ(res, WSError::WS_OK); + EXPECT_EQ(res, WSError::WS_OK); rect.height_ = 50; rect.width_ = 50; rectW.height_ = 50; rectW.width_ = 50; window->property_->SetWindowRect(rectW); - res = window->UpdateRect(rect, reason); - ASSERT_EQ(res, WSError::WS_OK); + const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION }; + const std::map& avoidAreas = {}; + res = window->UpdateRect(rect, reason, config, avoidAreas, false); + EXPECT_EQ(res, WSError::WS_OK); Rect nowRect = window->property_->GetWindowRect(); EXPECT_EQ(nowRect.posX_, rect.posX_); EXPECT_EQ(nowRect.posY_, rect.posY_); @@ -356,21 +358,21 @@ HWTEST_F(WindowSessionImplLayoutTest, NotifyTransformChange_TestUIContent, TestS } /** - * @tc.name: NotifyWindowStatusDidChange - * @tc.desc: NotifyWindowStatusDidChange + * @tc.name: NotifyWindowCoordinateChange + * @tc.desc: NotifyWindowCoordinateChange * @tc.type: FUNC */ -HWTEST_F(WindowSessionImplLayoutTest, NotifyWindowStatusDidChange, TestSize.Level1) +HWTEST_F(WindowSessionImplLayoutTest, NotifyWindowCoordinateChange, TestSize.Level1) { - GTEST_LOG_(INFO) << "WindowSessionImplLayoutTest: NotifyWindowStatusDidChange start"; - auto window = GetTestWindowImpl("NotifyWindowStatusDidChange"); - auto listeners = GetListenerList(); + GTEST_LOG_(INFO) << "WindowSessionImplLayoutTest: NotifyWindowCoordinateChange start"; + auto window = GetTestWindowImpl("NotifyWindowCoordinateChange"); + auto listeners = GetListenerList(); EXPECT_NE(listeners.size(), 0); listeners.insert(listeners.begin(), nullptr); - window->windowStatusDidChangeListeners_.insert({ window->GetPersistentId(), listeners }); - window->NotifyWindowStatusDidChange(WindowMode::WINDOW_MODE_FLOATING); + window->windowCoordinateChangeListeners_.insert({ window->GetPersistentId(), listeners }); + window->NotifyWindowCoordinateChange(WindowSizeChangeReason::UNDEFINED); EXPECT_EQ(WMError::WM_ERROR_INVALID_WINDOW, window->Destroy()); - GTEST_LOG_(INFO) << "WindowSessionImplLayoutTest: NotifyWindowStatusDidChange end"; + GTEST_LOG_(INFO) << "WindowSessionImplLayoutTest: NotifyWindowCoordinateChange end"; } /**