From d75e235ba245feba8e7993130131c9111cf4169b Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 1 Mar 2023 14:29:00 +0100 Subject: [PATCH] Use session id returned from join room & more 1) Use session id returned from join room = introduce sessionIdAfterRoomJoined to make clear this is the session to use instead of currentConversation?.sessionId See https://nextcloud-talk.readthedocs.io/en/latest/conversation/#get-user-s-conversations : "'0' if not connected, otherwise an up to 512 character long string that is the identifier of the user's session making the request. Should only be used to pre-check if the user joined already with this session, but this might be outdated by the time of usage, so better check via Get list of participants in a conversation" 2) Also, trigger getRoomInfo() or handleFromNotification() in onAttach() instead of in onViewBound. onViewBound is not called when returning back from an other view (e.g. conversation infos) so after this, new messages were not handled. Furthermore, getRoomInfo()/joinRoomWithPassword() in onViewBound and onAttach were sometimes both called, because the handling of validSessionId was buggy. This resulted in duplicated messages. 3) Use ApplicationWideCurrentRoomHolder to set sessionId from call and check in ChatController if there is already a session for the room. If yes, use this instead to joinRoom again. This is necessary for PictureInPicture mode. Otherwise, call would be left whenever ChatController joins room again. Signed-off-by: Marcel Hibbe --- .../talk/activities/CallActivity.java | 2 +- .../talk/controllers/ChatController.kt | 54 +++++++++---------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index fb4fc34c1..9ed5fa5aa 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1591,7 +1591,7 @@ public class CallActivity extends CallBaseActivity { Log.d(TAG, " new callSession by joinRoom= " + callSession); ApplicationWideCurrentRoomHolder.getInstance().setSession(callSession); - ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId); + ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(conversation.getRoomId()); ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomToken(roomToken); ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(conversationUser); callOrJoinRoomViaWebSocket(); 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 ca75f6467..4b3909690 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -251,6 +251,7 @@ class ChatController(args: Bundle) : val disposables = DisposableSet() + var sessionIdAfterRoomJoined: String? = null var roomToken: String? = null val conversationUser: User? private val roomPassword: String @@ -526,13 +527,10 @@ class ChatController(args: Bundle) : override fun onViewBound(view: View) { Log.d(TAG, "onViewBound: " + System.identityHashCode(this).toString()) actionBar?.show() - var adapterWasNull = false if (adapter == null) { binding?.progressBar?.visibility = View.VISIBLE - adapterWasNull = true - val messageHolders = MessageHolders() val profileBottomSheet = ProfileBottomSheet(ncApi, conversationUser!!, router) @@ -917,14 +915,6 @@ class ChatController(args: Bundle) : setTitle() } - if (adapterWasNull) { - Log.d(TAG, "starting for the first time (because adapter was null)") - if (TextUtils.isEmpty(roomToken)) { - handleFromNotification() - } else { - getRoomInfo() - } - } super.onViewBound(view) } @@ -1787,8 +1777,8 @@ class ChatController(args: Bundle) : private fun validSessionId(): Boolean { return currentConversation != null && - !TextUtils.isEmpty(currentConversation?.sessionId) && - currentConversation?.sessionId != "0" + sessionIdAfterRoomJoined?.isNotEmpty() == true && + sessionIdAfterRoomJoined != "0" } @Suppress("Detekt.TooGenericExceptionCaught") @@ -1807,10 +1797,6 @@ class ChatController(args: Bundle) : activity?.findViewById(R.id.toolbar)?.setOnClickListener { v -> showConversationInfoScreen() } } - ApplicationWideCurrentRoomHolder.getInstance().currentRoomId = roomId - ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken = roomToken - ApplicationWideCurrentRoomHolder.getInstance().userInRoom = conversationUser - val smileyButton = binding?.messageInputView?.findViewById(R.id.smileyButton) emojiPopup = binding?.messageInputView?.inputEditText?.let { @@ -1850,9 +1836,10 @@ class ChatController(args: Bundle) : cancelNotificationsForCurrentConversation() - if (!validSessionId()) { - Log.d(TAG, "execute joinRoomWithPassword in onAttach") - joinRoomWithPassword() + if (TextUtils.isEmpty(roomToken)) { + handleFromNotification() + } else { + getRoomInfo() } } @@ -1954,6 +1941,17 @@ class ChatController(args: Bundle) : } private fun joinRoomWithPassword() { + // if ApplicationWideCurrentRoomHolder contains a session (because a call is active), then keep the sessionId + if (ApplicationWideCurrentRoomHolder.getInstance().currentRoomId == + currentConversation!!.roomId + ) { + sessionIdAfterRoomJoined = ApplicationWideCurrentRoomHolder.getInstance().session + + ApplicationWideCurrentRoomHolder.getInstance().currentRoomId = roomId + ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken = roomToken + ApplicationWideCurrentRoomHolder.getInstance().userInRoom = conversationUser + } + if (!validSessionId()) { Log.d(TAG, "sessionID was not valid -> joinRoom") var apiVersion = 1 @@ -1980,12 +1978,11 @@ class ChatController(args: Bundle) : @Suppress("Detekt.TooGenericExceptionCaught") override fun onNext(roomOverall: RoomOverall) { Log.d(TAG, "joinRoomWithPassword - joinRoom - got response: $startNanoTime") - currentConversation?.sessionId = roomOverall.ocs!!.data!!.sessionId + sessionIdAfterRoomJoined = roomOverall.ocs!!.data!!.sessionId logConversationInfos("joinRoomWithPassword#onNext") - ApplicationWideCurrentRoomHolder.getInstance().session = - currentConversation?.sessionId + ApplicationWideCurrentRoomHolder.getInstance().session = sessionIdAfterRoomJoined // FIXME The web socket should be set up in onAttach(). It is currently setup after joining the // room to "ensure" (rather, increase the chances) that the WebsocketConnectionsWorker job @@ -2007,7 +2004,7 @@ class ChatController(args: Bundle) : if (webSocketInstance != null) { webSocketInstance?.joinRoomWithRoomTokenAndSession( roomToken!!, - currentConversation?.sessionId + sessionIdAfterRoomJoined ) } if (startCallFromNotification != null && startCallFromNotification ?: false) { @@ -2031,11 +2028,10 @@ class ChatController(args: Bundle) : } else { Log.d(TAG, "sessionID was valid -> skip joinRoom") - ApplicationWideCurrentRoomHolder.getInstance().session = currentConversation?.sessionId if (webSocketInstance != null) { webSocketInstance?.joinRoomWithRoomTokenAndSession( roomToken!!, - currentConversation?.sessionId + sessionIdAfterRoomJoined ) } checkLobbyState() @@ -2089,7 +2085,7 @@ class ChatController(args: Bundle) : if (webSocketInstance != null && currentConversation != null) { webSocketInstance?.joinRoomWithRoomTokenAndSession( "", - currentConversation?.sessionId + sessionIdAfterRoomJoined ) } else { Log.e(TAG, "magicWebSocketInstance or currentConversation were null! Failed to leave the room!") @@ -2102,7 +2098,7 @@ class ChatController(args: Bundle) : } } - currentConversation?.sessionId = "0" + sessionIdAfterRoomJoined = "0" if (remapChatModel != null && funToCallWhenLeaveSuccessful != null) { Log.d(TAG, "a callback action was set and is now executed because room was left successfully") @@ -3498,7 +3494,7 @@ class ChatController(args: Bundle) : Log.d(TAG, " | ChatController: " + System.identityHashCode(this).toString()) Log.d(TAG, " | roomToken: $roomToken") Log.d(TAG, " | currentConversation?.displayName: ${currentConversation?.displayName}") - Log.d(TAG, " | currentConversation?.sessionId: ${currentConversation?.sessionId}") + Log.d(TAG, " | sessionIdAfterRoomJoined: $sessionIdAfterRoomJoined") Log.d(TAG, " |-----------------------------------------------") }