Skip to content

Commit 6460f01

Browse files
committed
wip
1 parent ea5932a commit 6460f01

File tree

6 files changed

+70
-33
lines changed

6 files changed

+70
-33
lines changed

.idea/dictionaries/Admin.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/com/hoc/pagination_mvi/di/modules/DomainModule.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ interface DomainModule {
1818
@Binds
1919
fun provideCoroutinesDispatchersProvider(coroutinesDispatchersProviderImpl: CoroutinesDispatchersProviderImpl): CoroutinesDispatchersProvider
2020

21-
2221
@Binds
2322
fun providePhotoRepository(photoRepositoryImpl: PhotoRepositoryImpl): PhotoRepository
2423
}

app/src/main/java/com/hoc/pagination_mvi/di/modules/ViewModelModule.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@ import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatcher
88
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatchersProviderImpl
99
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.RxSchedulerProvider
1010
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.RxSchedulerProviderImpl
11+
import com.hoc.pagination_mvi.ui.main.MainContract
12+
import com.hoc.pagination_mvi.ui.main.MainInteractorImpl
1113
import com.hoc.pagination_mvi.ui.main.MainVM
1214
import dagger.Binds
1315
import dagger.Module
1416
import dagger.multibindings.IntoMap
1517

1618
@Module
1719
abstract class ViewModelModule {
20+
@Binds
21+
abstract fun provideMainInteractor(mainInteractorImpl: MainInteractorImpl): MainContract.Interactor
22+
1823
@Binds
1924
abstract fun provideVMFactory(appViewModelFactory: AppViewModelFactory): ViewModelProvider.Factory
2025

app/src/main/java/com/hoc/pagination_mvi/ui/main/MainContract.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.hoc.pagination_mvi.ui.main
22

33
import androidx.annotation.LayoutRes
44
import com.hoc.pagination_mvi.R
5+
import io.reactivex.Observable
56
import com.hoc.pagination_mvi.domain.entity.Photo as PhotoDomain
67

78
interface MainContract {
@@ -158,4 +159,9 @@ interface MainContract {
158159
sealed class SingleEvent {
159160

160161
}
162+
163+
interface Interactor {
164+
fun photoNextPageChanges(start: Int, limit: Int): Observable<PartialStateChange.PhotoNextPage>
165+
fun photoFirstPageChanges(limit: Int): Observable<PartialStateChange.PhotoFirstPage>
166+
}
161167
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.hoc.pagination_mvi.ui.main
2+
3+
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatchersProvider
4+
import com.hoc.pagination_mvi.domain.usecase.GetPhotosUseCase
5+
import com.hoc.pagination_mvi.ui.main.MainContract.PhotoVS
6+
import io.reactivex.Observable
7+
import kotlinx.coroutines.ExperimentalCoroutinesApi
8+
import kotlinx.coroutines.delay
9+
import kotlinx.coroutines.rx2.rxObservable
10+
import javax.inject.Inject
11+
12+
@ExperimentalCoroutinesApi
13+
class MainInteractorImpl @Inject constructor(
14+
private val getPhotosUseCase: GetPhotosUseCase,
15+
private val dispatchers: CoroutinesDispatchersProvider
16+
) : MainContract.Interactor {
17+
override fun photoNextPageChanges(
18+
start: Int,
19+
limit: Int
20+
): Observable<MainContract.PartialStateChange.PhotoNextPage> {
21+
return rxObservable(dispatchers.main) {
22+
send(MainContract.PartialStateChange.PhotoNextPage.Loading)
23+
try {
24+
getPhotosUseCase(start = start, limit = limit)
25+
.map(MainContract::PhotoVS)
26+
.let { MainContract.PartialStateChange.PhotoNextPage.Data(it) }
27+
.let { send(it) }
28+
} catch (e: Exception) {
29+
delay(1_000)
30+
send(MainContract.PartialStateChange.PhotoNextPage.Error(e))
31+
}
32+
}
33+
}
34+
35+
override fun photoFirstPageChanges(limit: Int): Observable<MainContract.PartialStateChange.PhotoFirstPage> {
36+
return rxObservable(dispatchers.main) {
37+
send(MainContract.PartialStateChange.PhotoFirstPage.Loading)
38+
try {
39+
getPhotosUseCase(start = 0, limit = limit)
40+
.map(::PhotoVS)
41+
.let { MainContract.PartialStateChange.PhotoFirstPage.Data(it) }
42+
.let { send(it) }
43+
} catch (e: Exception) {
44+
send(MainContract.PartialStateChange.PhotoFirstPage.Error(e))
45+
}
46+
}
47+
}
48+
}

app/src/main/java/com/hoc/pagination_mvi/ui/main/MainVM.kt

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ import javax.inject.Inject
2626

2727
@ExperimentalCoroutinesApi
2828
class MainVM @Inject constructor(
29-
private val getPhotosUseCase: GetPhotosUseCase,
30-
private val dispatchers: CoroutinesDispatchersProvider
29+
private val interactor: Interactor
3130
) : ViewModel() {
3231
private val initial = ViewState.initial()
3332
private val _stateD = MutableLiveData<ViewState>().apply { value = initial }
@@ -46,19 +45,7 @@ class MainVM @Inject constructor(
4645
intents
4746
.withLatestFrom(stateObservable)
4847
.filter { (_, vs) -> vs.photoItems.isEmpty() }
49-
.flatMap {
50-
rxObservable(dispatchers.main) {
51-
send(PartialStateChange.PhotoFirstPage.Loading)
52-
try {
53-
getPhotosUseCase(start = 0, limit = PAGE_SIZE)
54-
.map(::PhotoVS)
55-
.let { PartialStateChange.PhotoFirstPage.Data(it) }
56-
.let { send(it) }
57-
} catch (e: Exception) {
58-
send(PartialStateChange.PhotoFirstPage.Error(e))
59-
}
60-
}
61-
}
48+
.flatMap { interactor.photoFirstPageChanges(limit = PAGE_SIZE) }
6249
}
6350

6451
private val nextPageProcessor =
@@ -67,7 +54,7 @@ class MainVM @Inject constructor(
6754
.withLatestFrom(stateObservable)
6855
.filter { (_, vs) -> vs.canLoadNextPage() }
6956
.map { (_, vs) -> vs.photoItems.size }
70-
.exhaustMap(::nextPageChanges)
57+
.exhaustMap { interactor.photoNextPageChanges(start = it, limit = PAGE_SIZE) }
7158
}
7259

7360
private val retryLoadPageProcessor =
@@ -76,7 +63,7 @@ class MainVM @Inject constructor(
7663
.withLatestFrom(stateObservable)
7764
.filter { (_, vs) -> vs.shouldRetry() }
7865
.map { (_, vs) -> vs.photoItems.size }
79-
.exhaustMap(::nextPageChanges)
66+
.exhaustMap { interactor.photoNextPageChanges(start = it, limit = PAGE_SIZE) }
8067
}
8168

8269
private val toPartialStateChange =
@@ -109,21 +96,6 @@ class MainVM @Inject constructor(
10996
compositeDisposable.dispose()
11097
}
11198

112-
private fun nextPageChanges(start: Int): Observable<PartialStateChange.PhotoNextPage> {
113-
return rxObservable(dispatchers.main) {
114-
send(PartialStateChange.PhotoNextPage.Loading)
115-
try {
116-
getPhotosUseCase(start = start, limit = PAGE_SIZE)
117-
.map(::PhotoVS)
118-
.let { PartialStateChange.PhotoNextPage.Data(it) }
119-
.let { send(it) }
120-
} catch (e: Exception) {
121-
delay(1_000)
122-
send(PartialStateChange.PhotoNextPage.Error(e))
123-
}
124-
}
125-
}
126-
12799
private companion object {
128100
val intentFilter = ObservableTransformer<ViewIntent, ViewIntent> { intents ->
129101
intents.publish { shared ->

0 commit comments

Comments
 (0)