nextNoteVault #23
@ -40,6 +40,9 @@
 | 
			
		||||
    <inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
 | 
			
		||||
      <option name="composableFile" value="true" />
 | 
			
		||||
    </inspection_tool>
 | 
			
		||||
    <inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
 | 
			
		||||
      <option name="composableFile" value="true" />
 | 
			
		||||
    </inspection_tool>
 | 
			
		||||
    <inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
 | 
			
		||||
      <option name="composableFile" value="true" />
 | 
			
		||||
    </inspection_tool>
 | 
			
		||||
 | 
			
		||||
@ -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<NoteEntry>() }
 | 
			
		||||
 | 
			
		||||
                // Bildauswahl + Dialog-States
 | 
			
		||||
                var selectedUris by remember { mutableStateOf<List<Uri>>(emptyList()) }
 | 
			
		||||
                var showDialog by remember { mutableStateOf(false) }
 | 
			
		||||
@ -55,6 +46,15 @@ class MainActivity : ComponentActivity() {
 | 
			
		||||
                    }
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
                var noteToEdit by remember { mutableStateOf<NoteEntity?>(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
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
}
 | 
			
		||||
@ -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<String>, // 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
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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 = {
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user