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 d99360c6e..85ae36f2b 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 @@ -19,6 +19,7 @@ */ package org.linphone.ui.main.calls.fragment +import android.app.Dialog import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -81,6 +82,8 @@ class StartCallFragment : GenericFragment() { } } + private var numberOrAddressPickerDialog: Dialog? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -175,6 +178,13 @@ class StartCallFragment : GenericFragment() { } } + override fun onPause() { + super.onPause() + + numberOrAddressPickerDialog?.dismiss() + numberOrAddressPickerDialog = null + } + private fun startCall(model: ContactAvatarModel) { coreContext.postOnCoreThread { core -> val friend = model.friend @@ -200,6 +210,7 @@ class StartCallFragment : GenericFragment() { val model = NumberOrAddressPickerDialogModel(list) val dialog = DialogUtils.getNumberOrAddressPickerDialog(requireActivity(), model) + numberOrAddressPickerDialog = dialog model.dismissEvent.observe(viewLifecycleOwner) { event -> event.consume { 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 5112cbe9a..ca97c6da8 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 @@ -19,6 +19,7 @@ */ package org.linphone.ui.main.contacts.fragment +import android.app.Dialog import android.content.ClipData import android.content.ClipboardManager import android.content.Context @@ -59,6 +60,8 @@ class ContactFragment : GenericFragment() { private val args: ContactFragmentArgs by navArgs() + private var numberOrAddressPickerDialog: Dialog? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -143,6 +146,7 @@ class ContactFragment : GenericFragment() { viewModel.sipAddressesAndPhoneNumbers.value.orEmpty() ) val dialog = DialogUtils.getNumberOrAddressPickerDialog(requireActivity(), model) + numberOrAddressPickerDialog = dialog model.dismissEvent.observe(viewLifecycleOwner) { event -> event.consume { @@ -197,6 +201,13 @@ class ContactFragment : GenericFragment() { } } + override fun onPause() { + super.onPause() + + numberOrAddressPickerDialog?.dismiss() + numberOrAddressPickerDialog = null + } + private fun copyNumberOrAddressToClipboard(value: String, isSip: Boolean) { val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val label = if (isSip) "SIP address" else "Phone number" diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt index 511bc0c87..ee41b66d3 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt @@ -29,6 +29,7 @@ import org.linphone.core.Friend import org.linphone.core.FriendListenerStub import org.linphone.core.tools.Log import org.linphone.utils.LinphoneUtils +import org.linphone.utils.TimestampUtils class ContactAvatarModel @WorkerThread constructor(val friend: Friend) { companion object { @@ -43,6 +44,8 @@ class ContactAvatarModel @WorkerThread constructor(val friend: Friend) { val initials = LinphoneUtils.getInitials(friend.name.orEmpty()) + val lastPresenceInfo = MutableLiveData() + val presenceStatus = MutableLiveData() val name = MutableLiveData() @@ -59,7 +62,7 @@ class ContactAvatarModel @WorkerThread constructor(val friend: Friend) { Log.d( "$TAG Presence received for friend [${fr.name}]: [${fr.consolidatedPresence}]" ) - presenceStatus.postValue(fr.consolidatedPresence) + computePresence() } } @@ -67,8 +70,7 @@ class ContactAvatarModel @WorkerThread constructor(val friend: Friend) { friend.addListener(friendListener) name.postValue(friend.name) - presenceStatus.postValue(friend.consolidatedPresence) - Log.d("$TAG Friend [${friend.name}] presence status is [${friend.consolidatedPresence}]") + computePresence() avatar.postValue(getAvatarUri()) } @@ -102,4 +104,57 @@ class ContactAvatarModel @WorkerThread constructor(val friend: Friend) { return null } + + @WorkerThread + private fun computePresence() { + val presence = friend.consolidatedPresence + Log.d("$TAG Friend [${friend.name}] presence status is [$presence]") + presenceStatus.postValue(presence) + + val presenceString = when (presence) { + ConsolidatedPresence.Online -> { + "Online" + } + ConsolidatedPresence.Busy -> { + val timestamp = friend.presenceModel?.latestActivityTimestamp ?: -1L + if (timestamp != -1L) { + when { + TimestampUtils.isToday(timestamp) -> { + val time = TimestampUtils.timeToString( + timestamp, + timestampInSecs = true + ) + val text = "Online today at" + "$text $time" + } + TimestampUtils.isYesterday(timestamp) -> { + val time = TimestampUtils.timeToString( + timestamp, + timestampInSecs = true + ) + val text = "Online yesterday at" + "$text $time" + } + else -> { + val date = TimestampUtils.toString( + timestamp, + onlyDate = true, + shortDate = false, + hideYear = true + ) + val text = "Online on" + "$text $date" + } + } + } else { + "Away" + } + } + ConsolidatedPresence.DoNotDisturb -> { + "Do not disturb" + } + else -> "" + } + lastPresenceInfo.postValue(presenceString) + } } diff --git a/app/src/main/res/layout/call_fragment.xml b/app/src/main/res/layout/call_fragment.xml index fad5b94e6..5f8e35ff5 100644 --- a/app/src/main/res/layout/call_fragment.xml +++ b/app/src/main/res/layout/call_fragment.xml @@ -134,7 +134,7 @@ android:visibility="@{viewModel.callLogModel.avatarModel.presenceStatus == ConsolidatedPresence.Offline ? View.GONE : View.VISIBLE}" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{viewModel.callLogModel.avatarModel.presenceStatus == ConsolidatedPresence.Online ? `En ligne` : `Absent`, default=`En ligne`}" + android:text="@{viewModel.callLogModel.avatarModel.lastPresenceInfo, default=`En ligne`}" android:textColor="@{viewModel.callLogModel.avatarModel.presenceStatus == ConsolidatedPresence.Online ? @color/green_online : @color/orange_away, default=@color/green_online}" android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/contact_fragment.xml b/app/src/main/res/layout/contact_fragment.xml index 6f78138e4..aaa2df83b 100644 --- a/app/src/main/res/layout/contact_fragment.xml +++ b/app/src/main/res/layout/contact_fragment.xml @@ -149,7 +149,7 @@ android:visibility="@{viewModel.contact.presenceStatus == ConsolidatedPresence.Offline ? View.GONE : View.VISIBLE}" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{viewModel.contact.presenceStatus == ConsolidatedPresence.Online ? `En ligne` : `Absent`, default=`En ligne`}" + android:text="@{viewModel.contact.lastPresenceInfo, default=`En ligne`}" android:textColor="@{viewModel.contact.presenceStatus == ConsolidatedPresence.Online ? @color/green_online : @color/orange_away, default=@color/green_online}" android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent"