From 926413992b96b02e7da4b6ad49d81b3da0b51955 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 10 Jul 2023 12:31:30 +0200 Subject: [PATCH] Fixed crash when device boots on Android 14 --- app/src/main/AndroidManifest.xml | 2 +- .../java/org/linphone/LinphoneApplication.kt | 7 ++-- .../compatibility/Api31Compatibility.kt | 4 +++ .../java/org/linphone/core/CoreService.kt | 33 +++++++++++-------- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9b1f7e6fc..6a3574000 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -175,7 +175,7 @@ diff --git a/app/src/main/java/org/linphone/LinphoneApplication.kt b/app/src/main/java/org/linphone/LinphoneApplication.kt index 87e435932..2a08ce958 100644 --- a/app/src/main/java/org/linphone/LinphoneApplication.kt +++ b/app/src/main/java/org/linphone/LinphoneApplication.kt @@ -80,7 +80,8 @@ class LinphoneApplication : Application(), ImageLoaderFactory { context: Context, pushReceived: Boolean = false, service: CoreService? = null, - useAutoStartDescription: Boolean = false + useAutoStartDescription: Boolean = false, + skipCoreStart: Boolean = false ): Boolean { if (::coreContext.isInitialized && !coreContext.stopped) { Log.d("[Application] Skipping Core creation (push received? $pushReceived)") @@ -96,7 +97,9 @@ class LinphoneApplication : Application(), ImageLoaderFactory { service, useAutoStartDescription ) - coreContext.start() + if (!skipCoreStart) { + coreContext.start() + } return true } diff --git a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt index 457e3c60e..1afb8cfbf 100644 --- a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt @@ -264,6 +264,8 @@ class Api31Compatibility { Log.e("[Api31 Compatibility] Can't start service as foreground! $fssnae") } catch (se: SecurityException) { Log.e("[Api31 Compatibility] Can't start service as foreground! $se") + } catch (e: Exception) { + Log.e("[Api31 Compatibility] Can't start service as foreground! $e") } } @@ -274,6 +276,8 @@ class Api31Compatibility { Log.e("[Api31 Compatibility] Can't start service as foreground! $fssnae") } catch (se: SecurityException) { Log.e("[Api31 Compatibility] Can't start service as foreground! $se") + } catch (e: Exception) { + Log.e("[Api31 Compatibility] Can't start service as foreground! $e") } } diff --git a/app/src/main/java/org/linphone/core/CoreService.kt b/app/src/main/java/org/linphone/core/CoreService.kt index a6d798ade..5cc609cfd 100644 --- a/app/src/main/java/org/linphone/core/CoreService.kt +++ b/app/src/main/java/org/linphone/core/CoreService.kt @@ -38,24 +38,29 @@ class CoreService : CoreService() { if (corePreferences.keepServiceAlive) { Log.i("[Service] Starting as foreground to keep app alive in background") - if (!ensureCoreExists( - applicationContext, - pushReceived = false, - service = this, - useAutoStartDescription = false - ) - ) { + val contextCreated = ensureCoreExists( + applicationContext, + pushReceived = false, + service = this, + useAutoStartDescription = false + ) + if (!contextCreated) { + // Only start foreground notification if context already exists, otherwise context will do it itself coreContext.notificationsManager.startForeground(this, false) } } else if (intent?.extras?.get("StartForeground") == true) { Log.i("[Service] Starting as foreground due to device boot or app update") - if (!ensureCoreExists( - applicationContext, - pushReceived = false, - service = this, - useAutoStartDescription = true - ) - ) { + val contextCreated = ensureCoreExists( + applicationContext, + pushReceived = false, + service = this, + useAutoStartDescription = true, + skipCoreStart = true + ) + if (contextCreated) { + coreContext.start() + } else { + // Only start foreground notification if context already exists, otherwise context will do it itself coreContext.notificationsManager.startForeground(this, true) } coreContext.checkIfForegroundServiceNotificationCanBeRemovedAfterDelay(5000)