Skip to content

Commit ccd76ba

Browse files
add sorting options and dialog
1 parent 0050ba9 commit ccd76ba

8 files changed

Lines changed: 110 additions & 21 deletions

File tree

features/home/src/main/java/com/smarttoolfactory/home/HomeFragment.kt

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.smarttoolfactory.home
22

3-
import android.widget.Toast
3+
import android.app.Dialog
4+
import android.os.Bundle
5+
import androidx.appcompat.app.AlertDialog
6+
import androidx.fragment.app.DialogFragment
47
import androidx.fragment.app.Fragment
58
import androidx.fragment.app.activityViewModels
69
import androidx.lifecycle.Observer
10+
import androidx.lifecycle.ViewModelProvider
711
import androidx.navigation.NavController
812
import androidx.navigation.ui.AppBarConfiguration
913
import androidx.navigation.ui.setupWithNavController
@@ -16,6 +20,7 @@ import com.smarttoolfactory.core.util.Event
1620
import com.smarttoolfactory.core.viewmodel.NavControllerViewModel
1721
import com.smarttoolfactory.home.adapter.HomeViewPager2FragmentStateAdapter
1822
import com.smarttoolfactory.home.databinding.FragmentHomeBinding
23+
import com.smarttoolfactory.home.viewmodel.HomeToolbarVM
1924

2025
/**
2126
* Fragment that contains [ViewPager2] and [TabLayout].
@@ -37,8 +42,16 @@ class HomeFragment : DynamicNavigationFragment<FragmentHomeBinding>() {
3742

3843
override fun getLayoutRes(): Int = R.layout.fragment_home
3944

45+
/**
46+
* ViwModel for getting [NavController] for setting Toolbar navigation
47+
*/
4048
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
4149

50+
/**
51+
* ViewModel for setting sort filter on top menu and property list fragments
52+
*/
53+
private val toolbarVM by activityViewModels<HomeToolbarVM>()
54+
4255
override fun bindViews() {
4356

4457
// ViewPager2
@@ -59,19 +72,26 @@ class HomeFragment : DynamicNavigationFragment<FragmentHomeBinding>() {
5972

6073
dataBinding!!.toolbar.inflateMenu(R.menu.menu_home)
6174

75+
// Bind tabs and viewpager
76+
TabLayoutMediator(tabLayout, viewPager, tabConfigurationStrategy).attach()
77+
78+
setToolbarMenuItemListener()
79+
80+
subscribeAppbarNavigation()
81+
}
82+
83+
private fun setToolbarMenuItemListener() {
6284
dataBinding!!.toolbar.setOnMenuItemClickListener {
6385
if (it.itemId == R.id.menu_item_sort) {
64-
Toast.makeText(requireContext(), "Toast", Toast.LENGTH_SHORT).show()
86+
val dialogFragment = SortDialogFragment().show(
87+
requireActivity().supportFragmentManager,
88+
"sort-dialog"
89+
)
6590
true
6691
}
6792

6893
false
6994
}
70-
71-
// Bind tabs and viewpager
72-
TabLayoutMediator(tabLayout, viewPager, tabConfigurationStrategy).attach()
73-
74-
subscribeAppbarNavigation()
7595
}
7696

7797
private fun subscribeAppbarNavigation() {
@@ -125,3 +145,32 @@ class HomeFragment : DynamicNavigationFragment<FragmentHomeBinding>() {
125145
}
126146
}
127147
}
148+
149+
class SortDialogFragment : DialogFragment() {
150+
151+
private lateinit var viewModel: HomeToolbarVM
152+
153+
override fun onCreate(savedInstanceState: Bundle?) {
154+
super.onCreate(savedInstanceState)
155+
viewModel = ViewModelProvider(requireActivity()).get(HomeToolbarVM::class.java)
156+
}
157+
158+
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
159+
160+
val items = viewModel.sortPropertyList.toTypedArray()
161+
items[0] = "Featured"
162+
163+
val checkedItem = viewModel.sortPropertyList.indexOf(viewModel.currentSortFilter)
164+
165+
val builder = AlertDialog.Builder(requireActivity())
166+
builder.setTitle("Sorting")
167+
.setNegativeButton("CANCEL") { dialog, which ->
168+
dismiss()
169+
}
170+
.setSingleChoiceItems(items, checkedItem) { dialog, which ->
171+
viewModel.queryBySort.value = Event(viewModel.sortPropertyList[which])
172+
dismiss()
173+
}
174+
return builder.create()
175+
}
176+
}

features/home/src/main/java/com/smarttoolfactory/home/propertylist/PropertyListFlowFragment.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ package com.smarttoolfactory.home.propertylist
22

33
import android.os.Bundle
44
import androidx.core.os.bundleOf
5+
import androidx.fragment.app.activityViewModels
56
import androidx.recyclerview.widget.LinearLayoutManager
67
import com.smarttoolfactory.core.di.CoreModuleDependencies
78
import com.smarttoolfactory.core.ui.fragment.DynamicNavigationFragment
9+
import com.smarttoolfactory.core.util.observe
810
import com.smarttoolfactory.home.R
911
import com.smarttoolfactory.home.adapter.PropertyItemListAdapter
1012
import com.smarttoolfactory.home.databinding.FragmentPropertyListBinding
1113
import com.smarttoolfactory.home.di.DaggerHomeComponent
14+
import com.smarttoolfactory.home.viewmodel.HomeToolbarVM
1215
import com.smarttoolfactory.home.viewmodel.PropertyListViewModelFlow
1316
import dagger.hilt.android.EntryPointAccessors
1417
import javax.inject.Inject
@@ -18,6 +21,11 @@ class PropertyListFlowFragment : DynamicNavigationFragment<FragmentPropertyListB
1821
@Inject
1922
lateinit var viewModel: PropertyListViewModelFlow
2023

24+
/**
25+
* ViewModel for setting sort filter on top menu and property list fragments
26+
*/
27+
private val toolbarVM by activityViewModels<HomeToolbarVM>()
28+
2129
override fun getLayoutRes(): Int = R.layout.fragment_property_list
2230

2331
override fun onCreate(savedInstanceState: Bundle?) {
@@ -53,6 +61,17 @@ class PropertyListFlowFragment : DynamicNavigationFragment<FragmentPropertyListB
5361
}
5462

5563
subscribeGoToDetailScreen()
64+
65+
subscribeToolbarSortChange()
66+
}
67+
68+
private fun subscribeToolbarSortChange() {
69+
70+
viewLifecycleOwner.observe(toolbarVM.queryBySort) {
71+
it.getContentIfNotHandled()?.let { orderBy ->
72+
viewModel.refreshPropertyList(orderBy)
73+
}
74+
}
5675
}
5776

5877
private fun subscribeGoToDetailScreen() {

features/home/src/main/java/com/smarttoolfactory/home/propertylist/PropertyListRxjava3Fragment.kt

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

33
import android.os.Bundle
44
import androidx.core.os.bundleOf
5+
import androidx.fragment.app.activityViewModels
56
import androidx.recyclerview.widget.LinearLayoutManager
67
import com.smarttoolfactory.core.di.CoreModuleDependencies
78
import com.smarttoolfactory.core.ui.fragment.DynamicNavigationFragment
89
import com.smarttoolfactory.home.R
910
import com.smarttoolfactory.home.adapter.PropertyItemListAdapter
1011
import com.smarttoolfactory.home.databinding.FragmentPropertyListBinding
1112
import com.smarttoolfactory.home.di.DaggerHomeComponent
13+
import com.smarttoolfactory.home.viewmodel.HomeToolbarVM
1214
import com.smarttoolfactory.home.viewmodel.PropertyListViewModelRxJava3
1315
import dagger.hilt.android.EntryPointAccessors
1416
import javax.inject.Inject
@@ -18,6 +20,11 @@ class PropertyListRxjava3Fragment : DynamicNavigationFragment<FragmentPropertyLi
1820
@Inject
1921
lateinit var viewModel: PropertyListViewModelRxJava3
2022

23+
/**
24+
* ViewModel for setting sort filter on top menu and property list fragments
25+
*/
26+
private val toolbarVM by activityViewModels<HomeToolbarVM>()
27+
2128
override fun getLayoutRes(): Int = R.layout.fragment_property_list
2229

2330
override fun onCreate(savedInstanceState: Bundle?) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData
44
import androidx.lifecycle.ViewModel
55
import com.smarttoolfactory.core.util.Event
66
import com.smarttoolfactory.core.viewstate.ViewState
7+
import com.smarttoolfactory.domain.ORDER_BY_NONE
78
import com.smarttoolfactory.domain.model.PropertyItem
89

910
/**
@@ -20,9 +21,9 @@ abstract class AbstractPropertyListVM : ViewModel() {
2021

2122
abstract val propertyListViewState: LiveData<ViewState<List<PropertyItem>>>
2223

23-
abstract fun getPropertyList()
24+
abstract fun getPropertyList(orderBy: String = ORDER_BY_NONE)
2425

25-
abstract fun refreshPropertyList()
26+
abstract fun refreshPropertyList(orderBy: String = ORDER_BY_NONE)
2627

2728
abstract fun onClick(propertyItem: PropertyItem)
2829
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,23 @@ import androidx.hilt.lifecycle.ViewModelInject
44
import androidx.lifecycle.MutableLiveData
55
import androidx.lifecycle.ViewModel
66
import com.smarttoolfactory.core.util.Event
7+
import com.smarttoolfactory.domain.ORDER_BY_BEDS_ASCENDING
8+
import com.smarttoolfactory.domain.ORDER_BY_DES_DESCENDING
9+
import com.smarttoolfactory.domain.ORDER_BY_NONE
10+
import com.smarttoolfactory.domain.ORDER_BY_PRICE_ASCENDING
11+
import com.smarttoolfactory.domain.ORDER_BY_PRICE_DESCENDING
712

813
class HomeToolbarVM @ViewModelInject constructor() : ViewModel() {
914

10-
val setFilter = MutableLiveData<Event<String>>()
15+
var currentSortFilter = ORDER_BY_NONE
16+
17+
val sortPropertyList = listOf(
18+
ORDER_BY_NONE,
19+
ORDER_BY_PRICE_ASCENDING,
20+
ORDER_BY_PRICE_DESCENDING,
21+
ORDER_BY_BEDS_ASCENDING,
22+
ORDER_BY_DES_DESCENDING
23+
)
24+
25+
val queryBySort = MutableLiveData<Event<String>>()
1126
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.smarttoolfactory.core.viewstate.Status
99
import com.smarttoolfactory.core.viewstate.ViewState
1010
import com.smarttoolfactory.domain.model.PropertyItem
1111
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseFlow
12-
import com.smarttoolfactory.propertyfindar.ORDER_BY_NONE
1312
import kotlinx.coroutines.CoroutineScope
1413
import kotlinx.coroutines.flow.launchIn
1514
import kotlinx.coroutines.flow.onEach
@@ -41,9 +40,9 @@ class PropertyListViewModelFlow @ViewModelInject constructor(
4140
* * If both network and db don't have any data throw empty set exception
4241
*
4342
*/
44-
override fun getPropertyList() {
43+
override fun getPropertyList(orderBy: String) {
4544

46-
getPropertiesUseCase.getPropertiesOfflineFirst(orderBy = ORDER_BY_NONE)
45+
getPropertiesUseCase.getPropertiesOfflineFirst(orderBy)
4746
.convertToFlowViewState()
4847
.onStart {
4948
_propertyViewState.value = ViewState(status = Status.LOADING)
@@ -54,8 +53,8 @@ class PropertyListViewModelFlow @ViewModelInject constructor(
5453
.launchIn(coroutineScope)
5554
}
5655

57-
override fun refreshPropertyList() {
58-
getPropertiesUseCase.getPropertiesOfflineLast("")
56+
override fun refreshPropertyList(orderBy: String) {
57+
getPropertiesUseCase.getPropertiesOfflineLast(orderBy)
5958
.convertToFlowViewState()
6059
.onStart {
6160
_propertyViewState.value = ViewState(status = Status.LOADING)

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.smarttoolfactory.core.viewstate.Status
99
import com.smarttoolfactory.core.viewstate.ViewState
1010
import com.smarttoolfactory.domain.model.PropertyItem
1111
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseRxJava3
12-
import com.smarttoolfactory.propertyfindar.ORDER_BY_NONE
1312
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
1413

1514
class PropertyListViewModelRxJava3 @ViewModelInject constructor(
@@ -26,8 +25,8 @@ class PropertyListViewModelRxJava3 @ViewModelInject constructor(
2625
override val propertyListViewState: LiveData<ViewState<List<PropertyItem>>>
2726
get() = _propertyListViewState
2827

29-
override fun getPropertyList() {
30-
getPropertiesUseCase.getPropertiesOfflineFirst((ORDER_BY_NONE))
28+
override fun getPropertyList(orderBy: String) {
29+
getPropertiesUseCase.getPropertiesOfflineFirst((orderBy))
3130
.convertFromSingleToObservableViewStateWithLoading()
3231
.observeOn(AndroidSchedulers.mainThread())
3332
.subscribe(
@@ -40,8 +39,8 @@ class PropertyListViewModelRxJava3 @ViewModelInject constructor(
4039
)
4140
}
4241

43-
override fun refreshPropertyList() {
44-
getPropertiesUseCase.getPropertiesOfflineLast(ORDER_BY_NONE)
42+
override fun refreshPropertyList(orderBy: String) {
43+
getPropertiesUseCase.getPropertiesOfflineLast(orderBy)
4544
.convertFromSingleToObservableViewStateWithLoading()
4645
.observeOn(AndroidSchedulers.mainThread())
4746
.subscribe(

app/src/main/java/com/smarttoolfactory/propertyfindar/Constants.kt renamed to libraries/domain/src/main/java/com/smarttoolfactory/domain/Constants.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.smarttoolfactory.propertyfindar
1+
package com.smarttoolfactory.domain
22

33
const val ORDER_BY_NONE = com.smarttoolfactory.data.constant.ORDER_BY_NONE
44
const val ORDER_BY_PRICE_ASCENDING = com.smarttoolfactory.data.constant.ORDER_BY_PRICE_ASCENDING

0 commit comments

Comments
 (0)