Fixed crash when rotating device while message's reactions bottom sheet is visible

This commit is contained in:
Sylvain Berfini 2023-09-07 11:31:45 +02:00
parent 0deb4d5c11
commit 928a4f129b
2 changed files with 41 additions and 28 deletions

View file

@ -28,16 +28,17 @@ import com.google.android.material.tabs.TabLayout
import org.linphone.R import org.linphone.R
import org.linphone.activities.main.chat.data.ChatMessageReactionsListData import org.linphone.activities.main.chat.data.ChatMessageReactionsListData
import org.linphone.core.ChatMessage import org.linphone.core.ChatMessage
import org.linphone.core.tools.Log
import org.linphone.databinding.ChatMessageReactionsListDialogBinding import org.linphone.databinding.ChatMessageReactionsListDialogBinding
import org.linphone.utils.AppUtils import org.linphone.utils.AppUtils
class ChatMessageReactionsListDialogFragment( class ChatMessageReactionsListDialogFragment() : BottomSheetDialogFragment() {
private val chatMessage: ChatMessage
) : BottomSheetDialogFragment() {
companion object { companion object {
const val TAG = "ChatMessageReactionsListDialogFragment" const val TAG = "ChatMessageReactionsListDialogFragment"
} }
private lateinit var binding: ChatMessageReactionsListDialogBinding
private lateinit var data: ChatMessageReactionsListData private lateinit var data: ChatMessageReactionsListData
override fun onCreateView( override fun onCreateView(
@ -45,38 +46,43 @@ class ChatMessageReactionsListDialogFragment(
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
val binding = ChatMessageReactionsListDialogBinding.inflate(layoutInflater) binding = ChatMessageReactionsListDialogBinding.inflate(layoutInflater)
binding.lifecycleOwner = viewLifecycleOwner binding.lifecycleOwner = viewLifecycleOwner
if (::data.isInitialized) {
binding.data = data
data = ChatMessageReactionsListData(chatMessage) data.reactions.observe(viewLifecycleOwner) {
binding.data = data binding.tabs.removeAllTabs()
data.reactions.observe(viewLifecycleOwner) {
binding.tabs.removeAllTabs()
binding.tabs.addTab(
binding.tabs.newTab().setText(
AppUtils.getStringWithPlural(
R.plurals.chat_message_reactions_count,
it.orEmpty().size
)
).setId(0)
)
var index = 1
data.reactionsMap.forEach { (key, value) ->
binding.tabs.addTab( binding.tabs.addTab(
binding.tabs.newTab().setText("$key $value").setId(index).setTag(key) binding.tabs.newTab().setText(
AppUtils.getStringWithPlural(
R.plurals.chat_message_reactions_count,
it.orEmpty().size
)
).setId(0)
) )
index += 1
var index = 1
data.reactionsMap.forEach { (key, value) ->
binding.tabs.addTab(
binding.tabs.newTab().setText("$key $value").setId(index).setTag(key)
)
index += 1
}
} }
} else {
Log.w("$TAG View created but no message has been set, dismissing...")
dismiss()
} }
binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) { override fun onTabSelected(tab: TabLayout.Tab) {
if (tab.id == 0) { if (::data.isInitialized) {
data.updateFilteredReactions("") if (tab.id == 0) {
} else { data.updateFilteredReactions("")
data.updateFilteredReactions(tab.tag.toString()) } else {
data.updateFilteredReactions(tab.tag.toString())
}
} }
} }
@ -90,8 +96,14 @@ class ChatMessageReactionsListDialogFragment(
return binding.root return binding.root
} }
fun setMessage(chatMessage: ChatMessage) {
data = ChatMessageReactionsListData(chatMessage)
}
override fun onDestroy() { override fun onDestroy() {
data.onDestroy() if (::data.isInitialized) {
data.onDestroy()
}
super.onDestroy() super.onDestroy()
} }
} }

View file

@ -636,7 +636,8 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
viewLifecycleOwner viewLifecycleOwner
) { ) {
it.consume { message -> it.consume { message ->
val modalBottomSheet = ChatMessageReactionsListDialogFragment(message) val modalBottomSheet = ChatMessageReactionsListDialogFragment()
modalBottomSheet.setMessage(message)
modalBottomSheet.show( modalBottomSheet.show(
parentFragmentManager, parentFragmentManager,
ChatMessageReactionsListDialogFragment.TAG ChatMessageReactionsListDialogFragment.TAG