|
@@ -8,11 +8,9 @@ import android.os.IBinder
|
|
|
import android.os.PowerManager
|
|
|
import androidx.annotation.StringRes
|
|
|
import androidx.core.content.ContextCompat
|
|
|
-import com.jakewharton.rxrelay.BehaviorRelay
|
|
|
import eu.kanade.domain.download.service.DownloadPreferences
|
|
|
import eu.kanade.tachiyomi.R
|
|
|
import eu.kanade.tachiyomi.data.notification.Notifications
|
|
|
-import eu.kanade.tachiyomi.util.lang.plusAssign
|
|
|
import eu.kanade.tachiyomi.util.lang.withUIContext
|
|
|
import eu.kanade.tachiyomi.util.system.acquireWakeLock
|
|
|
import eu.kanade.tachiyomi.util.system.isConnectedToWifi
|
|
@@ -32,7 +30,6 @@ import kotlinx.coroutines.flow.launchIn
|
|
|
import kotlinx.coroutines.flow.onEach
|
|
|
import logcat.LogPriority
|
|
|
import ru.beryukhov.reactivenetwork.ReactiveNetwork
|
|
|
-import rx.subscriptions.CompositeSubscription
|
|
|
import uy.kohesive.injekt.injectLazy
|
|
|
|
|
|
/**
|
|
@@ -44,11 +41,6 @@ class DownloadService : Service() {
|
|
|
|
|
|
companion object {
|
|
|
|
|
|
- /**
|
|
|
- * Relay used to know when the service is running.
|
|
|
- */
|
|
|
- val runningRelay: BehaviorRelay<Boolean> = BehaviorRelay.create(false)
|
|
|
-
|
|
|
private val _isRunning = MutableStateFlow(false)
|
|
|
val isRunning = _isRunning.asStateFlow()
|
|
|
|
|
@@ -83,7 +75,6 @@ class DownloadService : Service() {
|
|
|
}
|
|
|
|
|
|
private val downloadManager: DownloadManager by injectLazy()
|
|
|
-
|
|
|
private val downloadPreferences: DownloadPreferences by injectLazy()
|
|
|
|
|
|
/**
|
|
@@ -91,62 +82,58 @@ class DownloadService : Service() {
|
|
|
*/
|
|
|
private lateinit var wakeLock: PowerManager.WakeLock
|
|
|
|
|
|
- private lateinit var subscriptions: CompositeSubscription
|
|
|
private lateinit var ioScope: CoroutineScope
|
|
|
|
|
|
- /**
|
|
|
- * Called when the service is created.
|
|
|
- */
|
|
|
override fun onCreate() {
|
|
|
super.onCreate()
|
|
|
ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
|
|
startForeground(Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS, getPlaceholderNotification())
|
|
|
wakeLock = acquireWakeLock(javaClass.name)
|
|
|
- runningRelay.call(true)
|
|
|
_isRunning.value = true
|
|
|
- subscriptions = CompositeSubscription()
|
|
|
listenDownloaderState()
|
|
|
listenNetworkChanges()
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Called when the service is destroyed.
|
|
|
- */
|
|
|
override fun onDestroy() {
|
|
|
ioScope?.cancel()
|
|
|
- runningRelay.call(false)
|
|
|
_isRunning.value = false
|
|
|
- subscriptions.unsubscribe()
|
|
|
downloadManager.stopDownloads()
|
|
|
wakeLock.releaseIfNeeded()
|
|
|
super.onDestroy()
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Not used.
|
|
|
- */
|
|
|
+ // Not used
|
|
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
|
|
return START_NOT_STICKY
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Not used.
|
|
|
- */
|
|
|
+ // Not used
|
|
|
override fun onBind(intent: Intent): IBinder? {
|
|
|
return null
|
|
|
}
|
|
|
|
|
|
+ private fun stopDownloads(@StringRes string: Int) {
|
|
|
+ downloadManager.stopDownloads(getString(string))
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Listens to network changes.
|
|
|
- *
|
|
|
- * @see onNetworkStateChanged
|
|
|
*/
|
|
|
private fun listenNetworkChanges() {
|
|
|
ReactiveNetwork()
|
|
|
.observeNetworkConnectivity(applicationContext)
|
|
|
.onEach {
|
|
|
withUIContext {
|
|
|
- onNetworkStateChanged()
|
|
|
+ if (isOnline()) {
|
|
|
+ if (downloadPreferences.downloadOnlyOverWifi().get() && !isConnectedToWifi()) {
|
|
|
+ stopDownloads(R.string.download_notifier_text_only_wifi)
|
|
|
+ } else {
|
|
|
+ val started = downloadManager.startDownloads()
|
|
|
+ if (!started) stopSelf()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ stopDownloads(R.string.download_notifier_no_network)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
.catch { error ->
|
|
@@ -159,41 +146,20 @@ class DownloadService : Service() {
|
|
|
.launchIn(ioScope)
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Called when the network state changes.
|
|
|
- */
|
|
|
- private fun onNetworkStateChanged() {
|
|
|
- if (isOnline()) {
|
|
|
- if (downloadPreferences.downloadOnlyOverWifi().get() && !isConnectedToWifi()) {
|
|
|
- stopDownloads(R.string.download_notifier_text_only_wifi)
|
|
|
- } else {
|
|
|
- val started = downloadManager.startDownloads()
|
|
|
- if (!started) stopSelf()
|
|
|
- }
|
|
|
- } else {
|
|
|
- stopDownloads(R.string.download_notifier_no_network)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private fun stopDownloads(@StringRes string: Int) {
|
|
|
- downloadManager.stopDownloads(getString(string))
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* Listens to downloader status. Enables or disables the wake lock depending on the status.
|
|
|
*/
|
|
|
private fun listenDownloaderState() {
|
|
|
- subscriptions += downloadManager.runningRelay
|
|
|
- .doOnError {
|
|
|
- /* Swallow wakelock error */
|
|
|
- }
|
|
|
- .subscribe { running ->
|
|
|
- if (running) {
|
|
|
+ _isRunning
|
|
|
+ .onEach { isRunning ->
|
|
|
+ if (isRunning) {
|
|
|
wakeLock.acquireIfNeeded()
|
|
|
} else {
|
|
|
wakeLock.releaseIfNeeded()
|
|
|
}
|
|
|
}
|
|
|
+ .catch { /* Ignore errors */ }
|
|
|
+ .launchIn(ioScope)
|
|
|
}
|
|
|
|
|
|
/**
|