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"