/** * NavigationDemo — three-screen app using Navigation-Compose. * Demonstrates route arguments and Scaffold with back navigation. */ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavHostController import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument data class Course(val id: Int, val code: String, val title: String, val credits: Int) val sampleCourses = listOf( Course(1, "IT6003", "Advanced Java Programming", 3), Course(2, "IT6010", "Mobile Application Development", 3), Course(3, "IT3101", "Data Structures & Algorithms", 4), Course(4, "IT1102", "Intro to High-Level Programming", 3) ) @Composable fun NavigationDemoApp() { val nav = rememberNavController() NavHost(navController = nav, startDestination = "list") { composable("list") { CourseListScreen(nav) } composable( route = "detail/{id}", arguments = listOf(navArgument("id") { type = NavType.IntType }) ) { entry -> val id = entry.arguments?.getInt("id") ?: -1 CourseDetailScreen(id, onBack = { nav.popBackStack() }) } composable("about") { AboutScreen(onBack = { nav.popBackStack() }) } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun CourseListScreen(nav: NavHostController) { Scaffold( topBar = { TopAppBar( title = { Text("SUZA Courses") }, actions = { TextButton(onClick = { nav.navigate("about") }) { Text("About") } } ) } ) { padding -> LazyColumn( modifier = Modifier.padding(padding), contentPadding = PaddingValues(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(sampleCourses, key = { it.id }) { c -> ElevatedCard( modifier = Modifier.fillMaxWidth(), onClick = { nav.navigate("detail/${c.id}") } ) { Column(Modifier.padding(16.dp)) { Text(c.code, fontWeight = FontWeight.Bold) Text(c.title, fontSize = 18.sp) Text("${c.credits} credits", fontSize = 12.sp) } } } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun CourseDetailScreen(id: Int, onBack: () -> Unit) { val course = sampleCourses.find { it.id == id } Scaffold(topBar = { TopAppBar( title = { Text(course?.code ?: "Unknown") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Default.ArrowBack, "Back") } } ) }) { padding -> Column(Modifier.padding(padding).padding(16.dp)) { if (course == null) Text("Course not found") else { Text(course.title, fontSize = 22.sp, fontWeight = FontWeight.Bold) Spacer(Modifier.height(8.dp)) Text("Code: ${course.code}") Text("Credits: ${course.credits}") } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun AboutScreen(onBack: () -> Unit) { Scaffold(topBar = { TopAppBar( title = { Text("About") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Default.ArrowBack, "Back") } } ) }) { padding -> Column(Modifier.padding(padding).padding(16.dp)) { Text("Mobile Application Development", fontWeight = FontWeight.Bold, fontSize = 20.sp) Text("State University of Zanzibar") Text("Semester II — 2025/2026") } } }