Yuito-app-android/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksRemoteMediator.kt

58 lines
1.9 KiB
Kotlin
Raw Normal View History

package com.keylesspalace.tusky.components.domainblocks
2023-07-04 19:30:57 +02:00
import androidx.paging.ExperimentalPagingApi
import androidx.paging.LoadType
import androidx.paging.PagingState
import androidx.paging.RemoteMediator
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.util.HttpHeaderLink
import retrofit2.HttpException
import retrofit2.Response
@OptIn(ExperimentalPagingApi::class)
class DomainBlocksRemoteMediator(
2023-07-04 19:30:57 +02:00
private val api: MastodonApi,
2023-07-05 20:09:16 +02:00
private val repository: DomainBlocksRepository
2023-07-04 19:30:57 +02:00
) : RemoteMediator<String, String>() {
2023-07-05 20:09:16 +02:00
2023-07-04 19:30:57 +02:00
override suspend fun load(
loadType: LoadType,
state: PagingState<String, String>
): MediatorResult {
return try {
val response = request(loadType)
?: return MediatorResult.Success(endOfPaginationReached = true)
return applyResponse(response)
} catch (e: Exception) {
MediatorResult.Error(e)
}
}
private suspend fun request(loadType: LoadType): Response<List<String>>? {
return when (loadType) {
LoadType.PREPEND -> null
2023-07-05 20:09:16 +02:00
LoadType.APPEND -> api.domainBlocks(maxId = repository.nextKey)
2023-07-04 19:30:57 +02:00
LoadType.REFRESH -> {
2023-07-05 20:09:16 +02:00
repository.nextKey = null
repository.domains.clear()
2023-07-04 19:30:57 +02:00
api.domainBlocks()
}
}
}
private fun applyResponse(response: Response<List<String>>): MediatorResult {
val tags = response.body()
if (!response.isSuccessful || tags == null) {
return MediatorResult.Error(HttpException(response))
}
val links = HttpHeaderLink.parse(response.headers()["Link"])
2023-07-05 20:09:16 +02:00
repository.nextKey = HttpHeaderLink.findByRelationType(links, "next")?.uri?.getQueryParameter("max_id")
repository.domains.addAll(tags)
repository.invalidate()
2023-07-04 19:30:57 +02:00
2023-07-05 20:09:16 +02:00
return MediatorResult.Success(endOfPaginationReached = repository.nextKey == null)
2023-07-04 19:30:57 +02:00
}
}