diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7f549ea8c42dbc7c3975313c7b48e217d2c7fc32..3fdf003c491f19b33e446cbaf4142ccc1ba5c644 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -56,6 +56,8 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + implementation(libs.androidx.navigation.runtime.ktx) + implementation(libs.androidx.navigation.compose) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 829b0ac5c149792d516e0235cf59cd9c4db06e8f..6c7e6cab950943cc83497c1a1c9786671d647c56 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> - <uses-permission android:name="android.permission.VIBRATE"/> + <uses-permission android:name="android.permission.VIBRATE" android:required="false"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> @@ -26,7 +26,6 @@ <activity android:name=".MainActivity" android:exported="true" - android:label="@string/app_name" android:theme="@style/Theme.MyApplication"> <intent-filter> <action android:name="android.intent.action.MAIN" /> diff --git a/app/src/main/java/com/pomo/myapplication/CustomTimerDialog.kt b/app/src/main/java/com/pomo/myapplication/CustomTimerDialog.kt new file mode 100644 index 0000000000000000000000000000000000000000..4d0e2d1cfda42be6897a89be635f55723009a223 --- /dev/null +++ b/app/src/main/java/com/pomo/myapplication/CustomTimerDialog.kt @@ -0,0 +1,51 @@ +package com.pomo.myapplication + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp + +@Composable +fun CustomTimerDialog( + inputMinutes: String, + onMinutesChange: (String) -> Unit, + onConfirm: () -> Unit, + onDismiss: () -> Unit +) { + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(text = "Set Custom Timer") }, + text = { + Column { + Text(text = "Enter the number of minutes:") + Spacer(modifier = Modifier.height(8.dp)) + TextField( + value = inputMinutes, + onValueChange = onMinutesChange, + modifier = Modifier.fillMaxWidth(), + keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number), + placeholder = { Text(text = "Enter minutes") } + ) + } + }, + confirmButton = { + Button(onClick = onConfirm) { + Text(text = "OK") + } + }, + dismissButton = { + Button(onClick = onDismiss) { + Text(text = "Cancel") + } + } + ) +} diff --git a/app/src/main/java/com/pomo/myapplication/MainActivity.kt b/app/src/main/java/com/pomo/myapplication/MainActivity.kt index ade1c93c54c331d7502222fbe9803d8422b0c2f8..835c6d09129720be76204f0faeec0cd72f7e26cf 100644 --- a/app/src/main/java/com/pomo/myapplication/MainActivity.kt +++ b/app/src/main/java/com/pomo/myapplication/MainActivity.kt @@ -6,31 +6,21 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.* -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.List import androidx.compose.material3.* import androidx.compose.runtime.* -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.unit.dp -import androidx.core.app.ActivityCompat -import com.pomo.myapplication.ui.theme.MotivationalQuotes +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import com.pomo.myapplication.ui.theme.MyApplicationTheme -import com.pomo.myapplication.ui.theme.ToDoListScreen -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.pomo.myapplication.ui.theme.ToDoScreen class MainActivity : ComponentActivity() { - private val postNotificationsPermission = POST_NOTIFICATIONS - private lateinit var notificationHelper: NotificationHelper - private var timeLeftForNotification: String? = null + val postNotificationsPermission = POST_NOTIFICATIONS + lateinit var notificationHelper: NotificationHelper + var timeLeftForNotification: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -42,14 +32,16 @@ class MainActivity : ComponentActivity() { modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - MainScreen() + val navController = rememberNavController() + SetupNavGraph(navController = navController) } } } } companion object { - private const val PERMISSION_REQUEST_CODE = 1001 + const val postNotificationsPermission: String = POST_NOTIFICATIONS + const val PERMISSION_REQUEST_CODE = 1001 } override fun onRequestPermissionsResult( @@ -60,7 +52,6 @@ class MainActivity : ComponentActivity() { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == PERMISSION_REQUEST_CODE) { if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { - // Permission granted, show the notification if needed timeLeftForNotification?.let { notificationHelper.updateNotification() } @@ -71,259 +62,29 @@ class MainActivity : ComponentActivity() { } @Composable - fun MainScreen() { - var showToDoList by remember { mutableStateOf(false) } - - if (showToDoList) { - ToDoListScreen() - } else { - TimerScreen(onToDoListClick = { showToDoList = true }) - } - } - - @Composable - fun TimerScreen(onToDoListClick: () -> Unit) { - var timeLeftInMillis by remember { mutableStateOf(25 * 60 * 1000L) } - var timerRunning by remember { mutableStateOf(false) } - var customMinutes by remember { mutableStateOf(0) } - val timeFormatted = remember(timeLeftInMillis) { - val minutes = (timeLeftInMillis / 1000) / 60 - val seconds = (timeLeftInMillis / 1000) % 60 - String.format("%02d:%02d", minutes, seconds) - } - - var showDialog by remember { mutableStateOf(false) } - var inputMinutes by remember { mutableStateOf("") } - - var job: Job? by remember { mutableStateOf(null) } - - fun startTimer() { - job?.cancel() - job = CoroutineScope(Dispatchers.Main).launch { - timerRunning = true - notificationHelper.startTimerCountdown(timeLeftInMillis) - while (timeLeftInMillis > 0 && timerRunning) { - delay(1000L) - timeLeftInMillis -= 1000L - // Update notification with the remaining time - timeLeftForNotification = timeFormatted - if (ActivityCompat.checkSelfPermission( - this@MainActivity, - postNotificationsPermission - ) == PackageManager.PERMISSION_GRANTED - ) { - notificationHelper.updateNotification() - } - } - if (timeLeftInMillis <= 0) { - timerRunning = false - notificationHelper.showTimerFinishedNotification() - } - } - } - - fun stopTimer() { - job?.cancel() - timerRunning = false - } - - fun resetTimer() { - job?.cancel() - timeLeftInMillis = 0 - timerRunning = false - } - - fun setTimer(minutes: Int) { - job?.cancel() - timeLeftInMillis = minutes * 60 * 1000L - timerRunning = false - notificationHelper.cancelNotification() - } - - fun setCustomTimer() { - val minutes = inputMinutes.toIntOrNull() ?: 0 - if (minutes > 0) { - customMinutes = minutes - setTimer(customMinutes) - showDialog = false - } - } - - val motivationalQuote = remember { MotivationalQuotes.getRandomQuote() } - - Box( - modifier = Modifier.fillMaxSize() + fun SetupNavGraph(navController: NavHostController) { + NavHost( + navController = navController, + startDestination = "timer_screen" ) { - Column( - modifier = Modifier - .fillMaxSize() - .padding(bottom = 80.dp), // Padding für den Floating Action Button - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text( - text = motivationalQuote, - style = MaterialTheme.typography.titleLarge, - color = Color.Gray, - modifier = Modifier.padding(16.dp) + composable("timer_screen") { + TimerScreen( + onToDoListClick = { navController.navigate("todo_screen") }, + notificationHelper = notificationHelper, + activity = this@MainActivity ) - - TimerDisplay(time = timeFormatted) - Spacer(modifier = Modifier.height(20.dp)) - Row { - Button( - onClick = { - if (ActivityCompat.checkSelfPermission( - this@MainActivity, - postNotificationsPermission - ) == PackageManager.PERMISSION_GRANTED - ) { - startTimer() - } else { - ActivityCompat.requestPermissions( - this@MainActivity, - arrayOf(postNotificationsPermission), - PERMISSION_REQUEST_CODE - ) - } - }, - colors = ButtonDefaults.buttonColors( - containerColor = Color(0xFF00AA07), - contentColor = Color.White - ), - enabled = !timerRunning - ) { - Text(text = "Start") - } - Spacer(modifier = Modifier.width(8.dp)) - Button( - onClick = { stopTimer() }, - colors = ButtonDefaults.buttonColors( - containerColor = Color(0xFFD32F2F), - contentColor = Color.White - ), - enabled = timerRunning - ) { - Text(text = "Pause") - } - Spacer(modifier = Modifier.width(8.dp)) - Button(onClick = { resetTimer() }) { - Text(text = "Reset") - } - } - - Spacer(modifier = Modifier.height(20.dp)) - Row { - Button( - onClick = { setTimer(5) }, - colors = ButtonDefaults.buttonColors( - containerColor = Color(0xFF6650a4), - contentColor = Color.White - ) - ) { - Text(text = "5 min") - } - - Spacer(modifier = Modifier.width(8.dp)) - Button( - onClick = { setTimer(15) }, - colors = ButtonDefaults.buttonColors( - containerColor = Color(0xFF6650a4), - contentColor = Color.White - ) - ) { - Text(text = "15 min") - } - - Spacer(modifier = Modifier.width(8.dp)) - Button( - onClick = { setTimer(25) }, - colors = ButtonDefaults.buttonColors( - containerColor = Color(0xFF6650a4), - contentColor = Color.White - ) - ) { - Text(text = "25 min") - } - } - - Spacer(modifier = Modifier.height(20.dp)) - - Spacer(modifier = Modifier.height(8.dp)) - Button(onClick = { showDialog = true }, - colors = ButtonDefaults.buttonColors( - containerColor = Color.Magenta, - contentColor = Color.White - ) - ) { - Text(text = "Set Custom Timer") - } - - if (showDialog) { - CustomTimerDialog( - inputMinutes = inputMinutes, - onMinutesChange = { inputMinutes = it }, - onConfirm = { setCustomTimer() }, - onDismiss = { showDialog = false } - ) - } } - - FloatingActionButton( - onClick = onToDoListClick, - modifier = Modifier - .align(Alignment.BottomEnd) - .padding(16.dp) - ) { - Icon( - imageVector = Icons.Filled.List, - contentDescription = "To-Do List" - ) + composable("todo_screen") { + ToDoScreen(onBackClick = { navController.navigateUp() }) } } } +} - @Composable - fun CustomTimerDialog( - inputMinutes: String, - onMinutesChange: (String) -> Unit, - onConfirm: () -> Unit, - onDismiss: () -> Unit - ) { - AlertDialog( - onDismissRequest = onDismiss, - title = { Text(text = "Set Custom Timer") }, - text = { - Column { - Text(text = "Enter the number of minutes:") - Spacer(modifier = Modifier.height(8.dp)) - TextField( - value = inputMinutes, - onValueChange = onMinutesChange, - modifier = Modifier.fillMaxWidth(), - keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number), - placeholder = { Text(text = "Enter minutes") } - ) - } - }, - confirmButton = { - Button(onClick = onConfirm) { - Text(text = "OK") - } - }, - dismissButton = { - Button(onClick = onDismiss) { - Text(text = "Cancel") - } - } - ) - } - - @Composable +@Composable fun TimerDisplay(time: String) { Text( text = time, style = MaterialTheme.typography.displayLarge ) } -} diff --git a/app/src/main/java/com/pomo/myapplication/Permissions.kt b/app/src/main/java/com/pomo/myapplication/Permissions.kt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/src/main/java/com/pomo/myapplication/TimerScreen.kt b/app/src/main/java/com/pomo/myapplication/TimerScreen.kt new file mode 100644 index 0000000000000000000000000000000000000000..701b66e593aed8cc6c95adc79a033435110dc5d8 --- /dev/null +++ b/app/src/main/java/com/pomo/myapplication/TimerScreen.kt @@ -0,0 +1,222 @@ +package com.pomo.myapplication + +import android.content.pm.PackageManager +import androidx.activity.ComponentActivity +import androidx.compose.foundation.layout.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.List +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.core.app.ActivityCompat +import com.pomo.myapplication.ui.theme.MotivationalQuotes +import kotlinx.coroutines.* + +@Composable +fun TimerScreen( + onToDoListClick: () -> Unit, + notificationHelper: NotificationHelper, + activity: ComponentActivity +) { + var timeLeftInMillis by remember { mutableLongStateOf(25 * 60 * 1000L) } + var timerRunning by remember { mutableStateOf(false) } + var customMinutes by remember { mutableIntStateOf(0) } + val timeFormatted = remember(timeLeftInMillis) { + val minutes = (timeLeftInMillis / 1000) / 60 + val seconds = (timeLeftInMillis / 1000) % 60 + String.format("%02d:%02d", minutes, seconds) + } + + var showDialog by remember { mutableStateOf(false) } + var inputMinutes by remember { mutableStateOf("") } + + var job: Job? by remember { mutableStateOf(null) } + + fun startTimer() { + job?.cancel() + job = CoroutineScope(Dispatchers.Main).launch { + timerRunning = true + notificationHelper.startTimerCountdown(timeLeftInMillis) + while (timeLeftInMillis > 0 && timerRunning) { + delay(1000L) + timeLeftInMillis -= 1000L + (activity as MainActivity).timeLeftForNotification = timeFormatted + if (ActivityCompat.checkSelfPermission( + activity, + activity.postNotificationsPermission + ) == PackageManager.PERMISSION_GRANTED + ) { + notificationHelper.updateNotification() + } + } + if (timeLeftInMillis <= 0) { + timerRunning = false + notificationHelper.showTimerFinishedNotification() + } + } + } + + fun stopTimer() { + job?.cancel() + timerRunning = false + } + + fun resetTimer() { + job?.cancel() + timeLeftInMillis = 0 + timerRunning = false + } + + fun setTimer(minutes: Int) { + job?.cancel() + timeLeftInMillis = minutes * 60 * 1000L + timerRunning = false + notificationHelper.cancelNotification() + } + + fun setCustomTimer() { + val minutes = inputMinutes.toIntOrNull() ?: 0 + if (minutes > 0) { + customMinutes = minutes + setTimer(customMinutes) + showDialog = false + } + } + + val motivationalQuote = remember { MotivationalQuotes.getRandomQuote() } + + Box( + modifier = Modifier.fillMaxSize() + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 80.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = motivationalQuote, + style = MaterialTheme.typography.titleLarge, + color = Color.Gray, + modifier = Modifier.padding(16.dp) + ) + + TimerDisplay(time = timeFormatted) + Spacer(modifier = Modifier.height(20.dp)) + Row { + Button( + onClick = { + if (ActivityCompat.checkSelfPermission( + activity, + MainActivity.postNotificationsPermission + ) == PackageManager.PERMISSION_GRANTED + ) { + startTimer() + } else { + ActivityCompat.requestPermissions( + activity, + arrayOf(MainActivity.postNotificationsPermission), + MainActivity.PERMISSION_REQUEST_CODE + ) + } + }, + colors = ButtonDefaults.buttonColors( + containerColor = Color(0xFF00AA07), + contentColor = Color.White + ), + enabled = !timerRunning + ) { + Text(text = "Start") + } + Spacer(modifier = Modifier.width(8.dp)) + Button( + onClick = { stopTimer() }, + colors = ButtonDefaults.buttonColors( + containerColor = Color(0xFFD32F2F), + contentColor = Color.White + ), + enabled = timerRunning + ) { + Text(text = "Pause") + } + Spacer(modifier = Modifier.width(8.dp)) + Button(onClick = { resetTimer() }) { + Text(text = "Reset") + } + } + + + Spacer(modifier = Modifier.height(20.dp)) + Row { + Button( + onClick = { setTimer(5) }, + colors = ButtonDefaults.buttonColors( + containerColor = Color(0xFF6650a4), + contentColor = Color.White + ) + ) { + Text(text = "5 min") + } + + Spacer(modifier = Modifier.width(8.dp)) + Button( + onClick = { setTimer(15) }, + colors = ButtonDefaults.buttonColors( + containerColor = Color(0xFF6650a4), + contentColor = Color.White + ) + ) { + Text(text = "15 min") + } + + Spacer(modifier = Modifier.width(8.dp)) + Button( + onClick = { setTimer(25) }, + colors = ButtonDefaults.buttonColors( + containerColor = Color(0xFF6650a4), + contentColor = Color.White + ) + ) { + Text(text = "25 min") + } + } + + Spacer(modifier = Modifier.height(20.dp)) + + Spacer(modifier = Modifier.height(8.dp)) + Button(onClick = { showDialog = true }, + colors = ButtonDefaults.buttonColors( + containerColor = Color.Magenta, + contentColor = Color.White + ) + ) { + Text(text = "Set Custom Timer") + } + + if (showDialog) { + CustomTimerDialog( + inputMinutes = inputMinutes, + onMinutesChange = { inputMinutes = it }, + onConfirm = { setCustomTimer() }, + onDismiss = { showDialog = false } + ) + } + } + + FloatingActionButton( + onClick = onToDoListClick, + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(16.dp) + ) { + Icon( + imageVector = Icons.Filled.List, + contentDescription = "To-Do List" + ) + } + } +} diff --git a/app/src/main/java/com/pomo/myapplication/ui/theme/ToDoList.kt b/app/src/main/java/com/pomo/myapplication/ui/theme/ToDoList.kt index 74e5bda3c8199ee417349377a15ab9a4ceb5dd24..979b4cb0628d6c47ef945c804309f6fbdbe51d50 100644 --- a/app/src/main/java/com/pomo/myapplication/ui/theme/ToDoList.kt +++ b/app/src/main/java/com/pomo/myapplication/ui/theme/ToDoList.kt @@ -1,109 +1,57 @@ package com.pomo.myapplication.ui.theme import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp -@Composable -fun ToDoListScreen() { - var toDoItems by remember { mutableStateOf(listOf<String>()) } - var newToDoItem by remember { mutableStateOf("") } - var showAddDialog by remember { mutableStateOf(false) } - Column( - modifier = Modifier - .fillMaxSize() - .padding(16.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) +@Composable +fun ToDoScreen(onBackClick: () -> Unit) { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background ) { - Text( - text = "To-Do List", - style = MaterialTheme.typography.headlineLarge - ) - - Button(onClick = { showAddDialog = true }) { - Text(text = "Add To-Do") - } - - Spacer(modifier = Modifier.height(8.dp)) - - LazyColumn { - items(toDoItems) { item -> - Row( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp), - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(text = item) - Button(onClick = { toDoItems = toDoItems - item }) { - Text(text = "Delete") - } + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top + ) { + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + IconButton(onClick = onBackClick) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Back" + ) } + Spacer(modifier = Modifier.weight(1f)) + Text( + text = "To-Do", + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.align(Alignment.CenterVertically) + ) + Spacer(modifier = Modifier.weight(1f)) } - } - if (showAddDialog) { - AddToDoDialog( - onDismiss = { showAddDialog = false }, - onAdd = { - if (newToDoItem.isNotBlank()) { - toDoItems = toDoItems + newToDoItem - newToDoItem = "" - showAddDialog = false - } - }, - newToDoItem = newToDoItem, - onNewToDoItemChange = { newToDoItem = it } - ) - } - } -} + Spacer(modifier = Modifier.height(20.dp)) -@Composable -fun AddToDoDialog( - onDismiss: () -> Unit, - onAdd: () -> Unit, - newToDoItem: String, - onNewToDoItemChange: (String) -> Unit -) { - AlertDialog( - onDismissRequest = onDismiss, - title = { Text(text = "Add To-Do") }, - text = { - Column { - Text(text = "Enter the to-do item:") - Spacer(modifier = Modifier.height(8.dp)) - BasicTextField( - value = newToDoItem, - onValueChange = onNewToDoItemChange, - modifier = Modifier - .fillMaxWidth() - .padding(8.dp) - ) - } - }, - confirmButton = { - Button(onClick = onAdd) { - Text(text = "Add") - } - }, - dismissButton = { - Button(onClick = onDismiss) { - Text(text = "Cancel") - } } - ) + } } @Preview(showBackground = true) @Composable fun PreviewToDoListScreen() { - ToDoListScreen() + ToDoScreen(onBackClick = {}) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 32534ebb2598d9340176045903cfdae498fa8c98..8ec8ae2c03e9c6fdd5b59934684e064a62ac9e3c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,8 @@ espressoCore = "3.5.1" lifecycleRuntimeKtx = "2.6.1" activityCompose = "1.7.0" composeBom = "2023.08.00" +navigationRuntimeKtx = "2.7.7" +navigationCompose = "2.7.7" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -24,6 +26,8 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-navigation-runtime-ktx = { group = "androidx.navigation", name = "navigation-runtime-ktx", version.ref = "navigationRuntimeKtx" } +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }