diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7b5bbf9..816141e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -126,6 +126,7 @@ dependencies { implementation(libs.androidx.room.runtime) // ADDED: Explicitly add runtime implementation(libs.androidx.room.ktx) implementation(libs.core.ktx) + implementation(libs.androidx.compose.runtime) ksp(libs.room.compiler) // Networking diff --git a/app/src/main/java/eu/gaudian/translator/view/Navigation.kt b/app/src/main/java/eu/gaudian/translator/view/Navigation.kt index 9ccfefe..36e11a5 100644 --- a/app/src/main/java/eu/gaudian/translator/view/Navigation.kt +++ b/app/src/main/java/eu/gaudian/translator/view/Navigation.kt @@ -154,8 +154,22 @@ fun AppNavHost( NewWordReviewScreen(navController = navController) } - composable(NavigationRoutes.START_EXERCISE) { - StartExerciseScreen(navController = navController) + composable( + route = "${NavigationRoutes.START_EXERCISE}?categoryId={categoryId}", + arguments = listOf( + navArgument("categoryId") { + type = NavType.StringType + nullable = true + defaultValue = null + } + ) + ) { backStackEntry -> + val categoryIdString = backStackEntry.arguments?.getString("categoryId") + val categoryId = categoryIdString?.toIntOrNull() + StartExerciseScreen( + navController = navController, + preselectedCategoryId = categoryId + ) } // Define all other navigation graphs at the same top level. diff --git a/app/src/main/java/eu/gaudian/translator/view/exercises/StartExerciseScreen.kt b/app/src/main/java/eu/gaudian/translator/view/exercises/StartExerciseScreen.kt index 454830e..3bb9a76 100644 --- a/app/src/main/java/eu/gaudian/translator/view/exercises/StartExerciseScreen.kt +++ b/app/src/main/java/eu/gaudian/translator/view/exercises/StartExerciseScreen.kt @@ -35,6 +35,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf @@ -76,17 +77,30 @@ import kotlinx.coroutines.launch @Composable fun StartExerciseScreen( navController: NavHostController, + preselectedCategoryId: Int? = null, modifier: Modifier = Modifier ) { val activity = androidx.compose.ui.platform.LocalContext.current.findActivity() val vocabularyViewModel: VocabularyViewModel = hiltViewModel(viewModelStoreOwner = activity) + val categoryViewModel: CategoryViewModel = hiltViewModel(viewModelStoreOwner = activity) val exerciseViewModel: VocabularyExerciseViewModel = hiltViewModel(viewModelStoreOwner = activity) val exerciseConfig by exerciseViewModel.pendingExerciseConfig.collectAsState() + val allCategories by categoryViewModel.categories.collectAsState(initial = emptyList()) var selectedLanguagePairs by remember { mutableStateOf>>(emptyList()) } var selectedCategories by remember { mutableStateOf>(emptyList()) } var selectedStages by remember { mutableStateOf>(emptyList()) } + // Initialize preselected category + LaunchedEffect(allCategories, preselectedCategoryId) { + if (preselectedCategoryId != null) { + val category = allCategories.find { it.id == preselectedCategoryId } + if (category != null && category !in selectedCategories) { + selectedCategories = listOf(category) + } + } + } + var selectedOriginLanguage by remember { mutableStateOf(null) } var selectedTargetLanguage by remember { mutableStateOf(null) } val isDirectionPreferenceSet = selectedOriginLanguage != null || selectedTargetLanguage != null diff --git a/app/src/main/java/eu/gaudian/translator/view/vocabulary/CategoryDetailScreen.kt b/app/src/main/java/eu/gaudian/translator/view/vocabulary/CategoryDetailScreen.kt index 49d4c53..f069efb 100644 --- a/app/src/main/java/eu/gaudian/translator/view/vocabulary/CategoryDetailScreen.kt +++ b/app/src/main/java/eu/gaudian/translator/view/vocabulary/CategoryDetailScreen.kt @@ -255,9 +255,7 @@ fun CategoryDetailScreen( subtitle = subtitle, categoryProgress = categoryProgress, onStartExerciseClick = { - val categories = listOf(category) - val categoryIds = categories.joinToString(",") { it?.id.toString() } - navController.navigate("vocabulary_exercise/false?categories=$categoryIds") + navController.navigate("start_exercise?categoryId=$categoryId") }, onEditClick = { categoryViewModel.setShowEditCategoryDialog(true, categoryId) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 47731b5..e4d4d1a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,6 +42,7 @@ coreKtxVersion = "1.7.0" truth = "1.4.5" zstdJni = "1.5.7-7" composeMarkdown = "0.5.8" +runtime = "1.10.3" [libraries] @@ -102,6 +103,7 @@ hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", ve hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version = "1.3.0" } mockk = { module = "io.mockk:mockk", version = "1.14.9" } compose-markdown = { module = "com.github.jeziellago:compose-markdown", version.ref = "composeMarkdown" } +androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "runtime" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }