From 5e150ee16a690e230129b792ef8a60adbe53b01e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 22 Aug 2023 17:52:15 +0200 Subject: [PATCH] Started missed calls count in bottom nav bar --- .../main/calls/fragment/CallsListFragment.kt | 7 +++++ .../ui/main/fragment/BottomNavBarFragment.kt | 6 ++++ .../main/viewmodel/BottomNavBarViewModel.kt | 28 +++++++++++++++++++ .../ui/main/viewmodel/SharedMainViewModel.kt | 4 +++ .../main/res/layout-land/bottom_nav_bar.xml | 18 ++++++++++-- app/src/main/res/layout/bottom_nav_bar.xml | 21 ++++++++++++-- 6 files changed, 80 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt index 565757c2e..939e16bef 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt @@ -194,6 +194,13 @@ class CallsListFragment : GenericFragment() { } } + override fun onResume() { + super.onResume() + + Log.i("$TAG Fragment is resumed, resetting missed calls count") + sharedViewModel.resetMissedCallsCountEvent.value = Event(true) + } + private fun copyNumberOrAddressToClipboard(value: String) { val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val label = "SIP address" diff --git a/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt index 8aebb1b0e..1d0b30aaf 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt @@ -97,5 +97,11 @@ class BottomNavBarFragment : Fragment() { viewModel.callsSelected.value = it == R.id.callsFragment viewModel.conversationsSelected.value = it == R.id.conversationsFragment } + + sharedViewModel.resetMissedCallsCountEvent.observe(viewLifecycleOwner) { + it.consume { + viewModel.resetMissedCallsCount() + } + } } } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt index 628a83fbd..48b884345 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt @@ -20,6 +20,7 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.UiThread +import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext @@ -27,6 +28,7 @@ import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.Call import org.linphone.core.Core import org.linphone.core.CoreListenerStub +import org.linphone.core.tools.Log class BottomNavBarViewModel @UiThread constructor() : ViewModel() { companion object { @@ -45,25 +47,33 @@ class BottomNavBarViewModel @UiThread constructor() : ViewModel() { val hideMeetings = MutableLiveData() + val missedCallsCount = MutableLiveData() + private val coreListener = object : CoreListenerStub() { + @WorkerThread override fun onCallStateChanged( core: Core, call: Call, state: Call.State?, message: String ) { + if (state == Call.State.End || state == Call.State.Error) { + updateMissedCallsCount() + } } } init { coreContext.postOnCoreThread { core -> core.addListener(coreListener) + updateMissedCallsCount() } hideConversations.value = corePreferences.disableChat || true // TODO hideMeetings.value = true // TODO } + @UiThread override fun onCleared() { super.onCleared() @@ -71,4 +81,22 @@ class BottomNavBarViewModel @UiThread constructor() : ViewModel() { core.removeListener(coreListener) } } + + @WorkerThread + fun updateMissedCallsCount() { + val count = coreContext.core.missedCallsCount + val moreThanOne = count > 1 + Log.i( + "$TAG There ${if (moreThanOne) "are" else "is"} [$count] missed ${if (moreThanOne) "calls" else "call"}" + ) + missedCallsCount.postValue(count) + } + + @UiThread + fun resetMissedCallsCount() { + coreContext.postOnCoreThread { core -> + core.resetMissedCallsCount() + updateMissedCallsCount() + } + } } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt index a4e9d8216..d6bd05c06 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt @@ -84,4 +84,8 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { val forceRefreshCallLogsListEvent: MutableLiveData> by lazy { MutableLiveData>() } + + val resetMissedCallsCountEvent: MutableLiveData> by lazy { + MutableLiveData>() + } } diff --git a/app/src/main/res/layout-land/bottom_nav_bar.xml b/app/src/main/res/layout-land/bottom_nav_bar.xml index 674859e40..4ce3d4989 100644 --- a/app/src/main/res/layout-land/bottom_nav_bar.xml +++ b/app/src/main/res/layout-land/bottom_nav_bar.xml @@ -61,10 +61,24 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/contacts" /> + + + +