DnDApplication/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt

107 lines
No EOL
4.3 KiB
Kotlin

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<Activity> {
error("Activity not available")
}
val LocalSnack = staticCompositionLocalOf<SnackbarHostState> {
error("SnackbarHostState not available")
}
val LocalRollOverlay = compositionLocalOf<BlurredRollOverlayHostState> {
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<RollOverlayViewModel>()
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()
}
}
}
}
}
}