diff --git a/interfaces/innerkits/extension/extension_business_info.h b/interfaces/innerkits/extension/extension_business_info.h index efc0c4b577052fcdeeeffafeef00ac5120be361a..ea304e1ea9bde2d7dc534ec8eddc70f50d28b8f3 100644 --- a/interfaces/innerkits/extension/extension_business_info.h +++ b/interfaces/innerkits/extension/extension_business_info.h @@ -20,9 +20,12 @@ namespace OHOS::Rosen::Extension { constexpr const char* const WINDOW_MODE_FIELD = "windowMode"; +constexpr const char* const CROSS_AXIS_FIELD = "crossAxis"; +constexpr const char* const UIEXTENSION_CONFIG_FIELD = "ohos.system.window.uiextension.params"; enum class Businesscode : uint8_t { SYNC_HOST_WINDOW_MODE = 0, // Synchronize the host's window mode + SYNC_CROSS_AXIS_STATE, }; } // namespace OHOS::Rosen::Extension diff --git a/interfaces/innerkits/wm/window.h b/interfaces/innerkits/wm/window.h index d81b362e2a8f197bda38e262054819d280c4cd63..c7784f27753590e121595af92c3e6f0b4c7176f7 100644 --- a/interfaces/innerkits/wm/window.h +++ b/interfaces/innerkits/wm/window.h @@ -3140,6 +3140,20 @@ public: { return WMError::WM_OK; } + + /** + * @brief Get custom extension param. + * + * @param want the want to store param. + */ + virtual void GetExtensionConfig(AAFwk::WantParams& want) {} + + /** + * @brief Update custom extension param. + * + * @param want the want to update param. + */ + virtual void UpdateExtensionConfig(std::shared_ptr want) {} }; } } diff --git a/wm/include/window_extension_session_impl.h b/wm/include/window_extension_session_impl.h index c3df463b28430a4a7b2cf516ac44f2a26f3d8078..982079173a6875653e875484fb465c16e28c9761 100644 --- a/wm/include/window_extension_session_impl.h +++ b/wm/include/window_extension_session_impl.h @@ -22,6 +22,7 @@ #include "accessibility_element_info.h" #include "extension_data_handler.h" +#include "extension/extension_business_info.h" namespace OHOS { namespace Rosen { @@ -131,6 +132,7 @@ public: */ static void UpdateConfigurationSyncForAll(const std::shared_ptr& configuration); void UpdateConfigurationSync(const std::shared_ptr& configuration) override; + CrossAxisState GetCrossAxisState() override; protected: NotifyTransferComponentDataFunc notifyTransferComponentDataFunc_; @@ -159,6 +161,9 @@ private: WMError SetUIContentInner(const std::string& contentInfo, napi_env env, napi_value storage, sptr token, AppExecFwk::Ability* ability, bool initByName = false); void RegisterDataConsumer(); + void RegisterConsumer(Extension::Businesscode code, + const std::function& reply)>& func); + WMError OnCrossAxisStateChange(AAFwk::Want&& data, std::optional& reply); std::shared_ptr dataHandler_; std::unordered_map dataConsumers_; // Read only after init diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index d4612cd0886ac21cfb2e5ee4e69762976568942c..2bdfb0a387c9274b0adab0374948ca7a3914a2f1 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -206,6 +206,8 @@ public: WMError UnregisterScreenshotListener(const sptr& listener) override; void SetAceAbilityHandler(const sptr& handler) override; void SetInputEventConsumer(const std::shared_ptr& inputEventConsumer) override; + void GetExtensionConfig(AAFwk::WantParams& want) override; + void UpdateExtensionConfig(std::shared_ptr want) override; WMError SetBackgroundColor(const std::string& color) override; virtual Orientation GetRequestedOrientation() override; @@ -509,6 +511,7 @@ protected: void UpdateVirtualPixelRatio(const sptr& display); WMError GetVirtualPixelRatio(float& vpr); mutable std::recursive_mutex transformMutex_; + std::atomic crossAxisState_ = CrossAxisState::STATE_INVALID; /* * Window Immersive @@ -693,7 +696,6 @@ private: int16_t rotationAnimationCount_ { 0 }; Transform layoutTransform_; SingleHandTransform singleHandTransform_; - std::atomic crossAxisState_; /* * Window Decor diff --git a/wm/src/window_extension_session_impl.cpp b/wm/src/window_extension_session_impl.cpp index ad7a56bc455c347c603f2d3ca3228d9558ab7a72..b2db8a9608a1fdb1f329c3aea6732758ce0d3ca9 100644 --- a/wm/src/window_extension_session_impl.cpp +++ b/wm/src/window_extension_session_impl.cpp @@ -25,7 +25,6 @@ #endif #include "display_info.h" -#include "extension/extension_business_info.h" #include "input_transfer_station.h" #include "perform_reporter.h" #include "session_permission.h" @@ -1386,6 +1385,41 @@ WMError WindowExtensionSessionImpl::SetWindowMode(WindowMode mode) return WMError::WM_OK; } +WMError WindowExtensionSessionImpl::OnCrossAxisStateChange(AAFwk::Want&& data, std::optional& reply) +{ + auto state = data.GetIntParam(Extension::CROSS_AXIS_FIELD, 0); + if (state == static_cast(crossAxisState_.load())) { + return WMError::WM_OK; + } + if (state < static_cast(CrossAxisState::STATE_INVALID) || + state > static_cast(CrossAxisState::STATE_END)) { + TLOGE(WmsLogTag::WMS_UIEXT, "invalid CrossAxisState:%{public}d", state); + return WMError::WM_ERROR_INVALID_PARAM; + } + crossAxisState_ = static_cast(state); + if (auto uiContent = GetUIContentSharedPtr()) { + uiContent->SendUIExtProprty(static_cast(Extension::Businesscode::SYNC_CROSS_AXIS_STATE), + data, static_cast(SubSystemId::WM_UIEXT)); + } + TLOGI(WmsLogTag::WMS_UIEXT, "CrossAxisState:%{public}d", state); + return WMError::WM_OK; +} + +CrossAxisState WindowExtensionSessionImpl::GetCrossAxisState() +{ + return crossAxisState_.load(); +} + +void WindowExtensionSessionImpl::RegisterConsumer(Extension::Businesscode code, + const std::function& reply)>& func) +{ + auto consumer = [this, func](SubSystemId id, uint32_t customId, AAFwk::Want&& data, + std::optional& reply) { + return static_cast(func(std::move(data), reply)); + }; + dataConsumers_.emplace(static_cast(code), std::move(consumer)); +} + void WindowExtensionSessionImpl::RegisterDataConsumer() { auto windowModeConsumer = [this](SubSystemId id, uint32_t customId, AAFwk::Want&& data, @@ -1402,6 +1436,9 @@ void WindowExtensionSessionImpl::RegisterDataConsumer() }; dataConsumers_.emplace(static_cast(Extension::Businesscode::SYNC_HOST_WINDOW_MODE), std::move(windowModeConsumer)); + RegisterConsumer(Extension::Businesscode::SYNC_CROSS_AXIS_STATE, + std::bind(&WindowExtensionSessionImpl::OnCrossAxisStateChange, + this, std::placeholders::_1, std::placeholders::_2)); auto consumersEntry = [weakThis = wptr(this)](SubSystemId id, uint32_t customId, AAFwk::Want&& data, std::optional& reply) -> int32_t { diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index 46d74504ae2ed23c17794b4f2b24b7b4a2df945f..1897ef36ad493aab02a0afccc1ff9e8b463fd453 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #ifdef IMF_ENABLE #include #endif // IMF_ENABLE @@ -33,6 +34,7 @@ #include "common/include/fold_screen_state_internel.h" #include "display_info.h" #include "display_manager.h" +#include "extension/extension_business_info.h" #include "hitrace_meter.h" #include "session_permission.h" #include "key_event.h" @@ -2863,6 +2865,12 @@ void WindowSessionImpl::NotifyWindowCrossAxisChange(CrossAxisState state) TLOGI(WmsLogTag::WMS_LAYOUT, "id: %{public}d, cross axis state %{public}d", GetPersistentId(), static_cast(state)); crossAxisState_ = state; + AAFwk::Want want; + want.SetParam(Extension::CROSS_AXIS_FIELD, static_cast(state)); + if (auto uiContent = GetUIContentSharedPtr()) { + uiContent->SendUIExtProprty(static_cast(Extension::Businesscode::SYNC_CROSS_AXIS_STATE), + want, static_cast(SubSystemId::WM_UIEXT)); + } std::lock_guard lockListener(windowTitleButtonRectChangeListenerMutex_); auto windowCrossAxisListeners = GetListeners(); for (const auto& listener : windowCrossAxisListeners) { @@ -5022,5 +5030,27 @@ void WindowSessionImpl::RegisterWindowInspectorCallback() }; WindowInspector::GetInstance().RegisterGetWMSWindowListCallback(GetWindowId(), std::move(getWMSWindowListCallback)); } + +void WindowSessionImpl::GetExtensionConfig(AAFwk::WantParams& want) +{ + want.SetParam(Extension::CROSS_AXIS_FIELD, AAFwk::Integer::Box(static_cast(crossAxisState_.load()))); +} + +void WindowSessionImpl::UpdateExtensionConfig(std::shared_ptr want) +{ + if (want == nullptr) { + TLOGE(WmsLogTag::WMS_UIEXT, "null want ptr"); + return; + } + auto wantParam = want->GetParams(); + auto configParam = wantParam.GetWantParams(Extension::UIEXTENSION_CONFIG_FIELD); + auto state = configParam.GetIntParam(Extension::CROSS_AXIS_FIELD, 0); + if (state >= static_cast(CrossAxisState::STATE_INVALID) && + state <= static_cast(CrossAxisState::STATE_END)) { + crossAxisState_ = static_cast(state); + } + want->RemoveParam(Extension::UIEXTENSION_CONFIG_FIELD); + TLOGI(WmsLogTag::WMS_UIEXT, "CrossAxisState:%{public}d", state); +} } // namespace Rosen } // namespace OHOS diff --git a/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp b/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp index 8cd6ba149ffbb123b008fc337a367353947b2b34..61a1cf824eb1f57b428383e89c3da6281e7a82f8 100644 --- a/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp +++ b/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp @@ -2252,6 +2252,34 @@ HWTEST_F(WindowExtensionSessionImplTest, NotifyExtensionDataConsumer01, Function // Verify window mode was updated ASSERT_EQ(WindowMode::WINDOW_MODE_FLOATING, window_->GetWindowMode()); } + +/** + * @tc.name: RegisterConsumer + * @tc.desc: RegisterConsumer Test + * @tc.type: FUNC + */ +HWTEST_F(WindowExtensionSessionImplTest, RegisterConsumer, Function | SmallTest | Level3) +{ + window_->RegisterConsumer(Extension::Businesscode::SYNC_CROSS_AXIS_STATE, + std::bind(&WindowExtensionSessionImpl::OnCrossAxisStateChange, + window_, std::placeholders::_1, std::placeholders::_2)); + ASSERT_NE(nullptr, + window_->dataConsumers_[static_cast(Extension::Businesscode::SYNC_CROSS_AXIS_STATE)]); +} + +/** + * @tc.name: OnCrossAxisStateChange + * @tc.desc: OnCrossAxisStateChange Test + * @tc.type: FUNC + */ +HWTEST_F(WindowExtensionSessionImplTest, OnCrossAxisStateChange, Function | SmallTest | Level3) +{ + AAFwk::Want want; + std::optional reply = std::make_optional(); + want.SetParam(Extension::CROSS_AXIS_FIELD, static_cast(CrossAxisState::STATE_END)); + ASSERT_EQ(WMError::WM_OK, window_->OnCrossAxisStateChange(std::move(want), reply)); + ASSERT_EQ(CrossAxisState::STATE_END, window_->crossAxisState_.load()); +} } } // namespace Rosen } // namespace OHOS \ No newline at end of file diff --git a/wm/test/unittest/window_session_impl_test.cpp b/wm/test/unittest/window_session_impl_test.cpp index c78b398af5944ff33119b4c69e4514a1272138e3..4af3f2b2e90ad0f989015d6403e42d33768f3e02 100644 --- a/wm/test/unittest/window_session_impl_test.cpp +++ b/wm/test/unittest/window_session_impl_test.cpp @@ -16,10 +16,13 @@ #include #include #include +#include +#include #include "ability_context_impl.h" #include "accessibility_event_info.h" #include "color_parser.h" +#include "extension/extension_business_info.h" #include "mock_session.h" #include "mock_uicontent.h" #include "mock_window.h" @@ -2041,6 +2044,74 @@ HWTEST_F(WindowSessionImplTest, GetBackgroundColor03, Function | SmallTest | Lev sptr window = sptr::MakeSptr(option); EXPECT_EQ(0xffffffff, window->GetBackgroundColor()); } + +/** + * @tc.name: GetExtensionConfig + * @tc.desc: GetExtensionConfig test + * @tc.type: FUNC + */ +HWTEST_F(WindowSessionImplTest, GetExtensionConfig, Function | SmallTest | Level3) +{ + sptr option = sptr::MakeSptr(); + option->SetWindowName("GetExtensionConfig"); + sptr window = sptr::MakeSptr(option); + window->crossAxisState_ = CrossAxisState::STATE_CROSS; + AAFwk::WantParams want; + window->GetExtensionConfig(want); + EXPECT_EQ(want.GetIntParam(Extension::CROSS_AXIS_FIELD, 0), static_cast(CrossAxisState::STATE_CROSS)); + window->crossAxisState_ = CrossAxisState::STATE_INVALID; + window->GetExtensionConfig(want); + EXPECT_EQ(want.GetIntParam(Extension::CROSS_AXIS_FIELD, 0), static_cast(CrossAxisState::STATE_INVALID)); + window->crossAxisState_ = CrossAxisState::STATE_NO_CROSS; + window->GetExtensionConfig(want); + EXPECT_EQ(want.GetIntParam(Extension::CROSS_AXIS_FIELD, 0), static_cast(CrossAxisState::STATE_NO_CROSS)); + window->crossAxisState_ = CrossAxisState::STATE_END; + window->GetExtensionConfig(want); + EXPECT_EQ(want.GetIntParam(Extension::CROSS_AXIS_FIELD, 0), static_cast(CrossAxisState::STATE_END)); +} + +/** + * @tc.name: UpdateExtensionConfig + * @tc.desc: UpdateExtensionConfig test + * @tc.type: FUNC + */ +HWTEST_F(WindowSessionImplTest, UpdateExtensionConfig, Function | SmallTest | Level3) +{ + sptr option = sptr::MakeSptr(); + option->SetWindowName("UpdateExtensionConfig"); + sptr window = sptr::MakeSptr(option); + window->crossAxisState_ = CrossAxisState::STATE_INVALID; + auto want = std::make_shared(); + window->UpdateExtensionConfig(want); + EXPECT_EQ(window->crossAxisState_.load(), CrossAxisState::STATE_INVALID); + + AAFwk::WantParams configParam; + AAFwk::WantParams wantParam(want->GetParams()); + configParam.SetParam(Extension::CROSS_AXIS_FIELD, + AAFwk::Integer::Box(static_cast(CrossAxisState::STATE_CROSS))); + wantParam.SetParam(Extension::UIEXTENSION_CONFIG_FIELD, AAFwk::WantParamWrapper::Box(configParam)); + want->SetParams(wantParam); + window->UpdateExtensionConfig(want); + EXPECT_EQ(window->crossAxisState_.load(), CrossAxisState::STATE_CROSS); + configParam.SetParam(Extension::CROSS_AXIS_FIELD, + AAFwk::Integer::Box(static_cast(CrossAxisState::STATE_INVALID))); + wantParam.SetParam(Extension::UIEXTENSION_CONFIG_FIELD, AAFwk::WantParamWrapper::Box(configParam)); + want->SetParams(wantParam); + window->UpdateExtensionConfig(want); + EXPECT_EQ(window->crossAxisState_.load(), CrossAxisState::STATE_INVALID); + configParam.SetParam(Extension::CROSS_AXIS_FIELD, + AAFwk::Integer::Box(static_cast(CrossAxisState::STATE_NO_CROSS))); + wantParam.SetParam(Extension::UIEXTENSION_CONFIG_FIELD, AAFwk::WantParamWrapper::Box(configParam)); + want->SetParams(wantParam); + window->UpdateExtensionConfig(want); + EXPECT_EQ(window->crossAxisState_.load(), CrossAxisState::STATE_NO_CROSS); + configParam.SetParam(Extension::CROSS_AXIS_FIELD, + AAFwk::Integer::Box(static_cast(CrossAxisState::STATE_END))); + wantParam.SetParam(Extension::UIEXTENSION_CONFIG_FIELD, AAFwk::WantParamWrapper::Box(configParam)); + want->SetParams(wantParam); + window->UpdateExtensionConfig(want); + EXPECT_EQ(window->crossAxisState_.load(), CrossAxisState::STATE_END); +} } // namespace } // namespace Rosen } // namespace OHOS