When opening delivery status bottom sheet select 'first' not empty tab automatically

This commit is contained in:
Sylvain Berfini 2026-01-09 10:30:11 +01:00
parent 3b561275a4
commit 07cae7eb12
2 changed files with 51 additions and 35 deletions

View file

@ -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

View file

@ -51,11 +51,11 @@ class MessageDeliveryModel
val displayedModels = arrayListOf<MessageBottomSheetParticipantModel>()
private val deliveredModels = arrayListOf<MessageBottomSheetParticipantModel>()
val deliveredModels = arrayListOf<MessageBottomSheetParticipantModel>()
private val sentModels = arrayListOf<MessageBottomSheetParticipantModel>()
val sentModels = arrayListOf<MessageBottomSheetParticipantModel>()
private val errorModels = arrayListOf<MessageBottomSheetParticipantModel>()
val errorModels = arrayListOf<MessageBottomSheetParticipantModel>()
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<MessageBottomSheetParticipantModel> {
fun getListForState(state: State): ArrayList<MessageBottomSheetParticipantModel> {
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"
)