diff --git a/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt b/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt index 4f8223e7b..027590552 100644 --- a/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt @@ -23,7 +23,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil -import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -31,7 +30,7 @@ import org.linphone.R import org.linphone.databinding.CallConferenceParticipantListCellBinding import org.linphone.ui.call.model.ConferenceParticipantModel -class ConferenceParticipantsListAdapter(private val viewLifecycleOwner: LifecycleOwner) : +class ConferenceParticipantsListAdapter : ListAdapter(ParticipantDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { @@ -41,7 +40,6 @@ class ConferenceParticipantsListAdapter(private val viewLifecycleOwner: Lifecycl parent, false ) - binding.lifecycleOwner = viewLifecycleOwner return ViewHolder(binding) } diff --git a/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt index 6d63374ee..3f3f5940c 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/AbstractNewTransferCallFragment.kt @@ -83,6 +83,12 @@ abstract class AbstractNewTransferCallFragment : GenericCallFragment() { abstract val title: String + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = ContactsAndSuggestionsListAdapter() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -94,7 +100,6 @@ abstract class AbstractNewTransferCallFragment : GenericCallFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - postponeEnterTransition() binding.lifecycleOwner = viewLifecycleOwner @@ -109,9 +114,7 @@ abstract class AbstractNewTransferCallFragment : GenericCallFragment() { viewModel.hideNumpad() } - adapter = ContactsAndSuggestionsListAdapter(viewLifecycleOwner) binding.contactsAndSuggestionsList.setHasFixedSize(true) - binding.contactsAndSuggestionsList.adapter = adapter val headerItemDecoration = RecyclerViewHeaderDecoration(requireContext(), adapter, true) binding.contactsAndSuggestionsList.addItemDecoration(headerItemDecoration) @@ -131,6 +134,10 @@ abstract class AbstractNewTransferCallFragment : GenericCallFragment() { val count = adapter.itemCount adapter.submitList(it) + if (binding.contactsAndSuggestionsList.adapter != adapter) { + binding.contactsAndSuggestionsList.adapter = adapter + } + if (count == 0) { (view.parent as? ViewGroup)?.doOnPreDraw { startPostponedEnterTransition() diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceParticipantsListFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ConferenceParticipantsListFragment.kt index 4c5f461cb..9ca719ff2 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceParticipantsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ConferenceParticipantsListFragment.kt @@ -42,6 +42,12 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { private lateinit var adapter: ConferenceParticipantsListAdapter + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = ConferenceParticipantsListAdapter() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -61,9 +67,7 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel - adapter = ConferenceParticipantsListAdapter(viewLifecycleOwner) binding.participantsList.setHasFixedSize(true) - binding.participantsList.adapter = adapter binding.participantsList.layoutManager = LinearLayoutManager(requireContext()) binding.setBackClickListener { @@ -73,6 +77,10 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { viewModel.conferenceModel.participants.observe(viewLifecycleOwner) { Log.i("$TAG participants list updated with [${it.size}] items") adapter.submitList(it) + + if (binding.participantsList.adapter != adapter) { + binding.participantsList.adapter = adapter + } } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageBottomSheetAdapter.kt b/app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageBottomSheetAdapter.kt index 2db37c29e..99e60f74b 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageBottomSheetAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageBottomSheetAdapter.kt @@ -4,7 +4,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil -import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -12,9 +11,7 @@ import org.linphone.R import org.linphone.databinding.ChatMessageBottomSheetListCellBinding import org.linphone.ui.main.chat.model.ChatMessageBottomSheetParticipantModel -class ChatMessageBottomSheetAdapter( - private val viewLifecycleOwner: LifecycleOwner -) : ListAdapter( +class ChatMessageBottomSheetAdapter : ListAdapter( ParticipantDiffCallback() ) { @@ -25,7 +22,6 @@ class ChatMessageBottomSheetAdapter( parent, false ) - binding.lifecycleOwner = viewLifecycleOwner return ViewHolder(binding) } diff --git a/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationParticipantsAdapter.kt b/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationParticipantsAdapter.kt index db5bcf2af..9cc983cf8 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationParticipantsAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationParticipantsAdapter.kt @@ -4,7 +4,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil -import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -12,9 +11,9 @@ import org.linphone.R import org.linphone.databinding.ChatParticipantListCellBinding import org.linphone.ui.main.chat.model.ParticipantModel -class ConversationParticipantsAdapter( - private val viewLifecycleOwner: LifecycleOwner -) : ListAdapter(ChatRoomParticipantDiffCallback()) { +class ConversationParticipantsAdapter : ListAdapter( + ChatRoomParticipantDiffCallback() +) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val binding: ChatParticipantListCellBinding = DataBindingUtil.inflate( @@ -23,7 +22,6 @@ class ConversationParticipantsAdapter( parent, false ) - binding.lifecycleOwner = viewLifecycleOwner return ViewHolder(binding) } 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 4184121d7..1011e2f66 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 @@ -158,6 +158,7 @@ class ConversationFragment : GenericFragment() { super.onCreate(savedInstanceState) adapter = ConversationEventAdapter() + bottomSheetAdapter = ChatMessageBottomSheetAdapter() } override fun onCreateView( @@ -238,10 +239,7 @@ class ConversationFragment : GenericFragment() { } } - bottomSheetAdapter = ChatMessageBottomSheetAdapter(viewLifecycleOwner) binding.messageBottomSheet.bottomSheetList.setHasFixedSize(true) - binding.messageBottomSheet.bottomSheetList.adapter = bottomSheetAdapter - val bottomSheetLayoutManager = LinearLayoutManager(requireContext()) binding.messageBottomSheet.bottomSheetList.layoutManager = bottomSheetLayoutManager @@ -555,6 +553,9 @@ class ConversationFragment : GenericFragment() { binding.messageBottomSheet.setHandleClickedListener { deliveryBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED } + if (binding.messageBottomSheet.bottomSheetList.adapter != bottomSheetAdapter) { + binding.messageBottomSheet.bottomSheetList.adapter = bottomSheetAdapter + } lifecycleScope.launch { withContext(Dispatchers.IO) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt index c0600e122..c40fd5c86 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt @@ -57,6 +57,16 @@ class ConversationInfoFragment : GenericFragment() { private val args: ConversationInfoFragmentArgs by navArgs() + override fun goBack(): Boolean { + return findNavController().popBackStack() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = ConversationParticipantsAdapter() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -66,16 +76,12 @@ class ConversationInfoFragment : GenericFragment() { return binding.root } - override fun goBack(): Boolean { - return findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { // This fragment is displayed in a SlidingPane "child" area isSlidingPaneChild = true - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner @@ -90,10 +96,8 @@ class ConversationInfoFragment : GenericFragment() { val chatRoom = sharedViewModel.displayedChatRoom viewModel.findChatRoom(chatRoom, localSipUri, remoteSipUri) - adapter = ConversationParticipantsAdapter(viewLifecycleOwner) binding.participants.setHasFixedSize(true) binding.participants.layoutManager = LinearLayoutManager(requireContext()) - binding.participants.adapter = adapter viewModel.chatRoomFoundEvent.observe(viewLifecycleOwner) { it.consume { found -> @@ -115,6 +119,10 @@ class ConversationInfoFragment : GenericFragment() { viewModel.participants.observe(viewLifecycleOwner) { items -> adapter.submitList(items) Log.i("$TAG Participants list updated with [${items.size}] items") + + if (binding.participants.adapter != adapter) { + binding.participants.adapter = adapter + } } viewModel.groupLeftEvent.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt index 23f64dea7..7c53c7901 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt @@ -59,8 +59,8 @@ class StartConversationFragment : GenericAddressPickerFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { viewModel = ViewModelProvider(this)[StartConversationViewModel::class.java] - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner @@ -76,13 +76,12 @@ class StartConversationFragment : GenericAddressPickerFragment() { viewLifecycleOwner ) { Log.i("$TAG Contacts & suggestions list is ready with [${it.size}] items") - val count = adapter.itemCount adapter.submitList(it) - if (count == 0) { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + attachAdapter() + + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index 3008cc1ab..d4f72f8cf 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -82,8 +82,8 @@ class ContactFragment : GenericFragment() { // This fragment is displayed in a SlidingPane "child" area isSlidingPaneChild = true - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt index dc3e64007..38a0d9dc4 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt @@ -100,8 +100,8 @@ class EditContactFragment : GenericFragment() { // This fragment is displayed in a SlidingPane "child" area isSlidingPaneChild = true - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) requireActivity().onBackPressedDispatcher.addCallback( viewLifecycleOwner, diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt index 4a97b4aec..528467707 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt @@ -67,8 +67,8 @@ class AddParticipantsFragment : GenericAddressPickerFragment() { viewModel = ViewModelProvider(this)[AddParticipantsViewModel::class.java] - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner @@ -84,13 +84,12 @@ class AddParticipantsFragment : GenericAddressPickerFragment() { viewLifecycleOwner ) { Log.i("$TAG Contacts & suggestions list is ready with [${it.size}] items") - val count = adapter.itemCount adapter.submitList(it) - if (count == 0) { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + attachAdapter() + + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() } } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt index dd98dd443..64328796a 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/GenericAddressPickerFragment.kt @@ -54,6 +54,8 @@ abstract class GenericAddressPickerFragment : GenericFragment() { protected abstract val viewModel: AddressSelectionViewModel + private lateinit var recyclerView: RecyclerView + private val listener = object : ContactNumberOrAddressClickListener { @UiThread override fun onClicked(model: ContactNumberOrAddressModel) { @@ -79,11 +81,15 @@ abstract class GenericAddressPickerFragment : GenericFragment() { @WorkerThread abstract fun onSingleAddressSelected(address: Address, friend: Friend) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = ContactsAndSuggestionsListAdapter() + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - adapter = ContactsAndSuggestionsListAdapter(viewLifecycleOwner) - adapter.contactClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> handleClickOnContactModel(model) @@ -104,14 +110,22 @@ abstract class GenericAddressPickerFragment : GenericFragment() { } @UiThread - protected fun setupRecyclerView(recyclerView: RecyclerView) { + protected fun setupRecyclerView(view: RecyclerView) { + recyclerView = view recyclerView.setHasFixedSize(true) - recyclerView.adapter = adapter + recyclerView.layoutManager = LinearLayoutManager(requireContext()) val headerItemDecoration = RecyclerViewHeaderDecoration(requireContext(), adapter, true) recyclerView.addItemDecoration(headerItemDecoration) + } - recyclerView.layoutManager = LinearLayoutManager(requireContext()) + @UiThread + protected fun attachAdapter() { + if (::recyclerView.isInitialized) { + if (recyclerView.adapter != adapter) { + recyclerView.adapter = adapter + } + } } @WorkerThread @@ -127,7 +141,7 @@ abstract class GenericAddressPickerFragment : GenericFragment() { } } - protected fun handleClickOnContactModel(model: ContactOrSuggestionModel) { + private fun handleClickOnContactModel(model: ContactOrSuggestionModel) { coreContext.postOnCoreThread { core -> val friend = model.friend if (friend == null) { diff --git a/app/src/main/java/org/linphone/ui/main/history/adapter/ContactHistoryListAdapter.kt b/app/src/main/java/org/linphone/ui/main/history/adapter/ContactHistoryListAdapter.kt index ff81d78df..25877c9b2 100644 --- a/app/src/main/java/org/linphone/ui/main/history/adapter/ContactHistoryListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/history/adapter/ContactHistoryListAdapter.kt @@ -23,7 +23,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil -import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -31,9 +30,9 @@ import org.linphone.R import org.linphone.databinding.HistoryContactListCellBinding import org.linphone.ui.main.history.model.CallLogHistoryModel -class ContactHistoryListAdapter( - private val viewLifecycleOwner: LifecycleOwner -) : ListAdapter(CallHistoryDiffCallback()) { +class ContactHistoryListAdapter : ListAdapter( + CallHistoryDiffCallback() +) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val binding: HistoryContactListCellBinding = DataBindingUtil.inflate( LayoutInflater.from(parent.context), @@ -41,7 +40,7 @@ class ContactHistoryListAdapter( parent, false ) - binding.lifecycleOwner = viewLifecycleOwner + // binding.lifecycleOwner = viewLifecycleOwner return ViewHolder(binding) } diff --git a/app/src/main/java/org/linphone/ui/main/history/adapter/ContactsAndSuggestionsListAdapter.kt b/app/src/main/java/org/linphone/ui/main/history/adapter/ContactsAndSuggestionsListAdapter.kt index f3930ea15..500211219 100644 --- a/app/src/main/java/org/linphone/ui/main/history/adapter/ContactsAndSuggestionsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/history/adapter/ContactsAndSuggestionsListAdapter.kt @@ -6,7 +6,6 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil -import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter @@ -20,11 +19,10 @@ import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.HeaderAdapter -class ContactsAndSuggestionsListAdapter( - private val viewLifecycleOwner: LifecycleOwner -) : ListAdapter( - ContactOrSuggestionDiffCallback() -), +class ContactsAndSuggestionsListAdapter : + ListAdapter( + ContactOrSuggestionDiffCallback() + ), HeaderAdapter { companion object { private const val CONTACT_TYPE = 0 @@ -75,7 +73,6 @@ class ContactsAndSuggestionsListAdapter( parent, false ) - binding.lifecycleOwner = viewLifecycleOwner ContactViewHolder(binding) } else -> { @@ -86,7 +83,6 @@ class ContactsAndSuggestionsListAdapter( false ) binding.apply { - lifecycleOwner = viewLifecycleOwner setOnClickListener { contactClickedEvent.value = Event(model!!) } diff --git a/app/src/main/java/org/linphone/ui/main/history/adapter/HistoryListAdapter.kt b/app/src/main/java/org/linphone/ui/main/history/adapter/HistoryListAdapter.kt index be00b895d..64b971d6b 100644 --- a/app/src/main/java/org/linphone/ui/main/history/adapter/HistoryListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/history/adapter/HistoryListAdapter.kt @@ -4,7 +4,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil -import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter @@ -14,9 +13,7 @@ import org.linphone.databinding.HistoryListCellBinding import org.linphone.ui.main.history.model.CallLogModel import org.linphone.utils.Event -class HistoryListAdapter( - private val viewLifecycleOwner: LifecycleOwner -) : ListAdapter(CallLogDiffCallback()) { +class HistoryListAdapter : ListAdapter(CallLogDiffCallback()) { var selectedAdapterPosition = -1 val callLogClickedEvent: MutableLiveData> by lazy { @@ -40,8 +37,6 @@ class HistoryListAdapter( ) val viewHolder = ViewHolder(binding) binding.apply { - lifecycleOwner = viewLifecycleOwner - setOnClickListener { callLogClickedEvent.value = Event(model!!) } diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt index ee5588c7f..6db0335b4 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt @@ -54,32 +54,41 @@ class HistoryContactFragment : GenericFragment() { } private lateinit var binding: HistoryContactFragmentBinding + private lateinit var viewModel: ContactHistoryViewModel + private lateinit var adapter: ContactHistoryListAdapter private val args: HistoryContactFragmentArgs by navArgs() - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - binding = HistoryContactFragmentBinding.inflate(layoutInflater) - return binding.root - } - override fun goBack(): Boolean { sharedViewModel.closeSlidingPaneEvent.value = Event(true) // If not done, when going back to CallsFragment this fragment will be created again return findNavController().popBackStack() } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = ContactHistoryListAdapter() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = HistoryContactFragmentBinding.inflate(layoutInflater) + + return binding.root + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { // This fragment is displayed in a SlidingPane "child" area isSlidingPaneChild = true - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner @@ -90,17 +99,26 @@ class HistoryContactFragment : GenericFragment() { Log.i("$TAG Looking up for call log with call id [$callId]") viewModel.findCallLogByCallId(callId) - adapter = ContactHistoryListAdapter(viewLifecycleOwner) binding.callHistory.setHasFixedSize(true) - binding.callHistory.adapter = adapter binding.callHistory.layoutManager = LinearLayoutManager(requireContext()) - binding.setBackClickListener { - goBack() - } - - binding.setMenuClickListener { - showPopupMenu() + viewModel.callLogFoundEvent.observe(viewLifecycleOwner) { + it.consume { found -> + if (found) { + Log.i( + "$TAG Found matching call log for call ID [$callId]" + ) + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() + sharedViewModel.openSlidingPaneEvent.value = Event(true) + } + } else { + (view.parent as? ViewGroup)?.doOnPreDraw { + Log.e("$TAG Failed to find call log, going back") + goBack() + } + } + } } sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable -> @@ -111,9 +129,8 @@ class HistoryContactFragment : GenericFragment() { Log.i("$TAG Call history list ready with [${it.size}] items") adapter.submitList(it) - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - sharedViewModel.openSlidingPaneEvent.value = Event(true) + if (binding.callHistory.adapter != adapter) { + binding.callHistory.adapter = adapter } } @@ -136,6 +153,14 @@ class HistoryContactFragment : GenericFragment() { sharedViewModel.navigateToConversationsEvent.value = Event(true) } } + + binding.setBackClickListener { + goBack() + } + + binding.setMenuClickListener { + showPopupMenu() + } } private fun copyNumberOrAddressToClipboard(value: String) { diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt index 0f4609407..e2f68031d 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt @@ -78,6 +78,12 @@ class HistoryListFragment : AbstractTopBarFragment() { return super.onCreateAnimation(transit, enter, nextAnim) } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = HistoryListAdapter() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -96,9 +102,7 @@ class HistoryListFragment : AbstractTopBarFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = listViewModel - adapter = HistoryListAdapter(viewLifecycleOwner) binding.historyList.setHasFixedSize(true) - binding.historyList.adapter = adapter binding.historyList.layoutManager = LinearLayoutManager(requireContext()) adapter.callLogLongClickedEvent.observe(viewLifecycleOwner) { @@ -173,6 +177,10 @@ class HistoryListFragment : AbstractTopBarFragment() { adapter.submitList(it) Log.i("$TAG Call logs ready with [${it.size}] items") + if (binding.historyList.adapter != adapter) { + binding.historyList.adapter = adapter + } + if (currentCount < it.size) { binding.historyList.scrollToPosition(0) } diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt index a896322f9..d9ad3d4d9 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt @@ -64,8 +64,8 @@ class StartCallFragment : GenericAddressPickerFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { viewModel = ViewModelProvider(this)[StartCallViewModel::class.java] - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner @@ -86,13 +86,12 @@ class StartCallFragment : GenericAddressPickerFragment() { viewLifecycleOwner ) { Log.i("$TAG Contacts & suggestions list is ready with [${it.size}] items") - val count = adapter.itemCount adapter.submitList(it) - if (count == 0) { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + attachAdapter() + + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() } } diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt index 704f3803f..3d505c1c9 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/ContactHistoryViewModel.kt @@ -37,6 +37,8 @@ class ContactHistoryViewModel @UiThread constructor() : ViewModel() { val operationInProgress = MutableLiveData() + val callLogFoundEvent = MutableLiveData>() + val chatRoomCreationErrorEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -117,6 +119,9 @@ class ContactHistoryViewModel @UiThread constructor() : ViewModel() { history.add(historyModel) } historyCallLogs.postValue(history) + callLogFoundEvent.postValue(Event(true)) + } else { + callLogFoundEvent.postValue(Event(false)) } } } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/adapter/MeetingsListAdapter.kt b/app/src/main/java/org/linphone/ui/main/meetings/adapter/MeetingsListAdapter.kt index 3bc712d99..0a3b05536 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/adapter/MeetingsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/adapter/MeetingsListAdapter.kt @@ -6,7 +6,6 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread import androidx.databinding.DataBindingUtil -import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter @@ -18,9 +17,11 @@ import org.linphone.ui.main.meetings.model.MeetingModel import org.linphone.utils.Event import org.linphone.utils.HeaderAdapter -class MeetingsListAdapter( - private val viewLifecycleOwner: LifecycleOwner -) : ListAdapter(MeetingDiffCallback()), HeaderAdapter { +class MeetingsListAdapter : + ListAdapter( + MeetingDiffCallback() + ), + HeaderAdapter { val meetingClickedEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -52,8 +53,6 @@ class MeetingsListAdapter( false ) binding.apply { - lifecycleOwner = viewLifecycleOwner - setOnClickListener { meetingClickedEvent.value = Event(model!!) } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt index 83512dedb..a1479a1eb 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt @@ -74,8 +74,8 @@ class MeetingFragment : GenericFragment() { // This fragment is displayed in a SlidingPane "child" area isSlidingPaneChild = true - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt index 402cd0608..c9a98b531 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt @@ -76,8 +76,8 @@ class MeetingWaitingRoomFragment : GenericFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt index f14bad2ca..93659cefc 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt @@ -70,6 +70,12 @@ class MeetingsListFragment : AbstractTopBarFragment() { return super.onCreateAnimation(transit, enter, nextAnim) } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = MeetingsListAdapter() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -88,10 +94,7 @@ class MeetingsListFragment : AbstractTopBarFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = listViewModel - adapter = MeetingsListAdapter(viewLifecycleOwner) binding.meetingsList.setHasFixedSize(true) - binding.meetingsList.adapter = adapter - val headerItemDecoration = RecyclerViewHeaderDecoration(requireContext(), adapter, true) binding.meetingsList.addItemDecoration(headerItemDecoration) binding.meetingsList.layoutManager = LinearLayoutManager(requireContext()) @@ -119,13 +122,19 @@ class MeetingsListFragment : AbstractTopBarFragment() { listViewModel.meetings.observe(viewLifecycleOwner) { val currentCount = adapter.itemCount + val newCount = it.size adapter.submitList(it) - Log.i("$TAG Meetings list ready with [${it.size}] items") + Log.i("$TAG Meetings list ready with [$newCount] items") - if (currentCount < it.size) { - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - sharedViewModel.isFirstFragmentReady = true + if (binding.meetingsList.adapter != adapter) { + binding.meetingsList.adapter = adapter + } + + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() + sharedViewModel.isFirstFragmentReady = true + + if (currentCount < newCount) { scrollToToday() } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index 2829c9769..b92214c95 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -80,8 +80,8 @@ class AccountProfileFragment : GenericFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt index 2dfd2afad..93abe4509 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt @@ -61,8 +61,8 @@ class AccountSettingsFragment : GenericFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index 7df39ab51..24873ee39 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -70,8 +70,8 @@ class SettingsFragment : GenericFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 040536266..62c0a4750 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -345,8 +345,6 @@ fun ShapeableImageView.loadCallAvatarWithCoil(model: AbstractAvatarModel?) { @UiThread @BindingAdapter("coilInitials") fun ShapeableImageView.loadInitialsAvatarWithCoil(initials: String?) { - Log.i("[Data Binding Utils] Displaying initials [$initials] on ImageView") - val imageView = this (context as AppCompatActivity).lifecycleScope.launch { withContext(Dispatchers.IO) { val builder = AvatarGenerator(context) diff --git a/app/src/main/res/layout/chat_info_fragment.xml b/app/src/main/res/layout/chat_info_fragment.xml index 642aeed81..d7790676e 100644 --- a/app/src/main/res/layout/chat_info_fragment.xml +++ b/app/src/main/res/layout/chat_info_fragment.xml @@ -333,23 +333,16 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" + android:layout_marginBottom="@dimen/screen_bottom_margin" android:background="@drawable/action_background" android:text="@string/conversation_info_delete_history_action" android:drawableStart="@drawable/trash_simple" app:layout_constraintVertical_bias="0" app:layout_constraintTop_toBottomOf="@id/action_leave_group" - app:layout_constraintBottom_toTopOf="@id/anchor" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@id/actions_background" app:layout_constraintEnd_toEndOf="@id/actions_background"/> - - diff --git a/app/src/main/res/layout/history_contact_fragment.xml b/app/src/main/res/layout/history_contact_fragment.xml index 622bf44a5..5096a36b3 100644 --- a/app/src/main/res/layout/history_contact_fragment.xml +++ b/app/src/main/res/layout/history_contact_fragment.xml @@ -66,194 +66,202 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/title" /> - + app:layout_constraintBottom_toBottomOf="parent"> - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + +