瀏覽代碼

Merge pull request #2824 from nextcloud/bugfix/2784/avoidCrashWhenJoinOtherRoomDuringCall

Restrict to join other rooms while being in a call
Marcel Hibbe 2 年之前
父節點
當前提交
b72fad3607

+ 26 - 5
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -1885,8 +1885,7 @@ class ChatController(args: Bundle) :
             if (validSessionId()) {
                 leaveRoom(null, null)
             } else {
-                Log.d(TAG, "not leaving room (inConversation is false and/or validSessionId is false)")
-                // room might have already been left...
+                Log.d(TAG, "not leaving room (validSessionId is false)")
             }
         } else {
             Log.e(TAG, "not leaving room...")
@@ -1937,6 +1936,24 @@ class ChatController(args: Bundle) :
     }
 
     private fun joinRoomWithPassword() {
+        if (CallActivity.active &&
+            roomToken != ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken
+        ) {
+            Toast.makeText(
+                context,
+                context.getString(R.string.restrict_join_other_room_while_call),
+                Toast.LENGTH_LONG
+            ).show()
+
+            Log.e(
+                TAG,
+                "Restricted to open chat controller because a call in another room is active. This is an " +
+                    "edge case which is not properly handled yet."
+            )
+            router.popToRoot()
+            return
+        }
+
         // if ApplicationWideCurrentRoomHolder contains a session (because a call is active), then keep the sessionId
         if (ApplicationWideCurrentRoomHolder.getInstance().currentRoomId ==
             currentConversation!!.roomId
@@ -1974,11 +1991,15 @@ class ChatController(args: Bundle) :
                     @Suppress("Detekt.TooGenericExceptionCaught")
                     override fun onNext(roomOverall: RoomOverall) {
                         Log.d(TAG, "joinRoomWithPassword - joinRoom - got response: $startNanoTime")
-                        sessionIdAfterRoomJoined = roomOverall.ocs!!.data!!.sessionId
 
-                        logConversationInfos("joinRoomWithPassword#onNext")
+                        val conversation = roomOverall.ocs!!.data!!
+                        sessionIdAfterRoomJoined = conversation.sessionId
+                        ApplicationWideCurrentRoomHolder.getInstance().session = conversation.sessionId
+                        ApplicationWideCurrentRoomHolder.getInstance().currentRoomId = conversation.roomId
+                        ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken = conversation.token
+                        ApplicationWideCurrentRoomHolder.getInstance().userInRoom = conversationUser
 
-                        ApplicationWideCurrentRoomHolder.getInstance().session = sessionIdAfterRoomJoined
+                        logConversationInfos("joinRoomWithPassword#onNext")
 
                         // 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

+ 13 - 0
app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt

@@ -66,6 +66,7 @@ import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler
 import com.google.android.material.button.MaterialButton
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.nextcloud.talk.R
+import com.nextcloud.talk.activities.CallActivity
 import com.nextcloud.talk.activities.MainActivity
 import com.nextcloud.talk.adapters.items.ConversationItem
 import com.nextcloud.talk.adapters.items.GenericTextHeaderItem
@@ -120,6 +121,7 @@ import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUnifiedSearc
 import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUserStatusAvailable
 import com.nextcloud.talk.utils.remapchat.ConductorRemapping.remapChatController
 import com.nextcloud.talk.utils.rx.SearchViewObservable.Companion.observeSearchView
+import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder
 import eu.davidea.flexibleadapter.FlexibleAdapter
 import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
 import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
@@ -1112,6 +1114,17 @@ class ConversationsListController(bundle: Bundle) :
     }
 
     private fun openConversation(textToPaste: String? = "") {
+        if (CallActivity.active &&
+            selectedConversation!!.token != ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken
+        ) {
+            Toast.makeText(
+                context,
+                context.getString(R.string.restrict_join_other_room_while_call),
+                Toast.LENGTH_LONG
+            ).show()
+            return
+        }
+
         val bundle = Bundle()
         bundle.putParcelable(KEY_USER_ENTITY, currentUser)
         bundle.putParcelable(KEY_ACTIVE_CONVERSATION, Parcels.wrap(selectedConversation))

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -241,6 +241,7 @@ How to translate with transifex:
     <string name="nc_call_raised_hand">%1$s raised the hand</string>
     <string name="raise_hand">Raise hand</string>
     <string name="lower_hand">Lower hand</string>
+    <string name="restrict_join_other_room_while_call">It's not possible to join other rooms while being in a call</string>
 
     <!-- Picture in Picture -->
     <string name="nc_pip_microphone_mute">Mute microphone</string>