# Lektionen & Erkenntnisse - 03.06.2026

## 📌 Projekt: FortuneCookie App (Ubuntu Touch 24.04 / Lomiri)

---

## 🎯 Heute erreichte Meilensteine

| Aufgabe | Status | Lösung |
|---------|--------|--------|
| Aktive Liste unten links anzeigen | ✅ | `Label` mit `currentFortuneListDescription` |
| Nur Beschreibung (ohne Name/Anzahl) | ✅ | Eigene Property für reine Beschreibung |
| Listen-Beschreibung auf Icon-Höhe | ✅ | `verticalCenter: musicButton.verticalCenter` |
| Audio-Button verkleinern | ✅ | 10×10 gu → 8×8 gu, Font: xxx-large → xx-large |
| Lautstärke-Regelung (SW) | ❌ | **Funktioniert nicht in Ubuntu Touch** |
| Lautstärke-Anpassung (HW) | ✅ | `chinese_music.mp3` per FFmpeg auf 30% reduziert |
| Alle Listen ≥100 Sprüche | ✅ | farmer wisdom, UNfortune, sandman, famous quotes ergänzt |
| Neue Listen hinzufügen | ✅ | sandman (Bettgehzeit!), famous quotes (Berühmte Zitate) |
| Autoren zu Zitaten | ✅ | Format: "Zitat - Autor" |

---

## 🔧 Technische Erkenntnisse

### 1. **Lomiri/Ubuntu Touch - Medienwiedergabe**

| Problem | Erkenntnis | Lösung |
|---------|-----------|--------|
| `MediaPlayer.volume` wirkt nicht | QtMultimedia Volume-Property wird in Ubuntu Touch ignoriert | **Dateiebene anpassen** mit FFmpeg |
| PyOtherSide sync-Aufrufe blockieren UI | Deadlock-Gefahr | **Asynchrone** `py.call()` verwenden |
| Lautstärke-Slider ohne Effekt | Plattform-Limitierung | Slider entfernt, feste Volumes |

**FFmpeg-Befehl zum Lautstärke reduzieren:**
```bash
ffmpeg -i input.mp3 -af "volume=0.3" -y output.mp3
```

### 2. **Qt/QML Best Practices**

#### ✅ Funktioniert:
```qml
// Property-Binding für automatische Synchronisation
MediaPlayer {
    volume: root.musicVolume  // Wird automatisch aktualisiert
}
```

#### ❌ Problem: Binding wird gebrochen durch:
```qml
// Direkte Zuweisung zerstört das Binding!
mediaPlayer.volume = value;  // ❌
```

#### ✅ Richtig:
```qml
// Nur die Property setzen, Binding überträgt automatisch
root.musicVolume = value;  // ✅
```

#### Anker-Positionierung:
```qml
// Vertikal zentriert mit anderem Element
Label {
    anchors {
        left: parent.left
        verticalCenter: musicButton.verticalCenter  // ✅
        leftMargin: units.gu(2)
    }
}
```

---

## 🌿 Branches-System

### Aktuelle Struktur:
```
main       → Stabil (Releases)
└── daily  → Entwicklung (aktuell)
```

### Regeln:
1. **Daily-Branch** für alle Entwicklungen nutzen
2. **Main-Branch** nur für getestete Releases
3. **Vor Merge:**
   - App testen auf Gerät
   - Alle Funktionen prüfen
   - Keine debug-Logs im Production-Code
4. **Versionierung:**
   - `manifest.json.in`: App-Version (1.0.x)
   - `fortunecookie.py`: Modul-Version (1.1.x)

### Heute genutzt:
```bash
# Im daily-branch arbeiten
git checkout daily

# Ändern, bauen, installieren
clickable build && clickable install
```

---

## 📚 Referenzquellen & Zeitersparnis

### 🔍 **Referenz-Apps studieren!**
- **metime** (Lomiri) - Gute Beispiele für:
  - UI/UX-Patterns
  - MediaPlayer-Integration
  - Einstellungen-Handling
  - Python-QML-Kommunikation

### ⏱️ **Fehlerbehebung beschleunigen:**
1. **Zuerst Referenz-Apps prüfen** (metime, andere Lomiri-Apps)
2. **Lomiri-Dokumentation:** https://docs.ubuntu-touch.io/
3. **QtMultimedia Limitations:** Ubuntu Touch hat Einschränkungen bei Volume-Control
4. **PyOtherSide:** Immer asynchron arbeiten

### 📖 **Wichtige Dateien im Projekt:**
```
qml/Main.qml              # Haupt-UI
src/fortunecookie.py      # Python-Backend
assets/fortunes/*.json     # Spruchlisten
manifest.json.in          # App-Metadaten
fortunecookie.apparmor    # Berechtigungen
```

---

## 📁 Dateistruktur FortuneCookie

```
fortunecookie-neu/
├── testing/                      # Entwicklungszweig
│   ├── qml/
│   │   └── Main.qml            # Haupt-UI (Navigation, MediaPlayer, Einstellungen)
│   ├── src/
│   │   └── fortunecookie.py    # Backend (Sprüche laden, Einstellungen)
│   ├── assets/
│   │   ├── fortunes/            # Spruchlisten
│   │   │   ├── fortune.json         (140 Sprüche)
│   │   │   ├── farmer wisdom.json   (114 Sprüche)
│   │   │   ├── UNfortune.json        (100 Sprüche)
│   │   │   ├── sandman.json          (100 Sprüche - Bettgehzeit!)
│   │   │   └── famous quotes.json    (121 Sprüche - Berühmte Zitate)
│   │   ├── chinese_music.mp3    # Hintergrundmusik (30% Lautstärke)
│   │   └── cookie_crack.mp3     # Knack-Geräusch (100% Lautstärke)
│   └── manifest.json.in         # App-Version: 1.0.8
└── build/                       # Build-Output
```

---

## 🎓 Gelernte Lektionen

### 1. **Ubuntu Touch spezifisch**
- MediaPlayer.volume wird **ignoriert** → Lautstärke in Datei anpassen
- PyOtherSide: **Immer async** (`py.call()`, nicht `py.syncCall()`)
- UI-Elemente: `units.gu()` für konsistente Größen
- Icons: Emoji-Shortcodes funktionieren (z. B. `\uD83D\uDD0A` = 🎆)

### 2. **QML Best Practices**
- **Property-Bindings** nutzen statt manueller Zuweisungen
- **Anker** statt absoluter Positionen
- **Component.onCompleted** mit `Qt.callLater()` für verzögerte Initialisierung
- **Visible vs. Opacity:** `visible: false` entfernt Element komplett

### 3. **Python Backend**
- **Settings speichern:** `save_setting()` / `load_setting()`
- **JSON-Listen laden:** Automatisch aus `assets/fortunes/`
- **AVAILABLE_FORTUNE_LISTS** muss alle Listen enthalten

### 4. **Projektmanagement**
- **Referenz-Apps vor Implementierung prüfen** (spart Stunden!)
- **Branches diszipliniert nutzen** (daily für Entwicklung)
- **Kleine, testbare Änderungen** statt großer Refactorings
- **Fehler dokumentieren** für zukünftige Referenz

---

## 🚀 Empfehlungen für zukünftige Sessions

### ✅ DO:
- [ ] Vor Implementierung: Referenz-Apps (metime) prüfen
- [ ] QtMultimedia-Limitations in Ubuntu Touch beachten
- [ ] Immer im **daily-branch** arbeiten
- [ ] Änderungen in kleinen Schritten testen
- [ ] FFmpeg für Audio-Bearbeitung nutzen
- [ ] Property-Bindings statt direkter Zuweisungen

### ❌ DON'T:
- [ ] `MediaPlayer.volume` für Lautstärke-Regelung erwarten
- [ ] Sync PyOtherSide-Aufrufe in Timern
- [ ] Direkte MediaPlayer-Property-Zuweisungen (bricht Bindings)
- [ ] Main-Branch für Entwicklung nutzen
- [ ] Ohne Test auf Gerät deployen

---

## 📊 Versionen & Änderungen

| Datum | Version (App) | Version (Modul) | Änderungen |
|-------|---------------|------------------|-----------|
| 03.06.2026 | 1.0.8 | 1.1.1 | Listen-Beschreibung, Lautstärke-Fix, neue Listen |

### Detailed Changelog:
```
1.0.8 (03.06.2026):
- FEAT: sandman-List (100 Sprüche, "Bettgehzeit!")
- FEAT: famous quotes-List (121 Zitate mit Autoren)
- FEAT: Alle Listen auf ≥100 Sprüche ergänzt
- FIX: Musik-Lautstärke via FFmpeg auf 30% reduziert
- FIX: Listen-Beschreibung vertikal zentriert mit Audio-Button
- FIX: Audio-Button verkleinert (8×8 gu)
- FIX: Lautstärke-Slider entfernt (funktioniert nicht in UT)
- REFACTOR: Property-Bindings für MediaPlayer.volume
```

---

## 🔗 Nützliche Links

- [Lomiri Documentation](https://docs.ubuntu-touch.io/)
- [QtMultimedia Documentation](https://doc.qt.io/qt-5/qtmultimedia-index.html)
- [PyOtherSide GitHub](https://github.com/thp/pyotherside)
- [Ubuntu Touch Forum](https://forums.ubports.com/)

---

*Dokument erstellt: 03.06.2026 | Letzte Aktualisierung: 03.06.2026*
