From 5f2e2c5fe690f8551303ce3340a23459cdd5ad90 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 3 Mar 2023 12:02:34 +0100 Subject: [PATCH 1/2] Restrict to join other rooms while being in a call When clicking on a conversation in conversation overview, restrict opening immediately. If joinRoomWithPassword in ChatController is reached in any other way (for example by creating a new conversation while being in a call), then it's restricted to join the room. All this is done to avoid NPE: D/ChatController: pullChatMessages - pullChatMessages[lookIntoFuture > 0] - got response W/System.err: java.lang.NullPointerException W/System.err: at com.nextcloud.talk.controllers.ChatController.modifyMessageCount(ChatController.kt:2536) W/System.err: at com.nextcloud.talk.controllers.ChatController.addMessagesToAdapter(ChatController.kt:2515) W/System.err: at com.nextcloud.talk.controllers.ChatController.processMessagesFromTheFuture(ChatController.kt:2489) W/System.err: at com.nextcloud.talk.controllers.ChatController.processMessages(ChatController.kt:2437) W/System.err: at com.nextcloud.talk.controllers.ChatController.processMessagesResponse(ChatController.kt:2398) W/System.err: at com.nextcloud.talk.controllers.ChatController.access$processMessagesResponse(ChatController.kt:221) W/System.err: at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext(ChatController.kt:2309) W/System.err: at com.nextcloud.talk.controllers.ChatController$pullChatMessages$2.onNext(ChatController.kt:2294) W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201) W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255) W/System.err: at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124) W/System.err: at android.os.Handler.handleCallback(Handler.java:883) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:100) W/System.err: at android.os.Looper.loop(Looper.java:224) W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7590) W/System.err: at java.lang.reflect.Method.invoke(Native Method) W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) Known issues: - doesn't respect handling for other instances. E.g. when receiving notification from other instance and open it. Signed-off-by: Marcel Hibbe Fix to always allow opening same room when being in call Fix to set also other properties for ApplicationWideCurrentRoomHolder when joining room in chat. Otherwise it could have been possible to not be allowed to open this chat again from conversation list while being in call. In a next step, ApplicationWideCurrentRoomHolder should be refactored to hold the conversation itself. Maybe in a map of users to handle different instances. Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 31 ++++++++++++++++--- .../ConversationsListController.kt | 13 ++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 40 insertions(+), 5 deletions(-) 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 97019255c..648c1a98f 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/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,12 +1991,16 @@ 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 + + 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 logConversationInfos("joinRoomWithPassword#onNext") - 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 // was able to finish and, therefore, that the web socket instance can be got. diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt index c041c0d8d..f675124b3 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt +++ b/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)) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58436f670..8a03c4802 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -241,6 +241,7 @@ How to translate with transifex: %1$s raised the hand Raise hand Lower hand + "It's not possible to join other rooms while being in a call Mute microphone From e9f10864b95457d102f6b56e81d46ad5f878e5f1 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 3 Mar 2023 15:59:13 +0100 Subject: [PATCH 2/2] Update app/src/main/res/values/strings.xml Co-authored-by: Joas Schilling <213943+nickvergessen@users.noreply.github.com> Signed-off-by: Marcel Hibbe --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8a03c4802..72ca9ca95 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -241,7 +241,7 @@ How to translate with transifex: %1$s raised the hand Raise hand Lower hand - "It's not possible to join other rooms while being in a call + It's not possible to join other rooms while being in a call Mute microphone