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

Repos und TaskViewModel

parent c51339cb
No related branches found
No related tags found
No related merge requests found
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
......@@ -36,16 +36,28 @@ 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
......@@ -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
)
}
}
}
......
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
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("") }
......@@ -241,9 +228,3 @@ data class Task(
val time: String,
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