package com.pixelized.rplexicon import android.app.Activity import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.remember import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Modifier import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.ui.composable.BlurredOverlayHost import com.pixelized.rplexicon.ui.navigation.ScreenNavHost import com.pixelized.rplexicon.ui.screens.rolls.BlurredRollOverlayHostState import com.pixelized.rplexicon.ui.screens.rolls.RollOverlay import com.pixelized.rplexicon.ui.screens.rolls.RollOverlayViewModel import com.pixelized.rplexicon.ui.screens.rolls.rememberBlurredRollOverlayHostState import com.pixelized.rplexicon.ui.theme.LexiconTheme import dagger.hilt.android.AndroidEntryPoint val LocalActivity = staticCompositionLocalOf { error("Activity not available") } val LocalSnack = staticCompositionLocalOf { error("SnackbarHostState not available") } val LocalRollOverlay = compositionLocalOf { error("LocalRollOverlay not yet ready") } val NO_WINDOW_INSETS = WindowInsets(0, 0, 0, 0) @AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Disable system inset consuming. WindowCompat.setDecorFitsSystemWindows(window, false) // splashscreen management installSplashScreen().apply { setKeepOnScreenCondition { false } } setContent { LexiconTheme { val rollViewModel = hiltViewModel() val overlay = rememberBlurredRollOverlayHostState( viewModel = rollViewModel, ) CompositionLocalProvider( LocalActivity provides this, LocalSnack provides remember { SnackbarHostState() }, LocalRollOverlay provides overlay, ) { Scaffold( contentWindowInsets = NO_WINDOW_INSETS, content = { padding -> Surface( modifier = Modifier .fillMaxSize() .padding(paddingValues = padding), color = MaterialTheme.colorScheme.background ) { BlurredOverlayHost( rollOverlayState = overlay, overlay = { RollOverlay( viewModel = rollViewModel, ) }, content = { ScreenNavHost() }, ) } }, snackbarHost = { SnackbarHost( modifier = Modifier.navigationBarsPadding(), hostState = LocalSnack.current, ) } ) BackHandler(enabled = overlay.isOverlayVisible) { overlay.hideOverlay() } } } } } }