From 3c9406891087cd3e43974eff894cfcd6707b1c0c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 29 Aug 2023 16:11:32 +0200 Subject: [PATCH] Layout of start call as intended but perfomances not great... --- .../calls/adapter/SuggestionsListAdapter.kt | 4 +- .../main/calls/fragment/StartCallFragment.kt | 36 ++++- .../viewmodel/SuggestionsListViewModel.kt | 17 +-- .../main/res/layout/call_start_fragment.xml | 139 ++++++++---------- app/src/main/res/layout/contact_list_cell.xml | 1 + 5 files changed, 102 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/calls/adapter/SuggestionsListAdapter.kt b/app/src/main/java/org/linphone/ui/main/calls/adapter/SuggestionsListAdapter.kt index c1c1686f2..553c41b5c 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/adapter/SuggestionsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/adapter/SuggestionsListAdapter.kt @@ -56,11 +56,11 @@ class SuggestionsListAdapter( private class SuggestionDiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { - return oldItem.friend == newItem.friend + return oldItem.id == newItem.id } override fun areContentsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { - return false + return true } } } diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt index 015d3a65d..127f6c159 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt @@ -30,6 +30,7 @@ import androidx.navigation.navGraphViewModels import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.core.tools.Log import org.linphone.databinding.CallStartFragmentBinding import org.linphone.ui.main.calls.adapter.SuggestionsListAdapter import org.linphone.ui.main.calls.viewmodel.StartCallViewModel @@ -46,6 +47,10 @@ import org.linphone.utils.DialogUtils @UiThread class StartCallFragment : GenericFragment() { + companion object { + private const val TAG = "[Start Call Fragment]" + } + private lateinit var binding: CallStartFragmentBinding private val viewModel: StartCallViewModel by navGraphViewModels( @@ -63,6 +68,9 @@ class StartCallFragment : GenericFragment() { private lateinit var contactsAdapter: ContactsListAdapter private lateinit var suggestionsAdapter: SuggestionsListAdapter + private var contactsListReady = false + private var suggestionsListReady = false + private val listener = object : ContactNumberOrAddressClickListener { @UiThread override fun onClicked(model: ContactNumberOrAddressModel) { @@ -131,17 +139,37 @@ class StartCallFragment : GenericFragment() { contactsListViewModel.contactsList.observe( viewLifecycleOwner ) { - contactsAdapter.submitList(it) + Log.i("$TAG Contacts list is ready with [${it.size}] items") + contactsAdapter.submitList(it) { + // Otherwise list won't show until keyboard is opened for example... + binding.contactsList.requestLayout() + } viewModel.emptyContactsList.value = it.isEmpty() - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() + if (suggestionsListReady && !contactsListReady) { + Log.i("$TAG Suggestions list is also ready, start postponed enter transition") + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() + } } + contactsListReady = true } suggestionsListViewModel.suggestionsList.observe(viewLifecycleOwner) { - suggestionsAdapter.submitList(it) + Log.i("$TAG Suggestions list is ready with [${it.size}] items") + suggestionsAdapter.submitList(it) { + // Otherwise list won't show until keyboard is opened for example... + binding.suggestionsList.requestLayout() + } viewModel.emptySuggestionsList.value = it.isEmpty() + + if (contactsListReady && !suggestionsListReady) { + Log.i("$TAG Contacts list is also ready, start postponed enter transition") + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() + } + } + suggestionsListReady = true } viewModel.searchFilter.observe(viewLifecycleOwner) { filter -> diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt index 187aeaac8..ccecc02f1 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt @@ -34,6 +34,7 @@ import org.linphone.core.SearchResult import org.linphone.core.tools.Log import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.ui.main.model.isInSecureMode +import org.linphone.utils.LinphoneUtils class SuggestionsListViewModel @UiThread constructor() : ViewModel() { companion object { @@ -101,10 +102,9 @@ class SuggestionsListViewModel @UiThread constructor() : ViewModel() { for (result in results) { val address = result.address - Log.i("$TAG ${address?.asStringUriOnly()}") + if (address != null) { val friend = coreContext.core.findFriend(address) - Log.i("$TAG ${friend?.name}") // We don't want Friends here as they would also be in contacts list if (friend == null) { // If user-input generated result (always last) already exists, don't show it again @@ -175,23 +175,14 @@ class SuggestionsListViewModel @UiThread constructor() : ViewModel() { @WorkerThread private fun createFriendFromSearchResult(searchResult: SearchResult): Friend { - val searchResultFriend = searchResult.friend - if (searchResultFriend != null) return searchResultFriend - val friend = coreContext.core.createFriend() val address = searchResult.address if (address != null) { friend.address = address - } - val number = searchResult.phoneNumber - if (number != null) { - friend.addPhoneNumber(number) - - if (address != null && address.username == number) { - friend.removeAddress(address) - } + friend.name = LinphoneUtils.getDisplayName(address) + friend.refKey = address.asStringUriOnly().hashCode().toString() } return friend diff --git a/app/src/main/res/layout/call_start_fragment.xml b/app/src/main/res/layout/call_start_fragment.xml index 899de3da1..938686b93 100644 --- a/app/src/main/res/layout/call_start_fragment.xml +++ b/app/src/main/res/layout/call_start_fragment.xml @@ -20,21 +20,21 @@ + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/title" /> + app:layout_constraintEnd_toEndOf="@id/search_bar" + app:layout_constraintTop_toTopOf="@id/search_bar" + app:tint="@color/gray_9" /> @@ -102,134 +102,121 @@ android:layout_height="0dp" android:layout_marginStart="22dp" android:background="@drawable/shape_gradient" - app:layout_constraintTop_toTopOf="@id/group_call_icon" app:layout_constraintBottom_toBottomOf="@id/group_call_icon" + app:layout_constraintEnd_toEndOf="@id/group_call_label" app:layout_constraintStart_toStartOf="@id/group_call_icon" - app:layout_constraintEnd_toEndOf="@id/group_call_label" /> + app:layout_constraintTop_toTopOf="@id/group_call_icon" /> + app:layout_constraintTop_toBottomOf="@id/search_bar" + app:tint="@color/white" /> + app:layout_constraintStart_toEndOf="@id/group_call_icon" + app:layout_constraintTop_toTopOf="@id/group_call_icon" /> + app:layout_constraintTop_toBottomOf="@id/group_call_icon" + app:layout_constraintVertical_chainStyle="packed" /> + app:layout_constraintBottom_toTopOf="@id/suggestions_label" /> + app:layout_constraintBottom_toTopOf="@id/suggestions_list" /> + app:layout_constraintBottom_toBottomOf="parent" /> diff --git a/app/src/main/res/layout/contact_list_cell.xml b/app/src/main/res/layout/contact_list_cell.xml index bd092f34a..a3f82a79c 100644 --- a/app/src/main/res/layout/contact_list_cell.xml +++ b/app/src/main/res/layout/contact_list_cell.xml @@ -23,6 +23,7 @@ android:onLongClick="@{onLongClickListener}" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="@color/white" android:layout_marginStart="4dp" android:layout_marginEnd="16dp">