Options to run background workers only using wifi
parent
dafca9e1e1
commit
297029a659
@ -1,71 +0,0 @@
|
||||
package org.koitharu.kotatsu.core.util
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import androidx.work.WorkInfo
|
||||
import androidx.work.WorkManager
|
||||
import androidx.work.WorkQuery
|
||||
import androidx.work.WorkRequest
|
||||
import androidx.work.await
|
||||
import androidx.work.impl.WorkManagerImpl
|
||||
import java.util.UUID
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.coroutines.resumeWithException
|
||||
import kotlin.coroutines.suspendCoroutine
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
class WorkManagerHelper(
|
||||
workManager: WorkManager,
|
||||
) {
|
||||
|
||||
private val workManagerImpl = workManager as WorkManagerImpl
|
||||
|
||||
suspend fun deleteWork(id: UUID) = suspendCoroutine { cont ->
|
||||
workManagerImpl.workTaskExecutor.executeOnTaskThread {
|
||||
try {
|
||||
workManagerImpl.workDatabase.workSpecDao().delete(id.toString())
|
||||
cont.resume(Unit)
|
||||
} catch (e: Exception) {
|
||||
cont.resumeWithException(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun deleteWorks(ids: Collection<UUID>) = suspendCoroutine { cont ->
|
||||
workManagerImpl.workTaskExecutor.executeOnTaskThread {
|
||||
try {
|
||||
val db = workManagerImpl.workDatabase
|
||||
db.runInTransaction {
|
||||
for (id in ids) {
|
||||
db.workSpecDao().delete(id.toString())
|
||||
}
|
||||
}
|
||||
cont.resume(Unit)
|
||||
} catch (e: Exception) {
|
||||
cont.resumeWithException(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun getWorkInfosByTag(tag: String): List<WorkInfo> {
|
||||
return workManagerImpl.getWorkInfosByTag(tag).await()
|
||||
}
|
||||
|
||||
suspend fun getFinishedWorkInfosByTag(tag: String): List<WorkInfo> {
|
||||
val query = WorkQuery.Builder.fromTags(listOf(tag))
|
||||
.addStates(listOf(WorkInfo.State.SUCCEEDED, WorkInfo.State.CANCELLED, WorkInfo.State.FAILED))
|
||||
.build()
|
||||
return workManagerImpl.getWorkInfos(query).await()
|
||||
}
|
||||
|
||||
suspend fun getWorkInfoById(id: UUID): WorkInfo? {
|
||||
return workManagerImpl.getWorkInfoById(id).await()
|
||||
}
|
||||
|
||||
suspend fun getUniqueWorkInfoByName(name: String): List<WorkInfo> {
|
||||
return workManagerImpl.getWorkInfosForUniqueWork(name).await().orEmpty()
|
||||
}
|
||||
|
||||
suspend fun updateWork(request: WorkRequest): WorkManager.UpdateResult {
|
||||
return workManagerImpl.updateWork(request).await()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,73 @@
|
||||
package org.koitharu.kotatsu.core.util.ext
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import androidx.work.WorkInfo
|
||||
import androidx.work.WorkManager
|
||||
import androidx.work.WorkQuery
|
||||
import androidx.work.WorkRequest
|
||||
import androidx.work.await
|
||||
import androidx.work.impl.WorkManagerImpl
|
||||
import java.util.UUID
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.coroutines.resumeWithException
|
||||
import kotlin.coroutines.suspendCoroutine
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
suspend fun WorkManager.deleteWork(id: UUID) = suspendCoroutine { cont ->
|
||||
workManagerImpl.workTaskExecutor.executeOnTaskThread {
|
||||
try {
|
||||
workManagerImpl.workDatabase.workSpecDao().delete(id.toString())
|
||||
cont.resume(Unit)
|
||||
} catch (e: Exception) {
|
||||
cont.resumeWithException(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
suspend fun WorkManager.deleteWorks(ids: Collection<UUID>) = suspendCoroutine { cont ->
|
||||
workManagerImpl.workTaskExecutor.executeOnTaskThread {
|
||||
try {
|
||||
val db = workManagerImpl.workDatabase
|
||||
db.runInTransaction {
|
||||
for (id in ids) {
|
||||
db.workSpecDao().delete(id.toString())
|
||||
}
|
||||
}
|
||||
cont.resume(Unit)
|
||||
} catch (e: Exception) {
|
||||
cont.resumeWithException(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
suspend fun WorkManager.awaitWorkInfosByTag(tag: String): List<WorkInfo> {
|
||||
return getWorkInfosByTag(tag).await()
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
suspend fun WorkManager.awaitFinishedWorkInfosByTag(tag: String): List<WorkInfo> {
|
||||
val query = WorkQuery.Builder.fromTags(listOf(tag))
|
||||
.addStates(listOf(WorkInfo.State.SUCCEEDED, WorkInfo.State.CANCELLED, WorkInfo.State.FAILED))
|
||||
.build()
|
||||
return getWorkInfos(query).await()
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
suspend fun WorkManager.awaitWorkInfoById(id: UUID): WorkInfo? {
|
||||
return getWorkInfoById(id).await()
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
suspend fun WorkManager.awaitUniqueWorkInfoByName(name: String): List<WorkInfo> {
|
||||
return getWorkInfosForUniqueWork(name).await().orEmpty()
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
suspend fun WorkManager.awaitUpdateWork(request: WorkRequest): WorkManager.UpdateResult {
|
||||
return updateWork(request).await()
|
||||
}
|
||||
|
||||
private val WorkManager.workManagerImpl
|
||||
@SuppressLint("RestrictedApi") inline get() = this as WorkManagerImpl
|
||||
@ -1,12 +1,10 @@
|
||||
package org.koitharu.kotatsu.settings.work
|
||||
|
||||
import android.content.Context
|
||||
|
||||
interface PeriodicWorkScheduler {
|
||||
|
||||
suspend fun schedule(context: Context)
|
||||
suspend fun schedule()
|
||||
|
||||
suspend fun unschedule(context: Context)
|
||||
suspend fun unschedule()
|
||||
|
||||
suspend fun isScheduled(context: Context): Boolean
|
||||
suspend fun isScheduled(): Boolean
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue