diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.kt index fbe604db809..488d557fc6d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.kt @@ -8,13 +8,13 @@ package com.facebook.react.modules.appearance import android.content.Context -import android.content.res.Configuration import androidx.appcompat.app.AppCompatDelegate import com.facebook.fbreact.specs.NativeAppearanceSpec import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.UiThreadUtil import com.facebook.react.bridge.buildReadableMap import com.facebook.react.module.annotations.ReactModule +import com.facebook.react.views.common.UiModeUtils /** Module that exposes the user's preferred color scheme. */ @ReactModule(name = NativeAppearanceSpec.NAME) @@ -41,13 +41,7 @@ constructor( return overrideColorScheme.getScheme() } - val currentNightMode = - context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK - return when (currentNightMode) { - Configuration.UI_MODE_NIGHT_NO -> "light" - Configuration.UI_MODE_NIGHT_YES -> "dark" - else -> "light" - } + return if (UiModeUtils.isDarkMode(context)) "dark" else "light" } public override fun getColorScheme(): String { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/common/UiModeUtils.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/common/UiModeUtils.kt new file mode 100644 index 00000000000..d1b342254c1 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/common/UiModeUtils.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.views.common + +import android.content.Context +import android.content.res.Configuration + +/** Utility object providing static methods for working with UI mode properties from Context. */ +internal object UiModeUtils { + + /** + * Determines whether the current UI mode is dark mode + * + * @param context The context to check the UI mode from + * @return true if the current UI mode is dark mode, false otherwise + */ + @JvmStatic + fun isDarkMode(context: Context): Boolean = + context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == + Configuration.UI_MODE_NIGHT_YES +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt index 8b0aff2bf1e..680d34893ca 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt @@ -7,7 +7,6 @@ package com.facebook.react.views.view -import android.content.res.Configuration import android.graphics.Color import android.os.Build import android.view.Window @@ -15,6 +14,7 @@ import android.view.WindowManager import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat +import com.facebook.react.views.common.UiModeUtils @Suppress("DEPRECATION") internal fun Window.setStatusBarTranslucency(isTranslucent: Boolean) { @@ -71,9 +71,7 @@ internal fun Window.setSystemBarsTranslucency(isTranslucent: Boolean) { WindowCompat.setDecorFitsSystemWindows(this, !isTranslucent) if (isTranslucent) { - val isDarkMode = - context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == - Configuration.UI_MODE_NIGHT_YES + val isDarkMode = UiModeUtils.isDarkMode(context) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { isStatusBarContrastEnforced = false