Compare commits

...

4 Commits

Author SHA1 Message Date
Peter Cai a50b50938e ConnectionService: initialize rtpConnection for incoming calls
Removes the need for repetitve findJingleRtpConnection() calls for
onAnswer() and onReject()
2022-03-12 21:50:23 -05:00
Peter Cai 1f2420b38b ConnectionService: remove unneeded setDisconnected()
It will be called by the rtp event handler anyway
2022-03-12 21:43:36 -05:00
Peter Cai 259b0e69ad ConnectionService: handle disconnection correctly
onDisconnect() is only called when the user *requests* to hang up. If
the state is changed by setDisconnected(), then only onStateChanged()
will be called. Handle this correctly, otherwise the connection state
could be inconsistent (e.g. call is ended by the other side but the
Connection object is still around)
2022-03-12 21:38:12 -05:00
Peter Cai 5e39d45d9a ConnectionService: handle connection events on the main thread
Not handling these events on the main thread could leave the connection
in an inconsistent state.
2022-03-12 21:30:03 -05:00
1 changed files with 40 additions and 23 deletions

View File

@ -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<String> postDial = new Stack<>();
protected Icon gatewayIcon;
protected WeakReference<JingleRtpConnection> rtpConnection = null;
protected WeakReference<JingleRtpConnection> rtpConnection;
CheogramConnection(Account account, Jid with, String postDialString) {
CheogramConnection(Account account, Jid with, String postDialString, WeakReference<JingleRtpConnection> 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