From 98a106e1b5c3b9eb8eda9e8b2fff6cd797e9bb6e Mon Sep 17 00:00:00 2001 From: fateddd Date: Thu, 11 Sep 2025 14:42:05 +0800 Subject: [PATCH 1/5] window animationSpeed Signed-off-by: fateddd --- interfaces/innerkits/wm/window_manager.h | 9 ++++ .../include/zidl/session_stage_interface.h | 1 + .../zidl/session_stage_ipc_interface_code.h | 2 + .../include/zidl/session_stage_proxy.h | 1 + .../include/zidl/session_stage_stub.h | 1 + .../src/zidl/session_stage_proxy.cpp | 28 ++++++++++ .../container/src/zidl/session_stage_stub.cpp | 14 +++++ .../session/host/include/scene_session.h | 1 + .../session/host/src/scene_session.cpp | 15 ++++++ .../include/scene_session_manager.h | 1 + .../zidl/scene_session_manager_interface.h | 1 + .../zidl/scene_session_manager_proxy.h | 1 + .../include/zidl/scene_session_manager_stub.h | 1 + .../src/scene_session_manager.cpp | 16 ++++++ .../src/zidl/scene_session_manager_proxy.cpp | 35 +++++++++++++ .../src/zidl/scene_session_manager_stub.cpp | 22 ++++++++ window_scene/test/mock/mock_session_stage.h | 1 + .../scene_session_manager_proxy_test.cpp | 16 ++++++ .../scene_session_manager_stub_test.cpp | 24 +++++++++ .../unittest/scene_session_manager_test7.cpp | 51 +++++++++++++++++++ .../test/unittest/scene_session_test5.cpp | 25 +++++++++ .../unittest/session_stage_proxy_test.cpp | 12 +++++ .../test/unittest/session_stage_stub_test.cpp | 15 ++++++ wm/include/window_adapter.h | 1 + wm/include/window_session_impl.h | 3 ++ wm/src/window_adapter.cpp | 8 +++ wm/src/window_manager.cpp | 9 ++++ wm/src/window_scene_session_impl.cpp | 7 +++ wm/src/window_session_impl.cpp | 27 ++++++++++ wm/test/unittest/window_adapter_test.cpp | 12 +++++ wm/test/unittest/window_manager_test.cpp | 17 +++++++ wm/test/unittest/window_session_impl_test.cpp | 16 ++++++ .../include/zidl/window_manager_interface.h | 1 + 33 files changed, 394 insertions(+) diff --git a/interfaces/innerkits/wm/window_manager.h b/interfaces/innerkits/wm/window_manager.h index ab2484ec00..ee8928470c 100644 --- a/interfaces/innerkits/wm/window_manager.h +++ b/interfaces/innerkits/wm/window_manager.h @@ -1272,6 +1272,15 @@ public: */ WMError MinimizeByWindowId(const std::vector& windowIds); + /** + * @brief Set the animation speed multiplier for a specific process. + * + * @param pid process id. + * @param multiplier The animation speed multiplier. + * @return WM_OK means set success, others means set failed. + */ + WMError UpdateAnimationSpeedMultiplerForPid(pid_t pid, float multiplier); + /** * @brief Set foreground window number. Only main window. Only support freeMultiWindow. * 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 8497291f89..9b495be0dc 100644 --- a/window_scene/session/container/include/zidl/session_stage_interface.h +++ b/window_scene/session/container/include/zidl/session_stage_interface.h @@ -206,6 +206,7 @@ public: return WSError::WS_OK; } virtual void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) = 0; + virtual void ApplyAnimationSpeedMultiplier(float multiplier) = 0; virtual void NotifySessionFullScreen(bool fullScreen) {} // **Non** IPC interface diff --git a/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h b/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h index fa52c3b51c..cfa7a98396 100644 --- a/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h +++ b/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h @@ -98,6 +98,8 @@ enum class SessionStageInterfaceCode { // Floating ball TRANS_ID_SEND_FB_ACTION_EVENT, TRANS_ID_NOTIFY_UPDATE_SHOW_DECOR_IN_FREE_MULTI_WINDOW, + + TRANS_ID_APPLY_ANIMATION_SPEED_MULTIPLIER, }; } // namespace Rosen } // namespace OHOS 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 529d61df44..f326e1136f 100644 --- a/window_scene/session/container/include/zidl/session_stage_proxy.h +++ b/window_scene/session/container/include/zidl/session_stage_proxy.h @@ -80,6 +80,7 @@ public: WSError PcAppInPadNormalClose() override; WSError NotifyCompatibleModePropertyChange(const sptr property) override; void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override; + void ApplyAnimationSpeedMultiplier(float multiplier) override; void NotifySessionFullScreen(bool fullScreen) override; WSError NotifyTargetRotationInfo(OrientationInfo& Info) override; RotationChangeResult NotifyRotationChange(const RotationChangeInfo& rotationChangeInfo) override; diff --git a/window_scene/session/container/include/zidl/session_stage_stub.h b/window_scene/session/container/include/zidl/session_stage_stub.h index 0b7c60efc2..c45d889a39 100644 --- a/window_scene/session/container/include/zidl/session_stage_stub.h +++ b/window_scene/session/container/include/zidl/session_stage_stub.h @@ -80,6 +80,7 @@ private: int HandlePcAppInPadNormalClose(MessageParcel& data, MessageParcel& reply); int HandleNotifyCompatibleModePropertyChange(MessageParcel& data, MessageParcel& reply); int HandleSetUniqueVirtualPixelRatio(MessageParcel& data, MessageParcel& reply); + int HandleApplyAnimationSpeedMultiplier(MessageParcel& data, MessageParcel& reply); int HandleNotifySessionFullScreen(MessageParcel& data, MessageParcel& reply); int HandleNotifyDumpInfo(MessageParcel& data, MessageParcel& reply); int HandleExtensionHostData(MessageParcel& data, MessageParcel& reply, MessageOption& option); 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 53ec21dbf6..e67405d6cf 100644 --- a/window_scene/session/container/src/zidl/session_stage_proxy.cpp +++ b/window_scene/session/container/src/zidl/session_stage_proxy.cpp @@ -1593,6 +1593,34 @@ void SessionStageProxy::SetUniqueVirtualPixelRatio(bool useUniqueDensity, float } } +void SessionStageProxy::ApplyAnimationSpeedMultiplier(float multiplier) +{ + sptr remote = Remote(); + if (remote == nullptr) { + TLOGE(WmsLogTag::WMS_ANIMATION, "remote is nullptr"); + return; + } + + MessageParcel data; + MessageParcel reply; + MessageOption option(MessageOption::TF_ASYNC); + if (!data.WriteInterfaceToken(GetDescriptor())) { + TLOGE(WmsLogTag::WMS_ANIMATION, "WriteInterfaceToken failed"); + return; + } + + if (!data.WriteFloat(multiplier)) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Write multiplier failed"); + return; + } + + if (remote->SendRequest(static_cast(SessionStageInterfaceCode::TRANS_ID_APPLY_ANIMATION_SPEED_MULTIPLIER), + data, reply, option) != ERR_NONE) { + TLOGE(WmsLogTag::WMS_ANIMATION, "SendRequest failed"); + return; + } +} + WSError SessionStageProxy::NotifyDumpInfo(const std::vector& params, std::vector& info) { sptr remote = Remote(); 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 04a4190538..c7d96ae9d7 100644 --- a/window_scene/session/container/src/zidl/session_stage_stub.cpp +++ b/window_scene/session/container/src/zidl/session_stage_stub.cpp @@ -238,6 +238,8 @@ int SessionStageStub::OnRemoteRequest(uint32_t code, MessageParcel& data, Messag return HandleSendFbActionEvent(data, reply); case static_cast(SessionStageInterfaceCode::TRANS_ID_NOTIFY_UPDATE_SHOW_DECOR_IN_FREE_MULTI_WINDOW): return HandleUpdateIsShowDecorInFreeMultiWindow(data, reply); + case static_cast(SessionStageInterfaceCode::TRANS_ID_APPLY_ANIMATION_SPEED_MULTIPLIER): + return HandleApplyAnimationSpeedMultiplier(data, reply); default: WLOGFE("Failed to find function handler!"); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); @@ -865,6 +867,18 @@ int SessionStageStub::HandleSetUniqueVirtualPixelRatio(MessageParcel& data, Mess return ERR_NONE; } +int SessionStageStub::HandleApplyAnimationSpeedMultiplier(MessageParcel& data, MessageParcel& reply) +{ + TLOGD(WmsLogTag::WMS_ANIMATION, "HandleApplyAnimationSpeedMultiplier!"); + float multiplier; + if (!data.ReadFloat(multiplier)) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Read multiplier failed."); + return ERR_INVALID_DATA; + } + ApplyAnimationSpeedMultiplier(multiplier); + return ERR_NONE; +} + int SessionStageStub::HandleSetSplitButtonVisible(MessageParcel& data, MessageParcel& reply) { TLOGD(WmsLogTag::WMS_LAYOUT, "in"); diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index 3de4319d29..869efa0a65 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -494,6 +494,7 @@ public: virtual void SetSkipSelfWhenShowOnVirtualScreen(bool isSkip); virtual void SetSkipEventOnCastPlus(bool isSkip); WMError SetUniqueDensityDpi(bool useUnique, float dpi); + WMErroe ApplyAnimationSpeedMultiplier(float multiplier); bool IsAnco() const override; void SetBlank(bool isAddBlank) override; diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 7bacd2bbf8..c8b9a6075e 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -7512,6 +7512,21 @@ WMError SceneSession::SetUniqueDensityDpi(bool useUnique, float dpi) return WMError::WM_OK; } +WMError SceneSession::ApplyAnimationSpeedMultiplier(float multiplier) +{ + if (!IsSessionValid()) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Session is invalid"); + return WMError::WM_ERROR_INVALID_SESSION; + } + + if (!sessionStage_) { + TLOGE(WmsLogTag::WMS_ANIMATION, "sessionStage_ is nullptr"); + return WMError::WM_ERROR_NULLPTR; + } + sessionStage_->ApplyAnimationSpeedMultiplier(multiplier); + return WMError::WM_OK; +} + WMError SceneSession::SetSystemWindowEnableDrag(bool enableDrag) { if (!WindowHelper::IsSubWindow(GetWindowType()) && !WindowHelper::IsSystemWindow(GetWindowType())) { diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index b8488c0c14..e61f71d8fc 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -754,6 +754,7 @@ public: bool IsMainWindowByPersistentId(int32_t persistentId); WMError MinimizeByWindowId(const std::vector& windowIds) override; void RegisterMinimizeByWindowIdCallback(MinimizeByWindowIdFunc&& func); + WMError UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier) override; void RegisterSceneSessionDestructCallback(NotifySceneSessionDestructFunc&& func); void RegisterTransferSessionToTargetScreenCallback(NotifyTransferSessionToTargetScreenFunc&& func); WMError NotifyTransferSessionToTargetScreen(const TransferSessionInfo& info); diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_interface.h b/window_scene/session_manager/include/zidl/scene_session_manager_interface.h index 8af9a8d0b3..4143541a8c 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_interface.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_interface.h @@ -156,6 +156,7 @@ public: TRANS_ID_REMOVE_SESSION_BLACK_LIST, TRANS_ID_GET_PIP_SWITCH_STATUS, TRANS_ID_RECOVER_WINDOW_PROPERTY_CHANGE_FLAG, + TRANS_ID_UPDATE_ANIMATION_SPEED_MULTIPLIER_FOR_PID, }; virtual WSError SetSessionLabel(const sptr& token, const std::string& label) = 0; diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_proxy.h b/window_scene/session_manager/include/zidl/scene_session_manager_proxy.h index 285e7f6ac8..7aa106082f 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_proxy.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_proxy.h @@ -167,6 +167,7 @@ public: WMError SetStartWindowBackgroundColor( const std::string& moduleName, const std::string& abilityName, uint32_t color, int32_t uid) override; WMError MinimizeByWindowId(const std::vector& windowIds) override; + WMError UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier) override; WMError SetForegroundWindowNum(uint32_t windowNum) override; WSError UseImplicitAnimation(int32_t hostWindowId, bool useImplicit) override; WMError RegisterWindowPropertyChangeAgent(WindowInfoKey windowInfoKey, uint32_t interestInfo, diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_stub.h b/window_scene/session_manager/include/zidl/scene_session_manager_stub.h index 57ca3b9ae6..991bbc57c1 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_stub.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_stub.h @@ -144,6 +144,7 @@ private: int ProcessRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option); int HandleMinimizeByWindowId(MessageParcel& data, MessageParcel& reply); + int HandleUpdateAnimationSpeedMultiplierForPid(MessageParcel& data, MessageParcel& reply); int HandleSetForegroundWindowNum(MessageParcel& data, MessageParcel& reply); int HandleUseImplicitAnimation(MessageParcel& data, MessageParcel& reply); int HandleCreateUIEffectController(MessageParcel& data, MessageParcel& reply); diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 4597ef22bb..e31de07674 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -16992,6 +16992,22 @@ void SceneSessionManager::RegisterMinimizeByWindowIdCallback(MinimizeByWindowIdF minimizeByWindowIdFunc_ = std::move(func); } +WMError SceneSessionManager::UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier) +{ + if (!SessionPermission::IsSystemServiceCalling()) { + TLOGE(WmsLogTag::WMS_ANIMATION, "The caller is not system service."); + return WMError::WM_ERROR_INVALID_PERMISSION; + } + + for (const auto& [_, session] : sceneSessionMap_) { + if (session && session->GetCallingPid() == pid && session->IsVisible()) { + session->ApplyAnimationSpeedMultiplier(multiplier); + return WMError::WM_OK; + } + } + return WMError::WM_OK; +} + const std::vector> SceneSessionManager::GetActiveSceneSessionCopy() { std::map> sceneSessionMapCopy; diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp index ff0e9f6d4d..3eb1093e4a 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp @@ -3669,6 +3669,41 @@ WMError SceneSessionManagerProxy::MinimizeByWindowId(const std::vector& return static_cast(ret); } +WMError SceneSessionManagerProxy::UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Write interfaceToken failed"); + return WMError::WM_ERROR_IPC_FAILED; + } + if (!data.WriteInt32(pid)) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Write pid failed"); + return WMError::WM_ERROR_IPC_FAILED; + } + if (!data.WriteFloat(multiplier)) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Write multiplier failed"); + return WMError::WM_ERROR_IPC_FAILED; + } + sptr remote = Remote(); + if (remote == nullptr) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Remote is null"); + return WMError::WM_ERROR_IPC_FAILED; + } + if (remote->SendRequest(static_cast(SceneSessionManagerMessage::TRANS_ID_UPDATE_ANIMATION_SPEED_MULTIPLIER_FOR_PID), + data, reply, option) != ERR_NONE) { + TLOGE(WmsLogTag::WMS_ANIMATION, "SendRequest failed"); + return WMError::WM_ERROR_IPC_FAILED; + } + int32_t ret = 0; + if (!reply.ReadInt32(ret)) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Read ret failed"); + return WMError::WM_ERROR_IPC_FAILED; + } + return static_cast(ret); +} + WMError SceneSessionManagerProxy::SetForegroundWindowNum(uint32_t windowNum) { MessageParcel data; diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp index 61331467e2..97ef1015af 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp @@ -262,6 +262,8 @@ int SceneSessionManagerStub::ProcessRemoteRequest(uint32_t code, MessageParcel& return HandleGetPiPSettingSwitchStatus(data, reply); case static_cast(SceneSessionManagerMessage::TRANS_ID_RECOVER_WINDOW_PROPERTY_CHANGE_FLAG): return HandleRecoverWindowPropertyChangeFlag(data, reply); + case static_cast(SceneSessionManageerMessage::TRANS_ID_UPDATE_ANIMATION_SPEED_MULTIPLIER_FOR_PID): + return HandleUpdateAnimationSpeedMultiplierForPid(data, reply); default: WLOGFE("Failed to find function handler!"); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); @@ -2280,6 +2282,26 @@ int SceneSessionManagerStub::HandleMinimizeByWindowId(MessageParcel& data, Messa return ERR_NONE; } +int SceneSessionManagerStub::HandleUpdateAnimationSpeedMultiplierForPid(MessageParcel& data, MessageParcel& reply) +{ + int32_t pid = 0; + float multiplier = 1.0f; + if (!data.ReadInt32(pid)) { + TLOGE(WmsLogTag::WMS_ANIMATION, "read pid failed"); + return ERR_INVALID_DATA; + } + if (!data.ReadFloat(multiplier)) { + TLOGE(WmsLogTag::WMS_ANIMATION, "read multiplier failed"); + return ERR_INVALID_DATA; + } + WMError errCode = UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + if (!reply.WriteInt32(static_cast(errCode))) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Write errCode failed."); + return ERR_INVALID_DATA; + } + return ERR_NONE; +} + int SceneSessionManagerStub::HandleSetForegroundWindowNum(MessageParcel& data, MessageParcel& reply) { uint32_t windowNum = 0; diff --git a/window_scene/test/mock/mock_session_stage.h b/window_scene/test/mock/mock_session_stage.h index a0d624abb0..fa886a3ee1 100644 --- a/window_scene/test/mock/mock_session_stage.h +++ b/window_scene/test/mock/mock_session_stage.h @@ -68,6 +68,7 @@ public: MOCK_METHOD2(NotifyDisplayMove, void(DisplayId from, DisplayId to)); MOCK_METHOD1(SwitchFreeMultiWindow, WSError(bool enable)); MOCK_METHOD2(SetUniqueVirtualPixelRatio, void(bool useUniqueDensity, float virtualPixelRatio)); + MOCK_METHOD1(ApplyAnimationSpeedMultiplier, void(float multiplier)); MOCK_METHOD0(PcAppInPadNormalClose, WSError(void)); MOCK_METHOD1(NotifyCompatibleModePropertyChange, WSError(const sptr property)); MOCK_METHOD1(NotifySessionFullScreen, void(bool fullScreen)); diff --git a/window_scene/test/unittest/scene_session_manager_proxy_test.cpp b/window_scene/test/unittest/scene_session_manager_proxy_test.cpp index abb741b146..393277d00e 100644 --- a/window_scene/test/unittest/scene_session_manager_proxy_test.cpp +++ b/window_scene/test/unittest/scene_session_manager_proxy_test.cpp @@ -621,6 +621,22 @@ HWTEST_F(sceneSessionManagerProxyTest, SetStartWindowBackgroundColor, TestSize.L sceneSessionManagerProxy->SetStartWindowBackgroundColor("moduleName", "abilityName", 0xffffffff, 100)); } +/** + * @tc.name: UpdateAnimationSpeedMultiplierForPid + * @tc.desc: normal function + * @tc.type: FUNC + */ +HWTEST_F(sceneSessionManagerProxyTest, UpdateAnimationSpeedMultiplierForPid, TestSize.Level1) +{ + sptr iRemoteObjectMocker = sptr::MakeSptr(); + ASSERT_NE(iRemoteObjectMocker, nullptr); + sptr sceneSessionManagerProxy = + sptr::MakeSptr(iRemoteObjectMocker); + ASSERT_NE(sceneSessionManagerProxy, nullptr); + + EXPECT_EQ(WMError::WM_OK, sceneSessionManagerProxy->UpdateAnimationSpeedMultiplierForPid(10000, 2.0f)); +} + /** * @tc.name: RemoveExtensionWindowStageFromSCB * @tc.desc: normal function diff --git a/window_scene/test/unittest/scene_session_manager_stub_test.cpp b/window_scene/test/unittest/scene_session_manager_stub_test.cpp index 4f901b1675..d491545b28 100644 --- a/window_scene/test/unittest/scene_session_manager_stub_test.cpp +++ b/window_scene/test/unittest/scene_session_manager_stub_test.cpp @@ -2039,6 +2039,30 @@ HWTEST_F(SceneSessionManagerStubTest, HandleSetStartWindowBackgroundColor, TestS EXPECT_EQ(res, ERR_NONE); } +/** + * @tc.name: HandleUpdateAnimationSpeedMultiplierForPid + * @tc.desc: test HandleUpdateAnimationSpeedMultiplierForPid + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionManagerStubTest, HandleUpdateAnimationSpeedMultiplierForPid, TestSize.Level1) +{ + ASSERT_NE(stub_, nullptr); + MessageParcel data; + MessageParcel reply; + + int res = stub_->HandleUpdateAnimationSpeedMultiplierForPid(data, reply); + EXPECT_EQ(res, ERR_INVALID_DATA); + + data.WriteInt32(10000); + res = stub_->HandleUpdateAnimationSpeedMultiplierForPid(data, reply); + EXPECT_EQ(res, ERR_INVALID_DATA); + + data.WriteInt32(10000); + data.WriteFloat(2.0f); + res = stub_->HandleUpdateAnimationSpeedMultiplierForPid(data, reply); + EXPECT_EQ(res, ERR_NONE); +} + /** * @tc.name: HandleNotifyScreenshotEvent * @tc.desc: test HandleNotifyScreenshotEvent diff --git a/window_scene/test/unittest/scene_session_manager_test7.cpp b/window_scene/test/unittest/scene_session_manager_test7.cpp index 396329d7c6..66bb54b9fa 100644 --- a/window_scene/test/unittest/scene_session_manager_test7.cpp +++ b/window_scene/test/unittest/scene_session_manager_test7.cpp @@ -2111,6 +2111,57 @@ HWTEST_F(SceneSessionManagerTest7, MinimizeByWindowId, TestSize.Level1) EXPECT_EQ(WMError::WM_ERROR_INVALID_PARAM, res); } +/** + * @tc.name: UpdateAnimationSpeedMultiplierForPid + * @tc.desc: test function : UpdateAnimationSpeedMultiplierForPid + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionManagerTest7, UpdateAnimationSpeedMultiplierForPid, TestSize.Level1) +{ + ASSERT_NE(nullptr, ssm_); + + MockAccesstokenKit::MockIsSACalling(false); + + float multiplier = 2.0f; + int32_t pid = 1; + + auto result = ssm_->UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + EXPECT_EQ(result, WMError::WM_ERROR_INVALID_PERMISSION); + + MockAccesstokenKit::MockIsSACalling(true); + SessionInfo info; + info.bundleName_ = "SceneSessionManagerTest7"; + info.abilityName_ = "UpdateAnimationSpeedMultiplierForPid"; + sptr sceneSession01 = sptr::MakeSptr(info, nullptr); + sptr sceneSession02 = sptr::MakeSptr(info, nullptr); + sptr sceneSession03 = sptr::MakeSptr(info, nullptr); + sptr sceneSession04 = sptr::MakeSptr(info, nullptr); + ASSERT_NE(sceneSession01, nullptr); + ASSERT_NE(sceneSession02, nullptr); + ASSERT_NE(sceneSession03, nullptr); + ASSERT_NE(sceneSession04, nullptr); + sceneSession01->isVisible_ = false; + sceneSession01->SetCallingPid(2); + ssm_->sceneSessionMap_.insert(std::make_pair(1, sceneSession01)); + result = ssm_->UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + EXPECT_EQ(result, WMError::WM_OK); + sceneSession02->isVisible_ = true; + sceneSession02->SetCallingPid(3); + ssm_->sceneSessionMap_.insert(std::make_pair(2, sceneSession02)); + result = ssm_->UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + EXPECT_EQ(result, WMError::WM_OK); + sceneSession03->isVisible_ = false; + sceneSession03->SetCallingPid(pid); + ssm_->sceneSessionMap_.insert(std::make_pair(3, sceneSession03)); + result = ssm_->UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + EXPECT_EQ(result, WMError::WM_OK); + sceneSession04->isVisible_ = true; + sceneSession04->SetCallingPid(pid); + ssm_->sceneSessionMap_.insert(std::make_pair(4, sceneSession04)); + result = ssm_->UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + EXPECT_EQ(result, WMError::WM_OK); +} + /** * @tc.name: SetForegroundWindowNum * @tc.desc: test function : SetForegroundWindowNum diff --git a/window_scene/test/unittest/scene_session_test5.cpp b/window_scene/test/unittest/scene_session_test5.cpp index 9ded5b7c12..8764f44793 100644 --- a/window_scene/test/unittest/scene_session_test5.cpp +++ b/window_scene/test/unittest/scene_session_test5.cpp @@ -1518,6 +1518,31 @@ HWTEST_F(SceneSessionTest5, SetUniqueDensityDpi, TestSize.Level1) EXPECT_NE(nullptr, session->sessionStage_); } +/** + * @tc.name: ApplyAnimationSpeedMultiplier + * @tc.desc: ApplyAnimationSpeedMultiplier function01 + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionTest5, ApplyAnimationSpeedMultiplier, TestSize.Level1) +{ + SessionInfo info; + info.abilityName_ = "ApplyAnimationSpeedMultiplier"; + info.bundleName_ = "ApplyAnimationSpeedMultiplier"; + sptr session = sptr::MakeSptr(info, nullptr); + EXPECT_NE(session, nullptr); + session->sessionStage_ = nullptr; + EXPECT_EQ(WMError::WM_ERROR_INVALID_SESSION, session->ApplyAnimationSpeedMultiplier(2.0f)); + session->sessionInfo_.isSystem_ = false; + session->state_ = SessionState::STATE_DISCONNECT; + EXPECT_EQ(WMError::WM_ERROR_INVALID_SESSION, session->ApplyAnimationSpeedMultiplier(2.0f)); + session->state_ = SessionState::STATE_CONNECT; + EXPECT_EQ(WMError::WM_ERROR_NULLPTR, session->ApplyAnimationSpeedMultiplier(2.0f)); + + session->sessionStage_ = sptr::MakeSptr(); + EXPECT_NE(nullptr, session->sessionStage_); + EXPECT_EQ(WMError::WM_OK, session->ApplyAnimationSpeedMultiplier(2.0f)); +} + /** * @tc.name: HandleActionUpdateWindowModeSupportType * @tc.desc: HandleActionUpdateWindowModeSupportType function01 diff --git a/window_scene/test/unittest/session_stage_proxy_test.cpp b/window_scene/test/unittest/session_stage_proxy_test.cpp index 3860f645c0..2cb24d16b8 100755 --- a/window_scene/test/unittest/session_stage_proxy_test.cpp +++ b/window_scene/test/unittest/session_stage_proxy_test.cpp @@ -286,6 +286,18 @@ HWTEST_F(SessionStageProxyTest, NotifyOccupiedAreaChangeInfo, TestSize.Level1) sessionStage_->NotifyOccupiedAreaChangeInfo(info, nullptr, {}, {}); } +/** + * @tc.name: ApplyAnimationSpeedMultiplier + * @tc.desc: test function : ApplyAnimationSpeedMultiplier + * @tc.type: FUNC + */ +HWTEST_F(SessionStageProxyTest, ApplyAnimationSpeedMultiplier, TestSize.Level1) +{ + float multiplier = 2.0f; + ASSERT_TRUE(sessionStage_ != nullptr); + sessionStage_->ApplyAnimationSpeedMultiplier(multiplier); +} + /** * @tc.name: NotifyKeyboardAnimationCompleted * @tc.desc: test function : NotifyKeyboardAnimationCompleted diff --git a/window_scene/test/unittest/session_stage_stub_test.cpp b/window_scene/test/unittest/session_stage_stub_test.cpp index 43c7b381be..b37e87c24b 100644 --- a/window_scene/test/unittest/session_stage_stub_test.cpp +++ b/window_scene/test/unittest/session_stage_stub_test.cpp @@ -811,6 +811,21 @@ HWTEST_F(SessionStageStubTest, HandleSetUniqueVirtualPixelRatio, TestSize.Level1 ASSERT_EQ(0, sessionStageStub_->OnRemoteRequest(code, data, reply, option)); } +/** + * @tc.name: HandleApplyAnimationSpeedMultiplier + * @tc.desc: test function : HandleApplyAnimationSpeedMultiplier + * @tc.type: FUNC + */ +HWTEST_F(SessionStageStubTest, HandleApplyAnimationSpeedMultiplier, TestSize.Level1) +{ + MessageParcel data; + MessageParcel reply; + ASSERT_TRUE(sessionStageStub_ != nullptr); + ASSERT_EQ(ERR_INVALID_DATA, sessionStageStub_->HandleApplyAnimationSpeedMultiplier(data, reply)); + data.WriteFloat(2.0f); + ASSERT_EQ(0, sessionStageStub_->HandleApplyAnimationSpeedMultiplier(data, reply)); +} + /** * @tc.name: HandleNotifySessionFullScreen * @tc.desc: test function : HandleNotifySessionFullScreen diff --git a/wm/include/window_adapter.h b/wm/include/window_adapter.h index 6367df9994..31c7777e0c 100644 --- a/wm/include/window_adapter.h +++ b/wm/include/window_adapter.h @@ -153,6 +153,7 @@ public: virtual WMError NotifyWatchGestureConsumeResult(int32_t keyCode, bool isConsumed); virtual WMError NotifyWatchFocusActiveChange(bool isActive); virtual WMError MinimizeByWindowId(const std::vector& windowIds); + virtual WMError UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier); virtual WMError SetForegroundWindowNum(uint32_t windowNum); virtual WMError SetStartWindowBackgroundColor( const std::string& moduleName, const std::string& abilityName, uint32_t color, int32_t uid); diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index 0009e6d412..79f318227f 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -57,6 +57,8 @@ using EnableIfSame = typename std::enable_if, Ret>::type; const std::string SET_UICONTENT_TIMEOUT_LISTENER_TASK_NAME = "SetUIContentTimeoutListener"; constexpr int64_t SET_UICONTENT_TIMEOUT_TIME_MS = 4000; constexpr int64_t SET_UICONTENT_TIMEOUT_TIME_AFTER_FREEZE_MS = 5000; +static std::atomic animationSpeedMultiplier = 1.0f; +static std::atomic isEnableAnimationSpeedMultiplier = false; } struct WindowTitleVisibleFlags { @@ -222,6 +224,7 @@ public: const std::map& avoidAreas = {}) override; void UpdateDensity() override; void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override; + void ApplyAnimationSpeedMultiplier(float multiplier) override; WSError UpdateOrientation() override; WSError UpdateDisplayId(uint64_t displayId) override; WSError UpdateFocus(bool focus) override; diff --git a/wm/src/window_adapter.cpp b/wm/src/window_adapter.cpp index 5f67dcc971..9a18b2df15 100644 --- a/wm/src/window_adapter.cpp +++ b/wm/src/window_adapter.cpp @@ -1365,6 +1365,14 @@ WMError WindowAdapter::MinimizeByWindowId(const std::vector& windowIds) return wmsProxy->MinimizeByWindowId(windowIds); } +WMError WindowAdapter::UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier) +{ + INIT_PROXY_CHECK_RETURN(WMError::WM_ERROR_SAMGR); + auto wmsProxy = GetWindowManagerServiceProxy(); + CHECK_PROXY_RETURN_ERROR_IF_NULL(wmsProxy, WMError::WM_ERROR_SAMGR); + return wmsProxy->UpdateAnimationSpeedMultiplierForPid(pid, multiplier); +} + WMError WindowAdapter::SetForegroundWindowNum(uint32_t windowNum) { INIT_PROXY_CHECK_RETURN(WMError::WM_ERROR_SAMGR); diff --git a/wm/src/window_manager.cpp b/wm/src/window_manager.cpp index aeff5a314c..b979683720 100644 --- a/wm/src/window_manager.cpp +++ b/wm/src/window_manager.cpp @@ -2257,6 +2257,15 @@ WMError WindowManager::MinimizeByWindowId(const std::vector& windowIds) return ret; } +WMError WindowManager::UpdateAnimationSpeedMultiplerForPid(pid_t pid, float multiplier) +{ + WMError ret = SingletonContainer::Get().UpdateAnimationSpeedMultiplerForPid(pid, multiplier); + if (ret != WMError::WM_OK) { + TLOGE(WmsLogTag::WMS_ANIMATION, "failed"); + } + return ret; +} + WMError WindowManager::SetForegroundWindowNum(uint32_t windowNum) { WMError ret = WindowAdapter::GetInstance(userId_)->SetForegroundWindowNum(windowNum); diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 6c22a3d99c..3334e0b4be 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -672,6 +672,13 @@ WMError WindowSceneSessionImpl::Create(const std::shared_ptrGetImplicitAnimator() : nullptr; + if (implicitAnimator != nullptr) { + implicitAnimator->ApplyAnimationSpeedMultiplier(animationSpeedMultiplier.load()); + } + } TLOGI(WmsLogTag::WMS_LIFE, "Window Create success [name:%{public}s, id:%{public}d], state:%{public}u, " "mode:%{public}u, enableDefaultDensity:%{public}d, displayId:%{public}" PRIu64, property_->GetWindowName().c_str(), property_->GetPersistentId(), state_, GetWindowMode(), diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index 71678e79a0..70c7c2025f 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -1486,6 +1486,33 @@ void WindowSessionImpl::SetUniqueVirtualPixelRatio(bool useUniqueDensity, float } } +void WindowSessionImpl::ApplyAnimationSpeedMultiplier(float multiplier) +{ + const char* const where = __func__; + auto task = [weakThis = wptr(this), multiplier, where, this] { + auto window = weakThis.promote(); + if (window == nullptr) { + TLOGW(WmsLogTag::WMS_ANIMATION, "%{public}s: window is nullptr", where); + return; + } + for (const auto& [_, pair] : windowSessionMap_) { + auto& WindowSession = pair.second; + if (WindowSession) { + auto rsUIContext = WindowSession->GetRSUIContext(); + auto implicitAnimator = rsUIContext ? rsUIContext->GetImplicitAnimator() : nullptr; + if (implicitAnimator == nullptr) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Failed to open implicit animtion"); + continue; + } + implicitAnimator->ApplyAnimationSpeedMultiplier(multiplier); + } + } + isEnableAnimationSpeedMultiplier.store(!FoldScreenStateInternel::FloatEqualAbs(multiplier, 1.0f)); + animationSpeedMultiplier.store(multiplier); + }; + handler_->PostTask(task, where, 0, AppExecFwk::EventQueue::Priority::HIGH); +} + void WindowSessionImpl::CopyUniqueDensityParameter(sptr parentWindow) { if (parentWindow) { diff --git a/wm/test/unittest/window_adapter_test.cpp b/wm/test/unittest/window_adapter_test.cpp index fc904dcc4f..effb3490df 100644 --- a/wm/test/unittest/window_adapter_test.cpp +++ b/wm/test/unittest/window_adapter_test.cpp @@ -1123,6 +1123,18 @@ HWTEST_F(WindowAdapterTest, MinimizeByWindowId, TestSize.Level1) ASSERT_EQ(ret, true); } +/** + * @tc.name: UpdateAnimationSpeedMultiplierForPid + * @tc.desc: WindowAdapter/UpdateAnimationSpeedMultiplierForPid + * @tc.type: FUNC + */ +HWTEST_F(WindowAdapterTest, UpdateAnimationSpeedMultiplierForPid, TestSize.Level1) +{ + WindowAdapter windowAdapter; + auto err = windowAdapter.UpdateAnimationSpeedMultiplierForPid(10000, 2.0f); + ASSERT_EQ(WMError::WM_OK, err); +} + /** * @tc.name: ListWindowInfo01 * @tc.desc: WindowAdapter/ListWindowInfo diff --git a/wm/test/unittest/window_manager_test.cpp b/wm/test/unittest/window_manager_test.cpp index 89d9f5f768..1e4af2a564 100644 --- a/wm/test/unittest/window_manager_test.cpp +++ b/wm/test/unittest/window_manager_test.cpp @@ -1699,6 +1699,23 @@ HWTEST_F(WindowManagerTest, MinimizeByWindowId, TestSize.Level1) ASSERT_EQ(WMError::WM_OK, ret_2); } +/** + * @tc.name: UpdateAnimationSpeedMultiplierForPid + * @tc.desc: Check UpdateAnimationSpeedMultiplierForPid + * @tc.type: FUNC + */ +HWTEST_F(WindowManagerTest, UpdateAnimationSpeedMultiplierForPid, TestSize.Level1) +{ + auto& windowManager = WindowManager::GetInstance(); + pid_t pid = 15234; + float multiplier = 2.0f; + WMError ret_1 = windowManager.UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + ASSERT_EQ(WMError::WM_OK, ret_1); + multiplier = 1.0f; + WMError ret_2 = windowManager.UpdateAnimationSpeedMultiplierForPid(pid, multiplier); + ASSERT_EQ(WMError::WM_OK, ret_2); +} + /** * @tc.name: ProcessRegisterWindowInfoChangeCallback01 * @tc.desc: Check ProcessRegisterWindowInfoChangeCallback diff --git a/wm/test/unittest/window_session_impl_test.cpp b/wm/test/unittest/window_session_impl_test.cpp index 6a4ff80435..27ec580ba6 100644 --- a/wm/test/unittest/window_session_impl_test.cpp +++ b/wm/test/unittest/window_session_impl_test.cpp @@ -1960,6 +1960,22 @@ HWTEST_F(WindowSessionImplTest, SetUniqueVirtualPixelRatio, TestSize.Level1) window->SetUniqueVirtualPixelRatio(false, 3.25f); } +/** + * @tc.name: ApplyAnimationSpeedMultiplier + * @tc.desc: ApplyAnimationSpeedMultiplier + * @tc.type: FUNC + */ +HWTEST_F(WindowSessionImplTest, ApplyAnimationSpeedMultiplier, TestSize.Level1) +{ + sptr option = new (std::nothrow) WindowOption(); + ASSERT_NE(option, nullptr); + option->SetWindowName("ApplyAnimationSpeedMultiplier"); + sptr window = new (std::nothrow) WindowSessionImpl(option); + ASSERT_NE(window, nullptr); + window->ApplyAnimationSpeedMultiplier(1.0f); + window->ApplyAnimationSpeedMultiplier(2.0f); +} + /** * @tc.name: EnableDrag * @tc.desc: EnableDrag Test diff --git a/wmserver/include/zidl/window_manager_interface.h b/wmserver/include/zidl/window_manager_interface.h index 8fabfad55d..d15a91077f 100644 --- a/wmserver/include/zidl/window_manager_interface.h +++ b/wmserver/include/zidl/window_manager_interface.h @@ -317,6 +317,7 @@ public: virtual WMError HasFloatingWindowForeground(const sptr& abilityToken, bool& hasOrNot) { return WMError::WM_OK; } virtual WMError MinimizeByWindowId(const std::vector& windowIds) { return WMError::WM_OK; } + virtual WMError UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier) { return WMError::WM_OK; } virtual WMError SetForegroundWindowNum(uint32_t windowNum) { return WMError::WM_OK; } virtual WSError UseImplicitAnimation(int32_t hostWindowId, bool useImplicit) { return WSError::WS_OK; } virtual WMError AnimateTo(int32_t windowId, const WindowAnimationProperty& animationProperty, -- Gitee From 1dd27ef63f2a50bf164bb47637994930e9d09f54 Mon Sep 17 00:00:00 2001 From: fateddd Date: Thu, 11 Sep 2025 15:50:00 +0800 Subject: [PATCH 2/5] fix error Signed-off-by: fateddd --- interfaces/innerkits/wm/window_manager.h | 4 +-- .../session/host/include/scene_session.h | 2 +- .../src/zidl/scene_session_manager_proxy.cpp | 3 +- wm/include/window_scene_session_impl.h | 1 + wm/include/window_session_impl.h | 1 + wm/src/window_scene_session_impl.cpp | 20 ++++++++---- wm/src/window_session_impl.cpp | 32 ++++++++++++------- 7 files changed, 40 insertions(+), 23 deletions(-) diff --git a/interfaces/innerkits/wm/window_manager.h b/interfaces/innerkits/wm/window_manager.h index ee8928470c..aabdb23703 100644 --- a/interfaces/innerkits/wm/window_manager.h +++ b/interfaces/innerkits/wm/window_manager.h @@ -1274,12 +1274,12 @@ public: /** * @brief Set the animation speed multiplier for a specific process. - * + * * @param pid process id. * @param multiplier The animation speed multiplier. * @return WM_OK means set success, others means set failed. */ - WMError UpdateAnimationSpeedMultiplerForPid(pid_t pid, float multiplier); + WMError UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier); /** * @brief Set foreground window number. Only main window. Only support freeMultiWindow. diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index 869efa0a65..18b0c741ce 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -494,7 +494,7 @@ public: virtual void SetSkipSelfWhenShowOnVirtualScreen(bool isSkip); virtual void SetSkipEventOnCastPlus(bool isSkip); WMError SetUniqueDensityDpi(bool useUnique, float dpi); - WMErroe ApplyAnimationSpeedMultiplier(float multiplier); + WMError ApplyAnimationSpeedMultiplier(float multiplier); bool IsAnco() const override; void SetBlank(bool isAddBlank) override; diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp index 3eb1093e4a..cfa36aa249 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_proxy.cpp @@ -3691,7 +3691,8 @@ WMError SceneSessionManagerProxy::UpdateAnimationSpeedMultiplierForPid(pid_t pid TLOGE(WmsLogTag::WMS_ANIMATION, "Remote is null"); return WMError::WM_ERROR_IPC_FAILED; } - if (remote->SendRequest(static_cast(SceneSessionManagerMessage::TRANS_ID_UPDATE_ANIMATION_SPEED_MULTIPLIER_FOR_PID), + if (remote->SendRequest(static_cast( + SceneSessionManagerMessage::TRANS_ID_UPDATE_ANIMATION_SPEED_MULTIPLIER_FOR_PID), data, reply, option) != ERR_NONE) { TLOGE(WmsLogTag::WMS_ANIMATION, "SendRequest failed"); return WMError::WM_ERROR_IPC_FAILED; diff --git a/wm/include/window_scene_session_impl.h b/wm/include/window_scene_session_impl.h index ab6fe0d41e..0ea1a881a0 100644 --- a/wm/include/window_scene_session_impl.h +++ b/wm/include/window_scene_session_impl.h @@ -41,6 +41,7 @@ public: WMError DestroyHookWindow(); WMError NotifyDrawingCompleted() override; WMError SetTextFieldAvoidInfo(double textFieldPositionY, double textFieldHeight) override; + void ApplyAnimationSpeedMultiplierIfEnabled(); void PreProcessCreate(); void SetDefaultProperty(); WMError Minimize() override; diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index 79f318227f..087ac62640 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -225,6 +225,7 @@ public: void UpdateDensity() override; void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override; void ApplyAnimationSpeedMultiplier(float multiplier) override; + void ApplyToAllWindowSessions(float multiplier); WSError UpdateOrientation() override; WSError UpdateDisplayId(uint64_t displayId) override; WSError UpdateFocus(bool focus) override; diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 3334e0b4be..77bc823d7b 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -672,13 +672,7 @@ WMError WindowSceneSessionImpl::Create(const std::shared_ptrGetImplicitAnimator() : nullptr; - if (implicitAnimator != nullptr) { - implicitAnimator->ApplyAnimationSpeedMultiplier(animationSpeedMultiplier.load()); - } - } + ApplyAnimationSpeedMultiplierIfEnabled(); TLOGI(WmsLogTag::WMS_LIFE, "Window Create success [name:%{public}s, id:%{public}d], state:%{public}u, " "mode:%{public}u, enableDefaultDensity:%{public}d, displayId:%{public}" PRIu64, property_->GetWindowName().c_str(), property_->GetPersistentId(), state_, GetWindowMode(), @@ -686,6 +680,18 @@ WMError WindowSceneSessionImpl::Create(const std::shared_ptrGetImplicitAnimator() : nullptr; + if (implicitAnimator != nullptr) { + implicitAnimator->ApplyAnimationSpeedMultiplier(animationSpeedMultiplier.load()); + } +} + WMError WindowSceneSessionImpl::SetPcAppInpadSpecificSystemBarInvisible() { TLOGI(WmsLogTag::WMS_COMPAT, "isPcAppInpadSpecificSystemBarInvisible: %{public}d", diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index 70c7c2025f..c0f300d5a4 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -1495,24 +1495,32 @@ void WindowSessionImpl::ApplyAnimationSpeedMultiplier(float multiplier) TLOGW(WmsLogTag::WMS_ANIMATION, "%{public}s: window is nullptr", where); return; } - for (const auto& [_, pair] : windowSessionMap_) { - auto& WindowSession = pair.second; - if (WindowSession) { - auto rsUIContext = WindowSession->GetRSUIContext(); - auto implicitAnimator = rsUIContext ? rsUIContext->GetImplicitAnimator() : nullptr; - if (implicitAnimator == nullptr) { - TLOGE(WmsLogTag::WMS_ANIMATION, "Failed to open implicit animtion"); - continue; - } - implicitAnimator->ApplyAnimationSpeedMultiplier(multiplier); - } - } + + ApplyToAllWindowSessions(multiplier); + isEnableAnimationSpeedMultiplier.store(!FoldScreenStateInternel::FloatEqualAbs(multiplier, 1.0f)); animationSpeedMultiplier.store(multiplier); }; handler_->PostTask(task, where, 0, AppExecFwk::EventQueue::Priority::HIGH); } +void WindowSessionImpl::ApplyToAllWindowSessions(float multiplier) +{ + for (const auto& [_, pair] : windowSessionMap_) { + auto& WindowSession = pair.second; + if (!WindowSession) { + continue; + } + auto rsUIContext = WindowSession->GetRSUIContext(); + auto implicitAnimator = rsUIContext ? rsUIContext->GetImplicitAnimator() : nullptr; + if (implicitAnimator == nullptr) { + TLOGE(WmsLogTag::WMS_ANIMATION, "Failed to open implicit animtion"); + continue; + } + implicitAnimator->ApplyAnimationSpeedMultiplier(multiplier); + } +} + void WindowSessionImpl::CopyUniqueDensityParameter(sptr parentWindow) { if (parentWindow) { -- Gitee From 6b0d7af380630f2dd8d26e4a9ba8bd39a999b192 Mon Sep 17 00:00:00 2001 From: fateddd Date: Thu, 11 Sep 2025 16:18:26 +0800 Subject: [PATCH 3/5] fix manager Signed-off-by: fateddd --- .../session_manager/src/zidl/scene_session_manager_stub.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp index 97ef1015af..1ddc02cec8 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_stub.cpp @@ -262,7 +262,7 @@ int SceneSessionManagerStub::ProcessRemoteRequest(uint32_t code, MessageParcel& return HandleGetPiPSettingSwitchStatus(data, reply); case static_cast(SceneSessionManagerMessage::TRANS_ID_RECOVER_WINDOW_PROPERTY_CHANGE_FLAG): return HandleRecoverWindowPropertyChangeFlag(data, reply); - case static_cast(SceneSessionManageerMessage::TRANS_ID_UPDATE_ANIMATION_SPEED_MULTIPLIER_FOR_PID): + case static_cast(SceneSessionManagerMessage::TRANS_ID_UPDATE_ANIMATION_SPEED_MULTIPLIER_FOR_PID): return HandleUpdateAnimationSpeedMultiplierForPid(data, reply); default: WLOGFE("Failed to find function handler!"); -- Gitee From acbf68afa220bcc03a8d7c821278d4fe4eeecb26 Mon Sep 17 00:00:00 2001 From: fateddd Date: Thu, 11 Sep 2025 16:36:54 +0800 Subject: [PATCH 4/5] fix Signed-off-by: fateddd --- wm/src/window_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wm/src/window_manager.cpp b/wm/src/window_manager.cpp index b979683720..ead2dd4964 100644 --- a/wm/src/window_manager.cpp +++ b/wm/src/window_manager.cpp @@ -2257,9 +2257,9 @@ WMError WindowManager::MinimizeByWindowId(const std::vector& windowIds) return ret; } -WMError WindowManager::UpdateAnimationSpeedMultiplerForPid(pid_t pid, float multiplier) +WMError WindowManager::UpdateAnimationSpeedMultiplierForPid(pid_t pid, float multiplier) { - WMError ret = SingletonContainer::Get().UpdateAnimationSpeedMultiplerForPid(pid, multiplier); + WMError ret = SingletonContainer::Get().UpdateAnimationSpeedMultiplierForPid(pid, multiplier); if (ret != WMError::WM_OK) { TLOGE(WmsLogTag::WMS_ANIMATION, "failed"); } -- Gitee From c29aeb1fc0c4cbf35f3e24c0d16655e9426a1e0e Mon Sep 17 00:00:00 2001 From: fateddd Date: Thu, 11 Sep 2025 17:10:28 +0800 Subject: [PATCH 5/5] fix RSImplicit Signed-off-by: fateddd --- wm/src/window_scene_session_impl.cpp | 2 +- wm/src/window_session_impl.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 77bc823d7b..6a89bdf7bb 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -686,7 +686,7 @@ void WindowSceneSessionImpl::ApplyAnimationSpeedMultiplierIfEnabled() return; } auto rsUIContext = WindowSessionImpl::GetRSUIContext(); - auto implicitAnimator = rsUIContext ? rsUIContext->GetImplicitAnimator() : nullptr; + auto implicitAnimator = rsUIContext ? rsUIContext->GetRSImplicitAnimator() : nullptr; if (implicitAnimator != nullptr) { implicitAnimator->ApplyAnimationSpeedMultiplier(animationSpeedMultiplier.load()); } diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index c0f300d5a4..61a8c724fa 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -1512,7 +1512,7 @@ void WindowSessionImpl::ApplyToAllWindowSessions(float multiplier) continue; } auto rsUIContext = WindowSession->GetRSUIContext(); - auto implicitAnimator = rsUIContext ? rsUIContext->GetImplicitAnimator() : nullptr; + auto implicitAnimator = rsUIContext ? rsUIContext->GetRSImplicitAnimator() : nullptr; if (implicitAnimator == nullptr) { TLOGE(WmsLogTag::WMS_ANIMATION, "Failed to open implicit animtion"); continue; -- Gitee