From f0a0261e4b92569daaee947c2f42a5140df75f44 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Wed, 22 Nov 2023 19:18:17 +0530 Subject: [PATCH] refactor: Use batch notification API --- .../libretube/workers/NotificationWorker.kt | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt b/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt index 3376273c3..d6e053250 100644 --- a/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt +++ b/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt @@ -1,15 +1,18 @@ package com.github.libretube.workers +import android.Manifest import android.app.Notification -import android.app.NotificationManager import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.graphics.Bitmap import android.util.Log import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.app.NotificationManagerCompat.NotificationWithIdAndTag import androidx.core.app.PendingIntentCompat -import androidx.core.content.getSystemService +import androidx.core.content.ContextCompat import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.github.libretube.LibreTubeApp.Companion.PUSH_CHANNEL_NAME @@ -35,7 +38,7 @@ import kotlinx.coroutines.withContext */ class NotificationWorker(appContext: Context, parameters: WorkerParameters) : CoroutineWorker(appContext, parameters) { - private val notificationManager = appContext.getSystemService()!! + private val notificationManager = NotificationManagerCompat.from(appContext) override suspend fun doWork(): Result { if (!checkTime()) return Result.success() @@ -126,6 +129,15 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) : * For more information, see https://developer.android.com/develop/ui/views/notifications/group */ private suspend fun createNotificationsForChannel(group: String, streams: List) { + // Avoid creating notifications if permission is not granted. + if (ContextCompat.checkSelfPermission( + applicationContext, + Manifest.permission.POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED + ) { + return + } + val summaryId = group.hashCode() val intent = Intent(applicationContext, MainActivity::class.java) .setFlags(INTENT_FLAGS) @@ -154,21 +166,18 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) : .build() // Create stream notifications. These are automatically grouped on Android 7.0 and later. - val notificationsAndIds = withContext(Dispatchers.IO) { + val notifications = withContext(Dispatchers.IO) { streams.map { async { createStreamNotification(group, it) } } .awaitAll() - .sortedBy { (_, uploaded, _) -> uploaded } - .map { (notificationId, _, notification) -> notificationId to notification } - } + (summaryId to summaryNotification) - notificationsAndIds.forEach { (notificationId, notification) -> - notificationManager.notify(notificationId, notification) } + notificationManager.notify(notifications) + notificationManager.notify(summaryId, summaryNotification) } private suspend fun createStreamNotification( group: String, stream: StreamItem - ): Triple { // Notification ID, uploaded date and notification object + ): NotificationWithIdAndTag { val videoId = stream.url!!.toID() val intent = Intent(applicationContext, MainActivity::class.java) .setFlags(INTENT_FLAGS) @@ -195,7 +204,7 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) : .setWhen(stream.uploaded) .setShowWhen(true) - return Triple(notificationId, stream.uploaded, notificationBuilder.build()) + return NotificationWithIdAndTag(notificationId, notificationBuilder.build()) } private suspend fun downloadImage(url: String?): Bitmap? {