From 21732237d4cfb0512155ae8bccdf3edf67a1d4a2 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 25 Mar 2024 08:50:44 +0100 Subject: [PATCH] add safeguards to ringtone playing twice --- .../conversations/services/NotificationService.java | 10 ++++++---- .../xmpp/jingle/JingleConnectionManager.java | 2 ++ .../conversations/xmpp/jingle/JingleRtpConnection.java | 9 +++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 3ad18286765f2c2e9059df2f31a3729b9431ef8f..fce5c3c493a38ee99598561b6795d30854ab44b2 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -502,11 +502,9 @@ public class NotificationService { public synchronized void startRinging( final AbstractJingleConnection.Id id, final Set media) { showIncomingCallNotification(id, media); - final NotificationManager notificationManager = - (NotificationManager) - mXmppConnectionService.getSystemService(Context.NOTIFICATION_SERVICE); + final NotificationManager notificationManager = mXmppConnectionService.getSystemService(NotificationManager.class); final int currentInterruptionFilter; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && notificationManager != null) { + if (notificationManager != null) { currentInterruptionFilter = notificationManager.getCurrentInterruptionFilter(); } else { currentInterruptionFilter = 1; // INTERRUPTION_FILTER_ALL @@ -525,6 +523,10 @@ public class NotificationService { if (currentVibrationFuture != null) { currentVibrationFuture.cancel(true); } + final var preexistingRingtone = this.currentlyPlayingRingtone; + if (preexistingRingtone != null) { + preexistingRingtone.stop(); + } final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mXmppConnectionService); final Resources resources = mXmppConnectionService.getResources(); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java index 0232478f5d6afa1acb982da4963f12af4848e0bb..e0eaaa08fdea00a36f43aecfafe61b9fda089dfa 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java @@ -504,6 +504,7 @@ public class JingleConnectionManager extends AbstractConnectionManager { final RtpSessionProposal proposal = getRtpSessionProposal(account, from.asBareJid(), sessionId); synchronized (rtpSessionProposals) { + // TODO remove the remove()!= null check to ensure we always call busy() if (proposal != null && rtpSessionProposals.remove(proposal) != null) { proposal.callIntegration.busy(); writeLogMissedOutgoing( @@ -763,6 +764,7 @@ public class JingleConnectionManager extends AbstractConnectionManager { final RtpSessionProposal proposal = RtpSessionProposal.of(account, with.asBareJid(), media, callIntegration); callIntegration.setCallback(new ProposalStateCallback(proposal)); + // TODO ensure that there is no previous proposal?! this.rtpSessionProposals.put(proposal, DeviceDiscoveryState.SEARCHING); mXmppConnectionService.notifyJingleRtpConnectionUpdate( account, proposal.with, proposal.sessionId, RtpEndUserState.FINDING_DEVICE); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java index bd069fa8b6d59d7f0188367b05731cf7aaecfd00..c9a7c055c3021ad56554269a2b577f34c85f21e8 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java @@ -2691,6 +2691,15 @@ public class JingleRtpConnection extends AbstractJingleConnection @Override public void onCallIntegrationShowIncomingCallUi() { + if (isTerminated()) { + // there might be race conditions with the call integration service invoking this + // callback when the rtp session has already ended. It should be enough to just return + // instead of throwing an exception. however throwing an exception gives us a sense of + // if and how frequently this happens + throw new IllegalStateException( + "CallIntegration requested incoming call UI but session was already terminated"); + } + // TODO apparently this can be called too early as well? xmppConnectionService.getNotificationService().startRinging(id, getMedia()); }