forked from starfish23/mangafeed
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Migrate downloader service to WorkManager (#10190)
- Loading branch information
1 parent
8ff2c01
commit 8ce8b60
Showing
8 changed files
with
142 additions
and
169 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
121 changes: 121 additions & 0 deletions
121
app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadJob.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
package eu.kanade.tachiyomi.data.download | ||
|
||
import android.content.Context | ||
import android.content.pm.ServiceInfo | ||
import android.os.Build | ||
import androidx.lifecycle.asFlow | ||
import androidx.work.CoroutineWorker | ||
import androidx.work.ExistingWorkPolicy | ||
import androidx.work.ForegroundInfo | ||
import androidx.work.OneTimeWorkRequestBuilder | ||
import androidx.work.WorkInfo | ||
import androidx.work.WorkManager | ||
import androidx.work.WorkerParameters | ||
import eu.kanade.tachiyomi.R | ||
import eu.kanade.tachiyomi.data.notification.Notifications | ||
import eu.kanade.tachiyomi.util.system.isConnectedToWifi | ||
import eu.kanade.tachiyomi.util.system.isOnline | ||
import eu.kanade.tachiyomi.util.system.notificationBuilder | ||
import kotlinx.coroutines.delay | ||
import kotlinx.coroutines.flow.Flow | ||
import kotlinx.coroutines.flow.map | ||
import logcat.LogPriority | ||
import tachiyomi.core.util.system.logcat | ||
import tachiyomi.domain.download.service.DownloadPreferences | ||
import uy.kohesive.injekt.Injekt | ||
import uy.kohesive.injekt.api.get | ||
|
||
/** | ||
* This worker is used to manage the downloader. The system can decide to stop the worker, in | ||
* which case the downloader is also stopped. It's also stopped while there's no network available. | ||
*/ | ||
class DownloadJob(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { | ||
|
||
private val downloadManager: DownloadManager = Injekt.get() | ||
private val downloadPreferences: DownloadPreferences = Injekt.get() | ||
|
||
override suspend fun getForegroundInfo(): ForegroundInfo { | ||
val notification = applicationContext.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) { | ||
setContentTitle(applicationContext.getString(R.string.download_notifier_downloader_title)) | ||
setSmallIcon(android.R.drawable.stat_sys_download) | ||
}.build() | ||
return ForegroundInfo( | ||
Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS, | ||
notification, | ||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { | ||
ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC | ||
} else { | ||
0 | ||
}, | ||
) | ||
} | ||
|
||
override suspend fun doWork(): Result { | ||
try { | ||
setForeground(getForegroundInfo()) | ||
} catch (e: IllegalStateException) { | ||
logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } | ||
} | ||
|
||
var networkCheck = checkConnectivity() | ||
var active = networkCheck | ||
downloadManager.downloaderStart() | ||
|
||
// Keep the worker running when needed | ||
while (active) { | ||
delay(100) | ||
networkCheck = checkConnectivity() | ||
active = !isStopped && networkCheck && downloadManager.isRunning | ||
} | ||
|
||
return Result.success() | ||
} | ||
|
||
private fun checkConnectivity(): Boolean { | ||
return with(applicationContext) { | ||
if (isOnline()) { | ||
val noWifi = downloadPreferences.downloadOnlyOverWifi().get() && !isConnectedToWifi() | ||
if (noWifi) { | ||
downloadManager.downloaderStop( | ||
applicationContext.getString(R.string.download_notifier_text_only_wifi), | ||
) | ||
} | ||
!noWifi | ||
} else { | ||
downloadManager.downloaderStop(applicationContext.getString(R.string.download_notifier_no_network)) | ||
false | ||
} | ||
} | ||
} | ||
|
||
companion object { | ||
private const val TAG = "Downloader" | ||
|
||
fun start(context: Context) { | ||
val request = OneTimeWorkRequestBuilder<DownloadJob>() | ||
.addTag(TAG) | ||
.build() | ||
WorkManager.getInstance(context) | ||
.enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request) | ||
} | ||
|
||
fun stop(context: Context) { | ||
WorkManager.getInstance(context) | ||
.cancelUniqueWork(TAG) | ||
} | ||
|
||
fun isRunning(context: Context): Boolean { | ||
return WorkManager.getInstance(context) | ||
.getWorkInfosForUniqueWork(TAG) | ||
.get() | ||
.let { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } | ||
} | ||
|
||
fun isRunningFlow(context: Context): Flow<Boolean> { | ||
return WorkManager.getInstance(context) | ||
.getWorkInfosForUniqueWorkLiveData(TAG) | ||
.asFlow() | ||
.map { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
151 changes: 0 additions & 151 deletions
151
app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.