diff --git a/app/src/main/java/org/linphone/ui/main/calls/adapter/CallHistoryListAdapter.kt b/app/src/main/java/org/linphone/ui/main/calls/adapter/CallHistoryListAdapter.kt new file mode 100644 index 000000000..83fa20deb --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/calls/adapter/CallHistoryListAdapter.kt @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.main.calls.adapter + +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 +import org.linphone.R +import org.linphone.databinding.CallHistoryListCellBinding +import org.linphone.ui.main.calls.model.CallLogHistoryModel + +class CallHistoryListAdapter( + private val viewLifecycleOwner: LifecycleOwner +) : ListAdapter(CallHistoryDiffCallback()) { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val binding: CallHistoryListCellBinding = DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.call_history_list_cell, + parent, + false + ) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + (holder as CallHistoryListAdapter.ViewHolder).bind(getItem(position)) + } + + inner class ViewHolder( + val binding: CallHistoryListCellBinding + ) : RecyclerView.ViewHolder(binding.root) { + @UiThread + fun bind(callLogHistoryModel: CallLogHistoryModel) { + with(binding) { + model = callLogHistoryModel + + lifecycleOwner = viewLifecycleOwner + + executePendingBindings() + } + } + } + + private class CallHistoryDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: CallLogHistoryModel, newItem: CallLogHistoryModel): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: CallLogHistoryModel, newItem: CallLogHistoryModel): Boolean { + return false + } + } +} diff --git a/app/src/main/java/org/linphone/ui/main/calls/adapter/CallsListAdapter.kt b/app/src/main/java/org/linphone/ui/main/calls/adapter/CallsListAdapter.kt index cfe39c384..609d26fc6 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/adapter/CallsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/adapter/CallsListAdapter.kt @@ -86,14 +86,14 @@ class CallsListAdapter( } } } -} -private class CallLogDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: CallLogModel, newItem: CallLogModel): Boolean { - return oldItem.id == newItem.id - } + private class CallLogDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: CallLogModel, newItem: CallLogModel): Boolean { + return oldItem.id == newItem.id + } - override fun areContentsTheSame(oldItem: CallLogModel, newItem: CallLogModel): Boolean { - return oldItem.avatarModel.id == newItem.avatarModel.id + override fun areContentsTheSame(oldItem: CallLogModel, newItem: CallLogModel): Boolean { + return oldItem.avatarModel.id == newItem.avatarModel.id + } } } 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 e3c01a0d1..c1c1686f2 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 @@ -53,14 +53,14 @@ class SuggestionsListAdapter( } } } -} -private class SuggestionDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { - return oldItem.friend == newItem.friend - } + private class SuggestionDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { + return oldItem.friend == newItem.friend + } - override fun areContentsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { - return false + override fun areContentsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { + return false + } } } diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt index 835a00a2d..7973c3f3c 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt @@ -34,11 +34,13 @@ import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs +import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallFragmentBinding import org.linphone.databinding.CallPopupMenuBinding import org.linphone.ui.main.MainActivity +import org.linphone.ui.main.calls.adapter.CallHistoryListAdapter import org.linphone.ui.main.calls.viewmodel.CallLogViewModel import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.Event @@ -50,8 +52,8 @@ class CallFragment : GenericFragment() { } private lateinit var binding: CallFragmentBinding - private lateinit var viewModel: CallLogViewModel + private lateinit var adapter: CallHistoryListAdapter private val args: CallFragmentArgs by navArgs() @@ -84,6 +86,13 @@ class CallFragment : GenericFragment() { Log.i("$TAG Looking up for call log with call id [$callId]") viewModel.findCallLogByCallId(callId) + adapter = CallHistoryListAdapter(viewLifecycleOwner) + binding.callHistory.setHasFixedSize(true) + binding.callHistory.adapter = adapter + + val layoutManager = LinearLayoutManager(requireContext()) + binding.callHistory.layoutManager = layoutManager + binding.setBackClickListener { goBack() } @@ -96,13 +105,12 @@ class CallFragment : GenericFragment() { viewModel.showBackButton.value = slideable } - viewModel.callLogFoundEvent.observe(viewLifecycleOwner) { - it.consume { - Log.i("$TAG Call log has been found, start postponed enter transition") + viewModel.historyCallLogs.observe(viewLifecycleOwner) { + Log.i("$TAG Call history list ready with [${it.size}] items") + adapter.submitList(it) - (view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - } + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() sharedViewModel.openSlidingPaneEvent.value = Event(true) } } diff --git a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt index fc1b3faef..aa5f35ee2 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt @@ -10,6 +10,8 @@ import org.linphone.utils.LinphoneUtils import org.linphone.utils.TimestampUtils class CallLogHistoryModel @WorkerThread constructor(val callLog: CallLog) { + val id = callLog.callId ?: callLog.refKey + val isOutgoing = MutableLiveData() val isSuccessful = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt index 1770ed330..63eb45596 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt @@ -14,7 +14,7 @@ import org.linphone.utils.TimestampUtils class CallLogModel @WorkerThread constructor(private val callLog: CallLog) { val id = callLog.callId ?: callLog.refKey - val address = if (callLog.dir == Dir.Outgoing) callLog.remoteAddress else callLog.fromAddress + val address = if (callLog.dir == Dir.Outgoing) callLog.toAddress else callLog.fromAddress val displayedAddress = address.asStringUriOnly() diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt index 57c25d632..3774b3bc3 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt @@ -17,8 +17,6 @@ class CallLogViewModel @UiThread constructor() : ViewModel() { val historyCallLogs = MutableLiveData>() - val callLogFoundEvent = MutableLiveData>() - val historyDeletedEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -31,6 +29,7 @@ class CallLogViewModel @UiThread constructor() : ViewModel() { val callLog = core.findCallLogFromCallId(callId) if (callLog != null) { val model = CallLogModel(callLog) + address = model.address callLogModel.postValue(model) val localAddress = if (callLog.dir == Call.Dir.Outgoing) callLog.fromAddress else callLog.toAddress @@ -41,9 +40,6 @@ class CallLogViewModel @UiThread constructor() : ViewModel() { history.add(historyModel) } historyCallLogs.postValue(history) - - address = model.address - callLogFoundEvent.postValue(Event(true)) } } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/adapter/ContactsListAdapter.kt b/app/src/main/java/org/linphone/ui/main/contacts/adapter/ContactsListAdapter.kt index bc447cf38..c49975e48 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/adapter/ContactsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/adapter/ContactsListAdapter.kt @@ -120,15 +120,15 @@ class ContactsListAdapter( } } } -} -private class ContactDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { - return oldItem.id == newItem.id - } + private class ContactDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { + return oldItem.id == newItem.id + } - override fun areContentsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { - return oldItem.firstContactStartingByThatLetter.value == newItem.firstContactStartingByThatLetter.value && - oldItem.presenceStatus.value == newItem.presenceStatus.value + override fun areContentsTheSame(oldItem: ContactAvatarModel, newItem: ContactAvatarModel): Boolean { + return oldItem.firstContactStartingByThatLetter.value == newItem.firstContactStartingByThatLetter.value && + oldItem.presenceStatus.value == newItem.presenceStatus.value + } } } 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 e90775a24..5112cbe9a 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 @@ -112,8 +112,8 @@ class ContactFragment : GenericFragment() { Log.i("$TAG Contact has been found, start postponed enter transition") (view.parent as? ViewGroup)?.doOnPreDraw { startPostponedEnterTransition() + sharedViewModel.openSlidingPaneEvent.value = Event(true) } - sharedViewModel.openSlidingPaneEvent.value = Event(true) } } diff --git a/app/src/main/res/layout-land/calls_list_fragment.xml b/app/src/main/res/layout-land/calls_list_fragment.xml index f531e64f7..58e414484 100644 --- a/app/src/main/res/layout-land/calls_list_fragment.xml +++ b/app/src/main/res/layout-land/calls_list_fragment.xml @@ -48,7 +48,7 @@ android:onClick="@{menuClickListener}" android:id="@+id/menu" android:layout_width="24dp" - android:layout_height="24dp" + android:layout_height="0dp" android:layout_marginEnd="9dp" android:src="@drawable/dots_three_vertical" app:tint="@color/white" diff --git a/app/src/main/res/layout/account_list_cell.xml b/app/src/main/res/layout/account_list_cell.xml index eb52c3797..33a45c3ae 100644 --- a/app/src/main/res/layout/account_list_cell.xml +++ b/app/src/main/res/layout/account_list_cell.xml @@ -109,7 +109,7 @@ android:onClick="@{() -> model.openMenu(menu)}" android:id="@+id/menu" android:layout_width="24dp" - android:layout_height="24dp" + android:layout_height="0dp" android:layout_marginEnd="16dp" android:src="@drawable/dots_three_vertical" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/call_fragment.xml b/app/src/main/res/layout/call_fragment.xml index 4c8bbfc30..4d68ec3e5 100644 --- a/app/src/main/res/layout/call_fragment.xml +++ b/app/src/main/res/layout/call_fragment.xml @@ -25,11 +25,10 @@ - + app:layout_constraintBottom_toBottomOf="parent" /> - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + diff --git a/app/src/main/res/layout/call_history_list_cell.xml b/app/src/main/res/layout/call_history_list_cell.xml index b4b4fe113..61bdeb7de 100644 --- a/app/src/main/res/layout/call_history_list_cell.xml +++ b/app/src/main/res/layout/call_history_list_cell.xml @@ -14,7 +14,6 @@ @@ -22,7 +21,7 @@ android:id="@+id/call_status" android:layout_width="16dp" android:layout_height="16dp" - android:layout_marginTop="20dp" + android:layout_marginTop="11dp" android:layout_marginStart="2dp" android:src="@{model.iconResId, default=@drawable/outgoing_call}" app:layout_constraintStart_toStartOf="parent" @@ -74,6 +73,7 @@ android:layout_width="0dp" android:layout_height="1dp" android:layout_marginEnd="10dp" + android:layout_marginBottom="11dp" android:background="@color/blue_outgoing_message" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/calls_list_fragment.xml b/app/src/main/res/layout/calls_list_fragment.xml index 7039c6cc9..98788b9f4 100644 --- a/app/src/main/res/layout/calls_list_fragment.xml +++ b/app/src/main/res/layout/calls_list_fragment.xml @@ -48,7 +48,7 @@ android:onClick="@{menuClickListener}" android:id="@+id/menu" android:layout_width="24dp" - android:layout_height="24dp" + android:layout_height="0dp" android:layout_marginEnd="9dp" android:src="@drawable/dots_three_vertical" app:tint="@color/white"