11package com.zoontek.rnedgetoedge
22
3- import android.app.Activity
43import android.content.res.Configuration
54import android.graphics.Color
65import android.os.Build
7- import android.util.TypedValue
6+ import android.os.Handler
7+ import android.os.Looper
88import android.view.WindowManager
99
1010import androidx.core.content.ContextCompat
@@ -13,75 +13,60 @@ import androidx.core.view.WindowInsetsCompat
1313import androidx.core.view.WindowInsetsControllerCompat
1414
1515import com.facebook.common.logging.FLog
16+ import com.facebook.react.bridge.ReactApplicationContext
1617import com.facebook.react.bridge.ReadableMap
1718import com.facebook.react.common.ReactConstants
1819
1920object RNEdgeToEdgeModuleImpl {
2021 const val NAME = " RNEdgeToEdge"
21- private var isInitialHostResume = true
2222
23- fun onHostResume (activity : Activity ? ) {
24- if (activity == null ) {
25- return FLog .w(ReactConstants .TAG , " $NAME : Ignored, current activity is null." )
26- }
23+ private fun applyEdgeToEdge (reactContext : ReactApplicationContext ) {
24+ val activity = reactContext.currentActivity
25+ ? : return FLog .w(ReactConstants .TAG , " $NAME : Ignored, current activity is null." )
2726
2827 activity.runOnUiThread {
2928 val window = activity.window
3029 val view = window.decorView
3130 val context = view.context
3231
33- val isDarkMode =
34- view.resources.configuration.uiMode and Configuration .UI_MODE_NIGHT_MASK ==
35- Configuration .UI_MODE_NIGHT_YES
36-
3732 WindowCompat .setDecorFitsSystemWindows(window, false )
3833
3934 window.statusBarColor = Color .TRANSPARENT
35+ window.navigationBarColor = ContextCompat .getColor(context, R .color.navigationBarColor)
4036
41- window.navigationBarColor = when {
42- Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q -> Color .TRANSPARENT
43- Build .VERSION .SDK_INT >= Build .VERSION_CODES .O && ! isDarkMode ->
44- ContextCompat .getColor(context, R .color.systemBarLightScrim)
45- else -> ContextCompat .getColor(context, R .color.systemBarDarkScrim)
37+ val isDarkMode =
38+ view.resources.configuration.uiMode and Configuration .UI_MODE_NIGHT_MASK ==
39+ Configuration .UI_MODE_NIGHT_YES
40+
41+ WindowInsetsControllerCompat (window, view).run {
42+ isAppearanceLightNavigationBars = ! isDarkMode
4643 }
4744
4845 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q ) {
4946 window.isStatusBarContrastEnforced = false
5047 window.isNavigationBarContrastEnforced = true
5148 }
5249
53- WindowInsetsControllerCompat (window, view).run {
54- if (isInitialHostResume) {
55- val typedValue = TypedValue ()
56-
57- isAppearanceLightStatusBars = activity
58- .theme
59- .resolveAttribute(android.R .attr.windowLightStatusBar, typedValue, true ) &&
60- typedValue.data != 0
61- }
62-
63- isInitialHostResume = false
64- isAppearanceLightNavigationBars = ! isDarkMode
65- }
66-
6750 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .P ) {
6851 window.attributes.layoutInDisplayCutoutMode = when {
69- Build .VERSION .SDK_INT >= Build .VERSION_CODES .R ->
70- WindowManager .LayoutParams .LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
52+ Build .VERSION .SDK_INT >= Build .VERSION_CODES .R -> WindowManager .LayoutParams .LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
7153 else -> WindowManager .LayoutParams .LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
7254 }
7355 }
7456 }
7557 }
7658
77- fun onHostDestroy ( ) {
78- isInitialHostResume = true
59+ fun onHostResume ( reactContext : ReactApplicationContext ) {
60+ applyEdgeToEdge(reactContext)
7961 }
8062
81- fun setSystemBarsConfig (activity : Activity ? , config : ReadableMap ) {
82- if (activity == null ) {
83- return FLog .w(ReactConstants .TAG , " $NAME : Ignored, current activity is null." )
84- }
63+ fun onConfigChange (reactContext : ReactApplicationContext ) {
64+ Handler (Looper .getMainLooper()).postDelayed({ applyEdgeToEdge(reactContext) }, 100 )
65+ }
66+
67+ fun setSystemBarsConfig (reactContext : ReactApplicationContext , config : ReadableMap ) {
68+ val activity = reactContext.currentActivity
69+ ? : return FLog .w(ReactConstants .TAG , " $NAME : Ignored, current activity is null." )
8570
8671 val statusBarHidden =
8772 config.takeIf { it.hasKey(" statusBarHidden" ) }?.getBoolean(" statusBarHidden" )
0 commit comments