diff --git a/android/src/screens/SettingsScreen.tsx b/android/src/screens/SettingsScreen.tsx index 24f5a99..8cc34c1 100644 --- a/android/src/screens/SettingsScreen.tsx +++ b/android/src/screens/SettingsScreen.tsx @@ -62,7 +62,7 @@ import MemoryBrowser from '../components/MemoryBrowser'; import TriggerBrowser from '../components/TriggerBrowser'; import SkillBrowser from '../components/SkillBrowser'; import OAuthBrowser from '../components/OAuthBrowser'; -import { isVerboseLogging, setVerboseLogging } from '../services/logger'; +import { isVerboseLogging, setVerboseLogging, isDebugLogsToBridge, setDebugLogsToBridge } from '../services/logger'; import { isWakeReadySoundEnabled, setWakeReadySoundEnabled, @@ -160,6 +160,7 @@ const SettingsScreen: React.FC = () => { const [apkCacheInfo, setApkCacheInfo] = useState<{count: number, totalMB: number} | null>(null); const [ttsCacheInfo, setTtsCacheInfo] = useState<{count: number, totalMB: number} | null>(null); const [verboseLogging, setVerboseLoggingState] = useState(isVerboseLogging()); + const [debugLogsToBridge, setDebugLogsToBridgeState] = useState(isDebugLogsToBridge()); const [ttsSpeed, setTtsSpeed] = useState(TTS_SPEED_DEFAULT); const [wakeKeyword, setWakeKeyword] = useState(DEFAULT_KEYWORD); const [wakeStatus, setWakeStatus] = useState(''); @@ -1916,6 +1917,27 @@ const SettingsScreen: React.FC = () => { Warnungen und Fehler bleiben immer aktiv. Bei Bedarf einschalten zum Debuggen via adb logcat. + + {/* Debug-Logs an Bridge: scharf nur wenn aktiv gebraucht */} + + Debug-Logs an Bridge + { + setDebugLogsToBridge(v); + setDebugLogsToBridgeState(v); + }} + trackColor={{ false: '#3A3A52', true: '#FF9500' }} + thumbColor={debugLogsToBridge ? '#FFFFFF' : '#666680'} + /> + + + Schickt detaillierte Diagnose-Logs (Wake-Word-Pipeline, Audio-Focus, + Background-Service) per RVS an die Bridge — abrufbar via + `curl /api/app-log?lines=N` ohne ADB. Default AUS damit kein + unnoetiger Traffic + Disk-Schreiben. Crash-Reports (Errors) gehen + IMMER, dieser Toggle betrifft nur Info-Logs. + diff --git a/android/src/services/logger.ts b/android/src/services/logger.ts index 719fec4..1a7c509 100644 --- a/android/src/services/logger.ts +++ b/android/src/services/logger.ts @@ -11,6 +11,11 @@ import { Platform } from 'react-native'; import rvs from './rvs'; export const VERBOSE_LOGGING_KEY = 'aria_verbose_logging'; +// Eigener Toggle fuer Debug-Logs die ueber RVS an die Bridge gehen +// (/shared/logs/app.log → Diagnostic /api/app-log). Damit der Default-User +// nicht stuendlich Traffic + Disk-Schreiben hat, dieser ist DEFAULT AUS. +// Stefan schaltet's nur ein wenn er ein konkretes Problem debuggen muss. +export const DEBUG_LOGS_TO_BRIDGE_KEY = 'aria_debug_logs_to_bridge'; // Original-console.log retten, damit wir die Wrapper jederzeit wieder // "scharf" stellen koennen (sonst waere ein Toggle-an nach -aus tot). @@ -18,6 +23,7 @@ const originalLog = console.log.bind(console); const noop = () => {}; let _verbose = true; +let _debugLogsToBridge = false; function applyState(): void { console.log = _verbose ? originalLog : noop; @@ -29,6 +35,10 @@ export async function initLogger(): Promise { const v = await AsyncStorage.getItem(VERBOSE_LOGGING_KEY); _verbose = v !== 'false'; // default: true } catch {} + try { + const d = await AsyncStorage.getItem(DEBUG_LOGS_TO_BRIDGE_KEY); + _debugLogsToBridge = d === 'true'; // default: false + } catch {} applyState(); } @@ -42,6 +52,15 @@ export function setVerboseLogging(verbose: boolean): void { AsyncStorage.setItem(VERBOSE_LOGGING_KEY, String(verbose)).catch(() => {}); } +export function isDebugLogsToBridge(): boolean { + return _debugLogsToBridge; +} + +export function setDebugLogsToBridge(enabled: boolean): void { + _debugLogsToBridge = enabled; + AsyncStorage.setItem(DEBUG_LOGS_TO_BRIDGE_KEY, String(enabled)).catch(() => {}); +} + // ─── App-Crash-Reporting via RVS ──────────────────────────────────── // // Wenn die App crasht — egal ob React-Render-Fehler (ErrorBoundary) oder @@ -81,8 +100,13 @@ export function reportAppError(ev: AppErrorEvent): void { /** Schickt eine Debug-/Info-Message via RVS an die Bridge. Landet ebenfalls * in /shared/logs/app.log — abrufbar via `curl /api/app-log?lines=N`. * Im Gegensatz zu reportAppError: keine Stacktrace, level=info, kein - * console.error. Fuer Live-Diagnose im Hintergrund wenn ADB nicht da ist. */ + * console.error. Fuer Live-Diagnose im Hintergrund wenn ADB nicht da ist. + * + * Nur aktiv wenn Settings → Protokoll → Debug-Logs an Bridge AN ist. + * Default aus damit Mama-Modus keine Disk-Schreiblast hat. Error-Reports + * (reportAppError) gehen weiterhin IMMER durch. */ export function reportAppDebug(scope: string, message: string): void { + if (!_debugLogsToBridge) return; try { rvs.send('app_log' as any, { ts: Date.now(),