Skip to content

Commit d6b5c3b

Browse files
Rename appbarViewModel to NavControllerViewModel and small changes
1 parent 657dbf0 commit d6b5c3b

File tree

26 files changed

+172
-45
lines changed

26 files changed

+172
-45
lines changed

Tutorial7-2BNV-ViewPager2-ComplexArchitecture/src/main/java/com/smarttoolfactory/tutorial7_2bnv_viewpager2_complexarchitecture/factory/NavHostFragmentFactory.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.annotation.IdRes
44
import androidx.annotation.LayoutRes
55
import androidx.fragment.app.Fragment
66
import androidx.fragment.app.FragmentFactory
7-
import com.smarttoolfactory.tutorial7_2bnv_viewpager2_complexarchitecture.navhost.GenericNavHostFragment
7+
import com.smarttoolfactory.tutorial7_2bnv_viewpager2_complexarchitecture.navhost.NavHostContainerFragment
88

99
class NavHostFragmentFactory private constructor() : FragmentFactory() {
1010

@@ -35,7 +35,7 @@ class NavHostFragmentFactory private constructor() : FragmentFactory() {
3535
// println("⚠️😱 NavHostFragment instantiate() layoutRes: ${this.layoutRes}, navHostFragmentId: ${this.navHostFragmentId}")
3636

3737
return when (className) {
38-
GenericNavHostFragment::class.java.name -> GenericNavHostFragment(
38+
NavHostContainerFragment::class.java.name -> NavHostContainerFragment(
3939
layoutRes,
4040
navHostFragmentId
4141
)
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,21 @@ import androidx.annotation.LayoutRes
99
import androidx.databinding.DataBindingUtil
1010
import androidx.databinding.ViewDataBinding
1111
import androidx.fragment.app.Fragment
12+
import androidx.fragment.app.FragmentFactory
1213
import androidx.fragment.app.activityViewModels
1314
import androidx.navigation.NavController
1415
import androidx.navigation.fragment.NavHostFragment
1516
import com.smarttoolfactory.tutorial7_2bnv_viewpager2_complexarchitecture.util.Event
1617
import com.smarttoolfactory.tutorial7_2bnv_viewpager2_complexarchitecture.viewmodel.AppbarViewModel
1718

18-
19-
class GenericNavHostFragment(
19+
/**
20+
* Fragment created via layout resource that belong to a layout that contains a [NavHostFragment]
21+
*
22+
* Requires a [FragmentFactory] to be able to create this fragment which does not posses
23+
* an empty constructor.
24+
*
25+
*/
26+
class NavHostContainerFragment(
2027
@LayoutRes private val layoutRes: Int,
2128
@IdRes private val navHostFragmentId: Int
2229
) : Fragment() {
@@ -25,7 +32,6 @@ class GenericNavHostFragment(
2532

2633
private lateinit var navController: NavController
2734

28-
2935
override fun onCreateView(
3036
inflater: LayoutInflater,
3137
container: ViewGroup?,
@@ -63,7 +69,4 @@ class GenericNavHostFragment(
6369
appbarViewModel.currentNavController.value = Event(it)
6470
}
6571
}
66-
67-
68-
}
69-
72+
}

Tutorial7-3BNV-ViewPager2-FragmentToolbar-MixedNavigation/src/main/java/com/smarttoolfactory/tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation/fragment/blankfragment/LoginFragment1.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ import androidx.navigation.fragment.NavHostFragment
77
import androidx.navigation.fragment.findNavController
88
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.R
99
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.databinding.FragmentLogin1Binding
10-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.main.MainFragment
1110
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.viewpagerfragment.ViewPagerContainerFragment
1211
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
13-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
12+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
1413

1514
/**
1615
* This fragment is added to graph via [ViewPagerContainerFragment]'s [NavHostFragment]
@@ -19,7 +18,7 @@ class LoginFragment1 : BaseDataBindingFragment<FragmentLogin1Binding>() {
1918

2019
override fun getLayoutRes(): Int = R.layout.fragment_login1
2120

22-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
21+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
2322

2423

2524
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -34,7 +33,7 @@ class LoginFragment1 : BaseDataBindingFragment<FragmentLogin1Binding>() {
3433
override fun onResume() {
3534
super.onResume()
3635
// Set this navController as ViewModel's navController
37-
appbarViewModel.currentNavController.value = Event(findNavController())
36+
navControllerViewModel.currentNavController.value = Event(findNavController())
3837
}
3938

4039
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.factory
2+
3+
import androidx.annotation.IdRes
4+
import androidx.annotation.LayoutRes
5+
import androidx.fragment.app.Fragment
6+
import androidx.fragment.app.FragmentFactory
7+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.navhost.NavHostContainerFragment
8+
9+
class NavHostFragmentFactory private constructor() : FragmentFactory() {
10+
11+
@LayoutRes
12+
private var layoutRes: Int = -1
13+
14+
@IdRes
15+
private var navHostFragmentId: Int = -1
16+
17+
fun createNavHostFragment(
18+
classLoader: ClassLoader,
19+
className: String,
20+
@LayoutRes layoutRes: Int,
21+
@IdRes navHostFragmentId: Int
22+
): Fragment {
23+
24+
this.layoutRes = layoutRes
25+
this.navHostFragmentId = navHostFragmentId
26+
27+
// println("🔥🔥 NavHostFragment creteNavHostFragment() layoutRes: ${this.layoutRes}, navHostFragmentId: ${this.navHostFragmentId}")
28+
29+
return instantiate(classLoader, className)
30+
}
31+
32+
33+
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
34+
35+
// println("⚠️😱 NavHostFragment instantiate() layoutRes: ${this.layoutRes}, navHostFragmentId: ${this.navHostFragmentId}")
36+
37+
return when (className) {
38+
NavHostContainerFragment::class.java.name -> NavHostContainerFragment(
39+
layoutRes,
40+
navHostFragmentId
41+
)
42+
else -> super.instantiate(classLoader, className)
43+
}
44+
}
45+
46+
47+
companion object {
48+
49+
private val navHostFragmentFactory: NavHostFragmentFactory by lazy {
50+
NavHostFragmentFactory()
51+
}
52+
53+
const val KEY_RES_ID = "key-res-id"
54+
const val KEY_NAV_HOST_ID = "key-nav-host-id"
55+
56+
@JvmStatic
57+
fun create(): NavHostFragmentFactory {
58+
return navHostFragmentFactory
59+
}
60+
61+
}
62+
63+
}

Tutorial7-3BNV-ViewPager2-FragmentToolbar-MixedNavigation/src/main/java/com/smarttoolfactory/tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation/fragment/main/MainFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavig
1313
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.blankfragment.BaseDataBindingFragment
1414
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.setupWithNavController
1515
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
16-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
16+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
1717

1818

1919
class MainFragment : BaseDataBindingFragment<FragmentMainBinding>() {
2020
override fun getLayoutRes(): Int = R.layout.fragment_main
2121

22-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
22+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
2323

2424
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2525
super.onViewCreated(view, savedInstanceState)
@@ -76,7 +76,7 @@ class MainFragment : BaseDataBindingFragment<FragmentMainBinding>() {
7676
}
7777

7878
private fun subscribeAppbarNavigation() {
79-
appbarViewModel.currentNavController.observe(viewLifecycleOwner, Observer { it ->
79+
navControllerViewModel.currentNavController.observe(viewLifecycleOwner, Observer { it ->
8080

8181
it?.let { event: Event<NavController> ->
8282
event.getContentIfNotHandled()?.let { navController ->

Tutorial7-3BNV-ViewPager2-FragmentToolbar-MixedNavigation/src/main/java/com/smarttoolfactory/tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation/fragment/navhost/DashBoardNavHostFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavig
99
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.databinding.FragmentNavhostDashboardBinding
1010
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.blankfragment.BaseDataBindingFragment
1111
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
12-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
12+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
1313

1414

1515
class DashBoardNavHostFragment : BaseDataBindingFragment<FragmentNavhostDashboardBinding>() {
1616
override fun getLayoutRes(): Int = R.layout.fragment_navhost_dashboard
1717

18-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
18+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
1919

2020
private var navController: NavController? = null
2121

@@ -34,7 +34,7 @@ class DashBoardNavHostFragment : BaseDataBindingFragment<FragmentNavhostDashboar
3434

3535
// Set this navController as ViewModel's navController
3636
navController?.let {
37-
appbarViewModel.currentNavController.value = Event(it)
37+
navControllerViewModel.currentNavController.value = Event(it)
3838
}
3939
}
4040

Original file line numberDiff line numberDiff line change
@@ -9,23 +9,31 @@ import androidx.annotation.LayoutRes
99
import androidx.databinding.DataBindingUtil
1010
import androidx.databinding.ViewDataBinding
1111
import androidx.fragment.app.Fragment
12+
import androidx.fragment.app.FragmentFactory
1213
import androidx.fragment.app.activityViewModels
1314
import androidx.navigation.NavController
1415
import androidx.navigation.fragment.NavHostFragment
16+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.R
1517
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
16-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
17-
18-
19-
class GenericNavHostFragment(
18+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
19+
import kotlin.reflect.KProperty
20+
21+
/**
22+
* Fragment created via layout resource that belong to a layout that contains a [NavHostFragment]
23+
*
24+
* Requires a [FragmentFactory] to be able to create this fragment which does not posses
25+
* an empty constructor.
26+
*
27+
*/
28+
class NavHostContainerFragment(
2029
@LayoutRes private val layoutRes: Int,
2130
@IdRes private val navHostFragmentId: Int
2231
) : Fragment() {
2332

24-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
33+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
2534

2635
private lateinit var navController: NavController
2736

28-
2937
override fun onCreateView(
3038
inflater: LayoutInflater,
3139
container: ViewGroup?,
@@ -60,9 +68,28 @@ class GenericNavHostFragment(
6068

6169
// Set this navController as ViewModel's navController
6270
navController?.let {
63-
appbarViewModel.currentNavController.value = Event(it)
71+
navControllerViewModel.currentNavController.value = Event(it)
6472
}
6573
}
6674

6775
}
6876

77+
var NavHostFragment.viewModel: NavControllerViewModel by FieldProperty {
78+
NavControllerViewModel()
79+
}
80+
81+
82+
83+
class FieldProperty<R, T : Any>(
84+
val initializer: (R) -> T = { throw IllegalStateException("Not initialized.") }
85+
) {
86+
private val map = HashMap<R, T>()
87+
88+
operator fun getValue(thisRef: R, property: KProperty<*>): T =
89+
map[thisRef] ?: setValue(thisRef, property, initializer(thisRef))
90+
91+
operator fun setValue(thisRef: R, property: KProperty<*>, value: T): T {
92+
map[thisRef] = value
93+
return value
94+
}
95+
}

Tutorial7-3BNV-ViewPager2-FragmentToolbar-MixedNavigation/src/main/java/com/smarttoolfactory/tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation/fragment/navhost/NotificationHostFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavig
99
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.blankfragment.BaseDataBindingFragment
1010
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.databinding.FragmentNavhostNotificationBinding
1111
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
12-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
12+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
1313

1414

1515
class NotificationHostFragment : BaseDataBindingFragment<FragmentNavhostNotificationBinding>() {
1616
override fun getLayoutRes(): Int = R.layout.fragment_navhost_notification
1717

18-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
18+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
1919

2020
private var navController: NavController? = null
2121

@@ -35,7 +35,7 @@ class NotificationHostFragment : BaseDataBindingFragment<FragmentNavhostNotifica
3535

3636
// Set this navController as ViewModel's navController
3737
navController?.let {
38-
appbarViewModel.currentNavController.value = Event(it)
38+
navControllerViewModel.currentNavController.value = Event(it)
3939
}
4040
}
4141

Tutorial7-3BNV-ViewPager2-FragmentToolbar-MixedNavigation/src/main/java/com/smarttoolfactory/tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation/fragment/navhost/PostGridNavHostFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavig
99
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.blankfragment.BaseDataBindingFragment
1010
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.databinding.FragmentNavhostPostHorizontalBinding
1111
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
12-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
12+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
1313

1414

1515
class PostGridNavHostFragment :
1616
BaseDataBindingFragment<FragmentNavhostPostHorizontalBinding>() {
1717
override fun getLayoutRes(): Int = R.layout.fragment_navhost_post_grid
1818

19-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
19+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
2020

2121
private var navController: NavController? = null
2222

@@ -37,7 +37,7 @@ class PostGridNavHostFragment :
3737

3838
// Set this navController as ViewModel's navController
3939
navController?.let {
40-
appbarViewModel.currentNavController.value = Event(it)
40+
navControllerViewModel.currentNavController.value = Event(it)
4141
}
4242
}
4343

Tutorial7-3BNV-ViewPager2-FragmentToolbar-MixedNavigation/src/main/java/com/smarttoolfactory/tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation/fragment/navhost/PostHorizontalNavHostFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavig
99
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.blankfragment.BaseDataBindingFragment
1010
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.databinding.FragmentNavhostPostHorizontalBinding
1111
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
12-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
12+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
1313

1414

1515
class PostHorizontalNavHostFragment :
1616
BaseDataBindingFragment<FragmentNavhostPostHorizontalBinding>() {
1717
override fun getLayoutRes(): Int = R.layout.fragment_navhost_post_horizontal
1818

19-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
19+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
2020

2121
private var navController: NavController? = null
2222

@@ -37,7 +37,7 @@ class PostHorizontalNavHostFragment :
3737

3838
// Set this navController as ViewModel's navController
3939
navController?.let {
40-
appbarViewModel.currentNavController.value = Event(it)
40+
navControllerViewModel.currentNavController.value = Event(it)
4141
}
4242
}
4343

Tutorial7-3BNV-ViewPager2-FragmentToolbar-MixedNavigation/src/main/java/com/smarttoolfactory/tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation/fragment/navhost/PostStaggeredNavHostFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavig
99
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.databinding.FragmentNavhostPostStaggeredBinding
1010
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.fragment.blankfragment.BaseDataBindingFragment
1111
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.util.Event
12-
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.AppbarViewModel
12+
import com.smarttoolfactory.tutorial7_3bnv_viewpager2_fragmenttoolbar_mixednavigation.viewmodel.NavControllerViewModel
1313

1414

1515
class PostStaggeredNavHostFragment :
1616
BaseDataBindingFragment<FragmentNavhostPostStaggeredBinding>() {
1717
override fun getLayoutRes(): Int = R.layout.fragment_navhost_post_staggered
1818

19-
private val appbarViewModel by activityViewModels<AppbarViewModel>()
19+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
2020

2121
private var navController: NavController? = null
2222

@@ -37,7 +37,7 @@ class PostStaggeredNavHostFragment :
3737

3838
// Set this navController as ViewModel's navController
3939
navController?.let {
40-
appbarViewModel.currentNavController.value = Event(it)
40+
navControllerViewModel.currentNavController.value = Event(it)
4141
}
4242
}
4343

0 commit comments

Comments
 (0)