Skip to content

Commit

Permalink
try to avoid NPE for currentConversation
Browse files Browse the repository at this point in the history
On gplay console the following NPE was reported for the line

participantPermissions = ParticipantPermissions(spreedCapabilities, currentConversation!!)

 E  FATAL EXCEPTION: main
          Process: com.nextcloud.talk2, PID: 6626
          java.lang.NullPointerException
          at com.nextcloud.talk.chat.ChatActivity.initObservers$lambda$13(ChatActivity.kt:583)
          at com.nextcloud.talk.chat.ChatActivity.$r8$lambda$QKH5JCFLmCzRMlSJ-EV-m4IW5ig(Unknown Source:0)

which seems that currentConversation was null. If it would have been spreedCapabilities, then the error would have been thrown in the line before..

A reason MAY BE that the observer is triggered before setData on the ViewModel is executed.
While this fix is just not executing code when currentConversation is null, it's unsure if it will follow up problems (like an empty chat) or if the observer is triggered another time when currentConversation is available.

So it's just a hotfix.
To improve the situation in the long term, we should move more logic to viewModel and only use Flow instead to mix it with LiveData.

Signed-off-by: Marcel Hibbe <[email protected]>
  • Loading branch information
mahibi authored and sowjanyakch committed Sep 24, 2024
1 parent 68627ad commit b78267d
Showing 1 changed file with 48 additions and 33 deletions.
81 changes: 48 additions & 33 deletions app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -571,48 +571,63 @@ class ChatActivity :
chatViewModel.getCapabilitiesViewState.observe(this) { state ->
when (state) {
is ChatViewModel.GetCapabilitiesUpdateState -> {
spreedCapabilities = state.spreedCapabilities
chatApiVersion = ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(1))
participantPermissions = ParticipantPermissions(spreedCapabilities, currentConversation!!)

invalidateOptionsMenu()
checkShowCallButtons()
checkLobbyState()
updateRoomTimerHandler()
if (currentConversation != null) {
spreedCapabilities = state.spreedCapabilities
chatApiVersion = ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(1))
participantPermissions = ParticipantPermissions(spreedCapabilities, currentConversation!!)

invalidateOptionsMenu()
checkShowCallButtons()
checkLobbyState()
updateRoomTimerHandler()
} else {
Log.w(
TAG,
"currentConversation was null in observer ChatViewModel.GetCapabilitiesUpdateState"
)
}
}

is ChatViewModel.GetCapabilitiesInitialLoadState -> {
spreedCapabilities = state.spreedCapabilities
chatApiVersion = ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(1))
participantPermissions = ParticipantPermissions(spreedCapabilities, currentConversation!!)

supportFragmentManager.commit {
setReorderingAllowed(true) // optimizes out redundant replace operations
replace(R.id.fragment_container_activity_chat, messageInputFragment)
}
if (currentConversation != null) {
spreedCapabilities = state.spreedCapabilities
chatApiVersion = ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(1))
participantPermissions = ParticipantPermissions(spreedCapabilities, currentConversation!!)

supportFragmentManager.commit {
setReorderingAllowed(true) // optimizes out redundant replace operations
replace(R.id.fragment_container_activity_chat, messageInputFragment)
}

joinRoomWithPassword()
joinRoomWithPassword()

if (conversationUser?.userId != "?" &&
CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.MENTION_FLAG)
) {
binding.chatToolbar.setOnClickListener { _ -> showConversationInfoScreen() }
}
if (conversationUser?.userId != "?" &&
CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.MENTION_FLAG)
) {
binding.chatToolbar.setOnClickListener { _ -> showConversationInfoScreen() }
}

loadAvatarForStatusBar()
setupSwipeToReply()
setActionBarTitle()
loadAvatarForStatusBar()
setupSwipeToReply()
setActionBarTitle()

checkShowCallButtons()
checkLobbyState()
updateRoomTimerHandler()
checkShowCallButtons()
checkLobbyState()
updateRoomTimerHandler()

val urlForChatting = ApiUtils.getUrlForChat(chatApiVersion, conversationUser?.baseUrl, roomToken)
val urlForChatting =
ApiUtils.getUrlForChat(chatApiVersion, conversationUser?.baseUrl, roomToken)

if (adapter?.isEmpty == true) {
chatViewModel.loadMessages(
withCredentials = credentials!!,
withUrl = urlForChatting
if (adapter?.isEmpty == true) {
chatViewModel.loadMessages(
withCredentials = credentials!!,
withUrl = urlForChatting
)
}
} else {
Log.w(
TAG,
"currentConversation was null in observer ChatViewModel.GetCapabilitiesInitialLoadState"
)
}
}
Expand Down

0 comments on commit b78267d

Please sign in to comment.