From f20c8f0096c941aaf50675267139f88b7e6c47e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 3 May 2025 09:35:39 +0200 Subject: [PATCH] ADD: Edit Notes --- .idea/inspectionProfiles/Project_Default.xml | 3 + .../stormborntales/notevault/MainActivity.kt | 66 ++++++++++++------- .../notevault/data/local/dao/NoteDao.kt | 4 ++ .../notevault/data/local/entity/NoteEntity.kt | 10 +-- .../data/repository/NoteRepository.kt | 2 + .../notevault/ui/screens/AddNoteDialog.kt | 18 +++-- .../notevault/ui/screens/MainScreen.kt | 17 +++-- .../notevault/ui/viewmodel/NoteViewModel.kt | 23 ++++++- 8 files changed, 101 insertions(+), 42 deletions(-) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 005afb3..f0c6ad0 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -40,6 +40,9 @@ + + diff --git a/app/src/main/java/come/stormborntales/notevault/MainActivity.kt b/app/src/main/java/come/stormborntales/notevault/MainActivity.kt index 332389d..b98a8ca 100644 --- a/app/src/main/java/come/stormborntales/notevault/MainActivity.kt +++ b/app/src/main/java/come/stormborntales/notevault/MainActivity.kt @@ -2,27 +2,23 @@ package come.stormborntales.notevault import android.net.Uri import android.os.Bundle -import android.webkit.MimeTypeMap +import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.setContent -import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.viewmodel.compose.viewModel import come.stormborntales.notevault.data.local.AppDatabase -import come.stormborntales.notevault.data.model.NoteEntry +import come.stormborntales.notevault.data.local.entity.NoteEntity import come.stormborntales.notevault.data.repository.NoteRepository import come.stormborntales.notevault.ui.screens.AddNoteDialog import come.stormborntales.notevault.ui.screens.MainScreen import come.stormborntales.notevault.ui.theme.NoteVaultTheme import come.stormborntales.notevault.ui.viewmodel.NoteViewModel import come.stormborntales.notevault.ui.viewmodel.NoteViewModelFactory -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.io.File -import java.io.InputStream + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -35,11 +31,6 @@ class MainActivity : ComponentActivity() { setContent { NoteVaultTheme { val viewModel: NoteViewModel = viewModel(factory = viewModelFactory) - val context = LocalContext.current - - // Globale Notenliste - val notes = remember { mutableStateListOf() } - // Bildauswahl + Dialog-States var selectedUris by remember { mutableStateOf>(emptyList()) } var showDialog by remember { mutableStateOf(false) } @@ -55,6 +46,15 @@ class MainActivity : ComponentActivity() { } ) + var noteToEdit by remember { mutableStateOf(null) } + + // Dialog anzeigen + val openDialog: (NoteEntity?) -> Unit = { note -> + Log.d("EditNote", "NoteEntity: " + note?.title) + noteToEdit = note + showDialog = true + } + // UI anzeigen MainScreen( viewModel = viewModel, @@ -62,7 +62,8 @@ class MainActivity : ComponentActivity() { imagePickerLauncher.launch( arrayOf("image/*") ) - } + }, + onEditNote = openDialog ) // Dialog bei Bedarf @@ -72,17 +73,34 @@ class MainActivity : ComponentActivity() { AddNoteDialog( onDismiss = { showDialog = false }, onSave = { title, composer, year, genre, description -> - viewModel.addNote( - context = context, - title = title, - composer = composer, - year = year, - genre = genre, - description = description, - selectedUris = selectedUris, - onDone = { showDialog = false } - ) - } + if(noteToEdit == null) { + viewModel.addNote( + context = context, + title = title, + composer = composer, + year = year, + genre = genre, + description = description, + selectedUris = selectedUris, + onDone = { showDialog = false } + ) + } else { + viewModel.updateNote( + editedNote = noteToEdit!!, + updatedTitle = title, + updatedComposer = composer, + updatedYear = year, + updatedGenre = genre, + updatedDescription = description, + onDone = { showDialog = false } + ) + } + }, + initialTitle = noteToEdit?.title ?: "", + initialComposer = noteToEdit?.composer, + initialYear = noteToEdit?.year, + initialGenre = noteToEdit?.genre, + initialDescription = noteToEdit?.description ) } } diff --git a/app/src/main/java/come/stormborntales/notevault/data/local/dao/NoteDao.kt b/app/src/main/java/come/stormborntales/notevault/data/local/dao/NoteDao.kt index 8fa3169..a9c55ae 100644 --- a/app/src/main/java/come/stormborntales/notevault/data/local/dao/NoteDao.kt +++ b/app/src/main/java/come/stormborntales/notevault/data/local/dao/NoteDao.kt @@ -5,6 +5,7 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.Update import come.stormborntales.notevault.data.local.entity.NoteEntity import kotlinx.coroutines.flow.Flow @@ -18,4 +19,7 @@ interface NoteDao { @Delete suspend fun delete(note: NoteEntity) + + @Update + suspend fun update(note: NoteEntity) } \ No newline at end of file diff --git a/app/src/main/java/come/stormborntales/notevault/data/local/entity/NoteEntity.kt b/app/src/main/java/come/stormborntales/notevault/data/local/entity/NoteEntity.kt index 498c3a8..9be2a13 100644 --- a/app/src/main/java/come/stormborntales/notevault/data/local/entity/NoteEntity.kt +++ b/app/src/main/java/come/stormborntales/notevault/data/local/entity/NoteEntity.kt @@ -6,11 +6,11 @@ import androidx.room.PrimaryKey @Entity(tableName = "notes") data class NoteEntity( @PrimaryKey(autoGenerate = true) val id: Int = 0, - val title: String, + var title: String, val images: List, // oder String + TypeConverter - val composer: String?, - val year: Int?, - val genre: String?, - val description: String?, + var composer: String?, + var year: Int?, + var genre: String?, + var description: String?, val imagePreview: String ) diff --git a/app/src/main/java/come/stormborntales/notevault/data/repository/NoteRepository.kt b/app/src/main/java/come/stormborntales/notevault/data/repository/NoteRepository.kt index b0b769d..55ac247 100644 --- a/app/src/main/java/come/stormborntales/notevault/data/repository/NoteRepository.kt +++ b/app/src/main/java/come/stormborntales/notevault/data/repository/NoteRepository.kt @@ -9,4 +9,6 @@ class NoteRepository(private val dao: NoteDao) { suspend fun insert(note: NoteEntity) = dao.insert(note) suspend fun delete(note: NoteEntity) = dao.delete(note) + + suspend fun update(note: NoteEntity) = dao.update(note); } diff --git a/app/src/main/java/come/stormborntales/notevault/ui/screens/AddNoteDialog.kt b/app/src/main/java/come/stormborntales/notevault/ui/screens/AddNoteDialog.kt index 3bce4ce..a5ca5a7 100644 --- a/app/src/main/java/come/stormborntales/notevault/ui/screens/AddNoteDialog.kt +++ b/app/src/main/java/come/stormborntales/notevault/ui/screens/AddNoteDialog.kt @@ -14,15 +14,21 @@ import androidx.compose.ui.unit.dp @Composable fun AddNoteDialog( onDismiss: () -> Unit, - onSave: (title: String, composer: String?, year: Int?, genre: String?, description: String?) -> Unit + onSave: (title: String, composer: String?, year: Int?, genre: String?, description: String?) -> Unit, + initialTitle: String = "", + initialComposer: String? = null, + initialYear: Int? = null, + initialGenre: String? = null, + initialDescription: String? = null ) { - var title by remember { mutableStateOf("") } - var composer by remember { mutableStateOf("") } - var yearText by remember { mutableStateOf("") } - var genre by remember { mutableStateOf("") } - var description by remember { mutableStateOf("") } + var title by remember { mutableStateOf(initialTitle) } + var composer by remember { mutableStateOf(initialComposer ?: "") } + var yearText by remember { mutableStateOf(initialYear?.toString() ?: "") } + var genre by remember { mutableStateOf(initialGenre ?: "") } + var description by remember { mutableStateOf(initialDescription ?: "") } var showTitleError by remember { mutableStateOf(false) } + AlertDialog( onDismissRequest = onDismiss, confirmButton = { diff --git a/app/src/main/java/come/stormborntales/notevault/ui/screens/MainScreen.kt b/app/src/main/java/come/stormborntales/notevault/ui/screens/MainScreen.kt index 1c73733..844288f 100644 --- a/app/src/main/java/come/stormborntales/notevault/ui/screens/MainScreen.kt +++ b/app/src/main/java/come/stormborntales/notevault/ui/screens/MainScreen.kt @@ -6,6 +6,7 @@ import android.graphics.BitmapFactory import android.graphics.ImageDecoder import android.media.Image import android.net.Uri +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -45,7 +46,7 @@ fun loadImageBitmap(context: Context, uriString: String): ImageBitmap? { } @Composable -fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit) { +fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit, onEditNote: (NoteEntity) -> Unit) { val context = LocalContext.current @@ -71,7 +72,7 @@ fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit) { modifier = Modifier .weight(1f) .align(Alignment.CenterVertically) - .padding(start=16.dp) + .padding(start = 16.dp) ) { Text( text = note.title, @@ -116,7 +117,10 @@ fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit) { Text("Anzeigen", style = MaterialTheme.typography.labelLarge) } OutlinedButton( - onClick = { /* TODO */ }, + onClick = { + onEditNote(note) + Log.d("EditNote", "on Edit Note!") + }, contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp) ) { Text("Bearbeiten", style = MaterialTheme.typography.labelLarge) @@ -143,7 +147,8 @@ fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit) { @Composable fun MainScreen( onAddNoteClicked: () -> Unit, // Übergib hier deine Logik für den Import - viewModel: NoteViewModel + viewModel: NoteViewModel, + onEditNote: (NoteEntity) -> Unit ) { val notes by viewModel.notes.observeAsState(emptyList()) Scaffold( @@ -168,9 +173,9 @@ fun MainScreen( .padding(16.dp) ) { items(notes) { note -> - NoteCard(note = note, onDeleteNote = {noteEntity -> + NoteCard(note = note, onDeleteNote = { noteEntity -> viewModel.deleteNote(noteEntity) - }) + }, onEditNote = onEditNote) } } } diff --git a/app/src/main/java/come/stormborntales/notevault/ui/viewmodel/NoteViewModel.kt b/app/src/main/java/come/stormborntales/notevault/ui/viewmodel/NoteViewModel.kt index 0e02293..e7bf8a1 100644 --- a/app/src/main/java/come/stormborntales/notevault/ui/viewmodel/NoteViewModel.kt +++ b/app/src/main/java/come/stormborntales/notevault/ui/viewmodel/NoteViewModel.kt @@ -14,7 +14,6 @@ import come.stormborntales.notevault.data.repository.NoteRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.File -import java.io.InputStream import androidx.core.graphics.scale class NoteViewModel( @@ -86,4 +85,26 @@ class NoteViewModel( repository.delete(note) } } + + fun updateNote( + editedNote: NoteEntity, + updatedTitle: String, + updatedComposer: String?, + updatedYear: Int?, + updatedGenre: String?, + updatedDescription: String?, + onDone: () -> Unit + ) { + viewModelScope.launch { + editedNote.title = updatedTitle + editedNote.year = updatedYear; + editedNote.composer = updatedComposer + editedNote.genre = updatedGenre + editedNote.description = updatedDescription + + repository.update(editedNote) + + onDone() + } + } }