@@ -4,38 +4,61 @@ import androidx.fragment.app.Fragment
44import androidx.fragment.app.viewModels
55import androidx.lifecycle.ViewModel
66import androidx.lifecycle.ViewModelProvider
7+ import androidx.lifecycle.asFlow
78import androidx.lifecycle.viewModelScope
89import androidx.paging.ExperimentalPagingApi
910import androidx.paging.Pager
1011import androidx.paging.PagingConfig
12+ import androidx.paging.PagingData
1113import androidx.paging.cachedIn
1214import androidx.paging.flatMap
1315import ceui.lisa.database.AppDatabase
1416import ceui.lisa.models.ModelObject
17+ import ceui.loxia.requireNetworkStateManager
18+ import ceui.pixiv.utils.NetworkStateManager
1519import kotlinx.coroutines.ExperimentalCoroutinesApi
1620import kotlinx.coroutines.flow.MutableStateFlow
21+ import kotlinx.coroutines.flow.combine
1722import kotlinx.coroutines.flow.flatMapLatest
23+ import kotlinx.coroutines.flow.flowOf
1824import kotlinx.coroutines.flow.map
1925
2026class PagingViewModel <ObjectT : ModelObject >(
2127 private val db : AppDatabase ,
28+ private val networkStateManager : NetworkStateManager ,
2229 private val repository : PagingAPIRepository <ObjectT >,
2330) : ViewModel() {
2431
2532 private val refreshTrigger = MutableStateFlow (0 )
33+ private val canAccessGoogle = networkStateManager.canAccessGoogle.asFlow()
2634
2735 @OptIn(ExperimentalPagingApi ::class , ExperimentalCoroutinesApi ::class )
28- val pager = refreshTrigger.flatMapLatest {
29- Pager (
30- config = PagingConfig (
31- pageSize = 30 ,
32- initialLoadSize = 30 ,
33- prefetchDistance = 0
34- ),
35- remoteMediator = PagingRemoteMediator (db, repository, repository.recordType),
36- pagingSourceFactory = { db.generalDao().pagingSource(repository.recordType) }
37- ).flow.map { pagingData ->
38- pagingData.flatMap(repository::mapper)
36+ val pager = combine(refreshTrigger, canAccessGoogle) { _, canAccess ->
37+ canAccess
38+ }.flatMapLatest { canAccess ->
39+ if (! canAccess) {
40+ Pager (
41+ config = PagingConfig (
42+ pageSize = 30 ,
43+ initialLoadSize = 30 ,
44+ prefetchDistance = 0
45+ ),
46+ pagingSourceFactory = { NoOpPagingSource () }
47+ ).flow.map { pagingData ->
48+ pagingData.flatMap(repository::mapper)
49+ }
50+ } else {
51+ Pager (
52+ config = PagingConfig (
53+ pageSize = 30 ,
54+ initialLoadSize = 30 ,
55+ prefetchDistance = 0
56+ ),
57+ remoteMediator = PagingRemoteMediator (db, repository, repository.recordType),
58+ pagingSourceFactory = { db.generalDao().pagingSource(repository.recordType) }
59+ ).flow.map { pagingData ->
60+ pagingData.flatMap(repository::mapper)
61+ }
3962 }
4063 }.cachedIn(viewModelScope)
4164
@@ -53,8 +76,9 @@ inline fun <ObjectT : ModelObject> Fragment.pagingViewModel(
5376 object : ViewModelProvider .Factory {
5477 override fun <T : ViewModel > create (modelClass : Class <T >): T {
5578 val database = AppDatabase .getAppDatabase(requireContext())
79+ val networkStateManager = requireNetworkStateManager()
5680 val repository = repositoryProducer()
57- return PagingViewModel (database, repository) as T
81+ return PagingViewModel (database, networkStateManager, repository) as T
5882 }
5983 }
6084 }
@@ -69,9 +93,10 @@ inline fun <ArgsT, ObjectT : ModelObject> Fragment.pagingViewModel(
6993 object : ViewModelProvider .Factory {
7094 override fun <T : ViewModel > create (modelClass : Class <T >): T {
7195 val database = AppDatabase .getAppDatabase(requireContext())
96+ val networkStateManager = requireNetworkStateManager()
7297 val args = argsProducer()
7398 val repository = repositoryProducer(args)
74- return PagingViewModel (database, repository) as T
99+ return PagingViewModel (database, networkStateManager, repository) as T
75100 }
76101 }
77102 }
0 commit comments