Compare commits
4 commits
peter-dev
...
a50b50938e
Author | SHA1 | Date | |
---|---|---|---|
Peter Cai | a50b50938e | ||
Peter Cai | 1f2420b38b | ||
Peter Cai | 259b0e69ad | ||
Peter Cai | 5e39d45d9a |
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue