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 ff163afed..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,12 +251,12 @@ class ChatController(args: Bundle) : val disposables = DisposableSet() + var sessionIdAfterRoomJoined: String? = null var roomToken: String? = null val conversationUser: User? private val roomPassword: String var credentials: String? = null var currentConversation: Conversation? = null - var inConversation = false private var historyRead = false private var globalLastKnownFutureMessageId = -1 private var globalLastKnownPastMessageId = -1 @@ -388,7 +388,7 @@ class ChatController(args: Bundle) : checkShowMessageInputView() checkLobbyState() - if (!inConversation) { + if (!validSessionId()) { joinRoomWithPassword() } else { Log.d(TAG, "already inConversation. joinRoomWithPassword is skipped") @@ -527,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) @@ -918,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) } @@ -1788,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") @@ -1808,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 { @@ -1851,10 +1836,10 @@ class ChatController(args: Bundle) : cancelNotificationsForCurrentConversation() - Log.d(TAG, "onAttach inConversation: $inConversation") - if (inConversation) { - Log.d(TAG, "execute joinRoomWithPassword in onAttach") - joinRoomWithPassword() + if (TextUtils.isEmpty(roomToken)) { + handleFromNotification() + } else { + getRoomInfo() } } @@ -1901,7 +1886,7 @@ class ChatController(args: Bundle) : if (conversationUser != null && isActivityNotChangingConfigurations() && isNotInCall()) { ApplicationWideCurrentRoomHolder.getInstance().clear() - if (inConversation && validSessionId()) { + if (validSessionId()) { leaveRoom(null, null) } else { Log.d(TAG, "not leaving room (inConversation is false and/or validSessionId is false)") @@ -1952,11 +1937,21 @@ class ChatController(args: Bundle) : currentlyPlayedVoiceMessage?.let { stopMediaPlayer(it) } adapter = null - inConversation = false Log.d(TAG, "inConversation was set to false!") } 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 @@ -1983,13 +1978,11 @@ class ChatController(args: Bundle) : @Suppress("Detekt.TooGenericExceptionCaught") override fun onNext(roomOverall: RoomOverall) { Log.d(TAG, "joinRoomWithPassword - joinRoom - got response: $startNanoTime") - inConversation = true - 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 @@ -2011,7 +2004,7 @@ class ChatController(args: Bundle) : if (webSocketInstance != null) { webSocketInstance?.joinRoomWithRoomTokenAndSession( roomToken!!, - currentConversation?.sessionId + sessionIdAfterRoomJoined ) } if (startCallFromNotification != null && startCallFromNotification ?: false) { @@ -2035,12 +2028,10 @@ class ChatController(args: Bundle) : } else { Log.d(TAG, "sessionID was valid -> skip joinRoom") - inConversation = true - ApplicationWideCurrentRoomHolder.getInstance().session = currentConversation?.sessionId if (webSocketInstance != null) { webSocketInstance?.joinRoomWithRoomTokenAndSession( roomToken!!, - currentConversation?.sessionId + sessionIdAfterRoomJoined ) } checkLobbyState() @@ -2094,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!") @@ -2107,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") @@ -2226,7 +2217,7 @@ class ChatController(args: Bundle) : } fun pullChatMessages(lookIntoFuture: Int, setReadMarker: Int = 1, xChatLastCommonRead: Int? = null) { - if (!inConversation) { + if (!validSessionId()) { return } @@ -2406,7 +2397,7 @@ class ChatController(args: Bundle) : historyRead = true - if (!lookingIntoFuture && inConversation) { + if (!lookingIntoFuture && validSessionId()) { pullChatMessages(1) } } @@ -2442,7 +2433,7 @@ class ChatController(args: Bundle) : updateReadStatusOfAllMessages(xChatLastCommonRead) adapter?.notifyDataSetChanged() - if (inConversation) { + if (validSessionId()) { pullChatMessages(1, 1, xChatLastCommonRead) } } @@ -2638,7 +2629,7 @@ class ChatController(args: Bundle) : } override fun onLoadMore(page: Int, totalItemsCount: Int) { - if (!historyRead && inConversation) { + if (!historyRead && validSessionId()) { pullChatMessages(0) } } @@ -3503,8 +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, " | inConversation: $inConversation") + Log.d(TAG, " | sessionIdAfterRoomJoined: $sessionIdAfterRoomJoined") Log.d(TAG, " |-----------------------------------------------") }