make RtpSessionActivity onNewIntent and onBackendConnected run through the same code

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java | 14 
src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java   | 59 
2 files changed, 30 insertions(+), 43 deletions(-)

Detailed changes

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);
             }
         }

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> 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> 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> 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
+    }
 }