diff --git a/app/src/main/java/com/github/libretube/helpers/NotificationHelper.kt b/app/src/main/java/com/github/libretube/helpers/NotificationHelper.kt index 6745abbb9..4d44b1e70 100644 --- a/app/src/main/java/com/github/libretube/helpers/NotificationHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/NotificationHelper.kt @@ -4,7 +4,7 @@ import android.content.Context import androidx.work.Constraints import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.NetworkType -import androidx.work.PeriodicWorkRequest +import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager import com.github.libretube.constants.NOTIFICATION_WORK_NAME import com.github.libretube.constants.PreferenceKeys @@ -56,8 +56,7 @@ object NotificationHelper { .build() // create the worker - val notificationWorker = PeriodicWorkRequest.Builder( - NotificationWorker::class.java, + val notificationWorker = PeriodicWorkRequestBuilder( checkingFrequency, TimeUnit.MINUTES ) 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 31d91bb03..2c526c108 100644 --- a/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt +++ b/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt @@ -8,7 +8,7 @@ import android.os.Build import android.util.Log import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat -import androidx.work.Worker +import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.github.libretube.R import com.github.libretube.api.SubscriptionHelper @@ -22,14 +22,15 @@ import com.github.libretube.extensions.toID import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.views.TimePickerPreference +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import java.time.LocalTime -import kotlinx.coroutines.runBlocking /** * The notification worker which checks for new streams in a certain frequency */ class NotificationWorker(appContext: Context, parameters: WorkerParameters) : - Worker(appContext, parameters) { + CoroutineWorker(appContext, parameters) { private val notificationManager = NotificationManagerCompat.from(appContext) @@ -41,7 +42,7 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) : DOWNLOAD_PROGRESS_NOTIFICATION_ID } - override fun doWork(): Result { + override suspend fun doWork(): Result { if (!checkTime()) Result.success() // check whether there are new streams and notify if there are some val result = checkForNewStreams() @@ -82,71 +83,68 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) : /** * check whether new streams are available in subscriptions */ - private fun checkForNewStreams(): Boolean { - var success = true - + private suspend fun checkForNewStreams(): Boolean { Log.d(TAG(), "Work manager started") - runBlocking { - // fetch the users feed - val videoFeed = try { + // fetch the users feed + val videoFeed = try { + withContext(Dispatchers.IO) { SubscriptionHelper.getFeed() - } catch (e: Exception) { - success = false - return@runBlocking } - - val lastSeenStreamId = PreferenceHelper.getLastSeenVideoId() - val latestFeedStreamId = videoFeed.firstOrNull()?.url?.toID() ?: return@runBlocking - - // first time notifications are enabled or no new video available - if (lastSeenStreamId == "" || lastSeenStreamId == latestFeedStreamId) { - PreferenceHelper.setLatestVideoId(lastSeenStreamId) - return@runBlocking - } - - // filter the new videos until the last seen video in the feed - val newStreams = videoFeed.takeWhile { it.url!!.toID() != lastSeenStreamId } - - // return if the previous video didn't get found - if (newStreams.isEmpty()) return@runBlocking - - // hide for notifications unsubscribed channels - val channelsToIgnore = PreferenceHelper.getIgnorableNotificationChannels() - val filteredVideos = newStreams.filter { - channelsToIgnore.none { channelId -> - channelId == it.uploaderUrl?.toID() - } - } - - // group the new streams by the uploader - val channelGroups = filteredVideos.groupBy { it.uploaderUrl } - - Log.d(TAG(), "Create notifications for new videos") - - // create a notification for each new stream - channelGroups.forEach { (_, streams) -> - createNotification( - group = streams.first().uploaderUrl!!.toID(), - title = streams.first().uploaderName.toString(), - urlPath = streams.first().uploaderUrl!!, - isGroupSummary = true - ) - - streams.forEach { streamItem -> - createNotification( - title = streamItem.title.toString(), - description = streamItem.uploaderName.toString(), - urlPath = streamItem.url!!, - group = streamItem.uploaderUrl!!.toID() - ) - } - } - // save the latest streams that got notified about - PreferenceHelper.setLatestVideoId(videoFeed.first().url!!.toID()) + } catch (e: Exception) { + return false } + + val lastSeenStreamId = PreferenceHelper.getLastSeenVideoId() + val latestFeedStreamId = videoFeed.firstOrNull()?.url?.toID() ?: return true + + // first time notifications are enabled or no new video available + if (lastSeenStreamId == "" || lastSeenStreamId == latestFeedStreamId) { + PreferenceHelper.setLatestVideoId(lastSeenStreamId) + return true + } + + // filter the new videos until the last seen video in the feed + val newStreams = videoFeed.takeWhile { it.url!!.toID() != lastSeenStreamId } + + // return if the previous video didn't get found + if (newStreams.isEmpty()) return true + + // hide for notifications unsubscribed channels + val channelsToIgnore = PreferenceHelper.getIgnorableNotificationChannels() + val filteredVideos = newStreams.filter { + channelsToIgnore.none { channelId -> + channelId == it.uploaderUrl?.toID() + } + } + + // group the new streams by the uploader + val channelGroups = filteredVideos.groupBy { it.uploaderUrl } + + Log.d(TAG(), "Create notifications for new videos") + + // create a notification for each new stream + channelGroups.forEach { (_, streams) -> + createNotification( + group = streams.first().uploaderUrl!!.toID(), + title = streams.first().uploaderName.toString(), + urlPath = streams.first().uploaderUrl!!, + isGroupSummary = true + ) + + streams.forEach { streamItem -> + createNotification( + title = streamItem.title.toString(), + description = streamItem.uploaderName.toString(), + urlPath = streamItem.url!!, + group = streamItem.uploaderUrl!!.toID() + ) + } + } + // save the latest streams that got notified about + PreferenceHelper.setLatestVideoId(videoFeed.first().url!!.toID()) // return whether the work succeeded - return success + return true } /**