|
|
|
@@ -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<void> {
|
|
|
|
|
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
|
|
|
|
|