From 3d5ca3313bc75ae433bcebd79cca523932ad6195 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 28 Aug 2023 17:56:09 +0200 Subject: [PATCH] Do not use CoreService as it will attempt to use the Core on the main thread, TODO : disable activity monitor in SDK --- .../java/org/linphone/core/CoreContext.kt | 2 +- .../linphone/core/CoreForegroundService.kt | 23 ++++++++----------- .../notifications/NotificationsManager.kt | 13 ++++++++++- .../telecom/TelecomCallControlCallback.kt | 6 +++-- .../ui/voip/viewmodel/CallsViewModel.kt | 3 +++ .../ui/voip/viewmodel/CurrentCallViewModel.kt | 1 + 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 47e5f4f66..c41319892 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -76,7 +76,7 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C state: Call.State?, message: String ) { - Log.i("$TAG Call state changed [$state]") + Log.i("$TAG Call [${call.remoteAddress.asStringUriOnly()}] state changed [$state]") when (state) { Call.State.OutgoingProgress, Call.State.Connected -> { postOnMainThread { diff --git a/app/src/main/java/org/linphone/core/CoreForegroundService.kt b/app/src/main/java/org/linphone/core/CoreForegroundService.kt index ffea9f3e4..805c1b56b 100644 --- a/app/src/main/java/org/linphone/core/CoreForegroundService.kt +++ b/app/src/main/java/org/linphone/core/CoreForegroundService.kt @@ -19,12 +19,15 @@ */ package org.linphone.core +import android.app.Service import android.content.Intent +import android.os.IBinder +import androidx.annotation.MainThread import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.tools.Log -import org.linphone.core.tools.service.CoreService -class CoreForegroundService : CoreService() { +@MainThread +class CoreForegroundService : Service() { companion object { private const val TAG = "[Core Foreground Service]" } @@ -42,18 +45,6 @@ class CoreForegroundService : CoreService() { return super.onStartCommand(intent, flags, startId) } - override fun createServiceNotificationChannel() { - // Done elsewhere - } - - override fun showForegroundServiceNotification() { - // Done elsewhere - } - - override fun hideForegroundServiceNotification() { - // Done elsewhere - } - override fun onTaskRemoved(rootIntent: Intent?) { Log.i("$TAG Task removed, doing nothing") @@ -66,4 +57,8 @@ class CoreForegroundService : CoreService() { super.onDestroy() } + + override fun onBind(p0: Intent?): IBinder? { + return null + } } diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index e5fec45db..173e0515e 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -117,12 +117,22 @@ class NotificationsManager @MainThread constructor(private val context: Context) } } + @MainThread fun onServiceStarted(service: CoreForegroundService) { Log.i("$TAG Service has been started") coreService = service - startCallForeground() + + coreContext.postOnCoreThread { core -> + if (core.callsNb == 0) { + Log.w("$TAG No call anymore, stopping service") + stopCallForeground() + } else { + startCallForeground() + } + } } + @MainThread fun onServiceDestroyed() { Log.i("$TAG Service has been destroyed") coreService = null @@ -355,6 +365,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) return builder.build() } + @WorkerThread private fun dismissCallNotification(call: Call) { val address = call.remoteAddress.asStringUriOnly() val notifiable: Notifiable? = callNotificationsMap[address] diff --git a/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt b/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt index 2e6c6db45..3e3061964 100644 --- a/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt +++ b/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt @@ -49,7 +49,7 @@ class TelecomCallControlCallback constructor( private val callListener = object : CallListenerStub() { override fun onStateChanged(call: Call, state: Call.State?, message: String) { - Log.i("$TAG Call state changed [$state]") + Log.i("$TAG Call [${call.remoteAddress.asStringUriOnly()}] state changed [$state]") if (state == Call.State.Connected) { if (call.dir == Call.Dir.Incoming) { scope.launch { @@ -137,7 +137,9 @@ class TelecomCallControlCallback constructor( callControl.isMuted.onEach { muted -> Log.i("$TAG We're asked to ${if (muted) "mute" else "unmute"} the call") - call.microphoneMuted = muted + coreContext.postOnCoreThread { + call.microphoneMuted = muted + } }.launchIn(scope) } diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt index 62b09d52e..931d96479 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt @@ -75,6 +75,9 @@ class CallsViewModel @UiThread constructor() : ViewModel() { message: String ) { if (call == core.currentCall || core.currentCall == null) { + Log.i( + "$TAG Current call [${call.remoteAddress.asStringUriOnly()}] state changed [$state]" + ) when (call.state) { Call.State.Connected -> { goToActiveCallEvent.postValue(Event(true)) diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt index 2fe5c285a..10aabc465 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt @@ -119,6 +119,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { if (CurrentCallViewModel@call != call) { return } + Log.i("$TAG Call [${call.remoteAddress.asStringUriOnly()}] state changed [$state]") if (LinphoneUtils.isCallOutgoing(call.state)) { isVideoEnabled.postValue(call.params.isVideoEnabled)