# AlbumViewModel ## Übersicht Die Klasse `AlbumViewModel` ist für die zentrale Verwaltung von Bilddaten innerhalb der App zuständig. Sie fungiert als Schnittstelle zwischen der Kamera-Hardware, der System-Galerie und der Benutzeroberfläche. Das ViewModel verarbeitet asynchrone Bildoperationen und stellt den aktuellen Status über einen reaktiven StateFlow bereit. --- ## 1. Klasse: AlbumViewModel `class AlbumViewModel(private val coroutineContext: CoroutineContext) : ViewModel()` ### Konstruktor-Parameter | Parameter | Typ | Beschreibung | | :--- | :--- | :--- | | `coroutineContext` | `CoroutineContext` | Der Kontext, in dem die Coroutines für Bildoperationen ausgeführt werden. | --- ## 2. Status-Management (State) ### `viewStateFlow: StateFlow` Ein observierbarer Datenstrom, der den aktuellen Zustand der Bildverwaltung liefert. Er basiert auf der Datenklasse `AlbumViewState`. **Wichtige Felder im State:** * **`tempFileUrl`**: Enthält die URL der temporären Datei, in der das mit der Kamera aufgenommene Bild zwischengespeichert wird. * **`selectedPictures`**: Enthält die Liste der mit der Kamera aufgenommenen oder aus der Galerie ausgewählten Bilder (als `ImageBitmap`). --- ## 3. Zentrale Methoden ### `onReceive(intent: Intent)` Diese Methode ist der zentrale Einstiegspunkt für alle Aktionen. Sie verarbeitet verschiedene `Intent`-Typen: | Intent | Beschreibung | | :--- | :--- | | `OnPermissionGrantedWith` | Wird aufgerufen, wenn die Kamera-Berechtigung erteilt wurde. Erstellt eine temporäre Datei (`.jpg`) im Cache-Verzeichnis und generiert eine Inhalts-URI via `FileProvider`. | | `OnPermissionDenied` | Loggt die Verweigerung der Kamera-Berechtigung durch den Nutzer. | | `OnFinishPickingImagesWith` | Verarbeitet Bilder, die aus der Galerie ausgewählt wurden. Die URIs werden in `ImageBitmap` konvertiert und der Liste hinzugefügt. | | `OnImageSavedWith` | Wird nach einer erfolgreichen Kameraaufnahme aufgerufen. Dekodiert das Bild aus der `tempFileUrl` und fügt es der Auswahl hinzu. | | `OnImageSavingCanceled` | Setzt die `tempFileUrl` zurück, falls der Aufnahmevorgang abgebrochen wurde. | ### `clearSelection()` Setzt die Liste der ausgewählten Bilder (`selectedPictures`) auf eine leere Liste zurück. --- ## 4. Funktionsweise & Datenfluss ### Bildverarbeitung (Galerie) Beim Auswählen von Bildern aus der Galerie werden die `InputStreams` der bereitgestellten URIs ausgelesen. Um Speicher effizient zu nutzen, werden die Byte-Arrays mithilfe von `BitmapFactory` dekodiert und anschließend als Compose-kompatible `ImageBitmap` gespeichert. ### Bildverarbeitung (Kamera) 1. **Vorbereitung**: Ein `File.createTempFile` erstellt einen Platzhalter im Cache. 2. **Sicherheit**: Der `FileProvider` wandelt den Dateipfad in eine sichere URI um, damit die Kamera-App darauf zugreifen kann. 3. **Abschluss**: Nach der Aufnahme wird `ImageDecoder` genutzt, um die Datei in eine Bitmap umzuwandeln. --- ## 5. Technische Voraussetzungen ### FileProvider-Konfiguration Damit die Kamera-App Bilder speichern kann, muss in der `AndroidManifest.xml` ein Provider definiert sein, der auf `${BuildConfig.APPLICATION_ID}.provider` hört. ### Abhängigkeiten * **androidx.lifecycle:lifecycle-viewmodel-ktx**: Für den `viewModelScope`. * **kotlinx-coroutines**: Für die asynchrone Verarbeitung der Bilddaten. * **androidx.compose.ui:ui-graphics**: Für die Konvertierung in `ImageBitmap`. --- ## Fehlerbehandlung * **NULL-Werte**: Falls ein InputStream nicht gelesen werden kann, wird eine Fehlermeldung geloggt, ohne die App zum Absturz zu bringen. * **Speichermanagement**: Bilder werden als Bitmaps im Speicher gehalten. Bei sehr großen Mengen sollte eine Skalierung (Sampling) in der `BitmapFactory` implementiert werden.