Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit cb4152f

Browse files
Merge branch 'feature/dynamic-feature-module-separation' into develop
2 parents fbc53fa + 4e1db0c commit cb4152f

File tree

74 files changed

+1657
-374
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+1657
-374
lines changed

‎app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ android {
9595
jvmTarget = "1.8"
9696
}
9797
dynamicFeatures = mutableSetOf(
98+
Modules.DynamicFeature.HOME,
9899
Modules.DynamicFeature.POST_DETAIL,
99100
Modules.DynamicFeature.SEARCH,
100101
Modules.DynamicFeature.DASHBOARD,

‎app/src/main/java/com/smarttoolfactory/postdynamichilt/home/HomeFragment.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

‎app/src/main/java/com/smarttoolfactory/postdynamichilt/main/MainFragment.kt

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ package com.smarttoolfactory.postdynamichilt.main
33
import android.os.Bundle
44
import android.view.View
55
import androidx.navigation.fragment.findNavController
6-
import com.smarttoolfactory.core.ui.fragment.BaseDataBindingFragment
6+
import com.smarttoolfactory.core.ui.fragment.DynamicNavigationFragment
77
import com.smarttoolfactory.postdynamichilt.R
88
import com.smarttoolfactory.postdynamichilt.databinding.FragmentMainBinding
9-
import com.smarttoolfactory.postdynamichilt.ui.DynamicBottomNavigationStateAdapter
9+
import com.smarttoolfactory.postdynamichilt.ui.BottomNavigationFragmentStateAdapter
1010

11-
class MainFragment : BaseDataBindingFragment<FragmentMainBinding>() {
11+
class MainFragment : DynamicNavigationFragment<FragmentMainBinding>() {
1212

1313
override fun getLayoutRes(): Int = R.layout.fragment_main
1414

@@ -27,24 +27,24 @@ class MainFragment : BaseDataBindingFragment<FragmentMainBinding>() {
2727

2828
// Set viewpager adapter
2929
viewPager2.adapter =
30-
DynamicBottomNavigationStateAdapter(childFragmentManager, viewLifecycleOwner.lifecycle)
30+
BottomNavigationFragmentStateAdapter(childFragmentManager, viewLifecycleOwner.lifecycle)
3131

3232
// Listen bottom navigation tabs change
3333
bottomNavigationView.setOnNavigationItemSelectedListener {
3434

3535
when (it.itemId) {
3636

37-
R.id.nav_graph_home -> {
37+
R.id.nav_graph_dfm_home_start -> {
3838
viewPager2.setCurrentItem(0, false)
3939
return@setOnNavigationItemSelectedListener true
4040
}
4141

42-
R.id.nav_graph_dashboard_start -> {
42+
R.id.nav_graph_dfm_dashboard_start -> {
4343
viewPager2.setCurrentItem(1, false)
4444
return@setOnNavigationItemSelectedListener true
4545
}
4646

47-
R.id.nav_graph_notification -> {
47+
R.id.nav_graph_dfm_notification_start -> {
4848
viewPager2.setCurrentItem(2, false)
4949
return@setOnNavigationItemSelectedListener true
5050
}
@@ -58,10 +58,6 @@ class MainFragment : BaseDataBindingFragment<FragmentMainBinding>() {
5858
false
5959
}
6060

61-
override fun bindViews() {
62-
println("")
63-
}
64-
6561
override fun onDestroyView() {
6662

6763
val viewPager2 = dataBinding?.viewPager

‎app/src/main/java/com/smarttoolfactory/postdynamichilt/main/MainFragmentBottomNav.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,22 @@ package com.smarttoolfactory.postdynamichilt.main
22

33
import android.os.Bundle
44
import android.view.View
5-
import com.smarttoolfactory.core.ui.fragment.BaseDataBindingFragment
5+
import androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment
6+
import com.google.android.material.bottomnavigation.BottomNavigationView
7+
import com.smarttoolfactory.core.ui.fragment.DynamicNavigationFragment
8+
import com.smarttoolfactory.core.ui.fragment.navhost.BaseDynamicNavHostFragment
69
import com.smarttoolfactory.core.util.setupWithNavController
710
import com.smarttoolfactory.postdynamichilt.R
811
import com.smarttoolfactory.postdynamichilt.databinding.FragmentMainBottomNavBinding
912

10-
class MainFragmentBottomNav : BaseDataBindingFragment<FragmentMainBottomNavBinding>() {
13+
/**
14+
* Alternative of MainFragment with only [BottomNavigationView]
15+
* that has [DynamicNavHostFragment]s as root fragment of each
16+
* tab with [BaseDynamicNavHostFragment]s that extend [DynamicNavHostFragment].
17+
*
18+
*
19+
*/
20+
class MainFragmentBottomNav : DynamicNavigationFragment<FragmentMainBottomNavBinding>() {
1121
override fun getLayoutRes(): Int = R.layout.fragment_main_bottom_nav
1222

1323
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -34,10 +44,10 @@ class MainFragmentBottomNav : BaseDataBindingFragment<FragmentMainBottomNavBindi
3444
val bottomNavigationView = dataBinding!!.bottomNav
3545

3646
val navGraphIds = listOf(
37-
R.navigation.nav_graph_home,
38-
R.navigation.nav_graph_dashboard_start,
39-
R.navigation.nav_graph_notification_start,
40-
R.navigation.nav_graph_account_start
47+
R.navigation.nav_graph_dfm_home_start,
48+
R.navigation.nav_graph_dfm_dashboard_start,
49+
R.navigation.nav_graph_dfm_notification_start,
50+
R.navigation.nav_graph_dfm_account_start
4151
)
4252

4353
// Setup the bottom navigation view with a list of navigation graphs
@@ -48,8 +58,4 @@ class MainFragmentBottomNav : BaseDataBindingFragment<FragmentMainBottomNavBindi
4858
intent = requireActivity().intent
4959
)
5060
}
51-
52-
override fun bindViews() {
53-
println("")
54-
}
5561
}

‎app/src/main/java/com/smarttoolfactory/postdynamichilt/main/MainFragmentViewPager2.kt

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,94 @@ package com.smarttoolfactory.postdynamichilt.main
22

33
import android.os.Bundle
44
import android.view.View
5+
import androidx.fragment.app.activityViewModels
6+
import androidx.lifecycle.Observer
7+
import androidx.navigation.NavController
8+
import androidx.navigation.ui.AppBarConfiguration
9+
import androidx.navigation.ui.setupWithNavController
10+
import com.google.android.material.tabs.TabLayoutMediator
511
import com.smarttoolfactory.core.ui.fragment.DynamicNavigationFragment
12+
import com.smarttoolfactory.core.util.Event
13+
import com.smarttoolfactory.core.viewmodel.NavControllerViewModel
614
import com.smarttoolfactory.postdynamichilt.R
715
import com.smarttoolfactory.postdynamichilt.databinding.FragmentMainViewpager2Binding
8-
import com.smarttoolfactory.postdynamichilt.ui.DynamicFragmentStateAdapter
16+
import com.smarttoolfactory.postdynamichilt.ui.BottomNavigationFragmentStateAdapter
917

1018
class MainFragmentViewPager2 : DynamicNavigationFragment<FragmentMainViewpager2Binding>() {
1119

1220
override fun getLayoutRes(): Int = R.layout.fragment_main_viewpager2
1321

22+
private val navControllerViewModel by activityViewModels<NavControllerViewModel>()
23+
1424
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1525
super.onViewCreated(view, savedInstanceState)
1626

17-
val binding = dataBinding!!
27+
// ViewPager2
28+
val viewPager = dataBinding!!.viewPager
29+
30+
// TabLayout
31+
val tabLayout = dataBinding!!.tabLayout
32+
33+
/*
34+
Set Adapter for ViewPager inside this fragment using this Fragment,
35+
more specifically childFragmentManager as param
1836
19-
val viewPager2 = binding.viewPager
37+
🔥 Create FragmentStateAdapter with viewLifeCycleOwner
38+
https://stackoverflow.com/questions/61779776/leak-canary-detects-memory-leaks-for-tablayout-with-viewpager2
39+
*/
40+
viewPager.adapter =
41+
BottomNavigationFragmentStateAdapter(childFragmentManager, viewLifecycleOwner.lifecycle)
2042

21-
// Cancel ViewPager swipe
22-
viewPager2.isUserInputEnabled =false
43+
// Bind tabs and viewpager
44+
TabLayoutMediator(tabLayout, viewPager, tabConfigurationStrategy).attach()
2345

24-
// Set viewpager adapter
25-
viewPager2.adapter =
26-
DynamicFragmentStateAdapter(childFragmentManager, viewLifecycleOwner.lifecycle)
46+
subscribeAppbarNavigation()
2747
}
2848

29-
override fun bindViews() {
30-
println("")
49+
private fun subscribeAppbarNavigation() {
50+
navControllerViewModel.currentNavController.observe(
51+
viewLifecycleOwner,
52+
Observer { it ->
53+
54+
it?.let { event: Event<NavController?> ->
55+
event.getContentIfNotHandled()?.let { navController ->
56+
val appBarConfig = AppBarConfiguration(navController.graph)
57+
dataBinding!!.toolbar.setupWithNavController(navController, appBarConfig)
58+
}
59+
}
60+
}
61+
)
3162
}
3263

3364
override fun onDestroyView() {
3465

35-
val viewPager2 = dataBinding?.viewPager
66+
// ViewPager2
67+
val viewPager2 = dataBinding!!.viewPager
68+
// TabLayout
69+
val tabLayout = dataBinding!!.tabLayout
3670

3771
/*
38-
Without setting ViewPager2 Adapter it causes memory leak
72+
🔥 Detach TabLayoutMediator since it causing memory leaks when it's in a fragment
73+
https://stackoverflow.com/questions/61779776/leak-canary-detects-memory-leaks-for-tablayout-with-viewpager2
74+
*/
75+
TabLayoutMediator(tabLayout, viewPager2, tabConfigurationStrategy).detach()
3976

40-
https://stackoverflow.com/questions/62851425/viewpager2-inside-a-fragment-leaks-after-replacing-the-fragment-its-in-by-navig
77+
/*
78+
🔥 Without setting ViewPager2 Adapter to null it causes memory leak
79+
https://stackoverflow.com/questions/62851425/viewpager2-inside-a-fragment-leaks-after-replacing-the-fragment-its-in-by-navig
4180
*/
42-
viewPager2?.let {
43-
it.adapter = null
44-
}
81+
viewPager2.adapter = null
4582

4683
super.onDestroyView()
4784
}
85+
86+
private val tabConfigurationStrategy =
87+
TabLayoutMediator.TabConfigurationStrategy { tab, position ->
88+
when (position) {
89+
0 -> tab.text = "Home"
90+
1 -> tab.text = "Dashboard"
91+
2 -> tab.text = "Notification"
92+
else -> tab.text = "Account"
93+
}
94+
}
4895
}

‎app/src/main/java/com/smarttoolfactory/postdynamichilt/postlist/PostListViewModel.kt

Lines changed: 0 additions & 75 deletions
This file was deleted.

‎app/src/main/java/com/smarttoolfactory/postdynamichilt/postlist/PostListViewModelRxJava3.kt

Lines changed: 0 additions & 63 deletions
This file was deleted.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /