parent
fc67c0195f
commit
f1fb7404c2
@ -5,6 +5,7 @@ import com.topjohnwu.magisk.core.Const
|
|||||||
import com.topjohnwu.magisk.core.model.module.Repo
|
import com.topjohnwu.magisk.core.model.module.Repo
|
||||||
import com.topjohnwu.magisk.data.database.RepoDao
|
import com.topjohnwu.magisk.data.database.RepoDao
|
||||||
import com.topjohnwu.magisk.data.network.GithubApiServices
|
import com.topjohnwu.magisk.data.network.GithubApiServices
|
||||||
|
import com.topjohnwu.magisk.ktx.synchronized
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.net.HttpURLConnection
|
import java.net.HttpURLConnection
|
||||||
@ -64,33 +65,39 @@ class RepoUpdater(
|
|||||||
page: Int = 1,
|
page: Int = 1,
|
||||||
etag: String = ""
|
etag: String = ""
|
||||||
): PageResult = coroutineScope {
|
): PageResult = coroutineScope {
|
||||||
val result = api.fetchRepos(page, etag)
|
runCatching {
|
||||||
result.run {
|
val result = api.fetchRepos(page, etag)
|
||||||
if (code() == HttpURLConnection.HTTP_NOT_MODIFIED)
|
result.run {
|
||||||
return@coroutineScope PageResult.CACHED
|
if (code() == HttpURLConnection.HTTP_NOT_MODIFIED)
|
||||||
|
return@coroutineScope PageResult.CACHED
|
||||||
|
|
||||||
if (!isSuccessful)
|
if (!isSuccessful)
|
||||||
return@coroutineScope PageResult.ERROR
|
return@coroutineScope PageResult.ERROR
|
||||||
|
|
||||||
if (page == 1)
|
if (page == 1)
|
||||||
repoDB.etagKey = headers()[Const.Key.ETAG_KEY].orEmpty().trimEtag()
|
repoDB.etagKey = headers()[Const.Key.ETAG_KEY].orEmpty().trimEtag()
|
||||||
|
|
||||||
val repoLoad = async { loadRepos(body()!!, cached) }
|
val repoLoad = async { loadRepos(body()!!, cached) }
|
||||||
val next = if (headers()[Const.Key.LINK_KEY].orEmpty().contains("next")) {
|
val next = if (headers()[Const.Key.LINK_KEY].orEmpty().contains("next")) {
|
||||||
async { loadPage(cached, page + 1) }
|
async { loadPage(cached, page + 1) }
|
||||||
} else {
|
} else {
|
||||||
async { PageResult.SUCCESS }
|
async { PageResult.SUCCESS }
|
||||||
|
}
|
||||||
|
repoLoad.await()
|
||||||
|
return@coroutineScope next.await()
|
||||||
}
|
}
|
||||||
repoLoad.await()
|
}.getOrElse {
|
||||||
return@coroutineScope next.await()
|
Timber.e(it)
|
||||||
|
PageResult.ERROR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend operator fun invoke(forced: Boolean) = withContext(Dispatchers.IO) {
|
suspend operator fun invoke(forced: Boolean) = withContext(Dispatchers.IO) {
|
||||||
val cached = Collections.synchronizedSet(HashSet(repoDB.repoIDList))
|
val cached = HashSet(repoDB.repoIDList).synchronized()
|
||||||
when (loadPage(cached, etag = repoDB.etagKey)) {
|
when (loadPage(cached, etag = repoDB.etagKey)) {
|
||||||
PageResult.CACHED -> if (forced) forcedReload(cached)
|
PageResult.CACHED -> if (forced) forcedReload(cached)
|
||||||
PageResult.SUCCESS -> repoDB.removeRepos(cached)
|
PageResult.SUCCESS -> repoDB.removeRepos(cached)
|
||||||
|
PageResult.ERROR -> Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user