From 12e22dd7a9fa9a858e12a892f9ce4f9299f99e69 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 24 Mar 2025 11:33:00 +0100 Subject: [PATCH] This should prevent crashes on Androids < 13 due to broken POST_NOTIFICATIONS permission check --- .../org/linphone/compatibility/Api33Compatibility.kt | 8 ++++++++ .../java/org/linphone/compatibility/Compatibility.kt | 7 +++++++ .../org/linphone/core/CoreFileTransferService.kt | 12 ++++-------- .../linphone/notifications/NotificationsManager.kt | 8 +++----- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt index 020698073..57f228df2 100644 --- a/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt @@ -20,6 +20,8 @@ package org.linphone.compatibility import android.Manifest +import android.content.Context +import android.content.pm.PackageManager import android.os.Build import androidx.annotation.RequiresApi @@ -34,5 +36,11 @@ class Api33Compatibility { Manifest.permission.CAMERA ) } + + fun isPostNotificationsPermissionGranted(context: Context): Boolean { + return context.checkSelfPermission( + Manifest.permission.POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED + } } } diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index c4cc48734..9d828fb55 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -111,6 +111,13 @@ class Compatibility { return false } + fun isPostNotificationsPermissionGranted(context: Context): Boolean { + if (Version.sdkAboveOrEqual(Version.API33_ANDROID_13_TIRAMISU)) { + return Api33Compatibility.isPostNotificationsPermissionGranted(context) + } + return true + } + fun enterPipMode(activity: Activity): Boolean { if (Version.sdkStrictlyBelow(Version.API31_ANDROID_12)) { return Api28Compatibility.enterPipMode(activity) diff --git a/app/src/main/java/org/linphone/core/CoreFileTransferService.kt b/app/src/main/java/org/linphone/core/CoreFileTransferService.kt index 1d57cf0ae..be58b3d09 100644 --- a/app/src/main/java/org/linphone/core/CoreFileTransferService.kt +++ b/app/src/main/java/org/linphone/core/CoreFileTransferService.kt @@ -19,19 +19,18 @@ */ package org.linphone.core -import android.Manifest +import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Intent -import android.content.pm.PackageManager import android.os.IBinder import androidx.annotation.AnyThread import androidx.annotation.MainThread import androidx.annotation.WorkerThread -import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.core.tools.service.FileTransferService import org.linphone.ui.main.MainActivity @@ -171,14 +170,11 @@ class CoreFileTransferService : FileTransferService() { postNotification() } + @SuppressLint("MissingPermission") @AnyThread private fun postNotification() { val notificationsManager = NotificationManagerCompat.from(this) - if (ActivityCompat.checkSelfPermission( - this, - Manifest.permission.POST_NOTIFICATIONS - ) == PackageManager.PERMISSION_GRANTED - ) { + if (Compatibility.isPostNotificationsPermissionGranted(this)) { if (mServiceNotification != null) { Log.i("$TAG Sending notification to manager") notificationsManager.notify(SERVICE_NOTIF_ID, mServiceNotification) diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index b90ebf8fe..149d21cca 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -20,6 +20,7 @@ package org.linphone.notifications import android.Manifest +import android.annotation.SuppressLint import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager @@ -1022,13 +1023,10 @@ class NotificationsManager notify(notifiable.notificationId, notification, CHAT_TAG) } + @SuppressLint("MissingPermission") @WorkerThread private fun notify(id: Int, notification: Notification, tag: String? = null) { - if (ActivityCompat.checkSelfPermission( - context, - Manifest.permission.POST_NOTIFICATIONS - ) == PackageManager.PERMISSION_GRANTED - ) { + if (Compatibility.isPostNotificationsPermissionGranted(context)) { Log.i( "$TAG Notifying using ID [$id] and ${if (tag == null) "without tag" else "with tag [$tag]"}" )