From 73b7a76ea836ff9e2d5fbcc3c2d0d0186e0c1666 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 10 May 2026 13:43:40 +0200 Subject: [PATCH] =?UTF-8?q?fix(phone-call):=20kein=20VoIP-Toast=20bei=20Pl?= =?UTF-8?q?ay-Button=20=E2=80=94=20AudioMode=20pruefen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stefan: 'Möchte ich mir playbacks anhören egal welches kommt die toast nachricht voip anruf und danach aria wieder aktiv'. Ursache: AUDIOFOCUS_LOSS feuert bei jedem Audio-Player-Wechsel (Spotify, andere Apps, sogar unsere eigenen Sound-Calls). Wir interpretierten das blind als VoIP-Anruf. Fix: vor dem Halt fragen wir AudioFocus.getMode() ab — nur wenn mode == 2 (IN_CALL) oder 3 (IN_COMMUNICATION) ist's wirklich ein Anruf. Bei NORMAL (0) wird der Loss ignoriert. Co-Authored-By: Claude Opus 4.7 (1M context) --- android/src/services/phoneCall.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/android/src/services/phoneCall.ts b/android/src/services/phoneCall.ts index 0a8a739..aac67a9 100644 --- a/android/src/services/phoneCall.ts +++ b/android/src/services/phoneCall.ts @@ -126,13 +126,24 @@ class PhoneCallService { } } - /** AudioFocus-Loss = irgendeine andere App hat das Mikro/die Audio-Pipeline - * uebernommen — typisch VoIP-Apps bei eingehendem Anruf, aber auch System- - * Voice-Assistants etc. */ - private _onFocusChanged(type: 'loss' | 'loss_transient' | 'gain'): void { + /** AudioFocus-Loss = irgendeine andere App hat den Focus uebernommen. + * Das passiert bei VoIP-Anrufen (was wir wollen) ABER auch bei normalen + * Audio-Playern (anderer Player startet, Notification-Sound, sogar + * unsere eigenen Sound-Calls beim Play-Button). Daher checken wir den + * AudioMode — nur IN_CALL (2) oder IN_COMMUNICATION (3) zaehlt als Anruf. */ + private async _onFocusChanged(type: 'loss' | 'loss_transient' | 'gain'): Promise { if (type === 'loss' || type === 'loss_transient') { // Schon durch klassischen TelephonyManager pausiert? Dann nichts doppeln. if (this.lastState === 'ringing' || this.lastState === 'offhook') return; + // Mode pruefen — nur echte Anrufe behandeln. + let mode = -1; + try { mode = await (NativeModules.AudioFocus as any)?.getMode?.(); } catch {} + if (mode !== 2 && mode !== 3) { + // NORMAL-Mode → kein Anruf (Stefan hat z.B. Play-Button gedrueckt + // oder Spotify hat sich neu reingedraengelt). Keine Toasts. + console.log('[PhoneCall] FOCUS_LOSS ignoriert (AudioMode=%d, kein Call)', mode); + return; + } this.interruptedByFocus = true; this._haltForCall('Anruf erkannt (VoIP) — ARIA pausiert'); // Pollen, weil GAIN nicht zuverlaessig kommt (wir releasen den Focus