From b84a05bd4e2bf2d10b7791155cc0a7a0e5aa3dcf Mon Sep 17 00:00:00 2001 From: Taco Date: Sun, 17 Mar 2024 14:58:33 -0400 Subject: [PATCH] Add POST_NOTIFICATIONS permission checks (#6951) Also update AndroidX Core to 1.9.0 because then `checkSelfPermission()` delegates to `areNotificationsEnabled()` if needed --- build.gradle | 2 +- core/build.gradle | 2 +- core/src/main/AndroidManifest.xml | 1 + .../core/service/FeedUpdateWorker.java | 8 +++++- .../download/EpisodeDownloadWorker.java | 13 +++++++-- .../download/NewEpisodesNotification.java | 16 +++++++++-- .../service/playback/PlaybackService.java | 28 +++++++++++++++---- .../antennapod/core/sync/SyncService.java | 8 +++++- 8 files changed, 64 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index dce2b1a10..979460547 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ project.ext { // AndroidX annotationVersion = "1.4.0" appcompatVersion = "1.5.1" - coreVersion = "1.8.0" + coreVersion = "1.9.0" fragmentVersion = "1.5.5" mediaVersion = "1.6.0" media3Version = "1.1.1" diff --git a/core/build.gradle b/core/build.gradle index 6683db189..ed4236e5b 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -10,7 +10,7 @@ android { lint { disable "InvalidPeriodicWorkRequestInterval", "ObsoleteLintCustomCheck", "DefaultLocale", "UnusedAttribute", "ParcelClassLoader", "CheckResult", "TrustAllX509TrustManager", - "StaticFieldLeak", "IconDensities", "IconDuplicates" + "StaticFieldLeak", "IconDensities", "IconDuplicates", "UnsafeOptInUsageError" } defaultConfig { diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index 99fd3de05..fc673ef5f 100644 --- a/core/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + { Log.d(TAG, "Loading notification icon"); notificationBuilder.loadIcon(); if (!Thread.currentThread().isInterrupted()) { - notificationManager.notify(R.id.notification_playing, notificationBuilder.build()); + if (ContextCompat.checkSelfPermission(getApplicationContext(), + Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { + notificationManager.notify(R.id.notification_playing, notificationBuilder.build()); + } updateMediaSessionMetadata(playable); } }); @@ -1779,7 +1794,10 @@ public class PlaybackService extends MediaBrowserServiceCompat { notificationBuilder.updatePosition(getCurrentPosition(), getCurrentPlaybackSpeed()); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - notificationManager.notify(R.id.notification_playing, notificationBuilder.build()); + if (ContextCompat.checkSelfPermission(getApplicationContext(), + Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { + notificationManager.notify(R.id.notification_playing, notificationBuilder.build()); + } } skipEndingIfNecessary(); }); diff --git a/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java b/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java index 86730b58c..3ee7c2b54 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java @@ -1,15 +1,18 @@ package de.danoeh.antennapod.core.sync; +import android.Manifest; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; import androidx.core.util.Pair; import androidx.work.BackoffPolicy; import androidx.work.Constraints; @@ -329,7 +332,10 @@ public class SyncService extends Worker { .build(); NotificationManager nm = (NotificationManager) getApplicationContext() .getSystemService(Context.NOTIFICATION_SERVICE); - nm.notify(R.id.notification_gpodnet_sync_error, notification); + if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.POST_NOTIFICATIONS) + == PackageManager.PERMISSION_GRANTED) { + nm.notify(R.id.notification_gpodnet_sync_error, notification); + } } private static OneTimeWorkRequest.Builder getWorkRequest() {