feat(app): optionaler Quell-Badge an ARIA-Bubbles (Einstellung, pro Geraet, default aus)

Zeigt wie in Diagnostic, ob eine Antwort vom lokalen Modell / Claude / Fast-Path
kam — aber in der App als Opt-in, damit die App "Mama-tauglich" bleibt.

- ChatScreen: ChatMessage.answeredBy; aus dem chat-Payload UND der History-Sync
  eingefangen; kleiner farbiger Badge im statusRow der ARIA-Bubble, nur wenn
  showSource an. State aus AsyncStorage aria_show_source (default false, per
  2s-Reload synchron mit den Settings).
- SettingsScreen: Toggle "Antwort-Quelle anzeigen" in der Chat-Bubbles-Card,
  schreibt aria_show_source (pro Geraet — Stefan an, Mama aus).
- Bridge liefert answeredBy schon in chat_backup/History mit (kein Change noetig).

Server-Teil in 9cc1aec. APK-Rebuild noetig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 13:46:12 +02:00
co-authored by Claude Opus 4.8
parent 9cc1aec5ec
commit 7ae61701ad
2 changed files with 44 additions and 0 deletions
+25
View File
@@ -175,6 +175,7 @@ const SettingsScreen: React.FC = () => {
const [bgGpsEnabled, setBgGpsEnabled] = useState(false);
const [backgroundMode, setBackgroundMode] = useState(true); // Default an
const [showSystemHints, setShowSystemHints] = useState(false); // Default aus
const [showSource, setShowSource] = useState(false); // Quell-Badge, Default aus
const [scannerVisible, setScannerVisible] = useState(false);
const [logTab, setLogTab] = useState<LogTab>('live');
const [logs, setLogs] = useState<LogEntry[]>([]);
@@ -261,6 +262,9 @@ const SettingsScreen: React.FC = () => {
// Default ist aus — nur explicit 'true' aktiviert
setShowSystemHints(saved === 'true');
});
AsyncStorage.getItem('aria_show_source').then(saved => {
setShowSource(saved === 'true'); // Default aus
});
// gpsTrackingService status syncen + auf Aenderungen lauschen
setGpsTracking(gpsTrackingService.isActive());
const offGps = gpsTrackingService.onChange(setGpsTracking);
@@ -857,6 +861,11 @@ const SettingsScreen: React.FC = () => {
AsyncStorage.setItem('aria_show_hints', String(value)).catch(() => {});
}, []);
const handleShowSourceToggle = useCallback((value: boolean) => {
setShowSource(value);
AsyncStorage.setItem('aria_show_source', String(value)).catch(() => {});
}, []);
// --- XTTS Voice ---
const selectVoice = useCallback((voiceName: string) => {
@@ -1580,6 +1589,22 @@ const SettingsScreen: React.FC = () => {
thumbColor={showSystemHints ? '#FFFFFF' : '#666680'}
/>
</View>
<View style={styles.toggleRow}>
<View style={styles.toggleInfo}>
<Text style={styles.toggleLabel}>Antwort-Quelle anzeigen</Text>
<Text style={styles.toggleHint}>
Kleiner Badge an ARIAs Bubbles: ob die Antwort vom schnellen
lokalen Modell, von Claude oder per Direkt-Befehl kam. Nur fuer
dich interessant (Technik) — standardmaessig aus.
</Text>
</View>
<Switch
value={showSource}
onValueChange={handleShowSourceToggle}
trackColor={{ false: '#2A2A3E', true: '#0096FF' }}
thumbColor={showSource ? '#FFFFFF' : '#666680'}
/>
</View>
</View>
{/* === Hintergrund-Modus === */}