diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 763bc3760..ae46b8075 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -127,6 +127,7 @@ 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 eu.siacs.conversations.xmpp.jingle.RtpEndUserState; import org.jetbrains.annotations.NotNull; @@ -1556,20 +1557,25 @@ public class ConversationFragment extends XmppFragment if (ongoingRtpSession.isPresent()) { final OngoingRtpSession id = ongoingRtpSession.get(); final Intent intent = new Intent(getActivity(), RtpSessionActivity.class); + intent.setAction(Intent.ACTION_VIEW); intent.putExtra( RtpSessionActivity.EXTRA_ACCOUNT, id.getAccount().getJid().asBareJid().toEscapedString()); intent.putExtra(RtpSessionActivity.EXTRA_WITH, id.getWith().toEscapedString()); if (id instanceof AbstractJingleConnection) { - intent.setAction(Intent.ACTION_VIEW); intent.putExtra(RtpSessionActivity.EXTRA_SESSION_ID, id.getSessionId()); startActivity(intent); } else if (id instanceof JingleConnectionManager.RtpSessionProposal proposal) { - if (proposal.media.contains(Media.VIDEO)) { - intent.setAction(RtpSessionActivity.ACTION_MAKE_VIDEO_CALL); + if (Media.audioOnly(proposal.media)) { + intent.putExtra( + RtpSessionActivity.EXTRA_LAST_ACTION, + RtpSessionActivity.ACTION_MAKE_VOICE_CALL); } else { - intent.setAction(RtpSessionActivity.ACTION_MAKE_VOICE_CALL); + intent.putExtra( + RtpSessionActivity.EXTRA_LAST_ACTION, + RtpSessionActivity.ACTION_MAKE_VIDEO_CALL); } + intent.putExtra(RtpSessionActivity.EXTRA_PROPOSED_SESSION_ID, proposal.sessionId); startActivity(intent); } } diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index 871b7c259..97b2ccb52 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java @@ -460,6 +460,9 @@ public class RtpSessionActivity extends XmppActivity public void onNewIntent(final Intent intent) { Log.d(Config.LOGTAG, this.getClass().getName() + ".onNewIntent()"); super.onNewIntent(intent); + if (intent == null) { + return; + } setIntent(intent); if (xmppConnectionService == null) { Log.d( @@ -467,32 +470,21 @@ public class RtpSessionActivity extends XmppActivity "RtpSessionActivity: background service wasn't bound in onNewIntent()"); return; } - final Account account = extractAccount(intent); - final String action = intent.getAction(); - final Jid with = Jid.ofEscaped(intent.getStringExtra(EXTRA_WITH)); - final String sessionId = intent.getStringExtra(EXTRA_SESSION_ID); - if (sessionId != null) { - Log.d(Config.LOGTAG, "reinitializing from onNewIntent()"); - if (initializeActivityWithRunningRtpSession(account, with, sessionId)) { - return; - } - if (ACTION_ACCEPT_CALL.equals(intent.getAction())) { - Log.d(Config.LOGTAG, "accepting call from onNewIntent()"); - requestPermissionsAndAcceptCall(); - resetIntent(intent.getExtras()); - } - } else if (asList(ACTION_MAKE_VIDEO_CALL, ACTION_MAKE_VOICE_CALL).contains(action)) { - proposeJingleRtpSession(account, with, actionToMedia(action)); - setWith(account.getRoster().getContact(with), null); - } else { - throw new IllegalStateException("received onNewIntent without sessionId"); - } + initializeWithIntent(Event.ON_NEW_INTENT, intent); } @Override void onBackendConnected() { - final Intent intent = getIntent(); + final var intent = getIntent(); + if (intent == null) { + return; + } + initializeWithIntent(Event.ON_BACKEND_CONNECTED, intent); + } + + private void initializeWithIntent(final Event event, @NonNull final Intent intent) { final String action = intent.getAction(); + Log.d(Config.LOGTAG, "initializeWithIntent(" + event + "," + action + ")"); final Account account = extractAccount(intent); final Jid with = Jid.ofEscaped(intent.getStringExtra(EXTRA_WITH)); final String sessionId = intent.getStringExtra(EXTRA_SESSION_ID); @@ -505,9 +497,6 @@ public class RtpSessionActivity extends XmppActivity requestPermissionsAndAcceptCall(); resetIntent(intent.getExtras()); } - } else if (asList(ACTION_MAKE_VIDEO_CALL, ACTION_MAKE_VOICE_CALL).contains(action)) { - proposeJingleRtpSession(account, with, actionToMedia(action)); - setWith(account.getRoster().getContact(with), null); } else if (Intent.ACTION_VIEW.equals(action)) { final String proposedSessionId = intent.getStringExtra(EXTRA_PROPOSED_SESSION_ID); final JingleConnectionManager.TerminatedRtpSession terminatedRtpSession = @@ -520,8 +509,6 @@ public class RtpSessionActivity extends XmppActivity return; } final String extraLastState = intent.getStringExtra(EXTRA_LAST_REPORTED_STATE); - final String lastAction = intent.getStringExtra(EXTRA_LAST_ACTION); - final Set media = actionToMedia(lastAction); final RtpEndUserState state = extraLastState == null ? null : RtpEndUserState.valueOf(extraLastState); if (state != null) { @@ -541,6 +528,8 @@ public class RtpSessionActivity extends XmppActivity if (END_CARD.contains(state)) { return; } + final String lastAction = intent.getStringExtra(EXTRA_LAST_ACTION); + final Set media = actionToMedia(lastAction); if (xmppConnectionService .getJingleConnectionManager() .hasMatchingProposal(account, with)) { @@ -567,19 +556,6 @@ public class RtpSessionActivity extends XmppActivity } } - private void proposeJingleRtpSession( - final Account account, final Jid with, final Set media) { - if (with.isBareJid()) { - xmppConnectionService - .getJingleConnectionManager() - .proposeJingleRtpSession(account, with, media); - } else { - throw new IllegalStateException( - "We should not be initializing direct calls from the RtpSessionActivity. Go through CallIntegrationConnectionService.placeCall instead!"); - } - putScreenInCallMode(media); - } - @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { @@ -1526,4 +1502,9 @@ public class RtpSessionActivity extends XmppActivity private static boolean emptyReference(final WeakReference weakReference) { return weakReference == null || weakReference.get() == null; } + + private enum Event { + ON_BACKEND_CONNECTED, + ON_NEW_INTENT + } }