From acc214234611359e36eff1a271d698495aa357b9 Mon Sep 17 00:00:00 2001 From: hfwang0318 Date: Fri, 14 Feb 2025 16:11:44 +0800 Subject: [PATCH 1/4] ability color mode Signed-off-by: hfwang0318 --- interfaces/innerkits/wm/window.h | 17 ++++- interfaces/innerkits/wm/window_scene.h | 9 +++ previewer/include/window.h | 9 ++- previewer/include/window_impl.h | 5 +- previewer/include/window_scene.h | 2 + previewer/src/window.cpp | 5 +- previewer/src/window_impl.cpp | 33 +++++++++- previewer/src/window_scene.cpp | 10 +++ test/common/mock/mock_uicontent.h | 2 + wm/include/root_scene.h | 5 +- wm/include/window_extension_session_impl.h | 5 +- wm/include/window_impl.h | 5 +- wm/include/window_scene_session_impl.h | 6 +- wm/src/root_scene.cpp | 45 +++++++++++-- wm/src/window.cpp | 11 ++-- wm/src/window_extension_session_impl.cpp | 33 +++++++++- wm/src/window_impl.cpp | 34 +++++++++- wm/src/window_scene.cpp | 11 ++++ wm/src/window_scene_session_impl.cpp | 59 +++++++++++++---- wm/test/unittest/root_scene_test.cpp | 17 +++++ .../window_extension_session_impl_test.cpp | 24 +++++++ wm/test/unittest/window_impl_test3.cpp | 64 +++++++++++++++++++ .../window_scene_session_impl_test2.cpp | 42 ++++++++++++ wm/test/unittest/window_scene_test.cpp | 20 ++++++ 24 files changed, 435 insertions(+), 38 deletions(-) diff --git a/interfaces/innerkits/wm/window.h b/interfaces/innerkits/wm/window.h index a09e18efd3..f79ee59394 100644 --- a/interfaces/innerkits/wm/window.h +++ b/interfaces/innerkits/wm/window.h @@ -39,6 +39,10 @@ class Ability; enum class SupportWindowMode; } +namespace OHOS::Global::Resource { +class ResourceManager; +} // namespace OHOS::Global::Resource + namespace OHOS::AbilityRuntime { class AbilityContext; class Context; @@ -689,8 +693,10 @@ public: * @brief Update configuration for all windows * * @param configuration configuration for app + * @param ignoreWindowContexts context of window which will be ignored */ - static void UpdateConfigurationForAll(const std::shared_ptr& configuration); + static void UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts = {}); /** * @brief Update theme configuration for all windows @@ -1441,6 +1447,15 @@ public: */ virtual void UpdateConfiguration(const std::shared_ptr& configuration) {} + /** + * @brief Update Configuration. + * + * @param configuration Window configuration. + * @param resourceManager The resource manager + */ + virtual void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) {} + /** * @brief Update theme configuration. * @param configuration Window configuration. diff --git a/interfaces/innerkits/wm/window_scene.h b/interfaces/innerkits/wm/window_scene.h index 2ab6f51ab2..d45dab544e 100644 --- a/interfaces/innerkits/wm/window_scene.h +++ b/interfaces/innerkits/wm/window_scene.h @@ -137,6 +137,15 @@ public: */ void UpdateConfiguration(const std::shared_ptr& configuration); + /** + * Update ability configuration for specified window. + * + * @param configuration the configuration of ability + * @param resourceManager the resource manager + */ + void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager); + /** * Set main window system bar property * diff --git a/previewer/include/window.h b/previewer/include/window.h index fa9cfc53ea..e8c4065777 100644 --- a/previewer/include/window.h +++ b/previewer/include/window.h @@ -39,6 +39,10 @@ class Ability; enum class SupportWindowMode; } +namespace OHOS::Global::Resource { +class ResourceManager; +} // namespace OHOS::Global::Resource + namespace OHOS::AbilityRuntime { class AbilityContext; class Context; @@ -128,7 +132,8 @@ public: static sptr GetTopWindowWithContext(const std::shared_ptr& context = nullptr); static sptr GetTopWindowWithId(uint32_t mainWinId); static std::vector> GetSubWindow(uint32_t parentId); - static void UpdateConfigurationForAll(const std::shared_ptr& configuration); + static void UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts = {}); static void UpdateConfigurationSyncForAll(const std::shared_ptr& configuration); virtual std::shared_ptr GetSurfaceNode() const = 0; virtual const std::shared_ptr GetContext() const = 0; @@ -223,6 +228,8 @@ public: virtual int64_t GetVSyncPeriod() = 0; virtual void FlushFrameRate(uint32_t rate, int32_t animatorExpectedFrameRate, uint32_t rateType) {} virtual void UpdateConfiguration(const std::shared_ptr& configuration) = 0; + virtual void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) = 0; virtual void UpdateConfigurationSync(const std::shared_ptr& configuration) = 0; virtual WMError RegisterLifeCycleListener(const sptr& listener) = 0; virtual WMError UnregisterLifeCycleListener(const sptr& listener) = 0; diff --git a/previewer/include/window_impl.h b/previewer/include/window_impl.h index d10c79d5bd..ecb31c5188 100644 --- a/previewer/include/window_impl.h +++ b/previewer/include/window_impl.h @@ -58,7 +58,8 @@ public: static sptr GetTopWindowWithContext(const std::shared_ptr& context = nullptr); static sptr GetTopWindowWithId(uint32_t mainWinId); static std::vector> GetSubWindow(uint32_t parantId); - static void UpdateConfigurationForAll(const std::shared_ptr& configuration); + static void UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts = {}); virtual std::shared_ptr GetSurfaceNode() const override; virtual Rect GetRect() const override; virtual Rect GetRequestRect() const override; @@ -175,6 +176,8 @@ public: virtual void RequestVsync(const std::shared_ptr& vsyncCallback) override; virtual int64_t GetVSyncPeriod() override; virtual void UpdateConfiguration(const std::shared_ptr& configuration) override; + void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) override; void UpdateAvoidArea(const sptr& avoidArea, AvoidAreaType type) override; void NotifyTouchDialogTarget(int32_t posX = 0, int32_t posY = 0) override; WMError SetUIContentByName(const std::string& contentInfo, napi_env env, napi_value storage, diff --git a/previewer/include/window_scene.h b/previewer/include/window_scene.h index 10aa3610c9..c868b45d0b 100644 --- a/previewer/include/window_scene.h +++ b/previewer/include/window_scene.h @@ -42,6 +42,8 @@ public: std::vector> GetSubWindow(); WMError GoDestroy(); void UpdateConfiguration(const std::shared_ptr& configuration); + void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager); private: std::string GenerateMainWindowName(const std::shared_ptr& context) const; diff --git a/previewer/src/window.cpp b/previewer/src/window.cpp index 362429fcbd..b2d250e8ad 100644 --- a/previewer/src/window.cpp +++ b/previewer/src/window.cpp @@ -67,9 +67,10 @@ sptr Window::GetTopWindowWithContext(const std::shared_ptr& configuration) +void Window::UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts) { - return WindowImpl::UpdateConfigurationForAll(configuration); + return WindowImpl::UpdateConfigurationForAll(configuration, ignoreWindowContexts); } void Window::UpdateConfigurationSyncForAll(const std::shared_ptr& configuration) diff --git a/previewer/src/window_impl.cpp b/previewer/src/window_impl.cpp index 9364dece0c..ce89b6705a 100644 --- a/previewer/src/window_impl.cpp +++ b/previewer/src/window_impl.cpp @@ -15,6 +15,8 @@ #include "window_impl.h" +#include + #include "dm_common.h" #include "window_manager_hilog.h" #include "window_helper.h" @@ -77,7 +79,7 @@ sptr WindowImpl::Find(const std::string& name) const std::shared_ptr WindowImpl::GetContext() const { - return nullptr; + return context_; } sptr WindowImpl::FindWindowById(uint32_t windowId) @@ -112,12 +114,26 @@ std::vector> WindowImpl::GetSubWindow(uint32_t parentId) return std::vector>(); } -void WindowImpl::UpdateConfigurationForAll(const std::shared_ptr& configuration) +void WindowImpl::UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts) { + std::unordered_set> ignoreWindowCtxSet( + ignoreWindowContexts.begin(), ignoreWindowContexts.end()); std::lock_guard lock(globalMutex_); for (const auto& winPair : windowMap_) { auto window = winPair.second.second; - window->UpdateConfiguration(configuration); + if (window == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "window is null"); + continue; + } + auto context = window->GetContext(); + if (context == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "context is null, winId: %{public}u", window->GetWindowId()); + continue; + } + if (ignoreWindowCtxSet.count(context) == 0) { + window->UpdateConfiguration(configuration); + } } } @@ -879,6 +895,17 @@ void WindowImpl::UpdateConfiguration(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) +{ + if (uiContent_ == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "uiContent is null, winId: %{public}u", GetWindowId()); + return; + } + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "notify ace winId: %{public}u", GetWindowId()); + uiContent_->UpdateConfiguration(configuration, resourceManager); +} + void WindowImpl::UpdateAvoidArea(const sptr& avoidArea, AvoidAreaType type) { if (!avoidArea) { diff --git a/previewer/src/window_scene.cpp b/previewer/src/window_scene.cpp index 19069069e8..f1f4a79672 100644 --- a/previewer/src/window_scene.cpp +++ b/previewer/src/window_scene.cpp @@ -129,5 +129,15 @@ void WindowScene::UpdateConfiguration(const std::shared_ptrGetWindowId()); mainWindow_->UpdateConfiguration(configuration); } + +void WindowScene::UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) +{ + if (mainWindow_ == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "main window is null"); + return; + } + mainWindow_->UpdateConfigurationForSpecified(configuration, resourceManager); +} } // namespace Rosen } // namespace OHOS diff --git a/test/common/mock/mock_uicontent.h b/test/common/mock/mock_uicontent.h index 095a1ae2a4..6c01c505f9 100644 --- a/test/common/mock/mock_uicontent.h +++ b/test/common/mock/mock_uicontent.h @@ -51,6 +51,8 @@ public: MOCK_METHOD1(ProcessAxisEvent, bool(const std::shared_ptr& axisEvent)); MOCK_METHOD1(ProcessVsyncEvent, bool(uint64_t timeStampNanos)); MOCK_METHOD1(UpdateConfiguration, void(const std::shared_ptr& config)); + MOCK_METHOD2(UpdateConfiguration, void(const std::shared_ptr& config, + const std::shared_ptr& resourceManager)); MOCK_METHOD1(UpdateConfigurationSyncForAll, void(const std::shared_ptr& config)); MOCK_METHOD4(UpdateViewportConfig, void(const ViewportConfig& config, OHOS::Rosen::WindowSizeChangeReason reason, const std::shared_ptr& rsTransaction, diff --git a/wm/include/root_scene.h b/wm/include/root_scene.h index 86d4700771..ce03d13f14 100644 --- a/wm/include/root_scene.h +++ b/wm/include/root_scene.h @@ -49,8 +49,11 @@ public: void LoadContent(const std::string& contentUrl, napi_env env, napi_value storage, AbilityRuntime::Context* context); void UpdateViewportConfig(const Rect& rect, WindowSizeChangeReason reason); - static void UpdateConfigurationForAll(const std::shared_ptr& configuration); + static void UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts = {}); void UpdateConfiguration(const std::shared_ptr& configuration) override; + void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) override; void RequestVsync(const std::shared_ptr& vsyncCallback) override; int64_t GetVSyncPeriod() override; diff --git a/wm/include/window_extension_session_impl.h b/wm/include/window_extension_session_impl.h index 0a6b30ecfd..8e281103ab 100644 --- a/wm/include/window_extension_session_impl.h +++ b/wm/include/window_extension_session_impl.h @@ -99,7 +99,10 @@ public: WMError RegisterOccupiedAreaChangeListener(const sptr& listener) override; WMError UnregisterOccupiedAreaChangeListener(const sptr& listener) override; void UpdateConfiguration(const std::shared_ptr& configuration) override; - static void UpdateConfigurationForAll(const std::shared_ptr& configuration); + void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) override; + static void UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts = {}); WMError Show(uint32_t reason = 0, bool withAnimation = false, bool withFocus = true) override; WMError Hide(uint32_t reason, bool withAnimation, bool isFromInnerkits) override; WSError NotifyDensityFollowHost(bool isFollowHost, float densityValue) override; diff --git a/wm/include/window_impl.h b/wm/include/window_impl.h index 36c6752f2b..b9166c64f2 100644 --- a/wm/include/window_impl.h +++ b/wm/include/window_impl.h @@ -118,7 +118,8 @@ public: static sptr GetTopWindowWithId(uint32_t mainWinId); static sptr GetWindowWithId(uint32_t winId); static std::vector> GetSubWindow(uint32_t parantId); - static void UpdateConfigurationForAll(const std::shared_ptr& configuration); + static void UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts = {}); virtual std::shared_ptr GetSurfaceNode() const override; virtual Rect GetRect() const override; virtual Rect GetRequestRect() const override; @@ -264,6 +265,8 @@ public: void UpdateFocusStatus(bool focused); virtual bool IsFocused() const override; virtual void UpdateConfiguration(const std::shared_ptr& configuration) override; + void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) override; void UpdateAvoidArea(const sptr& avoidArea, AvoidAreaType type); void UpdateWindowState(WindowState state); WmErrorCode UpdateSubWindowStateAndNotify(uint32_t parentId); diff --git a/wm/include/window_scene_session_impl.h b/wm/include/window_scene_session_impl.h index 9b9de4ea2a..3d616a6aca 100644 --- a/wm/include/window_scene_session_impl.h +++ b/wm/include/window_scene_session_impl.h @@ -69,7 +69,8 @@ public: WMError SetDialogBackGestureEnabled(bool isEnabled) override; WMError GetWindowLimits(WindowLimits& windowLimits) override; WMError SetWindowLimits(WindowLimits& windowLimits, bool isForce) override; - static void UpdateConfigurationForAll(const std::shared_ptr& configuration); + static void UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts = {}); static sptr GetTopWindowWithContext(const std::shared_ptr& context = nullptr); static sptr GetTopWindowWithId(uint32_t mainWinId); static sptr GetMainWindowWithContext(const std::shared_ptr& context = nullptr); @@ -78,6 +79,8 @@ public: // only main window, sub window, dialog window can use static int32_t GetParentMainWindowId(int32_t windowId); virtual void UpdateConfiguration(const std::shared_ptr& configuration) override; + void UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) override; WMError NotifyMemoryLevel(int32_t level) override; virtual WMError AddWindowFlag(WindowFlag flag) override; @@ -342,6 +345,7 @@ private: bool IsDefaultDensityEnabled(); float GetMainWindowCustomDensity(); float customDensity_ = UNDEFINED_DENSITY; + std::string specifiedColorMode_; /* * Sub Window diff --git a/wm/src/root_scene.cpp b/wm/src/root_scene.cpp index f2433ba078..2c15ae508c 100644 --- a/wm/src/root_scene.cpp +++ b/wm/src/root_scene.cpp @@ -149,13 +149,48 @@ void RootScene::UpdateConfiguration(const std::shared_ptr& configuration) +void RootScene::UpdateConfigurationForSpecified(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) { - WLOGFD("in"); + if (uiContent_ == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "uiContent is null, winId: %{public}u", GetWindowId()); + return; + } + uiContent_->UpdateConfiguration(configuration, resourceManager); + if (configuration == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "config is null, winId: %{public}u", GetWindowId()); + return; + } + std::string colorMode = configuration->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); + bool isDark = (colorMode == AppExecFwk::ConfigurationInner::COLOR_MODE_DARK); + if (!RSInterfaces::GetInstance().SetGlobalDarkColorMode(isDark)) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "set dark color mode failed, winId: %{public}u, colorMode: %{public}s", + GetWindowId(), colorMode.c_str()); + } +} + +void RootScene::UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts) +{ + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "in"); if (staticRootScene_) { - staticRootScene_->UpdateConfiguration(configuration); - if (configurationUpdatedCallback_) { - configurationUpdatedCallback_(configuration); + auto context = staticRootScene_->GetContext(); + if (context == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "context is null, winId: %{public}u", staticRootScene_->GetWindowId()); + return; + } + bool isUpdateConfig = true; + for (const auto& ignoreCtx : ignoreWindowContexts) { + if (context.get() == ignoreCtx.get()) { + isUpdateConfig = false; + break; + } + } + if (isUpdateConfig) { + staticRootScene_->UpdateConfiguration(configuration); + if (configurationUpdatedCallback_) { + configurationUpdatedCallback_(configuration); + } } } } diff --git a/wm/src/window.cpp b/wm/src/window.cpp index b94f14f2b5..8677058312 100644 --- a/wm/src/window.cpp +++ b/wm/src/window.cpp @@ -231,14 +231,15 @@ std::vector> Window::GetSubWindow(uint32_t parentId) } } -void Window::UpdateConfigurationForAll(const std::shared_ptr& configuration) +void Window::UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts) { if (SceneBoardJudgement::IsSceneBoardEnabled()) { - WindowSceneSessionImpl::UpdateConfigurationForAll(configuration); - RootScene::UpdateConfigurationForAll(configuration); - WindowExtensionSessionImpl::UpdateConfigurationForAll(configuration); + WindowSceneSessionImpl::UpdateConfigurationForAll(configuration, ignoreWindowContexts); + RootScene::UpdateConfigurationForAll(configuration, ignoreWindowContexts); + WindowExtensionSessionImpl::UpdateConfigurationForAll(configuration, ignoreWindowContexts); } else { - WindowImpl::UpdateConfigurationForAll(configuration); + WindowImpl::UpdateConfigurationForAll(configuration, ignoreWindowContexts); } } diff --git a/wm/src/window_extension_session_impl.cpp b/wm/src/window_extension_session_impl.cpp index 20fbbd49e6..4115c16d6b 100644 --- a/wm/src/window_extension_session_impl.cpp +++ b/wm/src/window_extension_session_impl.cpp @@ -168,12 +168,39 @@ void WindowExtensionSessionImpl::UpdateConfiguration(const std::shared_ptr& configuration) +void WindowExtensionSessionImpl::UpdateConfigurationForSpecified( + const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) { - WLOGD("notify scene ace update config"); + if (auto uiContent = GetUIContentSharedPtr()) { + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "winId: %{public}u", GetWindowId()); + uiContent->UpdateConfiguration(configuration, resourceManager); + } else { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "uiContent is null, winId: %{public}u", GetWindowId()); + } +} + +void WindowExtensionSessionImpl::UpdateConfigurationForAll( + const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts) +{ + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "notify scene ace update config"); + std::unordered_set> ignoreWindowCtxSet( + ignoreWindowContexts.begin(), ignoreWindowContexts.end()); std::unique_lock lock(windowExtensionSessionMutex_); for (const auto& window : windowExtensionSessionSet_) { - window->UpdateConfiguration(configuration); + if (window == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "window is null"); + continue; + } + auto context = window->GetContext(); + if (context == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "context is null, winId: %{public}u", window->GetWindowId()); + continue; + } + if (ignoreWindowCtxSet.count(context) == 0) { + window->UpdateConfiguration(configuration); + } } } diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 072c6f1e1b..61f71c8857 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -269,11 +269,25 @@ std::vector> WindowImpl::GetSubWindow(uint32_t parentId) return std::vector>(subWindowMap_[parentId].begin(), subWindowMap_[parentId].end()); } -void WindowImpl::UpdateConfigurationForAll(const std::shared_ptr& configuration) +void WindowImpl::UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts) { + std::unordered_set> ignoreWindowCtxSet( + ignoreWindowContexts.begin(), ignoreWindowContexts.end()); for (const auto& winPair : windowMap_) { auto window = winPair.second.second; - window->UpdateConfiguration(configuration); + if (window == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "window is null"); + continue; + } + auto context = window->GetContext(); + if (context == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "context is null, winId: %{public}u", window->GetWindowId()); + continue; + } + if (ignoreWindowCtxSet.count(context) == 0) { + window->UpdateConfiguration(configuration); + } } } @@ -3419,6 +3433,22 @@ void WindowImpl::UpdateConfiguration(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) +{ + if (uiContent_ != nullptr) { + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "winId: %{public}u", GetWindowId()); + uiContent_->UpdateConfiguration(configuration, resourceManager); + } + if (subWindowMap_.count(GetWindowId()) == 0) { + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "no subWindow, winId: %{public}u", GetWindowId()); + return; + } + for (auto& subWindow : subWindowMap_.at(GetWindowId())) { + subWindow->UpdateConfigurationForSpecified(configuration, resourceManager); + } +} + void WindowImpl::UpdateConfigurationSync(const std::shared_ptr& configuration) { if (uiContent_ != nullptr) { diff --git a/wm/src/window_scene.cpp b/wm/src/window_scene.cpp index ce1292e5b7..ada362d55a 100644 --- a/wm/src/window_scene.cpp +++ b/wm/src/window_scene.cpp @@ -229,6 +229,17 @@ void WindowScene::UpdateConfiguration(const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) +{ + if (auto mainWindow = GetMainWindow()) { + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "winId: %{public}u", mainWindow->GetWindowId()); + mainWindow->UpdateConfigurationForSpecified(configuration, resourceManager); + } else { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "main window is null"); + } +} + std::string WindowScene::GetContentInfo(BackupAndRestoreType type) const { auto mainWindow = GetMainWindow(); diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 22f403e5c7..3d976214e0 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -596,22 +596,24 @@ void WindowSceneSessionImpl::UpdateDefaultStatusBarColor() TLOGD(WmsLogTag::WMS_IMMS, "not main window"); return; } - std::shared_ptr appContext = AbilityRuntime::Context::GetApplicationContext(); - if (appContext == nullptr) { - TLOGE(WmsLogTag::WMS_IMMS, "app context is nullptr"); - return; - } - std::shared_ptr config = appContext->GetConfiguration(); - bool isColorModeSetByApp = !config->GetItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP).empty(); - std::string colorMode = config->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); uint32_t contentColor; constexpr uint32_t BLACK = 0xFF000000; constexpr uint32_t WHITE = 0xFFFFFFFF; + bool isColorModeSetByApp = !specifiedColorMode_.empty(); + std::string colorMode = specifiedColorMode_; if (isColorModeSetByApp) { TLOGI(WmsLogTag::WMS_IMMS, "win %{public}u type %{public}u colorMode %{public}s", GetPersistentId(), GetType(), colorMode.c_str()); contentColor = colorMode == AppExecFwk::ConfigurationInner::COLOR_MODE_LIGHT ? BLACK : WHITE; } else { + auto appContext = AbilityRuntime::Context::GetApplicationContext(); + if (appContext == nullptr) { + TLOGE(WmsLogTag::WMS_IMMS, "app context is nullptr"); + return; + } + std::shared_ptr config = appContext->GetConfiguration(); + isColorModeSetByApp = !config->GetItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP).empty(); + colorMode = config->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); bool hasDarkRes = false; appContext->AppHasDarkRes(hasDarkRes); TLOGI(WmsLogTag::WMS_IMMS, "win %{public}u type %{public}u hasDarkRes %{public}u colorMode %{public}s", @@ -3128,13 +3130,48 @@ void WindowSceneSessionImpl::UpdateConfiguration(const std::shared_ptr& configuration) +void WindowSceneSessionImpl::UpdateConfigurationForSpecified( + const std::shared_ptr& configuration, + const std::shared_ptr& resourceManager) +{ + if (auto uiContent = GetUIContentSharedPtr()) { + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "ace winId: %{public}u", GetWindowId()); + uiContent->UpdateConfiguration(configuration, resourceManager); + } + if (configuration != nullptr) { + specifiedColorMode_ = configuration->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); + } + UpdateDefaultStatusBarColor(); + if (subWindowSessionMap_.count(GetPersistentId()) == 0) { + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "no subSession, winId: %{public}u", GetWindowId()); + return; + } + for (auto& subWindowSession : subWindowSessionMap_.at(GetPersistentId())) { + subWindowSession->UpdateConfigurationForSpecified(configuration, resourceManager); + } +} + +void WindowSceneSessionImpl::UpdateConfigurationForAll(const std::shared_ptr& configuration, + const std::vector>& ignoreWindowContexts) { - TLOGD(WmsLogTag::DEFAULT, "in"); + TLOGI(WmsLogTag::WMS_ATTRIBUTE, "in"); + std::unordered_set> ignoreWindowCtxSet( + ignoreWindowContexts.begin(), ignoreWindowContexts.end()); std::shared_lock lock(windowSessionMutex_); for (const auto& winPair : windowSessionMap_) { auto window = winPair.second.second; - window->UpdateConfiguration(configuration); + if (window == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "window is null"); + continue; + } + auto context = window->GetContext(); + if (context == nullptr) { + TLOGE(WmsLogTag::WMS_ATTRIBUTE, "context is null, winId: %{public}u", window->GetWindowId()); + continue; + } + if (ignoreWindowCtxSet.count(context) == 0) { + window->UpdateConfiguration(configuration); + } } } diff --git a/wm/test/unittest/root_scene_test.cpp b/wm/test/unittest/root_scene_test.cpp index b2904b06fb..696383d47c 100644 --- a/wm/test/unittest/root_scene_test.cpp +++ b/wm/test/unittest/root_scene_test.cpp @@ -21,6 +21,7 @@ #include "root_scene.h" #include "app_mgr_client.h" +#include "mock_uicontent.h" #include "singleton.h" #include "singleton_container.h" @@ -104,6 +105,22 @@ HWTEST_F(RootSceneTest, UpdateConfiguration, Function | SmallTest | Level3) ASSERT_EQ(1, rootScene.GetWindowId()); } +/** + * @tc.name: UpdateConfigurationForSpecified + * @tc.desc: UpdateConfigurationForSpecified Test + * @tc.type: FUNC + */ +HWTEST_F(RootSceneTest, UpdateConfigurationForSpecified, Function | SmallTest | Level3) +{ + RootScene rootScene; + std::shared_ptr configuration; + std::shared_ptr resourceManager; + + rootScene.uiContent_ = std::make_unique(); + rootScene.UpdateConfigurationForSpecified(configuration, resourceManager); + ASSERT_EQ(1, rootScene.GetWindowId()); +} + /** * @tc.name: UpdateConfigurationForAll * @tc.desc: UpdateConfigurationForAll Test 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 262d5b1251..ff366f61a0 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 @@ -266,6 +266,30 @@ HWTEST_F(WindowExtensionSessionImplTest, UpdateConfigurationForAll02, Function | window_->windowExtensionSessionSet_.erase(window_); } +/** + * @tc.name: UpdateConfigurationForAll03 + * @tc.desc: UpdateConfigurationForAll03 Test + * @tc.type: FUNC + */ +HWTEST_F(WindowExtensionSessionImplTest, UpdateConfigurationForAll03, Function | SmallTest | Level3) +{ + auto abilityContext = std::make_shared(); + ASSERT_NE(nullptr, abilityContext); + SessionInfo sessionInfo; + sptr session = sptr::MakeSptr(sessionInfo); + ASSERT_NE(nullptr, session); + std::shared_ptr configuration = std::make_shared(); + ASSERT_NE(nullptr, window_->property_); + window_->property_->SetPersistentId(1); + ASSERT_EQ(WMError::WM_OK, window_->Create(abilityContext, session)); + ASSERT_NE(nullptr, window_); + window_->windowExtensionSessionSet_.insert(window_); + std::vector> ignoreWindowContexts; + ignoreWindowContexts.push_back(abilityContext); + window_->UpdateConfigurationForAll(configuration, ignoreWindowContexts); + window_->windowExtensionSessionSet_.erase(window_); +} + /** * @tc.name: MoveTo01 * @tc.desc: MoveTo diff --git a/wm/test/unittest/window_impl_test3.cpp b/wm/test/unittest/window_impl_test3.cpp index 448ce740ef..449645159c 100644 --- a/wm/test/unittest/window_impl_test3.cpp +++ b/wm/test/unittest/window_impl_test3.cpp @@ -536,6 +536,48 @@ HWTEST_F(WindowImplTest3, UpdateConfiguration, Function | SmallTest | Level3) ASSERT_EQ(WMError::WM_OK, window->Destroy()); } +/** + * @tc.name: UpdateConfigurationForSpecified + * @tc.desc: UpdateConfigurationForSpecified test + * @tc.type: FUNC + */ +HWTEST_F(WindowImplTest3, UpdateConfigurationForSpecified, Function | SmallTest | Level3) +{ + sptr option = sptr::MakeSptr(); + option->SetWindowName("UpdateConfigurationForSpecified"); + option->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW); + option->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); + sptr window = sptr::MakeSptr(option); + std::unique_ptr m = std::make_unique(); + window->RestoreSplitWindowMode(0u); + EXPECT_CALL(m->Mock(), GetSystemConfig(_)).WillOnce(Return(WMError::WM_OK)); + EXPECT_CALL(m->Mock(), CreateWindow(_, _, _, _, _)).Times(1).WillOnce(Return(WMError::WM_OK)); + ASSERT_EQ(WMError::WM_OK, window->Create(INVALID_WINDOW_ID)); + + option = sptr::MakeSptr(); + option->SetWindowType(WindowType::WINDOW_TYPE_APP_SUB_WINDOW); + option->SetWindowName("subwindow"); + sptr subWindow = sptr::MakeSptr(option); + EXPECT_CALL(m->Mock(), GetSystemConfig(_)).WillOnce(Return(WMError::WM_OK)); + EXPECT_CALL(m->Mock(), CreateWindow(_, _, _, _, _)).Times(1).WillOnce(Return(WMError::WM_OK)); + ASSERT_EQ(WMError::WM_OK, subWindow->Create(window->GetWindowId())); + std::shared_ptr configuration; + std::shared_ptr resourceManager; + window->UpdateConfigurationForSpecified(configuration, resourceManager); + + window->uiContent_ = std::make_unique(); + Ace::UIContentMocker* content = reinterpret_cast(window->uiContent_.get()); + subWindow->uiContent_ = std::make_unique(); + Ace::UIContentMocker* subContent = reinterpret_cast(subWindow->uiContent_.get()); + EXPECT_CALL(*content, UpdateConfiguration(_, _)); + EXPECT_CALL(*subContent, UpdateConfiguration(_, _)); + window->UpdateConfigurationForSpecified(configuration, resourceManager); + EXPECT_CALL(m->Mock(), DestroyWindow(_)).Times(1).WillOnce(Return(WMError::WM_OK)); + EXPECT_CALL(*content, Destroy()); + EXPECT_CALL(*subContent, Destroy()); + ASSERT_EQ(WMError::WM_OK, window->Destroy()); +} + /** * @tc.name: UpdateWindowState * @tc.desc: UpdateWindowState test @@ -878,6 +920,28 @@ HWTEST_F(WindowImplTest3, UpdateConfigurationForAll01, Function | SmallTest | Le ASSERT_EQ(WMError::WM_OK, window->Destroy()); } +/** + * @tc.name: UpdateConfigurationForAll02 + * @tc.desc: UpdateConfigurationForAll02 Test + * @tc.type: FUNC + */ +HWTEST_F(WindowImplTest3, UpdateConfigurationForAll02, Function | SmallTest | Level2) +{ + sptr option = sptr::MakeSptr(); + sptr window = sptr::MakeSptr(option); + EXPECT_CALL(m->Mock(), GetSystemConfig(_)).WillOnce(Return(WMError::WM_OK)); + EXPECT_CALL(m->Mock(), CreateWindow(_, _, _, _, _)).Times(1).WillOnce(Return(WMError::WM_OK)); + auto abilityContext = std::make_shared(); + ASSERT_NE(nullptr, abilityContext); + ASSERT_EQ(WMError::WM_OK, window->Create(INVALID_WINDOW_ID, abilityContext)); + std::vector> ignoreWindowContexts; + ignoreWindowContexts.push_back(abilityContext); + std::shared_ptr configuration; + window->UpdateConfigurationForAll(configuration, ignoreWindowContexts); + EXPECT_CALL(m->Mock(), DestroyWindow(_)).Times(1).WillOnce(Return(WMError::WM_OK)); + ASSERT_EQ(WMError::WM_OK, window->Destroy()); +} + /** * @tc.name: GetSurfaceNode01 * @tc.desc: GetSurfaceNode01 Test diff --git a/wm/test/unittest/window_scene_session_impl_test2.cpp b/wm/test/unittest/window_scene_session_impl_test2.cpp index e82b7fcdfc..87789624b5 100644 --- a/wm/test/unittest/window_scene_session_impl_test2.cpp +++ b/wm/test/unittest/window_scene_session_impl_test2.cpp @@ -506,6 +506,26 @@ HWTEST_F(WindowSceneSessionImplTest2, UpdateConfiguration01, Function | SmallTes ASSERT_EQ(ret, 0); } +/** + * @tc.name: UpdateConfigurationForSpecified + * @tc.desc: UpdateConfigurationForSpecified + * @tc.type: FUNC + */ +HWTEST_F(WindowSceneSessionImplTest2, UpdateConfigurationForSpecified, Function | SmallTest | Level2) +{ + sptr option = sptr::MakeSptr(); + option->SetWindowName("UpdateConfiguration01"); + option->SetWindowType(WindowType::SYSTEM_WINDOW_BASE); + sptr windowSceneSession = sptr::MakeSptr(option); + int ret = 0; + std::shared_ptr configuration; + std::shared_ptr resourceManager; + windowSceneSession->UpdateConfigurationForSpecified(configuration, resourceManager); + windowSceneSession->uiContent_ = std::make_unique(); + windowSceneSession->UpdateConfigurationForSpecified(configuration, resourceManager); + ASSERT_EQ(ret, 0); +} + /** * @tc.name: UpdateConfigurationForAll01 * @tc.desc: UpdateConfigurationForAll @@ -523,6 +543,28 @@ HWTEST_F(WindowSceneSessionImplTest2, UpdateConfigurationForAll01, Function | Sm ASSERT_EQ(ret, 0); } +/** + * @tc.name: UpdateConfigurationForAll02 + * @tc.desc: UpdateConfigurationForAll02 Test + * @tc.type: FUNC + */ +HWTEST_F(WindowSceneSessionImplTest2, UpdateConfigurationForAll02, Function | SmallTest | Level2) +{ + sptr option = sptr::MakeSptr(); + option->SetWindowName("UpdateConfigurationForAll02"); + option->SetWindowType(WindowType::SYSTEM_WINDOW_BASE); + sptr window = sptr::MakeSptr(option); + auto abilityContext = std::make_shared(); + ASSERT_NE(nullptr, abilityContext); + SessionInfo sessionInfo = { "CreateTestBundle", "CreateTestModule", "CreateTestAbility" }; + sptr session = sptr::MakeSptr(sessionInfo); + ASSERT_EQ(WMError::WM_OK, window->Create(abilityContext, session)); + std::shared_ptr configuration; + std::vector> ignoreWindowContexts; + ignoreWindowContexts.push_back(abilityContext); + window->UpdateConfigurationForAll(configuration, ignoreWindowContexts); +} + /** * @tc.name: GetTopWindowWithContext01 * @tc.desc: GetTopWindowWithContext diff --git a/wm/test/unittest/window_scene_test.cpp b/wm/test/unittest/window_scene_test.cpp index 576939a197..594d2d93bc 100644 --- a/wm/test/unittest/window_scene_test.cpp +++ b/wm/test/unittest/window_scene_test.cpp @@ -340,6 +340,26 @@ HWTEST_F(WindowSceneTest, UpdateConfiguration02, Function | SmallTest | Level2) scene->UpdateConfiguration(configuration); } +/** + * @tc.name: UpdateConfigurationForSpecified + * @tc.desc: UpdateConfigurationForSpecified Test + * @tc.type: FUNC + */ +HWTEST_F(WindowSceneTest, UpdateConfigurationForSpecified, Function | SmallTest | Level2) +{ + std::unique_ptr m = std::make_unique(); + sptr optionTest = new WindowOption(); + EXPECT_CALL(m->Mock(), CreateWindow(_, _, _)).Times(1).WillOnce(Return(new WindowImpl(optionTest))); + DisplayId displayId = 0; + sptr listener = nullptr; + sptr scene = new WindowScene(); + std::shared_ptr abilityContext = nullptr; + ASSERT_EQ(WMError::WM_OK, scene->Init(displayId, abilityContext, listener)); + std::shared_ptr configuration; + std::shared_ptr resourceManager; + scene->UpdateConfigurationForSpecified(configuration, resourceManager); +} + /** * @tc.name: GetContentInfo01 * @tc.desc: GetContentInfo nullptr -- Gitee From f48290ddb74709872d92d96eedf8e25dbfa44316 Mon Sep 17 00:00:00 2001 From: hfwang0318 Date: Fri, 14 Feb 2025 16:31:57 +0800 Subject: [PATCH 2/4] ability color mode Signed-off-by: hfwang0318 --- wm/src/root_scene.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/wm/src/root_scene.cpp b/wm/src/root_scene.cpp index 2c15ae508c..a12e9e29b9 100644 --- a/wm/src/root_scene.cpp +++ b/wm/src/root_scene.cpp @@ -179,14 +179,7 @@ void RootScene::UpdateConfigurationForAll(const std::shared_ptrGetWindowId()); return; } - bool isUpdateConfig = true; - for (const auto& ignoreCtx : ignoreWindowContexts) { - if (context.get() == ignoreCtx.get()) { - isUpdateConfig = false; - break; - } - } - if (isUpdateConfig) { + if (std::count(ignoreWindowContexts.begin(), ignoreWindowContexts.end(), context) != 0) { staticRootScene_->UpdateConfiguration(configuration); if (configurationUpdatedCallback_) { configurationUpdatedCallback_(configuration); -- Gitee From 6b3e64da4c8af1d66ed4e4687f5714ec797dad9e Mon Sep 17 00:00:00 2001 From: hfwang0318 Date: Fri, 14 Feb 2025 18:16:14 +0800 Subject: [PATCH 3/4] ability color mode Signed-off-by: hfwang0318 --- wm/src/window_impl.cpp | 3 +++ wm/src/window_scene_session_impl.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 61f71c8857..9efca55c52 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -3445,6 +3445,9 @@ void WindowImpl::UpdateConfigurationForSpecified(const std::shared_ptrUpdateConfigurationForSpecified(configuration, resourceManager); } } diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 3d976214e0..58835cdcfc 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -612,7 +612,9 @@ void WindowSceneSessionImpl::UpdateDefaultStatusBarColor() return; } std::shared_ptr config = appContext->GetConfiguration(); - isColorModeSetByApp = !config->GetItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP).empty(); + if (config == nullptr) { + TLOGE(WmsLogTag::WMS_IMMS, "config is null, winId: %{public}d", GetPersistentId()); + } colorMode = config->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); bool hasDarkRes = false; appContext->AppHasDarkRes(hasDarkRes); @@ -3147,6 +3149,9 @@ void WindowSceneSessionImpl::UpdateConfigurationForSpecified( return; } for (auto& subWindowSession : subWindowSessionMap_.at(GetPersistentId())) { + if (subWindowSession == nullptr) { + continue; + } subWindowSession->UpdateConfigurationForSpecified(configuration, resourceManager); } } -- Gitee From 6a69dcb779cc5e93702920ff2f862d244157138f Mon Sep 17 00:00:00 2001 From: hfwang0318 Date: Fri, 14 Feb 2025 18:21:12 +0800 Subject: [PATCH 4/4] ability color mode Signed-off-by: hfwang0318 --- wm/src/window_scene_session_impl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 58835cdcfc..a562c8289b 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -614,6 +614,7 @@ void WindowSceneSessionImpl::UpdateDefaultStatusBarColor() std::shared_ptr config = appContext->GetConfiguration(); if (config == nullptr) { TLOGE(WmsLogTag::WMS_IMMS, "config is null, winId: %{public}d", GetPersistentId()); + return; } colorMode = config->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); bool hasDarkRes = false; -- Gitee