Skip to content

Commit

Permalink
Merge pull request #2951 from Isira-Seneviratne/Work_KTX
Browse files Browse the repository at this point in the history
Use Work KTX functionality.
  • Loading branch information
Bnyro authored Feb 3, 2023
2 parents 1f00a98 + 38e8cd1 commit 1e379d5
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -56,8 +56,7 @@ object NotificationHelper {
.build()

// create the worker
val notificationWorker = PeriodicWorkRequest.Builder(
NotificationWorker::class.java,
val notificationWorker = PeriodicWorkRequestBuilder<NotificationWorker>(
checkingFrequency,
TimeUnit.MINUTES
)
Expand Down
100 changes: 49 additions & 51 deletions app/src/main/java/com/github/libretube/workers/NotificationWorker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)

Expand All @@ -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()
Expand Down Expand Up @@ -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
}
} catch (e: Exception) {
return false
}

val lastSeenStreamId = PreferenceHelper.getLastSeenVideoId()
val latestFeedStreamId = videoFeed.firstOrNull()?.url?.toID() ?: return@runBlocking
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@runBlocking
}
// 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 }
// 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
// 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()
}
// 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 }

// group the new streams by the uploader
val channelGroups = filteredVideos.groupBy { it.uploaderUrl }
Log.d(TAG(), "Create notifications for new videos")

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
)

// create a notification for each new stream
channelGroups.forEach { (_, streams) ->
streams.forEach { streamItem ->
createNotification(
group = streams.first().uploaderUrl!!.toID(),
title = streams.first().uploaderName.toString(),
urlPath = streams.first().uploaderUrl!!,
isGroupSummary = true
title = streamItem.title.toString(),
description = streamItem.uploaderName.toString(),
urlPath = streamItem.url!!,
group = streamItem.uploaderUrl!!.toID()
)

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())
}
// save the latest streams that got notified about
PreferenceHelper.setLatestVideoId(videoFeed.first().url!!.toID())
// return whether the work succeeded
return success
return true
}

/**
Expand Down

0 comments on commit 1e379d5

Please sign in to comment.