diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index e66aaedfd0a90eb35d8aea2256df40074b5a0ff7..c0503acb9634c766fe5b267ce9785d3443200882 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -253,7 +253,8 @@ enum class SystemBarSettingFlag : uint32_t { DEFAULT_SETTING = 0, COLOR_SETTING = 1, ENABLE_SETTING = 1 << 1, - ALL_SETTING = 0b11 + FOLLOW_SETTING = 1 << 2, + ALL_SETTING = 0b011 }; /** diff --git a/wm/BUILD.gn b/wm/BUILD.gn index 76e838b671467f2cdfa43d809e7fcbfd2bf6ad14..d4d8bce418c3cf1ece96aae0b64a6e8100d1c322 100644 --- a/wm/BUILD.gn +++ b/wm/BUILD.gn @@ -252,6 +252,7 @@ ohos_shared_library("libwm") { "ability_base:zuri", "ability_runtime:ability_context_native", "ability_runtime:ability_manager", + "ability_runtime:app_context", "ability_runtime:app_manager", "accessibility:accessibility_common", "ace_engine:ace_uicontent", diff --git a/wm/include/window_scene_session_impl.h b/wm/include/window_scene_session_impl.h index a29872fc0c788e20b9b861731ed1eecca67a227f..9540dc1914bc5993c47ba148db1074e987a26731 100644 --- a/wm/include/window_scene_session_impl.h +++ b/wm/include/window_scene_session_impl.h @@ -213,6 +213,7 @@ private: WindowLimits& newLimits, WindowLimits& customizedLimits, float& virtualPixelRatio); void CalculateNewLimitsByRatio(WindowLimits& newLimits, WindowLimits& customizedLimits); void NotifyDisplayInfoChange(); + void UpdateDefaultStatusBarColor(); bool userLimitsSet_ = false; bool enableDefaultAnimation_ = true; sptr animationTransitionController_; diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 318707e55e0af105c649ca08209c5d1801793465..770615dd1bcfdeee6232b086a73900ef66aacb08 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -46,6 +46,7 @@ #include "pattern_detach_callback.h" #include "window_session_impl.h" #include "sys_cap_util.h" +#include "application_context.h" namespace OHOS { namespace Rosen { @@ -477,6 +478,7 @@ WMError WindowSceneSessionImpl::Create(const std::shared_ptr(static_cast(statusBarProp.settingFlag_) & + static_cast(SystemBarSettingFlag::COLOR_SETTING)) == SystemBarSettingFlag::COLOR_SETTING) { + TLOGD(WmsLogTag::WMS_IMMS, "user set"); + return; + } + if (!WindowHelper::IsMainWindow(GetType())) { + 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; + static const uint32_t BLACK = 0xFF000000; + static const uint32_t WHITE = 0xFFFFFFFF; + if (isColorModeSetByApp) { + TLOGI(WmsLogTag::WMS_IMMS, "winId: %{public}u, type: %{public}u, colorMode: %{public}s", + GetPersistentId(), GetType(), colorMode.c_str()); + contentColor = colorMode == AppExecFwk::ConfigurationInner::COLOR_MODE_LIGHT ? BLACK : WHITE; + } else { + bool hasDarkRes = false; + appContext->AppHasDarkRes(hasDarkRes); + TLOGI(WmsLogTag::WMS_IMMS, "winId: %{public}u, type: %{public}u, hasDarkRes: %{public}u, colorMode: %{public}s", + GetPersistentId(), GetType(), hasDarkRes, colorMode.c_str()); + contentColor = colorMode == AppExecFwk::ConfigurationInner::COLOR_MODE_LIGHT ? BLACK : + (hasDarkRes ? WHITE : BLACK); + } + + statusBarProp.contentColor_ = contentColor; + statusBarProp.settingFlag_ = static_cast( + static_cast(statusBarProp.settingFlag_) | + static_cast(SystemBarSettingFlag::FOLLOW_SETTING) + ); + SetSpecificBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, statusBarProp); +} + void WindowSceneSessionImpl::RegisterSessionRecoverListener(bool isSpecificSession) { TLOGD(WmsLogTag::WMS_RECOVER, "persistentId = %{public}d, isSpecificSession = %{public}s", @@ -2352,6 +2399,7 @@ void WindowSceneSessionImpl::UpdateConfiguration(const std::shared_ptrUpdateConfiguration(configuration); } } + UpdateDefaultStatusBarColor(); if (subWindowSessionMap_.count(GetPersistentId()) == 0) { return; }