From 81884dd218302cc41a03d17fe4f9e330132401e2 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 27 Jan 2022 10:52:03 +0100 Subject: [PATCH] Fixed issues with background mode advanced setting --- .../sidemenu/fragments/SideMenuFragment.kt | 21 +++++++++----- .../compatibility/Api21Compatibility.kt | 5 ++++ .../compatibility/Api26Compatibility.kt | 5 ++++ .../linphone/compatibility/Compatibility.kt | 8 ++++++ .../java/org/linphone/core/CoreContext.kt | 5 ++++ .../java/org/linphone/core/CoreService.kt | 2 ++ .../notifications/NotificationsManager.kt | 28 +++++++++++++------ 7 files changed, 59 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt b/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt index 84183526d..3251193a1 100644 --- a/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt @@ -31,6 +31,7 @@ import androidx.lifecycle.lifecycleScope import java.io.File import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.assistant.AssistantActivity @@ -67,12 +68,11 @@ class SideMenuFragment : GenericFragment() { } sharedViewModel.accountRemoved.observe( - viewLifecycleOwner, - { - Log.i("[Side Menu] Account removed, update accounts list") - viewModel.updateAccountsList() - } - ) + viewLifecycleOwner + ) { + Log.i("[Side Menu] Account removed, update accounts list") + viewModel.updateAccountsList() + } viewModel.accountsSettingsListener = object : SettingListenerStub() { override fun onAccountClicked(identity: String) { @@ -110,8 +110,15 @@ class SideMenuFragment : GenericFragment() { } binding.setQuitClickListener { + Log.i("[Side Menu] Quitting app") requireActivity().finishAndRemoveTask() - coreContext.stop() + + if (!corePreferences.keepServiceAlive) { + Log.i("[Side Menu] Stopping Core") + coreContext.stop() + } else { + Log.w("[Side Menu] Keep Service alive setting enabled, don't destroy the Core") + } } onBackPressedCallback.isEnabled = false diff --git a/app/src/main/java/org/linphone/compatibility/Api21Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api21Compatibility.kt index 3bff031ee..db1a1b764 100644 --- a/app/src/main/java/org/linphone/compatibility/Api21Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api21Compatibility.kt @@ -26,6 +26,7 @@ import android.app.PendingIntent import android.bluetooth.BluetoothAdapter import android.content.ContentValues import android.content.Context +import android.content.Intent import android.graphics.Bitmap import android.net.Uri import android.os.Build @@ -240,5 +241,9 @@ class Api21Compatibility { fun getImeFlagsForSecureChatRoom(): Int { return EditorInfo.IME_FLAG_NO_EXTRACT_UI } + + fun startForegroundService(context: Context, intent: Intent) { + context.startService(intent) + } } } diff --git a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt index 4716219fd..59d1c0e04 100644 --- a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt @@ -24,6 +24,7 @@ import android.annotation.SuppressLint import android.annotation.TargetApi import android.app.* import android.content.Context +import android.content.Intent import android.content.pm.PackageManager import android.media.AudioAttributes import android.os.VibrationEffect @@ -278,5 +279,9 @@ class Api26Compatibility { fun getImeFlagsForSecureChatRoom(): Int { return EditorInfo.IME_FLAG_NO_EXTRACT_UI or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING } + + fun startForegroundService(context: Context, intent: Intent) { + context.startForegroundService(intent) + } } } diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index 4a6a2e3e4..adf273435 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -201,6 +201,14 @@ class Compatibility { return Api26Compatibility.createCallNotification(context, call, notifiable, pendingIntent, channel, notificationsManager) } + fun startForegroundService(context: Context, intent: Intent) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + Api26Compatibility.startForegroundService(context, intent) + } else { + Api21Compatibility.startForegroundService(context, intent) + } + } + /* Call */ fun canDrawOverlay(context: Context): Boolean { diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 7462ad19b..d098d076d 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -321,6 +321,11 @@ class CoreContext(val context: Context, coreConfig: Config) { FileUtils.clearExistingPlainFiles() } + if (corePreferences.keepServiceAlive) { + Log.i("[Context] Background mode setting is enabled, starting Service") + notificationsManager.startForeground() + } + Log.i("[Context] Started") } diff --git a/app/src/main/java/org/linphone/core/CoreService.kt b/app/src/main/java/org/linphone/core/CoreService.kt index 1eeac37da..56411a98c 100644 --- a/app/src/main/java/org/linphone/core/CoreService.kt +++ b/app/src/main/java/org/linphone/core/CoreService.kt @@ -67,6 +67,8 @@ class CoreService : CoreService() { } else { Log.w("[Service] Task removed but Core in not in background, skipping") } + } else { + Log.i("[Service] Task removed but we were asked to keep the service alive, so doing nothing") } super.onTaskRemoved(rootIntent) diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 91e74432b..5d462323d 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -248,16 +248,18 @@ class NotificationsManager(private val context: Context) { // causing the notification to be missed by the user... Log.i("[Notifications Manager] Getting destroyed, clearing foreground Service & call notifications") - if (currentForegroundServiceNotificationId > 0) { - notificationManager.cancel(currentForegroundServiceNotificationId) - currentForegroundServiceNotificationId = 0 + if (currentForegroundServiceNotificationId > 0 && !corePreferences.keepServiceAlive) { + Log.i("[Notifications Manager] Clearing foreground Service") + stopForegroundNotification() } - for (notifiable in callNotificationsMap.values) { - notificationManager.cancel(notifiable.notificationId) + if (callNotificationsMap.size > 0) { + Log.i("[Notifications Manager] Clearing call notifications") + for (notifiable in callNotificationsMap.values) { + notificationManager.cancel(notifiable.notificationId) + } } - stopForegroundNotification() coreContext.core.removeListener(listener) } @@ -286,7 +288,13 @@ class NotificationsManager(private val context: Context) { Log.w("[Notifications Manager] Can't start service as foreground without a service, starting it now") val intent = Intent() intent.setClass(coreContext.context, CoreService::class.java) - coreContext.context.startService(intent) + try { + Compatibility.startForegroundService(coreContext.context, intent) + } catch (ise: IllegalStateException) { + Log.e("[Notifications Manager] Failed to start Service: $ise") + } catch (se: SecurityException) { + Log.e("[Notifications Manager] Failed to start Service: $se") + } } } @@ -294,7 +302,11 @@ class NotificationsManager(private val context: Context) { service = coreService when { currentForegroundServiceNotificationId != 0 -> { - Log.e("[Notifications Manager] There is already a foreground service notification [$currentForegroundServiceNotificationId]") + if (currentForegroundServiceNotificationId != SERVICE_NOTIF_ID) { + Log.e("[Notifications Manager] There is already a foreground service notification [$currentForegroundServiceNotificationId]") + } else { + Log.i("[Notifications Manager] There is already a foreground service notification, no need to use the call notification to keep Service alive") + } } coreContext.core.callsNb > 0 -> { // When this method will be called, we won't have any notification yet