feat: implement system bars style utility for consistent UI behavior

This commit is contained in:
2026-02-09 14:26:59 +05:00
parent b6e4f20c4c
commit 079995958f
5 changed files with 264 additions and 250 deletions

View File

@@ -0,0 +1,74 @@
package com.rosetta.messenger.ui.utils
import android.content.Context
import android.graphics.Color
import android.view.View
import android.view.Window
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
data class SystemBarsState(
val statusBarColor: Int,
val navigationBarColor: Int,
val isLightStatusBars: Boolean,
val isLightNavigationBars: Boolean
)
object SystemBarsStyleUtils {
fun capture(window: Window?, view: View?): SystemBarsState? {
if (window == null || view == null) return null
val insetsController = WindowCompat.getInsetsController(window, view)
return SystemBarsState(
statusBarColor = window.statusBarColor,
navigationBarColor = window.navigationBarColor,
isLightStatusBars = insetsController.isAppearanceLightStatusBars,
isLightNavigationBars = insetsController.isAppearanceLightNavigationBars
)
}
fun applyFullscreenDark(window: Window?, view: View?) {
if (window == null || view == null) return
val insetsController = WindowCompat.getInsetsController(window, view)
window.statusBarColor = Color.BLACK
window.navigationBarColor = Color.BLACK
insetsController.isAppearanceLightStatusBars = false
insetsController.isAppearanceLightNavigationBars = false
}
fun applyChatStatusBar(window: Window?, view: View?, isDarkTheme: Boolean) {
if (window == null || view == null) return
val insetsController = WindowCompat.getInsetsController(window, view)
window.statusBarColor = Color.TRANSPARENT
insetsController.isAppearanceLightStatusBars = !isDarkTheme
}
fun restoreNavigationBar(window: Window?, view: View?, context: Context, state: SystemBarsState?) {
if (window == null || view == null) return
val insetsController = WindowCompat.getInsetsController(window, view)
if (NavigationModeUtils.hasNativeNavigationBar(context)) {
insetsController.show(WindowInsetsCompat.Type.navigationBars())
if (state != null) {
window.navigationBarColor = state.navigationBarColor
insetsController.isAppearanceLightNavigationBars = state.isLightNavigationBars
}
} else {
insetsController.hide(WindowInsetsCompat.Type.navigationBars())
insetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
fun restoreChatAfterFullscreen(
window: Window?,
view: View?,
context: Context,
isDarkTheme: Boolean,
state: SystemBarsState?
) {
applyChatStatusBar(window, view, isDarkTheme)
restoreNavigationBar(window, view, context, state)
}
}