diff --git a/app/src/main/java/eu/indiewalkabout/mathbrainer/core/presentation/navigation/NavGraph.kt b/app/src/main/java/eu/indiewalkabout/mathbrainer/core/presentation/navigation/NavGraph.kt index 693425a..c0f7148 100644 --- a/app/src/main/java/eu/indiewalkabout/mathbrainer/core/presentation/navigation/NavGraph.kt +++ b/app/src/main/java/eu/indiewalkabout/mathbrainer/core/presentation/navigation/NavGraph.kt @@ -1,14 +1,22 @@ package eu.indiewalkabout.mathbrainer.core.presentation.navigation import android.util.Log +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.navArgument +import eu.indiewalkabout.mathbrainer.R +import eu.indiewalkabout.mathbrainer.feat_ads.presentation.AdMobBannerView import eu.indiewalkabout.mathbrainer.feat_credits.presentation.ui.GameCreditsScreen import eu.indiewalkabout.mathbrainer.feat_games.feat_count_items.presentation.ui.CountObjectsGameScreen import eu.indiewalkabout.mathbrainer.feat_games.feat_enigma.presentation.ui.EnigmaGameScreen @@ -47,10 +55,12 @@ fun NavGraph( // --- Home --- composable(ScreenRoutes.Home.route) { val viewModel = hiltViewModel() - HomeScreen( - navController = navController, - homeViewModel = viewModel - ) + ScreenWithBottomBanner { + HomeScreen( + navController = navController, + homeViewModel = viewModel + ) + } } // --- MathWrite Game --- @@ -63,10 +73,12 @@ fun NavGraph( val encodedOperation = backStackEntry.arguments?.getString("operation") ?: "+" val operation = URLDecoder.decode(encodedOperation, "UTF-8") - MathWriteGameScreen( - operation = operation, - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + MathWriteGameScreen( + operation = operation, + onBack = { navController.popBackStack() } + ) + } } // --- MathChoose Game --- @@ -79,83 +91,120 @@ fun NavGraph( val encodedOperation = backStackEntry.arguments?.getString("operation") ?: "+" val operation = java.net.URLDecoder.decode(encodedOperation, "UTF-8") - MathChooseGameScreen( - operation = operation, - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + MathChooseGameScreen( + operation = operation, + onBack = { navController.popBackStack() } + ) + } } // --- Double Number Game --- composable(route = ScreenRoutes.DoubleNumberGame.route) { - DoubleNumberGameScreen( - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + DoubleNumberGameScreen( + onBack = { navController.popBackStack() } + ) + } } // --- Random Operation Game --- composable(route = ScreenRoutes.RandomOperationGame.route) { - RandomOperationGameScreen( - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + RandomOperationGameScreen( + onBack = { navController.popBackStack() } + ) + } } // --- Memory Flash Game --- composable(route = ScreenRoutes.MemoryFlashGame.route) { - MemoryFlashGameScreen( - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + MemoryFlashGameScreen( + onBack = { navController.popBackStack() } + ) + } } // --- Number Order Game --- composable(route = ScreenRoutes.NumberOrderGame.route) { - NumberOrderGameScreen( - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + NumberOrderGameScreen( + onBack = { navController.popBackStack() } + ) + } } // --- Count Objects Game --- composable(route = ScreenRoutes.CountObjectsGame.route) { - CountObjectsGameScreen(onBack = { navController.popBackStack() }) + ScreenWithBottomBanner { + CountObjectsGameScreen(onBack = { navController.popBackStack() }) + } } // --- Sequence Completion Game --- composable(route = ScreenRoutes.SequenceCompleteGame.route) { - SequenceCompleteGameScreen( - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + SequenceCompleteGameScreen( + onBack = { navController.popBackStack() } + ) + } } // --- Falling Operations Game --- composable(route = ScreenRoutes.FallingOpsGame.route) { - FallingOpsGameScreen( - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + FallingOpsGameScreen( + onBack = { navController.popBackStack() } + ) + } } // --- Enigma Game --- composable(route = ScreenRoutes.EnigmaGame.route) { - EnigmaGameScreen( - onBack = { navController.popBackStack() } - ) + ScreenWithBottomBanner { + EnigmaGameScreen( + onBack = { navController.popBackStack() } + ) + } } // --- Settings --- composable(ScreenRoutes.GameSettings.route) { - GameSettingsScreen( - onBack = { navController.popBackStack() }, - onCreditsClick = { navController.navigate(ScreenRoutes.GameCredits.route) } - ) + ScreenWithBottomBanner { + GameSettingsScreen( + onBack = { navController.popBackStack() }, + onCreditsClick = { navController.navigate(ScreenRoutes.GameCredits.route) } + ) + } } // --- Credits --- composable(ScreenRoutes.GameCredits.route) { - GameCreditsScreen(onBack = { navController.popBackStack() }) + ScreenWithBottomBanner { + GameCreditsScreen(onBack = { navController.popBackStack() }) + } } // --- Statistics --- composable(ScreenRoutes.Statistics.route) { val viewModel = hiltViewModel() - StatisticScreen(navController = navController, statisticViewModel = viewModel) + ScreenWithBottomBanner { + StatisticScreen(navController = navController, statisticViewModel = viewModel) + } + } + } +} + +@Composable +private fun ScreenWithBottomBanner(content: @Composable () -> Unit) { + Column(modifier = Modifier.fillMaxSize()) { + Box(modifier = Modifier.weight(1f, fill = true)) { + content() } + AdMobBannerView( + adUnitId = stringResource(R.string.admob_key_bottom_banner), + modifier = Modifier.fillMaxWidth() + ) } } diff --git a/app/src/main/java/eu/indiewalkabout/mathbrainer/navigation/NavGraph.kt b/app/src/main/java/eu/indiewalkabout/mathbrainer/navigation/NavGraph.kt deleted file mode 100644 index 4cc9308..0000000 --- a/app/src/main/java/eu/indiewalkabout/mathbrainer/navigation/NavGraph.kt +++ /dev/null @@ -1,58 +0,0 @@ -package eu.indiewalkabout.mathbrainer.navigation - -import android.util.Log -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.navigation.NavHostController -import androidx.navigation.NavType -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.navArgument -import eu.indiewalkabout.mathbrainer.feat_games.feat_math_op_write.presentation.ui.MathWriteGameScreen -import eu.indiewalkabout.mathbrainer.feat_home.presentation.ui.HomeScreen -import eu.indiewalkabout.mathbrainer.feat_home.presentation.ui.HomeViewModel - -@Composable -fun NavGraph( - navController: NavHostController, - startDestination: String = ScreenRoutes.Home.route -) { - // Log navigation events - LaunchedEffect(navController) { - navController.addOnDestinationChangedListener { _, destination, _ -> - Log.d("Navigation", "Navigated to: ${destination.route}") - } - } - - NavHost( - navController = navController, - startDestination = startDestination - ) { - composable(ScreenRoutes.Home.route) { - val viewModel = hiltViewModel() - HomeScreen( - navController = navController, - homeViewModel = viewModel - ) - } - - composable( - route = ScreenRoutes.MathWriteGame.route, - arguments = listOf( - navArgument("operation") { type = NavType.StringType }, - navArgument("highScore") { type = NavType.IntType } - ) - ) { backStackEntry -> - val encodedOperation = backStackEntry.arguments?.getString("operation") ?: "+" - val operation = java.net.URLDecoder.decode(encodedOperation, "UTF-8") - val highScore = backStackEntry.arguments?.getInt("highScore") ?: 0 - - MathWriteGameScreen( - operation = operation, - initialHighScore = highScore, - onBack = { navController.popBackStack() } - ) - } - } -} diff --git a/app/src/main/java/eu/indiewalkabout/mathbrainer/navigation/ScreenRoutes.kt b/app/src/main/java/eu/indiewalkabout/mathbrainer/navigation/ScreenRoutes.kt deleted file mode 100644 index 3c9f096..0000000 --- a/app/src/main/java/eu/indiewalkabout/mathbrainer/navigation/ScreenRoutes.kt +++ /dev/null @@ -1,13 +0,0 @@ -package eu.indiewalkabout.mathbrainer.navigation - -import java.net.URLEncoder - -sealed class ScreenRoutes(val route: String) { - object Home : ScreenRoutes("home") - object MathWriteGame : ScreenRoutes("math_write_game/{operation}") { - fun createRoute(operation: String): String { - val encodedOperation = URLEncoder.encode(operation, "UTF-8") - return "math_write_game/$encodedOperation" - } - } -}