diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index 95abdcdee..7b9e53a75 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -96,6 +96,7 @@ import org.linphone.utils.showKeyboard import androidx.core.net.toUri import org.linphone.ui.main.chat.adapter.ConversationParticipantsAdapter import org.linphone.ui.main.chat.model.MessageDeleteDialogModel +import kotlin.collections.arrayListOf @UiThread open class ConversationFragment : SlidingPaneChildFragment() { @@ -1426,49 +1427,59 @@ open class ConversationFragment : SlidingPaneChildFragment() { private fun displayDeliveryStatuses(model: MessageDeliveryModel) { val tabs = binding.messageBottomSheet.tabs tabs.removeAllTabs() - tabs.addTab( - tabs.newTab().setText(model.readLabel.value).setId( - ChatMessage.State.Displayed.toInt() - ) + + val displayedTab = tabs.newTab().setText(model.readLabel.value).setId( + ChatMessage.State.Displayed.toInt() ) - tabs.addTab( - tabs.newTab().setText( - model.receivedLabel.value - ).setId( - ChatMessage.State.DeliveredToUser.toInt() - ) + val deliveredTab = tabs.newTab().setText(model.receivedLabel.value).setId( + ChatMessage.State.DeliveredToUser.toInt() ) - tabs.addTab( - tabs.newTab().setText(model.sentLabel.value).setId( - ChatMessage.State.Delivered.toInt() - ) + val sentTab = tabs.newTab().setText(model.sentLabel.value).setId( + ChatMessage.State.Delivered.toInt() ) - tabs.addTab( - tabs.newTab().setText( - model.errorLabel.value - ).setId( - ChatMessage.State.NotDelivered.toInt() - ) + val errorTab = tabs.newTab().setText(model.errorLabel.value).setId( + ChatMessage.State.NotDelivered.toInt() ) + // Tabs must be added first otherwise select() will do nothing + tabs.addTab(displayedTab) + tabs.addTab(deliveredTab) + tabs.addTab(sentTab) + tabs.addTab(errorTab) + + if (model.displayedModels.isNotEmpty()) { + bottomSheetAdapter.submitList(model.displayedModels) + displayedTab.select() + } else { + if (model.deliveredModels.isNotEmpty()) { + bottomSheetAdapter.submitList(model.deliveredModels) + deliveredTab.select() + } else { + if (model.sentModels.isNotEmpty()) { + bottomSheetAdapter.submitList(model.sentModels) + sentTab.select() + } else { + if (model.errorModels.isNotEmpty()) { + bottomSheetAdapter.submitList(model.errorModels) + errorTab.select() + } else { + // TODO FIXME: remove all tabs and show error message? + } + } + } + } tabs.setOnTabSelectedListener(object : OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { val state = tab?.id ?: ChatMessage.State.Displayed.toInt() bottomSheetAdapter.submitList( - model.computeListForState(ChatMessage.State.fromInt(state)) + model.getListForState(ChatMessage.State.fromInt(state)) ) } - override fun onTabUnselected(tab: TabLayout.Tab?) { - } + override fun onTabUnselected(tab: TabLayout.Tab?) { } - override fun onTabReselected(tab: TabLayout.Tab?) { - } + override fun onTabReselected(tab: TabLayout.Tab?) { } }) - - val initialList = model.displayedModels - bottomSheetAdapter.submitList(initialList) - Log.i("$TAG Submitted [${initialList.size}] items for default delivery status list") } @UiThread diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/MessageDeliveryModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/MessageDeliveryModel.kt index 0721366e9..3d197e366 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/MessageDeliveryModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/MessageDeliveryModel.kt @@ -51,11 +51,11 @@ class MessageDeliveryModel val displayedModels = arrayListOf() - private val deliveredModels = arrayListOf() + val deliveredModels = arrayListOf() - private val sentModels = arrayListOf() + val sentModels = arrayListOf() - private val errorModels = arrayListOf() + val errorModels = arrayListOf() private val chatMessageListener = object : ChatMessageListenerStub() { @WorkerThread @@ -63,7 +63,7 @@ class MessageDeliveryModel message: ChatMessage, state: ParticipantImdnState ) { - Log.i("$TAG Participant IMDN state changed [${state.state}], updating delivery status") + Log.i("$TAG Participant IMDN state changed [${state.state}] for message with ID [${message.messageId}], updating delivery status") computeDeliveryStatus() } } @@ -79,7 +79,7 @@ class MessageDeliveryModel } @UiThread - fun computeListForState(state: State): ArrayList { + fun getListForState(state: State): ArrayList { return when (state) { State.DeliveredToUser -> { deliveredModels @@ -98,6 +98,8 @@ class MessageDeliveryModel @WorkerThread private fun computeDeliveryStatus() { + Log.i("$TAG Message ID [${chatMessage.messageId}] is in state [${chatMessage.state}]") + displayedModels.clear() deliveredModels.clear() sentModels.clear() @@ -175,12 +177,15 @@ class MessageDeliveryModel ) ) + if (displayedModels.isEmpty() && deliveredModels.isEmpty() && sentModels.isEmpty() && errorModels.isEmpty()) { + Log.e("$TAG No participant found in state Displayed, DeliveredToUser, Delivered or Error for message ID [${chatMessage.messageId}]") + } + displayedModels.sortBy { it.timestamp } deliveredModels.sortBy { it.timestamp } sentModels.sortBy { it.timestamp } errorModels.sortBy { it.timestamp } - Log.i("$TAG Message ID [${chatMessage.messageId}] is in state [${chatMessage.state}]") Log.i( "$TAG There are [$readCount] that have read this message, [$receivedCount] that have received it, [$sentCount] that haven't received it yet and [$errorCount] that probably won't receive it due to an error" )