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:
parent
18a40168d9
commit
50714c3006
|
@ -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
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue