Merge pull request #3181 from nextcloud/websocketImprovements

minor Websocket fixes
This commit is contained in:
Andy Scherzinger 2023-07-13 21:23:55 +02:00 committed by GitHub
commit 3a050ab690
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 49 additions and 16 deletions

View File

@ -1989,7 +1989,7 @@ public class CallActivity extends CallBaseActivity {
@Override @Override
public void onError(@io.reactivex.annotations.NonNull Throwable e) { public void onError(@io.reactivex.annotations.NonNull Throwable e) {
// unused atm Log.e(TAG, "Error while leaving the call", e);
} }
@Override @Override

View File

@ -2216,7 +2216,7 @@ class ChatActivity :
Log.d(TAG, "not leaving room (validSessionId is false)") Log.d(TAG, "not leaving room (validSessionId is false)")
} }
} else { } else {
Log.e(TAG, "not leaving room...") Log.d(TAG, "not leaving room...")
} }
if (mentionAutocomplete != null && mentionAutocomplete!!.isPopupShowing) { if (mentionAutocomplete != null && mentionAutocomplete!!.isPopupShowing) {

View File

@ -100,7 +100,7 @@ class ChatViewModel @Inject constructor(private val repository: ChatRepository)
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Log.e(TAG, "Error when fetching room") Log.e(TAG, "Error when joining room")
_joinRoomViewState.value = JoinRoomErrorState _joinRoomViewState.value = JoinRoomErrorState
} }

View File

@ -23,6 +23,7 @@ package com.nextcloud.talk.jobs;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.data.user.model.User;
@ -41,6 +42,8 @@ import autodagger.AutoInjector;
@AutoInjector(NextcloudTalkApplication.class) @AutoInjector(NextcloudTalkApplication.class)
public class WebsocketConnectionsWorker extends Worker { public class WebsocketConnectionsWorker extends Worker {
public static final String TAG = "WebsocketConnectionsWorker";
@Inject @Inject
UserManager userManager; UserManager userManager;
@ -52,6 +55,8 @@ public class WebsocketConnectionsWorker extends Worker {
@NonNull @NonNull
@Override @Override
public Result doWork() { public Result doWork() {
Log.d(TAG, "WebsocketConnectionsWorker started ");
NextcloudTalkApplication.Companion.getSharedApplication().getComponentApplication().inject(this); NextcloudTalkApplication.Companion.getSharedApplication().getComponentApplication().inject(this);
List<User> users = userManager.getUsers().blockingGet(); List<User> users = userManager.getUsers().blockingGet();
@ -61,9 +66,14 @@ public class WebsocketConnectionsWorker extends Worker {
user.getExternalSignalingServer().getExternalSignalingServer() != null && user.getExternalSignalingServer().getExternalSignalingServer() != null &&
!TextUtils.isEmpty(user.getExternalSignalingServer().getExternalSignalingServer()) && !TextUtils.isEmpty(user.getExternalSignalingServer().getExternalSignalingServer()) &&
!TextUtils.isEmpty(user.getExternalSignalingServer().getExternalSignalingTicket())) { !TextUtils.isEmpty(user.getExternalSignalingServer().getExternalSignalingTicket())) {
Log.d(TAG,
"WebsocketConnectionsWorker - getExternalSignalingInstanceForServer for user " + user.getDisplayName());
webSocketConnectionHelper.getExternalSignalingInstanceForServer( webSocketConnectionHelper.getExternalSignalingInstanceForServer(
user.getExternalSignalingServer().getExternalSignalingServer(), user.getExternalSignalingServer().getExternalSignalingServer(),
user, user.getExternalSignalingServer().getExternalSignalingTicket(), user,
user.getExternalSignalingServer().getExternalSignalingTicket(),
false); false);
} }
} }

View File

@ -32,7 +32,7 @@ class RoomWebSocketMessage(
@JsonField(name = ["roomid"]) @JsonField(name = ["roomid"])
var roomId: String? = null, var roomId: String? = null,
@JsonField(name = ["sessionid"]) @JsonField(name = ["sessionid"])
var sessiondId: String? = null, var sessionId: String? = null,
@JsonField(name = ["properties"]) @JsonField(name = ["properties"])
var roomPropertiesWebSocketMessage: RoomPropertiesWebSocketMessage? = null var roomPropertiesWebSocketMessage: RoomPropertiesWebSocketMessage? = null
) : Parcelable { ) : Parcelable {

View File

@ -20,9 +20,13 @@
package com.nextcloud.talk.utils.singletons; package com.nextcloud.talk.utils.singletons;
import android.util.Log;
import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.data.user.model.User;
public class ApplicationWideCurrentRoomHolder { public class ApplicationWideCurrentRoomHolder {
public static final String TAG = "ApplicationWideCurrentRoomHolder";
private static final ApplicationWideCurrentRoomHolder holder = new ApplicationWideCurrentRoomHolder(); private static final ApplicationWideCurrentRoomHolder holder = new ApplicationWideCurrentRoomHolder();
private String currentRoomId = ""; private String currentRoomId = "";
private String currentRoomToken = ""; private String currentRoomToken = "";
@ -36,6 +40,7 @@ public class ApplicationWideCurrentRoomHolder {
} }
public void clear() { public void clear() {
Log.d(TAG, "ApplicationWideCurrentRoomHolder was cleared");
currentRoomId = ""; currentRoomId = "";
userInRoom = new User(); userInRoom = new User();
inCall = false; inCall = false;

View File

@ -84,12 +84,14 @@ public class WebSocketConnectionHelper {
WebSocketInstance webSocketInstance; WebSocketInstance webSocketInstance;
if (userId != -1 && webSocketInstanceMap.containsKey(user.getId()) && (webSocketInstance = webSocketInstanceMap.get(user.getId())) != null) { if (userId != -1 && webSocketInstanceMap.containsKey(user.getId()) && (webSocketInstance = webSocketInstanceMap.get(user.getId())) != null) {
Log.d(TAG, "webSocketInstanceMap already contained webSocketInstance for userId " + user.getId());
return webSocketInstance; return webSocketInstance;
} else { } else {
if (userId == -1) { if (userId == -1) {
deleteExternalSignalingInstanceForUserEntity(userId); deleteExternalSignalingInstanceForUserEntity(userId);
} }
webSocketInstance = new WebSocketInstance(user, generatedURL, webSocketTicket); webSocketInstance = new WebSocketInstance(user, generatedURL, webSocketTicket);
Log.d(TAG, "created new webSocketInstance for userId " + user.getId());
webSocketInstanceMap.put(user.getId(), webSocketInstance); webSocketInstanceMap.put(user.getId(), webSocketInstance);
return webSocketInstance; return webSocketInstance;
} }
@ -140,7 +142,7 @@ public class WebSocketConnectionHelper {
roomOverallWebSocketMessage.setType("room"); roomOverallWebSocketMessage.setType("room");
RoomWebSocketMessage roomWebSocketMessage = new RoomWebSocketMessage(); RoomWebSocketMessage roomWebSocketMessage = new RoomWebSocketMessage();
roomWebSocketMessage.setRoomId(roomId); roomWebSocketMessage.setRoomId(roomId);
roomWebSocketMessage.setSessiondId(sessionId); roomWebSocketMessage.setSessionId(sessionId);
roomOverallWebSocketMessage.setRoomWebSocketMessage(roomWebSocketMessage); roomOverallWebSocketMessage.setRoomWebSocketMessage(roomWebSocketMessage);
return roomOverallWebSocketMessage; return roomOverallWebSocketMessage;
} }

View File

@ -84,6 +84,7 @@ class WebSocketInstance internal constructor(
private var internalWebSocket: WebSocket? = null private var internalWebSocket: WebSocket? = null
private val connectionUrl: String private val connectionUrl: String
private var currentRoomToken: String? = null private var currentRoomToken: String? = null
private var currentNormalBackendSession: String? = null
private var reconnecting = false private var reconnecting = false
private val usersHashMap: HashMap<String?, Participant> private val usersHashMap: HashMap<String?, Participant>
private var messagesQueue: MutableList<String> = ArrayList() private var messagesQueue: MutableList<String> = ArrayList()
@ -125,6 +126,7 @@ class WebSocketInstance internal constructor(
} }
override fun onOpen(webSocket: WebSocket, response: Response) { override fun onOpen(webSocket: WebSocket, response: Response) {
Log.d(TAG, "Open webSocket")
internalWebSocket = webSocket internalWebSocket = webSocket
sendHello() sendHello()
} }
@ -168,6 +170,7 @@ class WebSocketInstance internal constructor(
isConnected = false isConnected = false
resumeId = "" resumeId = ""
} }
else -> {} else -> {}
} }
} else { } else {
@ -213,8 +216,10 @@ class WebSocketInstance internal constructor(
} }
signalingMessageReceiver.process(eventOverallWebSocketMessage.eventMap) signalingMessageReceiver.process(eventOverallWebSocketMessage.eventMap)
} }
Globals.TARGET_PARTICIPANTS -> Globals.TARGET_PARTICIPANTS ->
signalingMessageReceiver.process(eventOverallWebSocketMessage.eventMap) signalingMessageReceiver.process(eventOverallWebSocketMessage.eventMap)
else -> else ->
Log.i(TAG, "Received unknown/ignored event target: $target") Log.i(TAG, "Received unknown/ignored event target: $target")
} }
@ -291,10 +296,7 @@ class WebSocketInstance internal constructor(
val (_, roomWebSocketMessage) = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage::class.java) val (_, roomWebSocketMessage) = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage::class.java)
if (roomWebSocketMessage != null) { if (roomWebSocketMessage != null) {
currentRoomToken = roomWebSocketMessage.roomId currentRoomToken = roomWebSocketMessage.roomId
if ( if (roomWebSocketMessage.roomPropertiesWebSocketMessage != null && !TextUtils.isEmpty(currentRoomToken)) {
roomWebSocketMessage.roomPropertiesWebSocketMessage != null &&
!TextUtils.isEmpty(currentRoomToken)
) {
sendRoomJoinedEvent() sendRoomJoinedEvent()
} }
} }
@ -309,6 +311,7 @@ class WebSocketInstance internal constructor(
Log.d(TAG, "WebSocket " + webSocket.hashCode() + " resumeID " + resumeId + " expired") Log.d(TAG, "WebSocket " + webSocket.hashCode() + " resumeID " + resumeId + " expired")
resumeId = "" resumeId = ""
currentRoomToken = "" currentRoomToken = ""
currentNormalBackendSession = ""
restartWebSocket() restartWebSocket()
} else if ("hello_expected" == message.code) { } else if ("hello_expected" == message.code) {
restartWebSocket() restartWebSocket()
@ -334,16 +337,17 @@ class WebSocketInstance internal constructor(
webSocket.send(messagesQueue[i]) webSocket.send(messagesQueue[i])
} }
messagesQueue = ArrayList() messagesQueue = ArrayList()
val helloHasHap = HashMap<String, String?>() val helloHashMap = HashMap<String, String?>()
if (!TextUtils.isEmpty(oldResumeId)) { if (!TextUtils.isEmpty(oldResumeId)) {
helloHasHap["oldResumeId"] = oldResumeId helloHashMap["oldResumeId"] = oldResumeId
} else { } else {
currentRoomToken = "" currentRoomToken = ""
currentNormalBackendSession = ""
} }
if (!TextUtils.isEmpty(currentRoomToken)) { if (!TextUtils.isEmpty(currentRoomToken)) {
helloHasHap[Globals.ROOM_TOKEN] = currentRoomToken helloHashMap[Globals.ROOM_TOKEN] = currentRoomToken
} }
eventBus!!.post(WebSocketCommunicationEvent("hello", helloHasHap)) eventBus!!.post(WebSocketCommunicationEvent("hello", helloHashMap))
} }
private fun sendRoomJoinedEvent() { private fun sendRoomJoinedEvent() {
@ -357,7 +361,12 @@ class WebSocketInstance internal constructor(
} }
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
Log.d(TAG, "Closing : $code / $reason") Log.d(TAG, "onClosing : $code / $reason")
}
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
Log.d(TAG, "onClosed : $code / $reason")
isConnected = false
} }
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
@ -380,9 +389,16 @@ class WebSocketInstance internal constructor(
if (!isConnected || reconnecting) { if (!isConnected || reconnecting) {
messagesQueue.add(message) messagesQueue.add(message)
} else { } else {
if (roomToken == currentRoomToken) { if (roomToken == "") {
Log.d(TAG, "sending 'leave room' via websocket")
currentNormalBackendSession = ""
internalWebSocket!!.send(message)
} else if (roomToken == currentRoomToken && normalBackendSession == currentNormalBackendSession) {
Log.d(TAG, "roomToken&session are unchanged. Joining locally without to send websocket message")
sendRoomJoinedEvent() sendRoomJoinedEvent()
} else { } else {
Log.d(TAG, "Sending join room message via websocket")
currentNormalBackendSession = normalBackendSession
internalWebSocket!!.send(message) internalWebSocket!!.send(message)
} }
} }