Skip to content

Commit 27994bb

Browse files
add pagination dependencies
1 parent 9a5e19c commit 27994bb

6 files changed

Lines changed: 129 additions & 4 deletions

File tree

features/home/src/main/java/com/smarttoolfactory/home/di/HomeComponent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.smarttoolfactory.home.di
22

33
import androidx.fragment.app.Fragment
44
import com.smarttoolfactory.core.di.CoreModuleDependencies
5+
import com.smarttoolfactory.home.propertylist.PagedPropertyListFragment
56
import com.smarttoolfactory.home.propertylist.PropertyListFlowFragment
67
import com.smarttoolfactory.home.propertylist.PropertyListRxjava3Fragment
78
import dagger.BindsInstance
@@ -15,6 +16,7 @@ interface HomeComponent {
1516

1617
fun inject(fragment: PropertyListFlowFragment)
1718
fun inject(fragment: PropertyListRxjava3Fragment)
19+
fun inject(fragment: PagedPropertyListFragment)
1820

1921
@Component.Factory
2022
interface Factory {

features/home/src/main/java/com/smarttoolfactory/home/di/HomeModule.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.smarttoolfactory.home.di
22

33
import androidx.fragment.app.Fragment
44
import androidx.lifecycle.ViewModelProvider
5+
import com.smarttoolfactory.home.viewmodel.PagedPropertyListViewModel
6+
import com.smarttoolfactory.home.viewmodel.PagedPropertyListViewModelFactory
57
import com.smarttoolfactory.home.viewmodel.PropertyListFlowViewModelFactory
68
import com.smarttoolfactory.home.viewmodel.PropertyListRxJava3ViewModelFactory
79
import com.smarttoolfactory.home.viewmodel.PropertyListViewModelFlow
@@ -18,13 +20,29 @@ import kotlinx.coroutines.SupervisorJob
1820
@Module
1921
class HomeModule {
2022

23+
/**
24+
* Property ViewModel that uses Flow for data operation
25+
*/
2126
@Provides
2227
fun providePropertyListViewModelFlow(
2328
fragment: Fragment,
2429
factory: PropertyListFlowViewModelFactory
2530
) =
2631
ViewModelProvider(fragment, factory).get(PropertyListViewModelFlow::class.java)
2732

33+
/**
34+
* Property ViewModel that uses Flow for data operation with Pagaination
35+
*/
36+
@Provides
37+
fun providePagedPropertyListViewModel(
38+
fragment: Fragment,
39+
factory: PagedPropertyListViewModelFactory
40+
) =
41+
ViewModelProvider(fragment, factory).get(PagedPropertyListViewModel::class.java)
42+
43+
/**
44+
* Property ViewModel that uses Rxjava for data operations
45+
*/
2846
@Provides
2947
fun providePropertyListViewModelRxJava3(
3048
fragment: Fragment,
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.smarttoolfactory.home.viewmodel
2+
3+
import androidx.hilt.lifecycle.ViewModelInject
4+
import androidx.lifecycle.LiveData
5+
import androidx.lifecycle.MutableLiveData
6+
import com.smarttoolfactory.core.util.Event
7+
import com.smarttoolfactory.core.util.convertToFlowViewState
8+
import com.smarttoolfactory.core.viewstate.Status
9+
import com.smarttoolfactory.core.viewstate.ViewState
10+
import com.smarttoolfactory.domain.ORDER_BY_NONE
11+
import com.smarttoolfactory.domain.model.PropertyItem
12+
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCasePaged
13+
import kotlinx.coroutines.CoroutineScope
14+
import kotlinx.coroutines.flow.launchIn
15+
import kotlinx.coroutines.flow.onEach
16+
import kotlinx.coroutines.flow.onStart
17+
18+
class PagedPropertyListViewModel @ViewModelInject constructor(
19+
private val coroutineScope: CoroutineScope,
20+
private val getPropertiesUseCase: GetPropertiesUseCasePaged
21+
) : AbstractPropertyListVM() {
22+
23+
private val _goToDetailScreen = MutableLiveData<Event<PropertyItem>>()
24+
25+
override val goToDetailScreen: LiveData<Event<PropertyItem>>
26+
get() = _goToDetailScreen
27+
28+
private val _propertyViewState = MutableLiveData<ViewState<List<PropertyItem>>>()
29+
30+
override val propertyListViewState: LiveData<ViewState<List<PropertyItem>>>
31+
get() = _propertyViewState
32+
33+
private var _orderByKey = ORDER_BY_NONE
34+
35+
var orderKey = MutableLiveData<String>().apply { value = _orderByKey }
36+
37+
init {
38+
updateOrderByKey()
39+
}
40+
41+
fun updateOrderByKey() {
42+
getPropertiesUseCase.getCurrentSortKey()
43+
.onEach {
44+
_orderByKey = it
45+
orderKey.value = _orderByKey
46+
}
47+
.launchIn(coroutineScope)
48+
}
49+
50+
override fun getPropertyList() {
51+
52+
getPropertiesUseCase.getPagedOfflineLast(_orderByKey)
53+
.convertToFlowViewState()
54+
.onStart {
55+
_propertyViewState.value = ViewState(status = Status.LOADING)
56+
}
57+
.onEach {
58+
_propertyViewState.value = it
59+
}
60+
.launchIn(coroutineScope)
61+
}
62+
63+
override fun refreshPropertyList(orderBy: String?) {
64+
65+
getPropertiesUseCase.refreshData(orderBy ?: _orderByKey)
66+
.convertToFlowViewState()
67+
.onStart {
68+
_propertyViewState.value = ViewState(status = Status.LOADING)
69+
}
70+
.onEach {
71+
_propertyViewState.value = it
72+
}
73+
.launchIn(coroutineScope)
74+
}
75+
76+
override fun onClick(item: PropertyItem) {
77+
_goToDetailScreen.value = Event(item)
78+
}
79+
80+
fun onLikeButtonClick(item: PropertyItem) {
81+
println("🔥 Like: $item")
82+
}
83+
}

features/home/src/main/java/com/smarttoolfactory/home/viewmodel/ViewModelFactory.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.smarttoolfactory.home.viewmodel
33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.ViewModelProvider
55
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseFlow
6+
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCasePaged
67
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseRxJava3
78
import javax.inject.Inject
89
import kotlinx.coroutines.CoroutineScope
@@ -26,6 +27,25 @@ class PropertyListFlowViewModelFactory @Inject constructor(
2627
}
2728
}
2829

30+
class PagedPropertyListViewModelFactory @Inject constructor(
31+
private val coroutineScope: CoroutineScope,
32+
private val getPropertiesUseCase: GetPropertiesUseCasePaged
33+
) : ViewModelProvider.Factory {
34+
35+
@Suppress("UNCHECKED_CAST")
36+
override fun <T : ViewModel> create(modelClass: Class<T>): T {
37+
38+
if (modelClass != PagedPropertyListViewModel::class.java) {
39+
throw IllegalArgumentException("Unknown ViewModel class")
40+
}
41+
42+
return PagedPropertyListViewModel(
43+
coroutineScope,
44+
getPropertiesUseCase
45+
) as T
46+
}
47+
}
48+
2949
class PropertyListRxJava3ViewModelFactory @Inject constructor(
3050
private val getPropertiesUseCase: GetPropertiesUseCaseRxJava3
3151
) : ViewModelProvider.Factory {

libraries/core/src/main/java/com/smarttoolfactory/core/di/CoreModuleDependencies.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.smarttoolfactory.core.di
22

33
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseFlow
4+
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCasePaged
45
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseRxJava3
56
import dagger.hilt.EntryPoint
67
import dagger.hilt.InstallIn
78
import dagger.hilt.android.components.ApplicationComponent
89

910
/**
10-
* This component is required for adding component to Dynamic Feature Module dependencies
11+
* This component is required for adding dependencies to Dy
1112
*/
1213
@EntryPoint
1314
@InstallIn(ApplicationComponent::class)
@@ -18,4 +19,5 @@ interface CoreModuleDependencies {
1819
*/
1920
fun getPropertiesUseCaseFlow(): GetPropertiesUseCaseFlow
2021
fun getPropertiesUseCaseRxJava3(): GetPropertiesUseCaseRxJava3
22+
fun getPropertiesUseCasePaged(): GetPropertiesUseCasePaged
2123
}

libraries/data/src/main/java/com/smarttoolfactory/data/db/PagedPropertyDao.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,20 @@ interface PagedPropertyDao {
1919
@Delete
2020
suspend fun deletePagedPropertyEntity(entity: PagedPropertyEntity): Int
2121

22-
@Query("DELETE FROM property")
22+
@Query("DELETE FROM paged_property")
2323
suspend fun deleteAll()
2424

2525
/**
2626
* Get number of properties in db
2727
*/
28-
@Query("SELECT COUNT(*) FROM property")
28+
@Query("SELECT COUNT(*) FROM paged_property")
2929
suspend fun getPropertyCount(): Int
3030

3131
/**
3232
* Get properties from database.
3333
*
3434
* *If database is empty returns empty list []
3535
*/
36-
@Query("SELECT * FROM property")
36+
@Query("SELECT * FROM paged_property")
3737
suspend fun getPropertyList(): List<PagedPropertyEntity>
3838
}

0 commit comments

Comments
 (0)