@@ -66,10 +66,16 @@ fun ApplyImmersiveModeToDialog(isVisible: Boolean) {
6666 or View .SYSTEM_UI_FLAG_IMMERSIVE_STICKY
6767 )
6868
69+ // Ensure dialog window also does not fit system windows so bars stay hidden
70+ dialogWindow?.let { WindowCompat .setDecorFitsSystemWindows(it, false ) }
71+
6972 val preDrawListener = object : android.view.ViewTreeObserver .OnPreDrawListener {
7073 override fun onPreDraw (): Boolean {
7174 controller?.hide(WindowInsetsCompat .Type .systemBars())
72- controller?.systemBarsBehavior = WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
75+ try {
76+ controller?.systemBarsBehavior = WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
77+ } catch (_: Throwable ) {
78+ }
7379 dialogView.viewTreeObserver.removeOnPreDrawListener(this )
7480 return true
7581 }
@@ -79,10 +85,15 @@ fun ApplyImmersiveModeToDialog(isVisible: Boolean) {
7985 val attachListener = object : View .OnAttachStateChangeListener {
8086 override fun onViewAttachedToWindow (v : View ) {
8187 val vWindow = (v.context as ? android.app.Activity )?.window
88+ // Make sure the attached window also opts out of fitting system windows
89+ vWindow?.let { WindowCompat .setDecorFitsSystemWindows(it, false ) }
8290 val c = vWindow?.let { WindowCompat .getInsetsController(it, v) }
8391 c?.hide(WindowInsetsCompat .Type .systemBars())
84- c?.systemBarsBehavior = WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
85-
92+ try {
93+ c?.systemBarsBehavior = WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
94+ } catch (_: Throwable ) {
95+ }
96+
8697 @Suppress(" DEPRECATION" )
8798 v.systemUiVisibility = (
8899 View .SYSTEM_UI_FLAG_FULLSCREEN
@@ -114,8 +125,26 @@ fun ApplyImmersiveModeToDialog(isVisible: Boolean) {
114125
115126 while (isActive && isVisible) {
116127 try {
128+ // Ensure both dialog window and root view window do not fit system windows
129+ dialogWindow?.let { WindowCompat .setDecorFitsSystemWindows(it, false ) }
117130 dialogController?.hide(WindowInsetsCompat .Type .systemBars())
118- dialogController?.systemBarsBehavior = WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
131+ try {
132+ dialogController?.systemBarsBehavior = WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
133+ } catch (_: Throwable ) {
134+ }
135+
136+ // Also attempt to hide on the root view's window in case the modal uses a different attach point
137+ try {
138+ val rootWindow = (dialogView.rootView.context as ? android.app.Activity )?.window
139+ rootWindow?.let { WindowCompat .setDecorFitsSystemWindows(it, false ) }
140+ val rootController = rootWindow?.let { WindowCompat .getInsetsController(it, dialogView.rootView) }
141+ rootController?.hide(WindowInsetsCompat .Type .systemBars())
142+ try {
143+ rootController?.systemBarsBehavior = WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
144+ } catch (_: Throwable ) {
145+ }
146+ } catch (_: Throwable ) {
147+ }
119148 } catch (_: Throwable ) {
120149 // Ignore errors
121150 }
0 commit comments