diff --git a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt index 0b11c37a4..b52308f41 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt @@ -88,10 +88,6 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { binding.participantsList.setHasFixedSize(true) binding.participantsList.layoutManager = LinearLayoutManager(requireContext()) - if (binding.participantsList.adapter != adapter) { - binding.participantsList.adapter = adapter - } - binding.setBackClickListener { findNavController().popBackStack() } @@ -107,6 +103,12 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { viewModel.conferenceModel.participants.observe(viewLifecycleOwner) { Log.i("$TAG participants list updated with [${it.size}] items") adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.participantsList.adapter != adapter) { + binding.participantsList.adapter = adapter + } } viewModel.conferenceModel.removeParticipantEvent.observe(viewLifecycleOwner) { 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 7b90c50b7..5fb74a251 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 @@ -120,10 +120,6 @@ abstract class AbstractNewTransferCallFragment : GenericCallFragment() { val headerItemDecoration = RecyclerViewHeaderDecoration(requireContext(), adapter) binding.contactsAndSuggestionsList.addItemDecoration(headerItemDecoration) - if (binding.contactsAndSuggestionsList.adapter != adapter) { - binding.contactsAndSuggestionsList.adapter = adapter - } - adapter.onClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> startCall(model) @@ -139,6 +135,12 @@ abstract class AbstractNewTransferCallFragment : GenericCallFragment() { val count = adapter.itemCount adapter.submitList(it) + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + 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/CallsListFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/CallsListFragment.kt index d015e1fe1..2faf2b303 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/CallsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/CallsListFragment.kt @@ -76,10 +76,6 @@ class CallsListFragment : GenericCallFragment() { binding.callsList.setHasFixedSize(true) binding.callsList.layoutManager = LinearLayoutManager(requireContext()) - if (binding.callsList.adapter != adapter) { - binding.callsList.adapter = adapter - } - adapter.callLongClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> val modalBottomSheet = CallMenuDialogFragment(model) { @@ -108,6 +104,12 @@ class CallsListFragment : GenericCallFragment() { viewModel.calls.observe(viewLifecycleOwner) { Log.i("$TAG Calls list updated with [${it.size}] items") adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.callsList.adapter != adapter) { + binding.callsList.adapter = adapter + } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt index e7899f34a..a13ce198d 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt @@ -111,6 +111,8 @@ class ConversationForwardMessageFragment : SlidingPaneChildFragment() { ) adapter.submitList(it) + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained if (binding.contactsList.adapter != adapter) { binding.contactsList.adapter = adapter } 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 01dc7bd63..eb1c3d3c0 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 @@ -400,10 +400,6 @@ open class ConversationFragment : SlidingPaneChildFragment() { layoutManager.stackFromEnd = true binding.eventsList.layoutManager = layoutManager - if (binding.eventsList.adapter != adapter) { - binding.eventsList.adapter = adapter - } - val callbacks = RecyclerViewSwipeUtilsCallback( R.drawable.reply, ConversationEventAdapter.EventViewHolder::class.java @@ -480,6 +476,12 @@ open class ConversationFragment : SlidingPaneChildFragment() { Log.i("$TAG Events (messages) list submitted, contains [${items.size}] items") adapter.submitList(items) + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.eventsList.adapter != adapter) { + binding.eventsList.adapter = adapter + } + (view.parent as? ViewGroup)?.doOnPreDraw { sharedViewModel.openSlidingPaneEvent.value = Event(true) } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt index abddb73f0..1d8c5bf27 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt @@ -120,10 +120,6 @@ class ConversationsListFragment : AbstractMainFragment() { binding.conversationsList.setHasFixedSize(true) binding.conversationsList.layoutManager = LinearLayoutManager(requireContext()) - if (binding.conversationsList.adapter != adapter) { - binding.conversationsList.adapter = adapter - } - adapter.conversationLongClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> val modalBottomSheet = ConversationDialogFragment( @@ -181,6 +177,13 @@ class ConversationsListFragment : AbstractMainFragment() { listViewModel.conversations.observe(viewLifecycleOwner) { adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.conversationsList.adapter != adapter) { + binding.conversationsList.adapter = adapter + } + Log.i("$TAG Conversations list ready with [${it.size}] items") listViewModel.fetchInProgress.value = false } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt index 4977e5b59..06956cb00 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt @@ -133,17 +133,17 @@ class ContactsListFragment : AbstractMainFragment() { configureAdapter(adapter) configureAdapter(favouritesAdapter) - if (binding.contactsList.adapter != adapter) { - binding.contactsList.adapter = adapter - } - if (binding.favouritesContactsList.adapter != favouritesAdapter) { - binding.favouritesContactsList.adapter = favouritesAdapter - } - listViewModel.contactsList.observe( viewLifecycleOwner ) { adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.contactsList.adapter != adapter) { + binding.contactsList.adapter = adapter + } + Log.i("$TAG Contacts list updated with [${it.size}] items") listViewModel.fetchInProgress.value = false } @@ -152,6 +152,13 @@ class ContactsListFragment : AbstractMainFragment() { viewLifecycleOwner ) { favouritesAdapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.favouritesContactsList.adapter != favouritesAdapter) { + binding.favouritesContactsList.adapter = favouritesAdapter + } + Log.i("$TAG Favourites contacts list updated with [${it.size}] items") } diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt index 7c364d3d9..c7f304bed 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryFragment.kt @@ -106,10 +106,6 @@ class HistoryFragment : SlidingPaneChildFragment() { binding.callHistory.setHasFixedSize(true) binding.callHistory.layoutManager = LinearLayoutManager(requireContext()) - if (binding.callHistory.adapter != adapter) { - binding.callHistory.adapter = adapter - } - viewModel.callLogFoundEvent.observe(viewLifecycleOwner) { it.consume { found -> if (found) { @@ -136,6 +132,12 @@ class HistoryFragment : SlidingPaneChildFragment() { viewModel.historyCallLogs.observe(viewLifecycleOwner) { Log.i("$TAG Call history list ready with [${it.size}] items") adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.callHistory.adapter != adapter) { + binding.callHistory.adapter = adapter + } } viewModel.historyDeletedEvent.observe(viewLifecycleOwner) { 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 de9c5f35b..2d9599962 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 @@ -107,10 +107,6 @@ class HistoryListFragment : AbstractMainFragment() { binding.historyList.setHasFixedSize(true) binding.historyList.layoutManager = LinearLayoutManager(requireContext()) - if (binding.historyList.adapter != adapter) { - binding.historyList.adapter = adapter - } - adapter.callLogLongClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> val modalBottomSheet = HistoryMenuDialogFragment( @@ -191,6 +187,13 @@ class HistoryListFragment : AbstractMainFragment() { listViewModel.callLogs.observe(viewLifecycleOwner) { adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.historyList.adapter != adapter) { + binding.historyList.adapter = adapter + } + Log.i("$TAG Call logs ready with [${it.size}] items") listViewModel.fetchInProgress.value = false } 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 d58e4daab..47a9e3f22 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 @@ -119,10 +119,6 @@ class MeetingsListFragment : AbstractMainFragment() { val headerItemDecoration = RecyclerViewHeaderDecoration(requireContext(), adapter) binding.meetingsList.addItemDecoration(headerItemDecoration) - if (binding.meetingsList.adapter != adapter) { - binding.meetingsList.adapter = adapter - } - binding.setNewMeetingClicked { if (findNavController().currentDestination?.id == R.id.meetingsListFragment) { Log.i("$TAG Navigating to schedule meeting fragment") @@ -153,6 +149,13 @@ class MeetingsListFragment : AbstractMainFragment() { val currentCount = adapter.itemCount val newCount = it.size adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.meetingsList.adapter != adapter) { + binding.meetingsList.adapter = adapter + } + Log.i("$TAG Meetings list ready with [$newCount] items") listViewModel.fetchInProgress.value = false } diff --git a/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt b/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt index 701178e6d..26405911d 100644 --- a/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/recordings/fragment/RecordingsListFragment.kt @@ -94,13 +94,16 @@ class RecordingsListFragment : GenericMainFragment() { val headerItemDecoration = RecyclerViewHeaderDecoration(requireContext(), adapter) binding.recordingsList.addItemDecoration(headerItemDecoration) - if (binding.recordingsList.adapter != adapter) { - binding.recordingsList.adapter = adapter - } - listViewModel.recordings.observe(viewLifecycleOwner) { val count = it.size adapter.submitList(it) + + // Wait for adapter to have items before setting it in the RecyclerView, + // otherwise scroll position isn't retained + if (binding.recordingsList.adapter != adapter) { + binding.recordingsList.adapter = adapter + } + Log.i("$TAG Recordings list ready with [$count] items") listViewModel.fetchInProgress.value = false }