Skip to content

Commit d125cbf

Browse files
Merge branch 'release/v0.9.0'
2 parents 8d1f1ae + 1779dab commit d125cbf

30 files changed

Lines changed: 877 additions & 170 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/adapter/PropertyListAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class PropertyItemDiffCallback : DiffUtil.ItemCallback<PropertyItem>() {
8282
oldItem: PropertyItem,
8383
newItem: PropertyItem
8484
): Boolean {
85-
return oldItem == newItem
85+
return oldItem === newItem
8686
}
8787

8888
override fun areContentsTheSame(

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

Lines changed: 47 additions & 6 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,13 @@ class PropertyListFlowFragment : DynamicNavigationFragment<FragmentPropertyListB
1821
@Inject
1922
lateinit var viewModel: PropertyListViewModelFlow
2023

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

2333
override fun onCreate(savedInstanceState: Bundle?) {
@@ -36,13 +46,13 @@ class PropertyListFlowFragment : DynamicNavigationFragment<FragmentPropertyListB
3646
LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
3747

3848
// Set RecyclerViewAdapter
39-
this.adapter =
40-
PropertyItemListAdapter(
41-
R.layout.row_property,
42-
viewModel::onClick,
43-
viewModel::onLikeButtonClick
49+
itemListAdapter = PropertyItemListAdapter(
50+
R.layout.row_property,
51+
viewModel::onClick,
52+
viewModel::onLikeButtonClick
4453

45-
)
54+
)
55+
this.adapter = itemListAdapter
4656
}
4757

4858
val swipeRefreshLayout = dataBinding.swipeRefreshLayout
@@ -52,9 +62,30 @@ class PropertyListFlowFragment : DynamicNavigationFragment<FragmentPropertyListB
5262
viewModel.refreshPropertyList()
5363
}
5464

65+
subscribeViewModelSortChange()
66+
5567
subscribeGoToDetailScreen()
5668
}
5769

70+
/**
71+
* When sort key is fetched from database change the one belong to Toolbar
72+
*/
73+
private fun subscribeViewModelSortChange() {
74+
viewLifecycleOwner.observe(viewModel.orderKey) {
75+
toolbarVM.currentSortFilter = it
76+
}
77+
}
78+
79+
private fun subscribeToolbarSortChange() {
80+
81+
viewLifecycleOwner.observe(toolbarVM.queryBySort) {
82+
it.getContentIfNotHandled()?.let { orderBy ->
83+
viewModel.refreshPropertyList(orderBy)
84+
toolbarVM.currentSortFilter = orderBy
85+
}
86+
}
87+
}
88+
5889
private fun subscribeGoToDetailScreen() {
5990

6091
viewModel.goToDetailScreen.observe(
@@ -81,4 +112,14 @@ class PropertyListFlowFragment : DynamicNavigationFragment<FragmentPropertyListB
81112
)
82113
.inject(this)
83114
}
115+
116+
override fun onResume() {
117+
super.onResume()
118+
subscribeToolbarSortChange()
119+
}
120+
121+
override fun onPause() {
122+
super.onPause()
123+
toolbarVM.queryBySort.removeObservers(viewLifecycleOwner)
124+
}
84125
}

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

Lines changed: 47 additions & 6 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.PropertyListViewModelRxJava3
1316
import dagger.hilt.android.EntryPointAccessors
1417
import javax.inject.Inject
@@ -18,6 +21,13 @@ class PropertyListRxjava3Fragment : DynamicNavigationFragment<FragmentPropertyLi
1821
@Inject
1922
lateinit var viewModel: PropertyListViewModelRxJava3
2023

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

2333
override fun onCreate(savedInstanceState: Bundle?) {
@@ -36,13 +46,13 @@ class PropertyListRxjava3Fragment : DynamicNavigationFragment<FragmentPropertyLi
3646
LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
3747

3848
// Set RecyclerViewAdapter
39-
this.adapter =
40-
PropertyItemListAdapter(
41-
R.layout.row_property,
42-
viewModel::onClick,
43-
viewModel::onLikeButtonClick
49+
itemListAdapter = PropertyItemListAdapter(
50+
R.layout.row_property,
51+
viewModel::onClick,
52+
viewModel::onLikeButtonClick
4453

45-
)
54+
)
55+
this.adapter = itemListAdapter
4656
}
4757

4858
val swipeRefreshLayout = dataBinding.swipeRefreshLayout
@@ -52,9 +62,30 @@ class PropertyListRxjava3Fragment : DynamicNavigationFragment<FragmentPropertyLi
5262
viewModel.refreshPropertyList()
5363
}
5464

65+
subscribeViewModelSortChange()
66+
5567
subscribeGoToDetailScreen()
5668
}
5769

70+
/**
71+
* When sort key is fetched from database change the one belong to Toolbar
72+
*/
73+
private fun subscribeViewModelSortChange() {
74+
viewLifecycleOwner.observe(viewModel.orderKey) {
75+
toolbarVM.currentSortFilter = it
76+
}
77+
}
78+
79+
private fun subscribeToolbarSortChange() {
80+
81+
viewLifecycleOwner.observe(toolbarVM.queryBySort) {
82+
it.getContentIfNotHandled()?.let { orderBy ->
83+
viewModel.refreshPropertyList(orderBy)
84+
toolbarVM.currentSortFilter = orderBy
85+
}
86+
}
87+
}
88+
5889
private fun subscribeGoToDetailScreen() {
5990

6091
viewModel.goToDetailScreen.observe(
@@ -81,4 +112,14 @@ class PropertyListRxjava3Fragment : DynamicNavigationFragment<FragmentPropertyLi
81112
)
82113
.inject(this)
83114
}
115+
116+
override fun onResume() {
117+
super.onResume()
118+
subscribeToolbarSortChange()
119+
}
120+
121+
override fun onPause() {
122+
super.onPause()
123+
toolbarVM.queryBySort.removeObservers(viewLifecycleOwner)
124+
}
84125
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ abstract class AbstractPropertyListVM : ViewModel() {
2020

2121
abstract val propertyListViewState: LiveData<ViewState<List<PropertyItem>>>
2222

23+
/**
24+
* Used when fragment is just opened
25+
*/
2326
abstract fun getPropertyList()
2427

25-
abstract fun refreshPropertyList()
28+
abstract fun refreshPropertyList(orderBy: String? = null)
2629

2730
abstract fun onClick(propertyItem: PropertyItem)
2831
}

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
}

0 commit comments

Comments
 (0)