11package org.openedx.app
22
33import android.os.Bundle
4+ import android.view.Menu
45import android.view.View
56import androidx.core.os.bundleOf
67import androidx.core.view.forEach
@@ -17,6 +18,7 @@ import org.openedx.core.adapter.NavigationFragmentAdapter
1718import org.openedx.core.presentation.global.appupgrade.UpgradeRequiredFragment
1819import org.openedx.core.presentation.global.viewBinding
1920import org.openedx.discovery.presentation.DiscoveryRouter
21+ import org.openedx.downloads.presentation.download.DownloadsFragment
2022import org.openedx.learn.presentation.LearnFragment
2123import org.openedx.learn.presentation.LearnTab
2224import org.openedx.profile.presentation.profile.ProfileFragment
@@ -40,29 +42,104 @@ class MainFragment : Fragment(R.layout.fragment_main) {
4042
4143 override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
4244 super .onViewCreated(view, savedInstanceState)
45+ handleArguments()
46+ setupBottomNavigation()
47+ setupViewPager()
48+ observeViewModel()
49+ }
4350
44- initViewPager()
45-
46- binding.bottomNavView.setOnItemSelectedListener {
47- when (it.itemId) {
48- R .id.fragmentLearn -> {
49- viewModel.logLearnTabClickedEvent()
50- binding.viewPager.setCurrentItem(0 , false )
51+ private fun handleArguments () {
52+ requireArguments().apply {
53+ getString(ARG_COURSE_ID ).takeIf { it.isNullOrBlank().not () }?.let { courseId ->
54+ val infoType = getString(ARG_INFO_TYPE )
55+ if (viewModel.isDiscoveryTypeWebView && infoType != null ) {
56+ router.navigateToCourseInfo(parentFragmentManager, courseId, infoType)
57+ } else {
58+ router.navigateToCourseDetail(parentFragmentManager, courseId)
5159 }
60+ putString(ARG_COURSE_ID , " " )
61+ putString(ARG_INFO_TYPE , " " )
62+ }
63+ }
64+ }
5265
53- R .id.fragmentDiscover -> {
54- viewModel.logDiscoveryTabClickedEvent( )
55- binding.viewPager.setCurrentItem( 1 , false )
56- }
66+ private fun setupBottomNavigation () {
67+ val openTabArg = requireArguments().getString( ARG_OPEN_TAB , HomeTab . LEARN .name )
68+ val initialMenuId = getInitialMenuId(openTabArg )
69+ binding.bottomNavView.selectedItemId = initialMenuId
5770
58- R .id.fragmentProfile -> {
59- viewModel.logProfileTabClickedEvent()
60- binding.viewPager.setCurrentItem(2 , false )
61- }
71+ val menu = binding.bottomNavView.menu
72+ menu.clear()
73+
74+ val tabList = createTabList(openTabArg)
75+ addMenuItems(menu, tabList)
76+ setupBottomNavListener(tabList)
77+
78+ requireArguments().remove(ARG_OPEN_TAB )
79+ }
80+
81+ private fun createTabList (openTabArg : String ): List <Pair <Int , Fragment >> {
82+ val learnFragment = LearnFragment .newInstance(
83+ openTab = if (openTabArg == HomeTab .PROGRAMS .name) {
84+ LearnTab .PROGRAMS .name
85+ } else {
86+ LearnTab .COURSES .name
87+ }
88+ )
89+
90+ return mutableListOf<Pair <Int , Fragment >>().apply {
91+ add(R .id.fragmentLearn to learnFragment)
92+ add(R .id.fragmentDiscover to viewModel.getDiscoveryFragment)
93+ if (viewModel.isDownloadsFragmentEnabled) {
94+ add(R .id.fragmentDownloads to DownloadsFragment ())
95+ }
96+ add(R .id.fragmentProfile to ProfileFragment ())
97+ }
98+ }
99+
100+ private fun addMenuItems (menu : Menu , tabList : List <Pair <Int , Fragment >>) {
101+ val tabTitles = mapOf (
102+ R .id.fragmentLearn to resources.getString(R .string.app_navigation_learn),
103+ R .id.fragmentDiscover to resources.getString(R .string.app_navigation_discovery),
104+ R .id.fragmentDownloads to resources.getString(R .string.app_navigation_downloads),
105+ R .id.fragmentProfile to resources.getString(R .string.app_navigation_profile),
106+ )
107+ val tabIconSelectors = mapOf (
108+ R .id.fragmentLearn to R .drawable.app_ic_learn_selector,
109+ R .id.fragmentDiscover to R .drawable.app_ic_discover_selector,
110+ R .id.fragmentDownloads to R .drawable.app_ic_downloads_selector,
111+ R .id.fragmentProfile to R .drawable.app_ic_profile_selector
112+ )
113+
114+ for ((id, _) in tabList) {
115+ val menuItem = menu.add(Menu .NONE , id, Menu .NONE , tabTitles[id] ? : " " )
116+ tabIconSelectors[id]?.let { menuItem.setIcon(it) }
117+ }
118+ }
119+
120+ private fun setupBottomNavListener (tabList : List <Pair <Int , Fragment >>) {
121+ val menuIdToIndex = tabList.mapIndexed { index, pair -> pair.first to index }.toMap()
122+
123+ binding.bottomNavView.setOnItemSelectedListener { menuItem ->
124+ when (menuItem.itemId) {
125+ R .id.fragmentLearn -> viewModel.logLearnTabClickedEvent()
126+ R .id.fragmentDiscover -> viewModel.logDiscoveryTabClickedEvent()
127+ R .id.fragmentDownloads -> viewModel.logDownloadsTabClickedEvent()
128+ R .id.fragmentProfile -> viewModel.logProfileTabClickedEvent()
129+ }
130+ menuIdToIndex[menuItem.itemId]?.let { index ->
131+ binding.viewPager.setCurrentItem(index, false )
62132 }
63133 true
64134 }
135+ }
65136
137+ private fun setupViewPager () {
138+ val tabList = createTabList(requireArguments().getString(ARG_OPEN_TAB , HomeTab .LEARN .name))
139+ initViewPager(tabList)
140+ }
141+
142+ private fun observeViewModel () {
66143 viewModel.isBottomBarEnabled.observe(viewLifecycleOwner) { isBottomBarEnabled ->
67144 enableBottomBar(isBottomBarEnabled)
68145 }
@@ -74,55 +151,30 @@ class MainFragment : Fragment(R.layout.fragment_main) {
74151 }
75152 }
76153 }
154+ }
77155
78- requireArguments().apply {
79- getString(ARG_COURSE_ID ).takeIf { it.isNullOrBlank().not () }?.let { courseId ->
80- val infoType = getString(ARG_INFO_TYPE )
81-
82- if (viewModel.isDiscoveryTypeWebView && infoType != null ) {
83- router.navigateToCourseInfo(parentFragmentManager, courseId, infoType)
84- } else {
85- router.navigateToCourseDetail(parentFragmentManager, courseId)
86- }
87-
88- // Clear arguments after navigation
89- putString(ARG_COURSE_ID , " " )
90- putString(ARG_INFO_TYPE , " " )
91- }
92-
93- when (requireArguments().getString(ARG_OPEN_TAB , " " )) {
94- HomeTab .LEARN .name,
95- HomeTab .PROGRAMS .name -> {
96- binding.bottomNavView.selectedItemId = R .id.fragmentLearn
97- }
98-
99- HomeTab .DISCOVER .name -> {
100- binding.bottomNavView.selectedItemId = R .id.fragmentDiscover
101- }
102-
103- HomeTab .PROFILE .name -> {
104- binding.bottomNavView.selectedItemId = R .id.fragmentProfile
105- }
156+ private fun getInitialMenuId (openTabArg : String ): Int {
157+ return when (openTabArg) {
158+ HomeTab .LEARN .name, HomeTab .PROGRAMS .name -> R .id.fragmentLearn
159+ HomeTab .DISCOVER .name -> R .id.fragmentDiscover
160+ HomeTab .DOWNLOADS .name -> if (viewModel.isDownloadsFragmentEnabled) {
161+ R .id.fragmentDownloads
162+ } else {
163+ R .id.fragmentLearn
106164 }
107- requireArguments().remove(ARG_OPEN_TAB )
165+ HomeTab .PROFILE .name -> R .id.fragmentProfile
166+ else -> R .id.fragmentLearn
108167 }
109168 }
110169
111- @Suppress(" MagicNumber" )
112- private fun initViewPager () {
170+ private fun initViewPager (tabList : List <Pair <Int , Fragment >>) {
113171 binding.viewPager.orientation = ViewPager2 .ORIENTATION_HORIZONTAL
114- binding.viewPager.offscreenPageLimit = 4
172+ binding.viewPager.offscreenPageLimit = tabList.size
115173
116- val openTab = requireArguments().getString(ARG_OPEN_TAB , HomeTab .LEARN .name)
117- val learnTab = if (openTab == HomeTab .PROGRAMS .name) {
118- LearnTab .PROGRAMS
119- } else {
120- LearnTab .COURSES
121- }
122174 adapter = NavigationFragmentAdapter (this ).apply {
123- addFragment( LearnFragment .newInstance(openTab = learnTab.name))
124- addFragment(viewModel.getDiscoveryFragment )
125- addFragment( ProfileFragment ())
175+ tabList.forEach { (_, fragment) ->
176+ addFragment(fragment )
177+ }
126178 }
127179 binding.viewPager.adapter = adapter
128180 binding.viewPager.isUserInputEnabled = false
0 commit comments