Yuito-app-android/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchNotestockDataSource.kt

70 lines
2.6 KiB
Kotlin

package com.keylesspalace.tusky.components.search.adapter
import android.annotation.SuppressLint
import androidx.lifecycle.MutableLiveData
import androidx.paging.PositionalDataSource
import com.keylesspalace.tusky.entity.SearchResult
import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.NotestockApi
import com.keylesspalace.tusky.util.NetworkState
import com.keylesspalace.tusky.viewdata.StatusViewData
import io.reactivex.disposables.CompositeDisposable
import java.util.concurrent.Executor
class SearchNotestockDataSource(
private val notestockApi: NotestockApi,
private val searchRequest: String?,
private val disposables: CompositeDisposable,
private val retryExecutor: Executor,
private val initialItems: List<Pair<Status, StatusViewData.Concrete>>? = null,
private val parser: (SearchResult?) -> List<Pair<Status, StatusViewData.Concrete>>) : PositionalDataSource<Pair<Status, StatusViewData.Concrete>>() {
val networkState = MutableLiveData<NetworkState>()
private var retry: (() -> Any)? = null
val initialLoad = MutableLiveData<NetworkState>()
fun retry() {
retry?.let {
retryExecutor.execute {
it.invoke()
}
}
}
@SuppressLint("CheckResult")
override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Pair<Status, StatusViewData.Concrete>>) {
if (!initialItems.isNullOrEmpty()) {
callback.onResult(initialItems, 0)
} else {
networkState.postValue(NetworkState.LOADED)
retry = null
initialLoad.postValue(NetworkState.LOADING)
notestockApi.search(searchRequest)
.doOnSubscribe {
disposables.add(it)
}
.subscribe(
{ data ->
val res = parser(data)
callback.onResult(res, params.requestedStartPosition)
initialLoad.postValue(NetworkState.LOADED)
},
{ error ->
retry = {
loadInitial(params, callback)
}
initialLoad.postValue(NetworkState.error(error.message))
}
)
}
}
@SuppressLint("CheckResult")
override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<Pair<Status, StatusViewData.Concrete>>) {
// Forbidden
}
}