diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9b9ee9889fb6f6e120f186aa6d332af475d49b48..c1d371b6f985c06990b39633c6c2a4d34ba944f1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsKotlinAndroid) + id("kotlin-kapt") } android { @@ -75,9 +76,9 @@ dependencies { val roomVersion = "2.6.1" - implementation("androidx.room:room-runtime:$roomVersion") - annotationProcessor("androidx.room:room-compiler:$roomVersion") - -} + implementation("androidx.room:room-runtime:$roomVersion") + kapt("androidx.room:room-compiler:$roomVersion") + implementation("androidx.room:room-ktx:$roomVersion") +} \ No newline at end of file diff --git a/app/src/main/java/com/pomo/myapplication/MainActivity.kt b/app/src/main/java/com/pomo/myapplication/MainActivity.kt index 04b0f9c3ff1532cbd10504f36e4f2a86e3754308..1d2b52149a2f4d554071e640349054924f4e3871 100644 --- a/app/src/main/java/com/pomo/myapplication/MainActivity.kt +++ b/app/src/main/java/com/pomo/myapplication/MainActivity.kt @@ -36,17 +36,29 @@ class MainActivity : ComponentActivity() { permissionsHelper = PermissionsHelper(this) // Register individual permission launchers and pass them to PermissionsHelper - val postNotificationLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> - permissionsHelper.handlePermissionResult(Manifest.permission.POST_NOTIFICATIONS, isGranted) - } + val postNotificationLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> + permissionsHelper.handlePermissionResult( + Manifest.permission.POST_NOTIFICATIONS, + isGranted + ) + } - val accessNotificationPolicyLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> - permissionsHelper.handlePermissionResult(Manifest.permission.ACCESS_NOTIFICATION_POLICY, isGranted) - } + val accessNotificationPolicyLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> + permissionsHelper.handlePermissionResult( + Manifest.permission.ACCESS_NOTIFICATION_POLICY, + isGranted + ) + } - val useExactAlarmLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> - permissionsHelper.handlePermissionResult(Manifest.permission.USE_EXACT_ALARM, isGranted) - } + val useExactAlarmLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> + permissionsHelper.handlePermissionResult( + Manifest.permission.USE_EXACT_ALARM, + isGranted + ) + } // Initialize permission launchers with the registered launchers permissionsHelper.initializePermissionLaunchers( @@ -74,7 +86,10 @@ class MainActivity : ComponentActivity() { @Composable - private fun SetupNavGraph(navController: NavHostController) { + fun SetupNavGraph(navController: NavHostController) { + // ViewModel einmalig für beide Screens + val taskViewModel: TaskViewModel = viewModel() // Verwende viewModel() hier + NavHost( navController = navController, startDestination = "timer_screen" @@ -82,17 +97,21 @@ class MainActivity : ComponentActivity() { composable("timer_screen") { TimerScreen( onToDoListClick = { - // Navigate to the to-do screen and request pending permissions + // Navigiere zum To-Do-Screen und fordere ausstehende Berechtigungen an navController.navigate("todo_screen") permissionsHelper.requestPendingPermissions() }, notificationHelper = notificationHelper, activity = this@MainActivity, - viewModel = viewModel() // Use viewModel to provide the SharedViewModel + viewModel = viewModel() // ViewModel bereitstellen ) } composable("todo_screen") { - ToDoScreen(onBackClick = { navController.navigateUp() }) + // Übergib den ViewModel an die ToDoScreen + ToDoScreen( + onBackClick = { navController.navigateUp() }, + taskViewModel = taskViewModel // ViewModel weitergeben + ) } } } diff --git a/app/src/main/java/com/pomo/myapplication/TaskRepos.kt b/app/src/main/java/com/pomo/myapplication/TaskRepos.kt new file mode 100644 index 0000000000000000000000000000000000000000..ef0861226e0b09aa2607a63026ede1127f352d9f --- /dev/null +++ b/app/src/main/java/com/pomo/myapplication/TaskRepos.kt @@ -0,0 +1,21 @@ +package com.pomo.myapplication + +import com.pomo.myapplication.timerroom.TaskDao +import com.pomo.myapplication.timerroom.TaskEntity +import kotlinx.coroutines.flow.Flow + +class TaskRepository(private val taskDao: TaskDao) { + val allTasks: Flow<List<TaskEntity>> = taskDao.getAllTasks() + + suspend fun insertTask(task: TaskEntity) { + taskDao.insertTask(task) + } + + suspend fun deleteTask(task: TaskEntity) { + taskDao.deleteTask(task) + } + + suspend fun updateTask(task: TaskEntity) { + taskDao.updateTask(task) + } +} diff --git a/app/src/main/java/com/pomo/myapplication/TaskViewModel.kt b/app/src/main/java/com/pomo/myapplication/TaskViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..36eb9441b8aee6c793e98f8e78c6dfb03f3c5192 --- /dev/null +++ b/app/src/main/java/com/pomo/myapplication/TaskViewModel.kt @@ -0,0 +1,32 @@ +package com.pomo.myapplication + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import com.pomo.myapplication.timerroom.AppDatabase +import com.pomo.myapplication.timerroom.TaskEntity +import kotlinx.coroutines.launch +import kotlinx.coroutines.flow.Flow + +class TaskViewModel(application: Application) : AndroidViewModel(application) { + private val repository: TaskRepository + val allTasks: Flow<List<TaskEntity>> + + init { + val taskDao = AppDatabase.getDatabase(application).taskDao() + repository = TaskRepository(taskDao) + allTasks = repository.allTasks + } + + fun insertTask(task: TaskEntity) = viewModelScope.launch { + repository.insertTask(task) + } + + fun deleteTask(task: TaskEntity) = viewModelScope.launch { + repository.deleteTask(task) + } + + fun updateTask(task: TaskEntity) = viewModelScope.launch { + repository.updateTask(task) + } +} diff --git a/app/src/main/java/com/pomo/myapplication/ToDoList.kt b/app/src/main/java/com/pomo/myapplication/ToDoList.kt index a5b717be0181b5ac986a47150b7c48d7f68863ef..dbe4949e856902359c02a3c92250197f9d84963a 100644 --- a/app/src/main/java/com/pomo/myapplication/ToDoList.kt +++ b/app/src/main/java/com/pomo/myapplication/ToDoList.kt @@ -28,72 +28,57 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog +import com.pomo.myapplication.timerroom.TaskEntity + @Composable -fun ToDoScreen(onBackClick: () -> Unit) { - val tasks = remember { mutableStateListOf<Task>() } +fun ToDoScreen(onBackClick: () -> Unit, taskViewModel: TaskViewModel) { + val tasks by taskViewModel.allTasks.collectAsState(initial = emptyList()) // Flow als State beobachten var showDialog by remember { mutableStateOf(false) } - Surface( - modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colorScheme.background - ) { + Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { Column( - modifier = Modifier - .fillMaxSize() - .padding(16.dp), + modifier = Modifier.fillMaxSize().padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Top ) { Row( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { IconButton(onClick = onBackClick) { - Icon( - imageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = "Back" - ) + Icon(imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back") } Spacer(modifier = Modifier.weight(1f)) - Text( - text = "To-Do", - style = MaterialTheme.typography.headlineLarge, - modifier = Modifier.align(Alignment.CenterVertically) - ) + Text(text = "To-Do", style = MaterialTheme.typography.headlineLarge, modifier = Modifier.align(Alignment.CenterVertically)) Spacer(modifier = Modifier.weight(1f)) IconButton(onClick = { showDialog = true }) { - Icon( - imageVector = Icons.Default.Add, - contentDescription = "Add Task" - ) + Icon(imageVector = Icons.Default.Add, contentDescription = "Add Task") } } Spacer(modifier = Modifier.height(20.dp)) - // Display the list of tasks LazyColumn { - items(tasks) { task -> + items(tasks) { taskEntity -> + val task = Task(taskEntity.description, taskEntity.time, taskEntity.isCompleted) TaskItem( task = task, onComplete = { completedTask -> - tasks[tasks.indexOf(completedTask)] = completedTask.copy(isCompleted = !completedTask.isCompleted) + taskViewModel.updateTask(taskEntity.copy(isCompleted = !completedTask.isCompleted)) }, - onRemove = { removedTask -> - tasks.remove(removedTask) + onRemove = { + taskViewModel.deleteTask(taskEntity) } ) } @@ -104,7 +89,8 @@ fun ToDoScreen(onBackClick: () -> Unit) { TaskInputDialog( onDismiss = { showDialog = false }, onAddTask = { taskText, taskTime -> - tasks.add(Task(taskText, taskTime, isCompleted = false)) + val newTaskEntity = TaskEntity(description = taskText, time = taskTime, isCompleted = false) + taskViewModel.insertTask(newTaskEntity) showDialog = false } ) @@ -112,6 +98,8 @@ fun ToDoScreen(onBackClick: () -> Unit) { } } + + @Composable fun TaskItem(task: Task, onComplete: (Task) -> Unit, onRemove: (Task) -> Unit) { Row( @@ -152,7 +140,6 @@ fun TaskItem(task: Task, onComplete: (Task) -> Unit, onRemove: (Task) -> Unit) { } } - @Composable fun TaskInputDialog(onDismiss: () -> Unit, onAddTask: (String, String) -> Unit) { var taskText by remember { mutableStateOf("") } @@ -240,10 +227,4 @@ data class Task( val description: String, val time: String, val isCompleted: Boolean -) - -@Preview(showBackground = true) -@Composable -fun PreviewToDoScreen() { - ToDoScreen(onBackClick = {}) -} +) \ No newline at end of file