show proposal as ongoing call

This commit is contained in:
Daniel Gultsch 2020-05-02 09:50:17 +02:00
parent f7a0d2031a
commit 48163a5604
6 changed files with 90 additions and 12 deletions

View File

@ -29,6 +29,7 @@ import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.utils.XmppUri;
import eu.siacs.conversations.xmpp.XmppConnection;
import eu.siacs.conversations.xmpp.jingle.RtpCapability;
import rocks.xmpp.addr.Jid;
public class Account extends AbstractEntity implements AvatarService.Avatarable {
@ -426,6 +427,16 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable
return this.getSelfContact().getPresences().size();
}
public int activeDevicesWithRtpCapability() {
int i = 0;
for(Presence presence : getSelfContact().getPresences().getPresences().values()) {
if (RtpCapability.check(presence) != RtpCapability.Capability.NONE) {
i++;
}
}
return i;
}
public String getPgpSignature() {
return getKey(KEY_PGP_SIGNATURE);
}

View File

@ -120,7 +120,10 @@ import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xmpp.XmppConnection;
import eu.siacs.conversations.xmpp.chatstate.ChatState;
import eu.siacs.conversations.xmpp.jingle.AbstractJingleConnection;
import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
import eu.siacs.conversations.xmpp.jingle.JingleFileTransferConnection;
import eu.siacs.conversations.xmpp.jingle.Media;
import eu.siacs.conversations.xmpp.jingle.OngoingRtpSession;
import eu.siacs.conversations.xmpp.jingle.RtpCapability;
import rocks.xmpp.addr.Jid;
@ -971,7 +974,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
menuCall.setVisible(false);
menuOngoingCall.setVisible(false);
} else {
final Optional<AbstractJingleConnection.Id> ongoingRtpSession = activity.xmppConnectionService.getJingleConnectionManager().getOngoingRtpConnection(conversation.getContact());
final Optional<OngoingRtpSession> ongoingRtpSession = activity.xmppConnectionService.getJingleConnectionManager().getOngoingRtpConnection(conversation.getContact());
if (ongoingRtpSession.isPresent()) {
menuOngoingCall.setVisible(true);
menuCall.setVisible(false);
@ -1267,13 +1270,22 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
}
private void returnToOngoingCall() {
final Optional<AbstractJingleConnection.Id> ongoingRtpSession = activity.xmppConnectionService.getJingleConnectionManager().getOngoingRtpConnection(conversation.getContact());
final Optional<OngoingRtpSession> ongoingRtpSession = activity.xmppConnectionService.getJingleConnectionManager().getOngoingRtpConnection(conversation.getContact());
if (ongoingRtpSession.isPresent()) {
final AbstractJingleConnection.Id id = ongoingRtpSession.get();
final OngoingRtpSession id = ongoingRtpSession.get();
final Intent intent = new Intent(getActivity(), RtpSessionActivity.class);
intent.putExtra(RtpSessionActivity.EXTRA_ACCOUNT, id.account.getJid().asBareJid().toEscapedString());
intent.putExtra(RtpSessionActivity.EXTRA_WITH, id.with.toEscapedString());
intent.putExtra(RtpSessionActivity.EXTRA_SESSION_ID, id.sessionId);
intent.putExtra(RtpSessionActivity.EXTRA_ACCOUNT, id.getAccount().getJid().asBareJid().toEscapedString());
intent.putExtra(RtpSessionActivity.EXTRA_WITH, id.getWith().toEscapedString());
if (id instanceof AbstractJingleConnection.Id) {
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(RtpSessionActivity.EXTRA_SESSION_ID, id.getSessionId());
} else if (id instanceof JingleConnectionManager.RtpSessionProposal) {
if (((JingleConnectionManager.RtpSessionProposal) id).media.contains(Media.VIDEO)) {
intent.setAction(RtpSessionActivity.ACTION_MAKE_VIDEO_CALL);
} else {
intent.setAction(RtpSessionActivity.ACTION_MAKE_VOICE_CALL);
}
}
startActivity(intent);
}

View File

@ -26,6 +26,7 @@ import eu.siacs.conversations.utils.EmojiWrapper;
import eu.siacs.conversations.utils.IrregularUnicodeDetector;
import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xmpp.jingle.AbstractJingleConnection;
import eu.siacs.conversations.xmpp.jingle.OngoingRtpSession;
import rocks.xmpp.addr.Jid;
public class ConversationAdapter extends RecyclerView.Adapter<ConversationAdapter.ConversationViewHolder> {
@ -165,7 +166,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationAdapte
}
final Optional<AbstractJingleConnection.Id> ongoingCall;
final Optional<OngoingRtpSession> ongoingCall;
if (conversation.getMode() == Conversational.MODE_MULTI) {
ongoingCall = Optional.absent();
} else {

View File

@ -1,6 +1,7 @@
package eu.siacs.conversations.xmpp.jingle;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import eu.siacs.conversations.entities.Account;
@ -40,7 +41,7 @@ public abstract class AbstractJingleConnection {
abstract void notifyRebound();
public static class Id {
public static class Id implements OngoingRtpSession {
public final Account account;
public final Jid with;
public final String sessionId;
@ -87,6 +88,21 @@ public abstract class AbstractJingleConnection {
public int hashCode() {
return Objects.hashCode(account.getJid(), with, sessionId);
}
@Override
public Account getAccount() {
return account;
}
@Override
public Jid getWith() {
return with;
}
@Override
public String getSessionId() {
return sessionId;
}
}

View File

@ -233,8 +233,8 @@ public class JingleConnectionManager extends AbstractConnectionManager {
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": ignoring call proposal from stranger " + id.with);
return;
}
final int activeDevices = account.countPresences();
Log.d(Config.LOGTAG, "active devices: " + activeDevices);
final int activeDevices = account.activeDevicesWithRtpCapability();
Log.d(Config.LOGTAG, "active devices with rtp capability: " + activeDevices);
if (activeDevices == 0) {
final MessagePacket reject = mXmppConnectionService.getMessageGenerator().sessionReject(from, sessionId);
mXmppConnectionService.sendMessagePacket(account, reject);
@ -353,7 +353,7 @@ public class JingleConnectionManager extends AbstractConnectionManager {
connection.init(message);
}
public Optional<AbstractJingleConnection.Id> getOngoingRtpConnection(final Contact contact) {
public Optional<OngoingRtpSession> getOngoingRtpConnection(final Contact contact) {
for (final Map.Entry<AbstractJingleConnection.Id, AbstractJingleConnection> entry : this.connections.entrySet()) {
if (entry.getValue() instanceof JingleRtpConnection) {
final AbstractJingleConnection.Id id = entry.getKey();
@ -362,6 +362,17 @@ public class JingleConnectionManager extends AbstractConnectionManager {
}
}
}
synchronized (this.rtpSessionProposals) {
for (Map.Entry<RtpSessionProposal, DeviceDiscoveryState> entry : this.rtpSessionProposals.entrySet()) {
RtpSessionProposal proposal = entry.getKey();
if (proposal.account == contact.getAccount() && contact.getJid().asBareJid().equals(proposal.with)) {
final DeviceDiscoveryState preexistingState = entry.getValue();
if (preexistingState != null && preexistingState != DeviceDiscoveryState.FAILED) {
return Optional.of(proposal);
}
}
}
}
return Optional.absent();
}
@ -625,7 +636,7 @@ public class JingleConnectionManager extends AbstractConnectionManager {
}
}
public static class RtpSessionProposal {
public static class RtpSessionProposal implements OngoingRtpSession {
public final Jid with;
public final String sessionId;
public final Set<Media> media;
@ -660,5 +671,20 @@ public class JingleConnectionManager extends AbstractConnectionManager {
public int hashCode() {
return Objects.hashCode(account.getJid(), with, sessionId);
}
@Override
public Account getAccount() {
return account;
}
@Override
public Jid getWith() {
return with;
}
@Override
public String getSessionId() {
return sessionId;
}
}
}

View File

@ -0,0 +1,12 @@
package eu.siacs.conversations.xmpp.jingle;
import com.google.common.base.Optional;
import eu.siacs.conversations.entities.Account;
import rocks.xmpp.addr.Jid;
public interface OngoingRtpSession {
Account getAccount();
Jid getWith();
String getSessionId();
}