Skip to content
Snippets Groups Projects
Commit f93fbbf5 authored by salih's avatar salih
Browse files

Repos und TaskViewModel

parent c51339cb
Branches
No related tags found
No related merge requests found
plugins { plugins {
alias(libs.plugins.androidApplication) alias(libs.plugins.androidApplication)
alias(libs.plugins.jetbrainsKotlinAndroid) alias(libs.plugins.jetbrainsKotlinAndroid)
id("kotlin-kapt")
} }
android { android {
...@@ -75,9 +76,9 @@ dependencies { ...@@ -75,9 +76,9 @@ dependencies {
val roomVersion = "2.6.1" 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
...@@ -36,16 +36,28 @@ class MainActivity : ComponentActivity() { ...@@ -36,16 +36,28 @@ class MainActivity : ComponentActivity() {
permissionsHelper = PermissionsHelper(this) permissionsHelper = PermissionsHelper(this)
// Register individual permission launchers and pass them to PermissionsHelper // Register individual permission launchers and pass them to PermissionsHelper
val postNotificationLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> val postNotificationLauncher =
permissionsHelper.handlePermissionResult(Manifest.permission.POST_NOTIFICATIONS, isGranted) registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
permissionsHelper.handlePermissionResult(
Manifest.permission.POST_NOTIFICATIONS,
isGranted
)
} }
val accessNotificationPolicyLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> val accessNotificationPolicyLauncher =
permissionsHelper.handlePermissionResult(Manifest.permission.ACCESS_NOTIFICATION_POLICY, isGranted) registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
permissionsHelper.handlePermissionResult(
Manifest.permission.ACCESS_NOTIFICATION_POLICY,
isGranted
)
} }
val useExactAlarmLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> val useExactAlarmLauncher =
permissionsHelper.handlePermissionResult(Manifest.permission.USE_EXACT_ALARM, isGranted) registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
permissionsHelper.handlePermissionResult(
Manifest.permission.USE_EXACT_ALARM,
isGranted
)
} }
// Initialize permission launchers with the registered launchers // Initialize permission launchers with the registered launchers
...@@ -74,7 +86,10 @@ class MainActivity : ComponentActivity() { ...@@ -74,7 +86,10 @@ class MainActivity : ComponentActivity() {
@Composable @Composable
private fun SetupNavGraph(navController: NavHostController) { fun SetupNavGraph(navController: NavHostController) {
// ViewModel einmalig für beide Screens
val taskViewModel: TaskViewModel = viewModel() // Verwende viewModel() hier
NavHost( NavHost(
navController = navController, navController = navController,
startDestination = "timer_screen" startDestination = "timer_screen"
...@@ -82,17 +97,21 @@ class MainActivity : ComponentActivity() { ...@@ -82,17 +97,21 @@ class MainActivity : ComponentActivity() {
composable("timer_screen") { composable("timer_screen") {
TimerScreen( TimerScreen(
onToDoListClick = { 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") navController.navigate("todo_screen")
permissionsHelper.requestPendingPermissions() permissionsHelper.requestPendingPermissions()
}, },
notificationHelper = notificationHelper, notificationHelper = notificationHelper,
activity = this@MainActivity, activity = this@MainActivity,
viewModel = viewModel() // Use viewModel to provide the SharedViewModel viewModel = viewModel() // ViewModel bereitstellen
) )
} }
composable("todo_screen") { composable("todo_screen") {
ToDoScreen(onBackClick = { navController.navigateUp() }) // Übergib den ViewModel an die ToDoScreen
ToDoScreen(
onBackClick = { navController.navigateUp() },
taskViewModel = taskViewModel // ViewModel weitergeben
)
} }
} }
} }
......
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)
}
}
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)
}
}
...@@ -28,72 +28,57 @@ import androidx.compose.material3.MaterialTheme ...@@ -28,72 +28,57 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import com.pomo.myapplication.timerroom.TaskEntity
@Composable @Composable
fun ToDoScreen(onBackClick: () -> Unit) { fun ToDoScreen(onBackClick: () -> Unit, taskViewModel: TaskViewModel) {
val tasks = remember { mutableStateListOf<Task>() } val tasks by taskViewModel.allTasks.collectAsState(initial = emptyList()) // Flow als State beobachten
var showDialog by remember { mutableStateOf(false) } var showDialog by remember { mutableStateOf(false) }
Surface( Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Column( Column(
modifier = Modifier modifier = Modifier.fillMaxSize().padding(16.dp),
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top verticalArrangement = Arrangement.Top
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier.fillMaxWidth(),
.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
IconButton(onClick = onBackClick) { IconButton(onClick = onBackClick) {
Icon( Icon(imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back")
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "Back"
)
} }
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
Text( Text(text = "To-Do", style = MaterialTheme.typography.headlineLarge, modifier = Modifier.align(Alignment.CenterVertically))
text = "To-Do",
style = MaterialTheme.typography.headlineLarge,
modifier = Modifier.align(Alignment.CenterVertically)
)
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
IconButton(onClick = { showDialog = true }) { IconButton(onClick = { showDialog = true }) {
Icon( Icon(imageVector = Icons.Default.Add, contentDescription = "Add Task")
imageVector = Icons.Default.Add,
contentDescription = "Add Task"
)
} }
} }
Spacer(modifier = Modifier.height(20.dp)) Spacer(modifier = Modifier.height(20.dp))
// Display the list of tasks
LazyColumn { LazyColumn {
items(tasks) { task -> items(tasks) { taskEntity ->
val task = Task(taskEntity.description, taskEntity.time, taskEntity.isCompleted)
TaskItem( TaskItem(
task = task, task = task,
onComplete = { completedTask -> onComplete = { completedTask ->
tasks[tasks.indexOf(completedTask)] = completedTask.copy(isCompleted = !completedTask.isCompleted) taskViewModel.updateTask(taskEntity.copy(isCompleted = !completedTask.isCompleted))
}, },
onRemove = { removedTask -> onRemove = {
tasks.remove(removedTask) taskViewModel.deleteTask(taskEntity)
} }
) )
} }
...@@ -104,7 +89,8 @@ fun ToDoScreen(onBackClick: () -> Unit) { ...@@ -104,7 +89,8 @@ fun ToDoScreen(onBackClick: () -> Unit) {
TaskInputDialog( TaskInputDialog(
onDismiss = { showDialog = false }, onDismiss = { showDialog = false },
onAddTask = { taskText, taskTime -> onAddTask = { taskText, taskTime ->
tasks.add(Task(taskText, taskTime, isCompleted = false)) val newTaskEntity = TaskEntity(description = taskText, time = taskTime, isCompleted = false)
taskViewModel.insertTask(newTaskEntity)
showDialog = false showDialog = false
} }
) )
...@@ -112,6 +98,8 @@ fun ToDoScreen(onBackClick: () -> Unit) { ...@@ -112,6 +98,8 @@ fun ToDoScreen(onBackClick: () -> Unit) {
} }
} }
@Composable @Composable
fun TaskItem(task: Task, onComplete: (Task) -> Unit, onRemove: (Task) -> Unit) { fun TaskItem(task: Task, onComplete: (Task) -> Unit, onRemove: (Task) -> Unit) {
Row( Row(
...@@ -152,7 +140,6 @@ fun TaskItem(task: Task, onComplete: (Task) -> Unit, onRemove: (Task) -> Unit) { ...@@ -152,7 +140,6 @@ fun TaskItem(task: Task, onComplete: (Task) -> Unit, onRemove: (Task) -> Unit) {
} }
} }
@Composable @Composable
fun TaskInputDialog(onDismiss: () -> Unit, onAddTask: (String, String) -> Unit) { fun TaskInputDialog(onDismiss: () -> Unit, onAddTask: (String, String) -> Unit) {
var taskText by remember { mutableStateOf("") } var taskText by remember { mutableStateOf("") }
...@@ -241,9 +228,3 @@ data class Task( ...@@ -241,9 +228,3 @@ data class Task(
val time: String, val time: String,
val isCompleted: Boolean val isCompleted: Boolean
) )
\ No newline at end of file
@Preview(showBackground = true)
@Composable
fun PreviewToDoScreen() {
ToDoScreen(onBackClick = {})
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment