diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 4cf4bf3452..4b5140eeae 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1192,8 +1192,8 @@ class ChatActivity : pendingTargetMessageId = extras?.getString(BundleKeys.KEY_MESSAGE_ID)?.toLongOrNull()?.takeIf { it > 0L } ?: extras?.getLong(BundleKeys.KEY_MESSAGE_ID)?.takeIf { it > 0L } - pendingTargetThreadId = extras?.getString(BundleKeys.KEY_THREAD_ID)?.toLongOrNull()?.takeIf { it > 0L } - ?: extras?.getLong(BundleKeys.KEY_THREAD_ID)?.takeIf { it > 0L } + pendingTargetThreadId = extras?.getString(KEY_THREAD_ID)?.toLongOrNull()?.takeIf { it > 0L } + ?: extras?.getLong(KEY_THREAD_ID)?.takeIf { it > 0L } pendingTargetSearchQuery = extras?.getString(BundleKeys.KEY_SEARCH_QUERY) } @@ -1332,7 +1332,6 @@ class ChatActivity : currentConversation = state.conversationModel chatApiVersion = ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(1)) participantPermissions = ParticipantPermissions(spreedCapabilities, state.conversationModel!!) - supportFragmentManager.commit { setReorderingAllowed(true) // optimizes out redundant replace operations replace(R.id.fragment_container_activity_chat, messageInputFragment) @@ -1440,7 +1439,6 @@ class ChatActivity : when (state) { is ChatViewModel.JoinRoomSuccessState -> { currentConversation = state.conversationModel - sessionIdAfterRoomJoined = currentConversation!!.sessionId ApplicationWideCurrentRoomHolder.getInstance().session = currentConversation!!.sessionId ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken = currentConversation!!.token diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index cc8228efb8..536011e3c5 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -80,10 +80,10 @@ import com.nextcloud.talk.ui.dialog.AttachmentDialog import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ApiUtils -import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.CapabilitiesUtil import com.nextcloud.talk.utils.CharPolicy import com.nextcloud.talk.utils.DateUtils +import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.EmojiTextInputEditText import com.nextcloud.talk.utils.ImageEmojiEditText import com.nextcloud.talk.utils.SpreedFeatures @@ -299,47 +299,48 @@ class MessageInputFragment : Fragment() { }.collect() } - messageInputViewModel.callStartedFlow.observe(viewLifecycleOwner) { - val (message, show) = it - if (show) { - binding.fragmentCallStarted.callAuthorChip.text = message.actorDisplayName - binding.fragmentCallStarted.callAuthorChipSecondary.text = message.actorDisplayName - val user = currentUserProvider.currentUser.blockingGet() - val url: String = if (message.actorType == "guests" || message.actorType == "guest") { - ApiUtils.getUrlForGuestAvatar(user!!.baseUrl!!, message.actorDisplayName, true) - } else { - ApiUtils.getUrlForAvatar( - user!!.baseUrl!!, - message.actorId, - false, - darkMode = DisplayUtils.isDarkModeOn(requireContext()) - ) - } + viewLifecycleOwner.lifecycleScope.launch { + chatActivity.chatViewModel.lastCallSystemMessage.collect { + if (it.shouldShow) { + binding.fragmentCallStarted.callAuthorChip.text = it.actorDisplayName + binding.fragmentCallStarted.callAuthorChipSecondary.text = it.actorDisplayName + val user = currentUserProvider.currentUser.blockingGet() + val url: String = if (it.actorType == "guests" || it.actorType == "guest") { + ApiUtils.getUrlForGuestAvatar(user!!.baseUrl!!, it.actorDisplayName, true) + } else { + ApiUtils.getUrlForAvatar( + user!!.baseUrl!!, + it.actorId, + false, + darkMode = DisplayUtils.isDarkModeOn(requireContext()) + ) + } - val imageRequest: ImageRequest = ImageRequest.Builder(requireContext()) - .data(url) - .crossfade(true) - .transformations(CircleCropTransformation()) - .target(object : Target { - override fun onStart(placeholder: Drawable?) { - // unused atm - } + val imageRequest: ImageRequest = ImageRequest.Builder(requireContext()) + .data(url) + .crossfade(true) + .transformations(CircleCropTransformation()) + .target(object : Target { + override fun onStart(placeholder: Drawable?) { + // unused atm + } - override fun onError(error: Drawable?) { - // unused atm - } + override fun onError(error: Drawable?) { + // unused atm + } - override fun onSuccess(result: Drawable) { - binding.fragmentCallStarted.callAuthorChip.chipIcon = result - binding.fragmentCallStarted.callAuthorChipSecondary.chipIcon = result - } - }) - .build() + override fun onSuccess(result: Drawable) { + binding.fragmentCallStarted.callAuthorChip.chipIcon = result + binding.fragmentCallStarted.callAuthorChipSecondary.chipIcon = result + } + }) + .build() - imageLoader(requireContext()).enqueue(imageRequest) - binding.fragmentCallStarted.root.visibility = View.VISIBLE - } else { - binding.fragmentCallStarted.root.visibility = View.GONE + imageLoader(requireContext()).enqueue(imageRequest) + binding.fragmentCallStarted.root.visibility = View.VISIBLE + } else { + binding.fragmentCallStarted.root.visibility = View.GONE + } } } } diff --git a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt index 0827e467e0..1b256e8110 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt @@ -1011,6 +1011,24 @@ class ChatViewModel @AssistedInject constructor( val expandedParents: Set = emptySet() ) + data class CallStartedIndicatorData( + val actorDisplayName: String, + val actorType: String, + val actorId: String, + val shouldShow: Boolean + ) + + private val _lastCallSystemMessage = MutableStateFlow(null) + + val lastCallSystemMessage = _lastCallSystemMessage.map { msg -> + CallStartedIndicatorData( + msg?.actorDisplayName ?: "", + msg?.actorType ?: "", + msg?.actorId ?: "", + msg != null + ) + } + private data class ProcessedMessages(val items: List, val missingParentIds: List) private fun observeMessages() { @@ -1328,6 +1346,21 @@ class ChatViewModel @AssistedInject constructor( val chatMessageMap = chatMessageList.associateBy { it.jsonMessageId }.toMutableMap() val chatMessageIterator = chatMessageMap.iterator() + chatMessageList.lastOrNull { + it.systemMessageType in + listOf( + ChatMessage.SystemMessageType.CALL_STARTED, + ChatMessage.SystemMessageType.CALL_JOINED, + ChatMessage.SystemMessageType.CALL_LEFT, + ChatMessage.SystemMessageType.CALL_ENDED, + ChatMessage.SystemMessageType.CALL_TRIED, + ChatMessage.SystemMessageType.CALL_ENDED_EVERYONE, + ChatMessage.SystemMessageType.CALL_MISSED + ) + }?.let { callMessage -> + processCallSystemMessage(callMessage) + } + while (chatMessageIterator.hasNext()) { val currentMessage = chatMessageIterator.next() @@ -1338,6 +1371,21 @@ class ChatViewModel @AssistedInject constructor( return chatMessageMap.values.toList() } + private fun processCallSystemMessage(recent: ChatMessage) { + when (recent.systemMessageType) { + ChatMessage.SystemMessageType.CALL_STARTED -> { + _lastCallSystemMessage.tryEmit(recent) + } + ChatMessage.SystemMessageType.CALL_ENDED, + ChatMessage.SystemMessageType.CALL_MISSED, + ChatMessage.SystemMessageType.CALL_TRIED, + ChatMessage.SystemMessageType.CALL_ENDED_EVERYONE -> { + _lastCallSystemMessage.tryEmit(null) + } + else -> {} + } + } + private fun isInfoMessageAboutDeletion(currentMessage: MutableMap.MutableEntry): Boolean = currentMessage.value.parentMessageId != null && currentMessage.value.systemMessageType == ChatMessage diff --git a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/MessageInputViewModel.kt b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/MessageInputViewModel.kt index dfd86f7e69..e6128411de 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/MessageInputViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/MessageInputViewModel.kt @@ -138,10 +138,6 @@ class MessageInputViewModel : val isVoicePreviewPlaying: LiveData get() = _isVoicePreviewPlaying - private val _callStartedFlow: MutableLiveData> = MutableLiveData() - val callStartedFlow: LiveData> - get() = _callStartedFlow - object ScheduleChatMessageStartState : ViewState class ScheduleChatMessageSuccessState(val scheduledAt: Long) : ViewState object ScheduleChatMessageErrorState : ViewState @@ -287,10 +283,6 @@ class MessageInputViewModel : _getRecordingTime.postValue(time) } - fun showCallStartedIndicator(recent: ChatMessage, show: Boolean) { - _callStartedFlow.postValue(Pair(recent, show)) - } - fun startThreadCreation() { _createThreadViewState.postValue(CreateThreadEditState()) }