---
applyTo: "**/*.kt"
---

# Kotlin Coding Conventions – Bollwerk App

Diese Konventionen gelten für alle Kotlin-Dateien im Workspace.

## Sprache & Plattform

- **Kotlin** (aktuell), Zielplattform **Android** (aktuelles API-Level)
- **Jetpack Compose** für UI
- **Gradle (Kotlin DSL)** als Build-System

## State Management

- `StateFlow` / `MutableStateFlow` in ViewModels
- `collectAsStateWithLifecycle()` in Composables
- `remember` / `rememberSaveable` für UI-lokalen State

## Navigation

- Jetpack Navigation Compose
- Type-safe Navigation mit `@Serializable` Routen

## Concurrency

- Kotlin Coroutines (`suspend`, `Flow`, `StateFlow`)
- `viewModelScope` für ViewModel-gebundene Coroutines
- `withContext(Dispatchers.IO)` für I/O-Operationen
- Strukturierte Fehlerbehandlung mit `try/catch` um jeden `suspend`-Aufruf

## Naming

- Klassen/Interfaces: `UpperCamelCase`
- Funktionen/Variablen: `lowerCamelCase`
- Konstanten: `UPPER_SNAKE_CASE`
- Composable-Funktionen: `UpperCamelCase` (wie Klassen)
- Boolean-Eigenschaften: Präfix `is`, `has`, `can`, `should`

## Zugriffsmodifikatoren

- So restriktiv wie möglich: `private` > `internal` > `public`
- Kein `public` ohne klaren Grund (Kotlin-Default ist `public`)

## Verbotene Patterns

- Keine Force-Casts (`as`) ohne vorherige Typprüfung – `as?` bevorzugen
- Keine `println()`-Statements – stattdessen `Timber` oder Projekt-Logger verwenden
- Keine ungenutzten Imports
- Keine auskommentierten Code-Blöcke
- Kein `!!` (not-null assertion) in Produktionscode

## Testing

- **JUnit 5** für Unit Tests
- **Espresso** / **Compose Testing** für UI Tests
- Testmethoden: `test_<Was>_<Vorbedingung>_<Ergebnis>()`
- Gliederung: `// Given`, `// When`, `// Then`
- MockK für Mocking

## Persistenz

- **Room** (SQLite) für lokale Daten
- **kotlinx.serialization** für JSON Import/Export
- **DataStore** für Einstellungen/Konfigurationen
- **Keychain** für Session-Tokens

## Dokumentation

- Alle öffentlichen/internen Typen und Methoden mit `///` dokumentieren
- Kommentare beschreiben „was" und „warum", nicht „wie"
