Add ability to cancel a feed update through a notification action

- Change prefetch value default so each parallel rail buffers less
items.
This commit is contained in:
Mauricio Colli 2020-02-16 19:03:46 -03:00
parent 18a40168d9
commit 50714c3006
No known key found for this signature in database
GPG Key ID: F200BFD6F29DDD85
1 changed files with 36 additions and 2 deletions

View File

@ -19,8 +19,12 @@
package org.schabi.newpipe.local.feed.service package org.schabi.newpipe.local.feed.service
import android.app.PendingIntent
import android.app.Service import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter
import android.os.Build import android.os.Build
import android.os.IBinder import android.os.IBinder
import android.preference.PreferenceManager import android.preference.PreferenceManager
@ -52,6 +56,7 @@ import org.schabi.newpipe.util.ExtractorHelper
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -59,6 +64,7 @@ class FeedLoadService : Service() {
companion object { companion object {
private val TAG = FeedLoadService::class.java.simpleName private val TAG = FeedLoadService::class.java.simpleName
private const val NOTIFICATION_ID = 7293450 private const val NOTIFICATION_ID = 7293450
private const val ACTION_CANCEL = "org.schabi.newpipe.local.feed.service.FeedLoadService.CANCEL"
/** /**
* How often the notification will be updated. * How often the notification will be updated.
@ -108,6 +114,7 @@ class FeedLoadService : Service() {
} }
setupNotification() setupNotification()
setupBroadcastReceiver()
val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
val groupId = intent.getLongExtra(EXTRA_GROUP_ID, FeedGroupEntity.GROUP_ALL_ID) val groupId = intent.getLongExtra(EXTRA_GROUP_ID, FeedGroupEntity.GROUP_ALL_ID)
@ -124,6 +131,8 @@ class FeedLoadService : Service() {
} }
private fun disposeAll() { private fun disposeAll() {
unregisterReceiver(broadcastReceiver)
loadingSubscription?.cancel() loadingSubscription?.cancel()
loadingSubscription = null loadingSubscription = null
@ -187,9 +196,12 @@ class FeedLoadService : Service() {
.observeOn(Schedulers.io()) .observeOn(Schedulers.io())
.flatMap { Flowable.fromIterable(it) } .flatMap { Flowable.fromIterable(it) }
.takeWhile { !cancelSignal.get() }
.parallel(PARALLEL_EXTRACTIONS, PARALLEL_EXTRACTIONS * 2)
.runOn(Schedulers.io(), PARALLEL_EXTRACTIONS * 2)
.filter { !cancelSignal.get() }
.parallel(PARALLEL_EXTRACTIONS)
.runOn(Schedulers.io())
.map { subscriptionEntity -> .map { subscriptionEntity ->
try { try {
val listInfo = if (useFeedExtractor) { val listInfo = if (useFeedExtractor) {
@ -351,11 +363,15 @@ class FeedLoadService : Service() {
private var maxProgress = AtomicInteger(-1) private var maxProgress = AtomicInteger(-1)
private fun createNotification(): NotificationCompat.Builder { private fun createNotification(): NotificationCompat.Builder {
val cancelActionIntent = PendingIntent.getBroadcast(this,
NOTIFICATION_ID, Intent(ACTION_CANCEL), 0)
return NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) return NotificationCompat.Builder(this, getString(R.string.notification_channel_id))
.setOngoing(true) .setOngoing(true)
.setProgress(-1, -1, true) .setProgress(-1, -1, true)
.setSmallIcon(R.drawable.ic_newpipe_triangle_white) .setSmallIcon(R.drawable.ic_newpipe_triangle_white)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.addAction(0, getString(R.string.cancel), cancelActionIntent)
.setContentTitle(getString(R.string.feed_notification_loading)) .setContentTitle(getString(R.string.feed_notification_loading))
} }
@ -394,6 +410,24 @@ class FeedLoadService : Service() {
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()) notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build())
} }
///////////////////////////////////////////////////////////////////////////
// Notification Actions
///////////////////////////////////////////////////////////////////////////
private lateinit var broadcastReceiver: BroadcastReceiver
private val cancelSignal = AtomicBoolean()
private fun setupBroadcastReceiver() {
broadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == ACTION_CANCEL) {
cancelSignal.set(true)
}
}
}
registerReceiver(broadcastReceiver, IntentFilter(ACTION_CANCEL))
}
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// Error handling // Error handling
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////