diff --git a/src/cheogram/java/com/cheogram/android/ConnectionService.java b/src/cheogram/java/com/cheogram/android/ConnectionService.java index be497a8b8..c67e38b01 100644 --- a/src/cheogram/java/com/cheogram/android/ConnectionService.java +++ b/src/cheogram/java/com/cheogram/android/ConnectionService.java @@ -11,6 +11,8 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSet; import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.telecom.CallAudioState; import android.telecom.Connection; import android.telecom.ConnectionRequest; @@ -54,6 +56,8 @@ import eu.siacs.conversations.xmpp.jingle.Media; import eu.siacs.conversations.xmpp.jingle.RtpEndUserState; public class ConnectionService extends android.telecom.ConnectionService { + private final Handler mHandler = new Handler(Looper.getMainLooper()); + public XmppConnectionService xmppConnectionService = null; protected ServiceConnection mConnection = new ServiceConnection() { @Override @@ -113,7 +117,7 @@ public class ConnectionService extends android.telecom.ConnectionService { Account account = xmppConnectionService.findAccountByJid(Jid.of(gateway[0])); Jid with = Jid.ofLocalAndDomain(tel, gateway[1]); - CheogramConnection connection = new CheogramConnection(account, with, postDial); + CheogramConnection connection = new CheogramConnection(account, with, postDial, null); PermissionManager permissionManager = PermissionManager.getInstance(this); permissionManager.setNotificationSettings( @@ -163,7 +167,10 @@ public class ConnectionService extends android.telecom.ConnectionService { Account account = xmppConnectionService.findAccountByJid(Jid.of(accountJid)); Jid with = Jid.of(withJid); - CheogramConnection connection = new CheogramConnection(account, with, null); + CheogramConnection connection = new CheogramConnection( + account, with, null, + xmppConnectionService.getJingleConnectionManager().findJingleRtpConnection(account, with, sessionId) + ); connection.setSessionId(sessionId); connection.setAddress( Uri.fromParts("tel", with.getLocal(), null), @@ -182,12 +189,13 @@ public class ConnectionService extends android.telecom.ConnectionService { protected String sessionId = null; protected Stack postDial = new Stack<>(); protected Icon gatewayIcon; - protected WeakReference rtpConnection = null; + protected WeakReference rtpConnection; - CheogramConnection(Account account, Jid with, String postDialString) { + CheogramConnection(Account account, Jid with, String postDialString, WeakReference rtpConnection) { super(); this.account = account; this.with = with; + this.rtpConnection = rtpConnection; gatewayIcon = Icon.createWithBitmap(xmppConnectionService.getAvatarService().get( account.getRoster().getContact(Jid.of(with.getDomain())), @@ -267,32 +275,39 @@ public class ConnectionService extends android.telecom.ConnectionService { @Override public void onAnswer() { - // For incoming calls, a connection update may not have been triggered before answering - // so we have to acquire the rtp connection object here - this.rtpConnection = xmppConnectionService.getJingleConnectionManager().findJingleRtpConnection(account, with, sessionId); - - rtpConnection.get().acceptCall(); + mHandler.post(() -> { + rtpConnection.get().acceptCall(); + }); } @Override public void onReject() { - this.rtpConnection = xmppConnectionService.getJingleConnectionManager().findJingleRtpConnection(account, with, sessionId); - rtpConnection.get().rejectCall(); - setDisconnected(new DisconnectCause(DisconnectCause.LOCAL)); + mHandler.post(() -> { + rtpConnection.get().rejectCall(); + }); + } + + @Override + public void onStateChanged(int state) { + if (state == STATE_DISCONNECTED) { + mHandler.post(() -> { + destroy(); + xmppConnectionService.setDiallerIntegrationActive(false); + xmppConnectionService.removeRtpConnectionUpdateListener(this); + }); + } } @Override public void onDisconnect() { - if (rtpConnection == null || rtpConnection.get() == null) { - xmppConnectionService.getJingleConnectionManager().retractSessionProposal(account, with.asBareJid()); - } else { - rtpConnection.get().endCall(); - } - destroy(); - xmppConnectionService.setDiallerIntegrationActive(false); - xmppConnectionService.removeRtpConnectionUpdateListener( - (XmppConnectionService.OnJingleRtpConnectionUpdate) this - ); + mHandler.post(() -> { + if (rtpConnection == null || rtpConnection.get() == null) { + xmppConnectionService.getJingleConnectionManager().retractSessionProposal(account, with.asBareJid()); + setDisconnected(new DisconnectCause(DisconnectCause.LOCAL)); + } else { + rtpConnection.get().endCall(); + } + }); } @Override @@ -302,7 +317,9 @@ public class ConnectionService extends android.telecom.ConnectionService { @Override public void onPlayDtmfTone(char c) { - rtpConnection.get().applyDtmfTone("" + c); + mHandler.post(() -> { + rtpConnection.get().applyDtmfTone("" + c); + }); } @Override