From 6d7cf8305a668e92ae01a40ae247342202a07af1 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 28 Sep 2020 11:53:22 +0200 Subject: [PATCH] Fix join call directly after first start Signed-off-by: tobiasKaminsky --- .../talk/controllers/CallController.java | 170 ++++++++++++------ .../talk/controllers/ChatController.kt | 6 +- .../talk/webrtc/MagicWebSocketInstance.java | 23 ++- 3 files changed, 134 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java index 7e2a1f97c..2f605148f 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -39,14 +39,13 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.widget.*; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import autodagger.AutoInjector; -import butterknife.BindView; -import butterknife.OnClick; -import butterknife.OnLongClick; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.TextView; + import com.bluelinelabs.logansquare.LoganSquare; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; @@ -55,17 +54,29 @@ import com.nextcloud.talk.R; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.base.BaseController; -import com.nextcloud.talk.events.*; +import com.nextcloud.talk.events.ConfigurationChangeEvent; +import com.nextcloud.talk.events.MediaStreamEvent; +import com.nextcloud.talk.events.NetworkEvent; +import com.nextcloud.talk.events.PeerConnectionEvent; +import com.nextcloud.talk.events.SessionDescriptionSendEvent; +import com.nextcloud.talk.events.WebSocketCommunicationEvent; import com.nextcloud.talk.models.ExternalSignalingServer; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall; +import com.nextcloud.talk.models.json.conversations.Conversation; import com.nextcloud.talk.models.json.conversations.RoomOverall; +import com.nextcloud.talk.models.json.conversations.RoomsOverall; import com.nextcloud.talk.models.json.generic.GenericOverall; import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.models.json.participants.ParticipantsOverall; -import com.nextcloud.talk.models.json.conversations.Conversation; -import com.nextcloud.talk.models.json.conversations.RoomsOverall; -import com.nextcloud.talk.models.json.signaling.*; +import com.nextcloud.talk.models.json.signaling.DataChannelMessage; +import com.nextcloud.talk.models.json.signaling.DataChannelMessageNick; +import com.nextcloud.talk.models.json.signaling.NCIceCandidate; +import com.nextcloud.talk.models.json.signaling.NCMessagePayload; +import com.nextcloud.talk.models.json.signaling.NCMessageWrapper; +import com.nextcloud.talk.models.json.signaling.NCSignalingMessage; +import com.nextcloud.talk.models.json.signaling.Signaling; +import com.nextcloud.talk.models.json.signaling.SignalingOverall; import com.nextcloud.talk.models.json.signaling.settings.IceServer; import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall; import com.nextcloud.talk.utils.ApiUtils; @@ -77,8 +88,57 @@ import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.power.PowerManagerUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder; -import com.nextcloud.talk.webrtc.*; +import com.nextcloud.talk.webrtc.MagicAudioManager; +import com.nextcloud.talk.webrtc.MagicPeerConnectionWrapper; +import com.nextcloud.talk.webrtc.MagicWebRTCUtils; +import com.nextcloud.talk.webrtc.MagicWebSocketInstance; +import com.nextcloud.talk.webrtc.WebSocketConnectionHelper; import com.wooplr.spotlight.SpotlightView; + +import org.apache.commons.lang3.StringEscapeUtils; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.parceler.Parcel; +import org.webrtc.AudioSource; +import org.webrtc.AudioTrack; +import org.webrtc.Camera1Enumerator; +import org.webrtc.Camera2Enumerator; +import org.webrtc.CameraEnumerator; +import org.webrtc.CameraVideoCapturer; +import org.webrtc.EglBase; +import org.webrtc.IceCandidate; +import org.webrtc.Logging; +import org.webrtc.MediaConstraints; +import org.webrtc.MediaStream; +import org.webrtc.PeerConnection; +import org.webrtc.PeerConnectionFactory; +import org.webrtc.RendererCommon; +import org.webrtc.SessionDescription; +import org.webrtc.SurfaceViewRenderer; +import org.webrtc.VideoCapturer; +import org.webrtc.VideoSource; +import org.webrtc.VideoTrack; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import autodagger.AutoInjector; +import butterknife.BindView; +import butterknife.OnClick; +import butterknife.OnLongClick; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -88,19 +148,8 @@ import me.zhanghai.android.effortlesspermissions.AfterPermissionDenied; import me.zhanghai.android.effortlesspermissions.EffortlessPermissions; import me.zhanghai.android.effortlesspermissions.OpenAppDetailsDialogFragment; import okhttp3.Cache; -import org.apache.commons.lang3.StringEscapeUtils; -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; -import org.parceler.Parcel; -import org.webrtc.*; import pub.devrel.easypermissions.AfterPermissionGranted; -import javax.inject.Inject; -import java.io.IOException; -import java.util.*; -import java.util.concurrent.TimeUnit; - @AutoInjector(NextcloudTalkApplication.class) public class CallController extends BaseController { @@ -1001,10 +1050,10 @@ public class CallController extends BaseController { .getCapabilities().getSpreedCapability() .getFeatures().contains("no-ping")); - if (!hasExternalSignalingServer) { - joinRoomAndCall(); - } else { + if (hasExternalSignalingServer) { setupAndInitiateWebSocketsConnection(); + } else { + joinRoomAndCall(); } } @@ -1021,44 +1070,51 @@ public class CallController extends BaseController { } private void joinRoomAndCall() { - ncApi.joinRoom(credentials, ApiUtils.getUrlForSettingMyselfAsActiveParticipant(baseUrl, - roomToken), conversationPassword) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .retry(3) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { + callSession = ApplicationWideCurrentRoomHolder.getInstance().getSession(); - } + if (TextUtils.isEmpty(callSession)) { + ncApi.joinRoom(credentials, ApiUtils.getUrlForSettingMyselfAsActiveParticipant(baseUrl, + roomToken), conversationPassword) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .retry(3) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { - @Override - public void onNext(RoomOverall roomOverall) { - callSession = roomOverall.getOcs().getData().getSessionId(); - ApplicationWideCurrentRoomHolder.getInstance().setSession(callSession); - ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId); - ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomToken(roomToken); - ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(conversationUser); - callOrJoinRoomViaWebSocket(); - } + } - @Override - public void onError(Throwable e) { + @Override + public void onNext(RoomOverall roomOverall) { + callSession = roomOverall.getOcs().getData().getSessionId(); + ApplicationWideCurrentRoomHolder.getInstance().setSession(callSession); + ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId); + ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomToken(roomToken); + ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(conversationUser); + callOrJoinRoomViaWebSocket(); + } - } + @Override + public void onError(Throwable e) { - @Override - public void onComplete() { + } - } - }); + @Override + public void onComplete() { + + } + }); + } else { + // we are in a room and start a call -> same session needs to be used + callOrJoinRoomViaWebSocket(); + } } private void callOrJoinRoomViaWebSocket() { - if (!hasExternalSignalingServer) { - performCall(); - } else { + if (hasExternalSignalingServer) { webSocketClient.joinRoomWithRoomTokenAndSession(roomToken, callSession); + } else { + performCall(); } } @@ -1399,10 +1455,6 @@ public class CallController extends BaseController { @Override public void onNext(GenericOverall genericOverall) { - if (!TextUtils.isEmpty(credentials) && hasExternalSignalingServer) { - webSocketClient.joinRoomWithRoomTokenAndSession("", callSession); - } - if (isMultiSession) { if (shutDownView && getActivity() != null) { getActivity().finish(); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 7678bbae1..6fc22d45a 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -641,7 +641,11 @@ class ChatController(args: Bundle) : BaseController(args), MessagesListAdapter override fun onDetach(view: View) { super.onDetach(view) - ApplicationWideCurrentRoomHolder.getInstance().clear() + + if (!isLeavingForConversation) { + // current room is still "active", we need the info + ApplicationWideCurrentRoomHolder.getInstance().clear() + } eventBus?.unregister(this) if (activity != null) { diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java index 7c2b83a15..38adaca89 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java @@ -23,7 +23,7 @@ package com.nextcloud.talk.webrtc; import android.content.Context; import android.text.TextUtils; import android.util.Log; -import autodagger.AutoInjector; + import com.bluelinelabs.logansquare.LoganSquare; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; @@ -33,24 +33,37 @@ import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.models.json.signaling.NCMessageWrapper; import com.nextcloud.talk.models.json.signaling.NCSignalingMessage; -import com.nextcloud.talk.models.json.websocket.*; +import com.nextcloud.talk.models.json.websocket.BaseWebSocketMessage; +import com.nextcloud.talk.models.json.websocket.ByeWebSocketMessage; +import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage; +import com.nextcloud.talk.models.json.websocket.ErrorOverallWebSocketMessage; +import com.nextcloud.talk.models.json.websocket.EventOverallWebSocketMessage; +import com.nextcloud.talk.models.json.websocket.HelloResponseOverallWebSocketMessage; +import com.nextcloud.talk.models.json.websocket.JoinedRoomOverallWebSocketMessage; import com.nextcloud.talk.utils.LoggingUtils; import com.nextcloud.talk.utils.MagicMap; import com.nextcloud.talk.utils.bundle.BundleKeys; -import okhttp3.*; -import okio.ByteString; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import javax.inject.Inject; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.inject.Inject; + +import autodagger.AutoInjector; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; +import okio.ByteString; + @AutoInjector(NextcloudTalkApplication.class) public class MagicWebSocketInstance extends WebSocketListener { private static final String TAG = "MagicWebSocketInstance";