From 7607b4fe54b3064d58a5e0a6323b7f68cd3dec50 Mon Sep 17 00:00:00 2001 From: hubijie Date: Thu, 21 Aug 2025 16:19:05 +0800 Subject: [PATCH 1/4] support uiextension create sub window which in system scene Signed-off-by: hubijie --- interfaces/innerkits/wm/wm_common.h | 1 + utils/include/string_util.h | 20 ++++++ .../common/include/window_session_property.h | 9 +++ .../common/src/window_session_property.cpp | 4 ++ .../js_scene_session_manager.cpp | 31 ++++++++ .../js_scene_session_manager.h | 2 + .../include/scene_session_manager.h | 1 + .../src/scene_session_manager.cpp | 25 +++++++ .../unittest/scene_session_manager_test12.cpp | 71 +++++++++++++++++++ wm/src/window_scene_session_impl.cpp | 2 +- 10 files changed, 165 insertions(+), 1 deletion(-) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index ec76b769c7..7f035bdaf3 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -165,6 +165,7 @@ enum class WindowType : uint32_t { SYSTEM_SUB_WINDOW_BASE = 2500, WINDOW_TYPE_SYSTEM_SUB_WINDOW = SYSTEM_SUB_WINDOW_BASE, + WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW, SYSTEM_SUB_WINDOW_END, SYSTEM_WINDOW_END = SYSTEM_SUB_WINDOW_END, diff --git a/utils/include/string_util.h b/utils/include/string_util.h index 96c5eb161b..75cf6fa038 100644 --- a/utils/include/string_util.h +++ b/utils/include/string_util.h @@ -16,6 +16,7 @@ #ifndef WM_STRING_UTIL_H #define WM_STRING_UTIL_H +#incldue #include namespace OHOS { @@ -23,6 +24,25 @@ namespace Rosen { class StringUtil { public: static std::string Trim(std::string s); + + static inline bool ConvertStringToInt32(const std::string& str, int32_t& num) + { + auto res = std::from_chars(str.data(), str.data() + str.size(), num); + if (res.ec != std::errc()) { + return false; + } + return true; + } + + static inline bool ConvertStringToBool(const std::string& str) + { + std::string tmp = str; + std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower); + if (tmp == "true" || tmp == "1") { + return true; + } + return false; + } }; } // Rosen } // OHOS diff --git a/window_scene/common/include/window_session_property.h b/window_scene/common/include/window_session_property.h index 4a5dc4d6f5..5b3abdfd51 100755 --- a/window_scene/common/include/window_session_property.h +++ b/window_scene/common/include/window_session_property.h @@ -27,6 +27,8 @@ #include #include "pixel_map.h" #include "floating_ball_template_info.h" +#include "string_util.h" +#include "window_manager_hilog.h" namespace OHOS { namespace Rosen { @@ -801,6 +803,8 @@ struct SystemSessionConfig : public Parcelable { bool supportPreloadStartingWindow_ = false; bool supportCreateFloatWindow_ = false; float defaultCornerRadius_ = 0.0f; // default corner radius of window set by system config + bool supportUIExtensionSubWindow_ = false; + using ConvertSystemConfigFunc = void(SystemSessionConfig::*)(SystemSessionConfig& systemConfig, const std::string& configItem); virtual bool Marshalling(Parcel& parcel) const override { @@ -945,6 +949,11 @@ struct SystemSessionConfig : public Parcelable { { return IsPcWindow() || (IsPadWindow() && IsFreeMultiWindowMode()); } + + void ConvertSupportUIExtensionSubWindow(SystemSessionConfig& systemConfig, const std::string& itemValue) + { + systemConfig.supportUIExtensionSubWindow_ = StringUtil::ConvertStringToBool(itemValue); + } }; } // namespace Rosen } // namespace OHOS diff --git a/window_scene/common/src/window_session_property.cpp b/window_scene/common/src/window_session_property.cpp index c7010cc992..70bfe2ee54 100755 --- a/window_scene/common/src/window_session_property.cpp +++ b/window_scene/common/src/window_session_property.cpp @@ -1589,6 +1589,10 @@ void WindowSessionProperty::CopyFrom(const sptr& property isPcAppInpadOrientationLandscape_ = property->isPcAppInpadOrientationLandscape_; isPcAppInpadCompatibleMode_ = property->isPcAppInpadCompatibleMode_; ancoRealBundleName_ = property->ancoRealBundleName_; + { + std::lock_guard lock(missionInfoMutex_); + missionInfo_ = property->missionInfo_; + } } bool WindowSessionProperty::Write(Parcel& parcel, WSPropertyChangeAction action) diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp index be06d1d20e..e9dff81a97 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp @@ -326,6 +326,8 @@ napi_value JsSceneSessionManager::Init(napi_env env, napi_value exportObj) JsSceneSessionManager::SetPiPSettingSwitchStatus); BindNativeFunction(env, exportObj, "UpdateSystemDecorEnable", moduleName, JsSceneSessionManager::UpdateSystemDecorEnable); + BindNativeFunction(env, exportObj, "applyFeatureConfig", moduleName, + JsSceneSessionManager::ApplyFeatureConfig); return NapiGetUndefined(env); } @@ -1455,6 +1457,35 @@ napi_value JsSceneSessionManager::SetSupportFunctionType(napi_env env, napi_call return (me != nullptr) ? me->OnSetSupportFunctionType(env, info) : nullptr; } +napi_value JsSceneSessionManager::ApplyFeatureConfig(napi_env env, napi_callback_info info) +{ + TLOGI(WmsLogTag::WMS_MAIN, "[NAPI]"); + JsSceneSessionManager* me = CheckParamsAndGetThis(env, info); + return (me != nullptr) ? me->OnApplyFeatureConfig(env, info) : nullptr; +} + +napi_value JsSceneSessionManager::OnApplyFeatureConfig(napi_env env, napi_callback_info info) +{ + size_t argc = ARGC_ONE; + napi_value argv[ARGC_ONE] = { nullptr }; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + if (argc < ARGC_ONE) { + TLOGE(WmsLogTag::WMS_MAIN, "Argc is invalid: %{public}zu", argc); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + std::unordered_map configMap; + if (!ConvertStringMapFromJs(env, argv[ARG_INDEX_ZERO], configMap)) { + TLOGE(WmsLogTag::WMS_MAIN, "Failed to convert parameter to configMap"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + SceneSessionManager::GetInstance().ApplyFeatureConfig(configMap); + return NapiGetUndefined(env); +} + bool JsSceneSessionManager::IsCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject) { HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsSceneSessionManager::IsCallbackRegistered[%s]", type.c_str()); diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h index bf82225a4b..8e0172a96c 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h @@ -135,6 +135,7 @@ public: static napi_value GetApplicationInfo(napi_env env, napi_callback_info info); static napi_value SetUIEffectControllerAliveInUI(napi_env env, napi_callback_info info); static napi_value SupportCreateFloatWindow(napi_env env, napi_callback_info info); + static napi_value ApplyFeatureConfig(napi_env env, napi_callback_info info); /* * PC Window @@ -257,6 +258,7 @@ private: napi_value OnSupportZLevel(napi_env env, napi_callback_info info); napi_value OnSetSupportFunctionType(napi_env env, napi_callback_info info); napi_value OnUpdateRecentMainSessionInfos(napi_env env, napi_callback_info info); + napi_value OnApplyFeatureConfig(napi_env env, napi_callback_info info); /* * PC Window diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index 8b4c5cd786..feb38f1c54 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -239,6 +239,7 @@ public: void SetDumpUITreeFunc(const DumpUITreeFunc& func); void SetFindScenePanelRsNodeByZOrderFunc(FindScenePanelRsNodeByZOrderFunc&& func); const AppWindowSceneConfig& GetWindowSceneConfig() const; + void ApplyFeatureConfig(const std::unordered_map& configMap); /* * Window Recover diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 46143f8f5a..b0f0f56f9c 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -196,6 +196,10 @@ const std::unordered_set LAYOUT_INFO_WHITELIST = { "SCBStatusBar" }; +const std::unordered_map convertConfigMap = { + {"supportUIExtensionSubWindow", &SystemSessionConfig::ConvertSupportUIExtensionSubWindow}, +}; + const std::chrono::milliseconds WAIT_TIME(3 * 1000); // 3 * 1000 wait for 3s std::string GetCurrentTime() @@ -3743,6 +3747,10 @@ WSError SceneSessionManager::CreateAndConnectSpecificSession(const sptrSetSubWindowLevel(parentProperty->GetSubWindowLevel() + 1); + if (WindowHelper::IsSystemWindow(parentSession->GetWindowType()) && property->GetIsUIExtFirstSubWindow() && + systemConfig_.supportUIExtensionSubWindow_) { + property->SetWindowType(WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + } } auto initClientDisplayId = UpdateSpecificSessionClientDisplayId(property); bool shouldBlock = false; @@ -10846,6 +10854,23 @@ static void FillUnreliableWindowInfo(const sptr& sceneSession, TLOGD(WmsLogTag::WMS_MAIN, "wid=%{public}d", info->windowId_); } +void SceneSessionManager::ApplyFeatureConfig(const std::unordered_map& configMap) +{ + auto task = [this, where = __func__, configMap] { + for (const auto& [configName, configValue] : configMap ) { + TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s, configEntry is %{public}s: %{public}s", + where, configName.c_str(), configValue.c_str()); + auto convertIter = convertConfigMap.find(configName); + if (convertIter != convertConfigMap.end()) { + auto convertFunc = convertIter->second; + (this->systemConfig_.*convertFunc)(systemConfig_, value); + } + } + return WMError::WM_OK; + }; + taskScheduler_->PostSyncTask(task, "ApplyFeatureConfig"); +} + WMError SceneSessionManager::GetUnreliableWindowInfo(int32_t windowId, std::vector>& infos) { diff --git a/window_scene/test/unittest/scene_session_manager_test12.cpp b/window_scene/test/unittest/scene_session_manager_test12.cpp index c1776be98d..08762034b3 100644 --- a/window_scene/test/unittest/scene_session_manager_test12.cpp +++ b/window_scene/test/unittest/scene_session_manager_test12.cpp @@ -631,6 +631,77 @@ HWTEST_F(SceneSessionManagerTest12, CreateAndConnectSpecificSession03, TestSize. EXPECT_EQ(WSError::WS_DO_NOTHING, res); } +/** + * @tc.name: CreateAndConnectSpecificSession + * @tc.desc: CreateAndConnectSpecificSession + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionManagerTest12, CreateAndConnectSpecificSession04, TestSize.Level1) +{ + sptr sessionStage; + sptr eventChannel; + std::shared_ptr node = nullptr; + sptr property = sptr::MakeSptr(); + sptr session; + SystemSessionConfig systemConfig; + sptr token; + int32_t id = 0; + ASSERT_NE(ssm_, nullptr); + + SessionInfo info; + info.abilityName_ = "test1"; + info.bundleName_ = "test2"; + sptr parentSession = sptr::MakeSptr(info, nullptr); + parentSession->GetSessionProperty()->SetWindowType(WindowType::WINDOW_TYPE_GLOBAL_SEARCH); + ssm_->sceneSessionMap_.insert({ parentSession->GetPersistentId(), parentSession }); + + // Create UI_EXTENSION_SUB_WINDOW success + property->SetWindowType(WindowType::WINDOW_TYPE_FLOAT); + property->SetParentPersistentId(parentSession->GetPersistentId()); + property->SetIsUIExtFirstSubWindow(true); + ssm_->systemConfig_.supportUIExtensionSubWindow_ = true; + ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, + systemConfig, token); + EXPECT_EQ(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + + // Create UI_EXTENSION_SUB_WINDOW failed + property->SetWindowType(WindowType::WINDOW_TYPE_FLOAT); + ssm_->systemConfig_.supportUIExtensionSubWindow_ = false; + ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, + systemConfig, token); + EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + + // Create UI_EXTENSION_SUB_WINDOW failed + property->SetWindowType(WindowType::WINDOW_TYPE_FLOAT); + property->SetIsUIExtFirstSubWindow(false); + ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, + systemConfig, token); + EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + + // Create UI_EXTENSION_SUB_WINDOW failed + property->SetWindowType(WindowType::WINDOW_TYPE_FLOAT); + parentSession->GetSessionProperty()->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE); + ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, + systemConfig, token); + EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); +} + +/** + * @tc.name: ApplyFeatureConfig + * @tc.desc: ApplyFeatureConfig + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionManagerTest12, ApplyFeatureConfig, TestSize.Level1) +{ + ASSERT_NE(ssm_, nullptr); + std::unordered_map configMap = { + {"testKey", "testVal"}, + {"supportUIExtensionSubWindow", "true"} + }; + ssm_->ApplyFeatureConfig(configMap); + EXPECT_TRUE(ssm_->systemConfig_.supportUIExtensionSubWindow_); +} + /** * @tc.name: SetCreateKeyboardSessionListener * @tc.desc: SetCreateKeyboardSessionListener diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 117d76fb87..d94364ef8a 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -663,7 +663,7 @@ WMError WindowSceneSessionImpl::Create(const std::shared_ptrGetWindowName().c_str(), property_->GetPersistentId(), state_, GetWindowMode(), isEnableDefaultDensityWhenCreate_, property_->GetDisplayId()); -- Gitee From 6be3e17eab50ad057de07ca71954c37134943f8c Mon Sep 17 00:00:00 2001 From: hubijie Date: Sat, 23 Aug 2025 10:47:07 +0800 Subject: [PATCH 2/4] support uiextension create sub window which in system scene Signed-off-by: hubijie --- utils/include/string_util.h | 2 +- window_scene/common/include/window_session_property.h | 11 +++-------- window_scene/common/src/window_session_property.cpp | 7 +++++++ .../session_manager/src/scene_session_manager.cpp | 6 +++--- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/utils/include/string_util.h b/utils/include/string_util.h index 75cf6fa038..241044c432 100644 --- a/utils/include/string_util.h +++ b/utils/include/string_util.h @@ -16,7 +16,7 @@ #ifndef WM_STRING_UTIL_H #define WM_STRING_UTIL_H -#incldue +#include #include namespace OHOS { diff --git a/window_scene/common/include/window_session_property.h b/window_scene/common/include/window_session_property.h index 5b3abdfd51..587276bf70 100755 --- a/window_scene/common/include/window_session_property.h +++ b/window_scene/common/include/window_session_property.h @@ -27,8 +27,6 @@ #include #include "pixel_map.h" #include "floating_ball_template_info.h" -#include "string_util.h" -#include "window_manager_hilog.h" namespace OHOS { namespace Rosen { @@ -804,7 +802,9 @@ struct SystemSessionConfig : public Parcelable { bool supportCreateFloatWindow_ = false; float defaultCornerRadius_ = 0.0f; // default corner radius of window set by system config bool supportUIExtensionSubWindow_ = false; - using ConvertSystemConfigFunc = void(SystemSessionConfig::*)(SystemSessionConfig& systemConfig, const std::string& configItem); + using ConvertSystemConfigFunc = void(SystemSessionConfig::*)(const std::string& configItem, + SystemSessionConfig& systemConfig); + void ConvertSupportUIExtensionSubWindow(const std::string& itemValue, SystemSessionConfig& systemConfig); virtual bool Marshalling(Parcel& parcel) const override { @@ -949,11 +949,6 @@ struct SystemSessionConfig : public Parcelable { { return IsPcWindow() || (IsPadWindow() && IsFreeMultiWindowMode()); } - - void ConvertSupportUIExtensionSubWindow(SystemSessionConfig& systemConfig, const std::string& itemValue) - { - systemConfig.supportUIExtensionSubWindow_ = StringUtil::ConvertStringToBool(itemValue); - } }; } // namespace Rosen } // namespace OHOS diff --git a/window_scene/common/src/window_session_property.cpp b/window_scene/common/src/window_session_property.cpp index 70bfe2ee54..76c92662db 100755 --- a/window_scene/common/src/window_session_property.cpp +++ b/window_scene/common/src/window_session_property.cpp @@ -14,6 +14,7 @@ */ #include "common/include/window_session_property.h" +#include "string_util.h" #include "window_manager_hilog.h" #include "wm_common.h" #include "window_helper.h" @@ -2584,5 +2585,11 @@ void WindowSessionProperty::UnmarshallingShadowsInfo(Parcel& parcel, WindowSessi } property->SetWindowShadows(*shadowsInfo); } + +void SystemSessionConfig::ConvertSupportUIExtensionSubWindow(const std::string& itemValue, + SystemSessionConfig& systemConfig) +{ + systemConfig.supportUIExtensionSubWindow_ = StringUtil::ConvertStringToBool(itemValue); +} } // namespace Rosen } // namespace OHOS \ No newline at end of file diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index b0f0f56f9c..5f42f92c77 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -10856,14 +10856,14 @@ static void FillUnreliableWindowInfo(const sptr& sceneSession, void SceneSessionManager::ApplyFeatureConfig(const std::unordered_map& configMap) { - auto task = [this, where = __func__, configMap] { - for (const auto& [configName, configValue] : configMap ) { + auto task = [this, where = __func__, &configMap] { + for (const auto& [configName, configValue] : configMap) { TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s, configEntry is %{public}s: %{public}s", where, configName.c_str(), configValue.c_str()); auto convertIter = convertConfigMap.find(configName); if (convertIter != convertConfigMap.end()) { auto convertFunc = convertIter->second; - (this->systemConfig_.*convertFunc)(systemConfig_, value); + (this->systemConfig_.*convertFunc)(systemConfig_, configValue); } } return WMError::WM_OK; -- Gitee From 900a2400caa668dd75a2cab71aa1bd212d8f9881 Mon Sep 17 00:00:00 2001 From: hubijie Date: Mon, 25 Aug 2025 20:04:26 +0800 Subject: [PATCH 3/4] support uiextension create sub window which in system scene Signed-off-by: hubijie --- interfaces/innerkits/wm/wm_common.h | 2 +- .../common/include/window_session_property.h | 5 ++--- .../common/src/window_session_property.cpp | 5 ++--- .../include/scene_session_manager.h | 2 ++ .../src/scene_session_manager.cpp | 19 ++++++++++--------- .../unittest/scene_session_manager_test12.cpp | 8 ++++---- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index 7f035bdaf3..eaa6a4d25d 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -165,7 +165,7 @@ enum class WindowType : uint32_t { SYSTEM_SUB_WINDOW_BASE = 2500, WINDOW_TYPE_SYSTEM_SUB_WINDOW = SYSTEM_SUB_WINDOW_BASE, - WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW, + WINDOW_TYPE_SCB_SUB_WINDOW, SYSTEM_SUB_WINDOW_END, SYSTEM_WINDOW_END = SYSTEM_SUB_WINDOW_END, diff --git a/window_scene/common/include/window_session_property.h b/window_scene/common/include/window_session_property.h index 587276bf70..46ebf02a97 100755 --- a/window_scene/common/include/window_session_property.h +++ b/window_scene/common/include/window_session_property.h @@ -802,9 +802,8 @@ struct SystemSessionConfig : public Parcelable { bool supportCreateFloatWindow_ = false; float defaultCornerRadius_ = 0.0f; // default corner radius of window set by system config bool supportUIExtensionSubWindow_ = false; - using ConvertSystemConfigFunc = void(SystemSessionConfig::*)(const std::string& configItem, - SystemSessionConfig& systemConfig); - void ConvertSupportUIExtensionSubWindow(const std::string& itemValue, SystemSessionConfig& systemConfig); + + void ConvertSupportUIExtensionSubWindow(const std::string& itemValue); virtual bool Marshalling(Parcel& parcel) const override { diff --git a/window_scene/common/src/window_session_property.cpp b/window_scene/common/src/window_session_property.cpp index 76c92662db..761ba1ae98 100755 --- a/window_scene/common/src/window_session_property.cpp +++ b/window_scene/common/src/window_session_property.cpp @@ -2586,10 +2586,9 @@ void WindowSessionProperty::UnmarshallingShadowsInfo(Parcel& parcel, WindowSessi property->SetWindowShadows(*shadowsInfo); } -void SystemSessionConfig::ConvertSupportUIExtensionSubWindow(const std::string& itemValue, - SystemSessionConfig& systemConfig) +void SystemSessionConfig::ConvertSupportUIExtensionSubWindow(const std::string& itemValue) { - systemConfig.supportUIExtensionSubWindow_ = StringUtil::ConvertStringToBool(itemValue); + supportUIExtensionSubWindow_ = StringUtil::ConvertStringToBool(itemValue); } } // namespace Rosen } // namespace OHOS \ No newline at end of file diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index feb38f1c54..38df580f4d 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -169,6 +169,7 @@ using NotifySessionRecoverStateChangeFunc = std::function; using FindScenePanelRsNodeByZOrderFunc = std::function(DisplayId screenId, uint32_t targetZOrder)>; +using ConvertSystemConfigFunc = std::function; class AppAnrListener : public IRemoteStub { public: @@ -809,6 +810,7 @@ protected: private: std::atomic enterRecent_ { false }; bool isKeyboardPanelEnabled_ = false; + std::unordered_map convertConfigMap_; static sptr CreateInstance(); static inline bool isNotCurrentScreen(sptr sceneSession, ScreenId screenId) { diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 5f42f92c77..f4fe905cce 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -196,10 +196,6 @@ const std::unordered_set LAYOUT_INFO_WHITELIST = { "SCBStatusBar" }; -const std::unordered_map convertConfigMap = { - {"supportUIExtensionSubWindow", &SystemSessionConfig::ConvertSupportUIExtensionSubWindow}, -}; - const std::chrono::milliseconds WAIT_TIME(3 * 1000); // 3 * 1000 wait for 3s std::string GetCurrentTime() @@ -3747,9 +3743,9 @@ WSError SceneSessionManager::CreateAndConnectSpecificSession(const sptrSetSubWindowLevel(parentProperty->GetSubWindowLevel() + 1); - if (WindowHelper::IsSystemWindow(parentSession->GetWindowType()) && property->GetIsUIExtFirstSubWindow() && + if (parentSession->GetSessionInfo().isSystem_ && property->GetIsUIExtFirstSubWindow() && systemConfig_.supportUIExtensionSubWindow_) { - property->SetWindowType(WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + property->SetWindowType(WindowType::WINDOW_TYPE_SCB_SUB_WINDOW); } } auto initClientDisplayId = UpdateSpecificSessionClientDisplayId(property); @@ -10857,13 +10853,18 @@ static void FillUnreliableWindowInfo(const sptr& sceneSession, void SceneSessionManager::ApplyFeatureConfig(const std::unordered_map& configMap) { auto task = [this, where = __func__, &configMap] { + if (convertConfigMap_.empty()) { + convertConfigMap_ = { + {"supportUIExtensionSubWindow", &SystemSessionConfig::ConvertSupportUIExtensionSubWindow}, + }; + } for (const auto& [configName, configValue] : configMap) { TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s, configEntry is %{public}s: %{public}s", where, configName.c_str(), configValue.c_str()); - auto convertIter = convertConfigMap.find(configName); - if (convertIter != convertConfigMap.end()) { + auto convertIter = convertConfigMap_.find(configName); + if (convertIter != convertConfigMap_.end()) { auto convertFunc = convertIter->second; - (this->systemConfig_.*convertFunc)(systemConfig_, configValue); + convertFunc(configValue); } } return WMError::WM_OK; diff --git a/window_scene/test/unittest/scene_session_manager_test12.cpp b/window_scene/test/unittest/scene_session_manager_test12.cpp index 08762034b3..470112c748 100644 --- a/window_scene/test/unittest/scene_session_manager_test12.cpp +++ b/window_scene/test/unittest/scene_session_manager_test12.cpp @@ -662,28 +662,28 @@ HWTEST_F(SceneSessionManagerTest12, CreateAndConnectSpecificSession04, TestSize. ssm_->systemConfig_.supportUIExtensionSubWindow_ = true; ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, systemConfig, token); - EXPECT_EQ(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + EXPECT_EQ(property->GetWindowType(), WindowType::WINDOW_TYPE_SCB_SUB_WINDOW); // Create UI_EXTENSION_SUB_WINDOW failed property->SetWindowType(WindowType::WINDOW_TYPE_FLOAT); ssm_->systemConfig_.supportUIExtensionSubWindow_ = false; ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, systemConfig, token); - EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_SCB_SUB_WINDOW); // Create UI_EXTENSION_SUB_WINDOW failed property->SetWindowType(WindowType::WINDOW_TYPE_FLOAT); property->SetIsUIExtFirstSubWindow(false); ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, systemConfig, token); - EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_SCB_SUB_WINDOW); // Create UI_EXTENSION_SUB_WINDOW failed property->SetWindowType(WindowType::WINDOW_TYPE_FLOAT); parentSession->GetSessionProperty()->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE); ssm_->CreateAndConnectSpecificSession(sessionStage, eventChannel, node, property, id, session, systemConfig, token); - EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_UI_EXTENSION_SUB_WINDOW); + EXPECT_NE(property->GetWindowType(), WindowType::WINDOW_TYPE_SCB_SUB_WINDOW); } /** -- Gitee From b0aee050cd073a5b0e9db46b5ddb31ecac961434 Mon Sep 17 00:00:00 2001 From: hubijie Date: Tue, 26 Aug 2025 14:07:37 +0800 Subject: [PATCH 4/4] support uiextension create sub window which in system scene Signed-off-by: hubijie --- window_scene/session_manager/src/scene_session_manager.cpp | 3 ++- .../src/zidl/scene_session_manager_proxy.cpp | 6 ++++++ .../session_manager/src/zidl/scene_session_manager_stub.cpp | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index f4fe905cce..d6d21f0c4a 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -10855,7 +10855,8 @@ void SceneSessionManager::ApplyFeatureConfig(const std::unordered_mapGetDisplayId() != VIRTUAL_DISPLAY_ID) { property->SetDisplayId(displayId); } + uint32_t windowType = 0; + if (!reply.ReadUint32(windowType)) { + TLOGE(WmsLogTag::WMS_LIFE, "Read windowType failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + property->SetWindowType(static_cast(windowType)); int32_t ret = reply.ReadInt32(); return static_cast(ret); } 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 aab739f17e..c3a79f7532 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 @@ -304,6 +304,7 @@ int SceneSessionManagerStub::HandleCreateAndConnectSpecificSession(MessageParcel reply.WriteParcelable(&systemConfig); reply.WriteUint32(property->GetSubWindowLevel()); reply.WriteUint64(property->GetDisplayId()); + reply.WriteUint32(static_cast(property->GetWindowType())); reply.WriteUint32(static_cast(WSError::WS_OK)); return ERR_NONE; } -- Gitee