Convert NotificationWorker to a CoroutineWorker.

This commit is contained in:
Isira Seneviratne 2023-01-30 20:41:43 +05:30
parent 75a3f3e53b
commit 5f1d41c790

View File

@ -8,7 +8,7 @@ import android.os.Build
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
import androidx.work.Worker import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.SubscriptionHelper 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.helpers.PreferenceHelper
import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.activities.MainActivity
import com.github.libretube.ui.views.TimePickerPreference import com.github.libretube.ui.views.TimePickerPreference
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.time.LocalTime import java.time.LocalTime
import kotlinx.coroutines.runBlocking
/** /**
* The notification worker which checks for new streams in a certain frequency * The notification worker which checks for new streams in a certain frequency
*/ */
class NotificationWorker(appContext: Context, parameters: WorkerParameters) : class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
Worker(appContext, parameters) { CoroutineWorker(appContext, parameters) {
private val notificationManager = NotificationManagerCompat.from(appContext) private val notificationManager = NotificationManagerCompat.from(appContext)
@ -41,7 +42,7 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
DOWNLOAD_PROGRESS_NOTIFICATION_ID DOWNLOAD_PROGRESS_NOTIFICATION_ID
} }
override fun doWork(): Result { override suspend fun doWork(): Result {
if (!checkTime()) Result.success() if (!checkTime()) Result.success()
// check whether there are new streams and notify if there are some // check whether there are new streams and notify if there are some
val result = checkForNewStreams() val result = checkForNewStreams()
@ -82,34 +83,32 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
/** /**
* check whether new streams are available in subscriptions * check whether new streams are available in subscriptions
*/ */
private fun checkForNewStreams(): Boolean { private suspend fun checkForNewStreams(): Boolean {
var success = true
Log.d(TAG(), "Work manager started") Log.d(TAG(), "Work manager started")
runBlocking {
// fetch the users feed // fetch the users feed
val videoFeed = try { val videoFeed = try {
withContext(Dispatchers.IO) {
SubscriptionHelper.getFeed() SubscriptionHelper.getFeed()
}
} catch (e: Exception) { } catch (e: Exception) {
success = false return false
return@runBlocking
} }
val lastSeenStreamId = PreferenceHelper.getLastSeenVideoId() val lastSeenStreamId = PreferenceHelper.getLastSeenVideoId()
val latestFeedStreamId = videoFeed.firstOrNull()?.url?.toID() ?: return@runBlocking val latestFeedStreamId = videoFeed.firstOrNull()?.url?.toID() ?: return true
// first time notifications are enabled or no new video available // first time notifications are enabled or no new video available
if (lastSeenStreamId == "" || lastSeenStreamId == latestFeedStreamId) { if (lastSeenStreamId == "" || lastSeenStreamId == latestFeedStreamId) {
PreferenceHelper.setLatestVideoId(lastSeenStreamId) PreferenceHelper.setLatestVideoId(lastSeenStreamId)
return@runBlocking return true
} }
// filter the new videos until the last seen video in the feed // filter the new videos until the last seen video in the feed
val newStreams = videoFeed.takeWhile { it.url!!.toID() != lastSeenStreamId } val newStreams = videoFeed.takeWhile { it.url!!.toID() != lastSeenStreamId }
// return if the previous video didn't get found // return if the previous video didn't get found
if (newStreams.isEmpty()) return@runBlocking if (newStreams.isEmpty()) return true
// hide for notifications unsubscribed channels // hide for notifications unsubscribed channels
val channelsToIgnore = PreferenceHelper.getIgnorableNotificationChannels() val channelsToIgnore = PreferenceHelper.getIgnorableNotificationChannels()
@ -144,9 +143,8 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
} }
// save the latest streams that got notified about // save the latest streams that got notified about
PreferenceHelper.setLatestVideoId(videoFeed.first().url!!.toID()) PreferenceHelper.setLatestVideoId(videoFeed.first().url!!.toID())
}
// return whether the work succeeded // return whether the work succeeded
return success return true
} }
/** /**