Remove call notification if other device accepted/denied
This commit is contained in:
parent
3f169c64d7
commit
ad00f3f930
|
@ -34,7 +34,7 @@ public class Dino.CallState : Object {
|
||||||
this.call = call;
|
this.call = call;
|
||||||
this.stream_interactor = stream_interactor;
|
this.stream_interactor = stream_interactor;
|
||||||
|
|
||||||
if (call.direction == Call.DIRECTION_OUTGOING) {
|
if (call.direction == Call.DIRECTION_OUTGOING && call.state != Call.State.OTHER_DEVICE && call.ourpart.equals(call.account.full_jid)) {
|
||||||
accepted = true;
|
accepted = true;
|
||||||
|
|
||||||
Timeout.add_seconds(30, () => {
|
Timeout.add_seconds(30, () => {
|
||||||
|
|
|
@ -233,15 +233,15 @@ namespace Dino {
|
||||||
return peer_state;
|
return peer_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CallState? get_call_state_by_call_id(Account account, string call_id, Jid jid1, Jid jid2) {
|
private CallState? get_call_state_by_call_id(Account account, string call_id, Jid? counterpart_jid = null) {
|
||||||
Jid relevant_jid = jid1.equals_bare(account.bare_jid) ? jid2 : jid1;
|
|
||||||
|
|
||||||
foreach (CallState call_state in call_states.values) {
|
foreach (CallState call_state in call_states.values) {
|
||||||
if (!call_state.call.account.equals(account)) continue;
|
if (!call_state.call.account.equals(account)) continue;
|
||||||
|
|
||||||
if (call_state.cim_call_id == call_id) {
|
if (call_state.cim_call_id == call_id) {
|
||||||
|
if (counterpart_jid == null) return call_state;
|
||||||
|
|
||||||
foreach (Jid jid in call_state.peers.keys) {
|
foreach (Jid jid in call_state.peers.keys) {
|
||||||
if (jid.equals_bare(relevant_jid)) {
|
if (jid.equals_bare(counterpart_jid)) {
|
||||||
return call_state;
|
return call_state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -266,7 +266,7 @@ namespace Dino {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CallState? create_recv_muji_call(Account account, Jid inviter_jid, Jid muc_jid, string message_type) {
|
private CallState? create_recv_muji_call(Account account, string call_id, Jid inviter_jid, Jid muc_jid, string message_type) {
|
||||||
debug("[%s] Muji call received from %s for MUC %s, type %s", account.bare_jid.to_string(), inviter_jid.to_string(), muc_jid.to_string(), message_type);
|
debug("[%s] Muji call received from %s for MUC %s, type %s", account.bare_jid.to_string(), inviter_jid.to_string(), muc_jid.to_string(), message_type);
|
||||||
|
|
||||||
foreach (Call call in call_states.keys) {
|
foreach (Call call in call_states.keys) {
|
||||||
|
@ -276,6 +276,7 @@ namespace Dino {
|
||||||
|
|
||||||
if (call.counterparts.size == 1 && call.counterparts.contains(inviter_jid) && call_state.accepted) {
|
if (call.counterparts.size == 1 && call.counterparts.contains(inviter_jid) && call_state.accepted) {
|
||||||
// A call is converted into a group call.
|
// A call is converted into a group call.
|
||||||
|
call_state.cim_call_id = call_id;
|
||||||
call_state.join_group_call.begin(muc_jid);
|
call_state.join_group_call.begin(muc_jid);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -429,7 +430,7 @@ namespace Dino {
|
||||||
string? room_jid_str = join_method_node.get_attribute("room");
|
string? room_jid_str = join_method_node.get_attribute("room");
|
||||||
if (room_jid_str == null) return;
|
if (room_jid_str == null) return;
|
||||||
Jid room_jid = new Jid(room_jid_str);
|
Jid room_jid = new Jid(room_jid_str);
|
||||||
call_state = create_recv_muji_call(account, from_jid, room_jid, message_stanza.type_);
|
call_state = create_recv_muji_call(account, call_id, from_jid, room_jid, message_stanza.type_);
|
||||||
|
|
||||||
multiparty = true;
|
multiparty = true;
|
||||||
break;
|
break;
|
||||||
|
@ -474,12 +475,13 @@ namespace Dino {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
call_invites_module.call_accepted.connect((from_jid, to_jid, call_id, message_type) => {
|
call_invites_module.call_accepted.connect((from_jid, to_jid, call_id, message_type) => {
|
||||||
CallState? call_state = get_call_state_by_call_id(account, call_id, from_jid, to_jid);
|
// Carboned message from our account
|
||||||
|
if (from_jid.equals_bare(account.bare_jid)) {
|
||||||
|
|
||||||
|
CallState? call_state = get_call_state_by_call_id(account, call_id);
|
||||||
if (call_state == null) return;
|
if (call_state == null) return;
|
||||||
Call call = call_state.call;
|
Call call = call_state.call;
|
||||||
|
|
||||||
// Carboned message from our account
|
|
||||||
if (from_jid.equals_bare(account.bare_jid)) {
|
|
||||||
// Ignore carbon from ourselves
|
// Ignore carbon from ourselves
|
||||||
if (from_jid.equals(account.full_jid)) return;
|
if (from_jid.equals(account.full_jid)) return;
|
||||||
|
|
||||||
|
@ -490,6 +492,10 @@ namespace Dino {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CallState? call_state = get_call_state_by_call_id(account, call_id, from_jid);
|
||||||
|
if (call_state == null) return;
|
||||||
|
Call call = call_state.call;
|
||||||
|
|
||||||
// We proposed the call. This is a message from our peer.
|
// We proposed the call. This is a message from our peer.
|
||||||
if (call.direction == Call.DIRECTION_OUTGOING &&
|
if (call.direction == Call.DIRECTION_OUTGOING &&
|
||||||
to_jid.equals(account.full_jid)) {
|
to_jid.equals(account.full_jid)) {
|
||||||
|
@ -502,7 +508,7 @@ namespace Dino {
|
||||||
if (from_jid.equals_bare(account.bare_jid)) return;
|
if (from_jid.equals_bare(account.bare_jid)) return;
|
||||||
|
|
||||||
// The call was retracted by the counterpart
|
// The call was retracted by the counterpart
|
||||||
CallState? call_state = get_call_state_by_call_id(account, call_id, from_jid, to_jid);
|
CallState? call_state = get_call_state_by_call_id(account, call_id, from_jid);
|
||||||
if (call_state == null) return;
|
if (call_state == null) return;
|
||||||
|
|
||||||
if (call_state.call.state != Call.State.RINGING) {
|
if (call_state.call.state != Call.State.RINGING) {
|
||||||
|
@ -516,6 +522,14 @@ namespace Dino {
|
||||||
remove_call_from_datastructures(call_state.call);
|
remove_call_from_datastructures(call_state.call);
|
||||||
});
|
});
|
||||||
call_invites_module.call_rejected.connect((from_jid, to_jid, call_id, message_type) => {
|
call_invites_module.call_rejected.connect((from_jid, to_jid, call_id, message_type) => {
|
||||||
|
// We rejected an invite from another device
|
||||||
|
if (from_jid.equals_bare(account.bare_jid)) {
|
||||||
|
CallState? call_state = get_call_state_by_call_id(account, call_id);
|
||||||
|
if (call_state == null) return;
|
||||||
|
Call call = call_state.call;
|
||||||
|
call.state = Call.State.DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
if (from_jid.equals_bare(account.bare_jid)) return;
|
if (from_jid.equals_bare(account.bare_jid)) return;
|
||||||
debug(@"[%s] %s rejected our MUJI invite", account.bare_jid.to_string(), from_jid.to_string());
|
debug(@"[%s] %s rejected our MUJI invite", account.bare_jid.to_string(), from_jid.to_string());
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue