mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-29 00:10:32 +05:30
Merge pull request #5212 from Isira-Seneviratne/Notification_batch
refactor: Use batch notification API
This commit is contained in:
commit
e715833e1e
@ -1,15 +1,18 @@
|
|||||||
package com.github.libretube.workers
|
package com.github.libretube.workers
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
import android.app.NotificationManager
|
|
||||||
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.core.app.NotificationManagerCompat
|
||||||
|
import androidx.core.app.NotificationManagerCompat.NotificationWithIdAndTag
|
||||||
import androidx.core.app.PendingIntentCompat
|
import androidx.core.app.PendingIntentCompat
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.work.CoroutineWorker
|
import androidx.work.CoroutineWorker
|
||||||
import androidx.work.WorkerParameters
|
import androidx.work.WorkerParameters
|
||||||
import com.github.libretube.LibreTubeApp.Companion.PUSH_CHANNEL_NAME
|
import com.github.libretube.LibreTubeApp.Companion.PUSH_CHANNEL_NAME
|
||||||
@ -35,7 +38,7 @@ import kotlinx.coroutines.withContext
|
|||||||
*/
|
*/
|
||||||
class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
|
class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
|
||||||
CoroutineWorker(appContext, parameters) {
|
CoroutineWorker(appContext, parameters) {
|
||||||
private val notificationManager = appContext.getSystemService<NotificationManager>()!!
|
private val notificationManager = NotificationManagerCompat.from(appContext)
|
||||||
|
|
||||||
override suspend fun doWork(): Result {
|
override suspend fun doWork(): Result {
|
||||||
if (!checkTime()) return Result.success()
|
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
|
* For more information, see https://developer.android.com/develop/ui/views/notifications/group
|
||||||
*/
|
*/
|
||||||
private suspend fun createNotificationsForChannel(group: String, streams: List<StreamItem>) {
|
private suspend fun createNotificationsForChannel(group: String, streams: List<StreamItem>) {
|
||||||
|
// 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 summaryId = group.hashCode()
|
||||||
val intent = Intent(applicationContext, MainActivity::class.java)
|
val intent = Intent(applicationContext, MainActivity::class.java)
|
||||||
.setFlags(INTENT_FLAGS)
|
.setFlags(INTENT_FLAGS)
|
||||||
@ -154,21 +166,18 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
|
|||||||
.build()
|
.build()
|
||||||
|
|
||||||
// Create stream notifications. These are automatically grouped on Android 7.0 and later.
|
// 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) } }
|
streams.map { async { createStreamNotification(group, it) } }
|
||||||
.awaitAll()
|
.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(
|
private suspend fun createStreamNotification(
|
||||||
group: String,
|
group: String,
|
||||||
stream: StreamItem
|
stream: StreamItem
|
||||||
): Triple<Int, Long, Notification> { // Notification ID, uploaded date and notification object
|
): NotificationWithIdAndTag {
|
||||||
val videoId = stream.url!!.toID()
|
val videoId = stream.url!!.toID()
|
||||||
val intent = Intent(applicationContext, MainActivity::class.java)
|
val intent = Intent(applicationContext, MainActivity::class.java)
|
||||||
.setFlags(INTENT_FLAGS)
|
.setFlags(INTENT_FLAGS)
|
||||||
@ -195,7 +204,7 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
|
|||||||
.setWhen(stream.uploaded)
|
.setWhen(stream.uploaded)
|
||||||
.setShowWhen(true)
|
.setShowWhen(true)
|
||||||
|
|
||||||
return Triple(notificationId, stream.uploaded, notificationBuilder.build())
|
return NotificationWithIdAndTag(notificationId, notificationBuilder.build())
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun downloadImage(url: String?): Bitmap? {
|
private suspend fun downloadImage(url: String?): Bitmap? {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user