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
@@ -41,33 +42,69 @@ class MainFragment : Fragment(R.layout.fragment_main) {
4142
4243 override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
4344 super .onViewCreated(view, savedInstanceState)
44- if (! viewModel.isDownloadsFragmentEnabled) {
45- binding.bottomNavView.menu.removeItem(R .id.fragmentDownloads)
45+
46+ requireArguments().apply {
47+ getString(ARG_COURSE_ID ).takeIf { it.isNullOrBlank().not () }?.let { courseId ->
48+ val infoType = getString(ARG_INFO_TYPE )
49+ if (viewModel.isDiscoveryTypeWebView && infoType != null ) {
50+ router.navigateToCourseInfo(parentFragmentManager, courseId, infoType)
51+ } else {
52+ router.navigateToCourseDetail(parentFragmentManager, courseId)
53+ }
54+ putString(ARG_COURSE_ID , " " )
55+ putString(ARG_INFO_TYPE , " " )
56+ }
4657 }
4758
48- initViewPager()
59+ val openTabArg = requireArguments().getString(ARG_OPEN_TAB , HomeTab .LEARN .name)
60+ val learnFragment = LearnFragment .newInstance(
61+ openTab = if (openTabArg == HomeTab .PROGRAMS .name) {
62+ LearnTab .PROGRAMS .name
63+ } else {
64+ LearnTab .COURSES .name
65+ }
66+ )
67+ val tabList = mutableListOf<Pair <Int , Fragment >>().apply {
68+ add(R .id.fragmentLearn to learnFragment)
69+ add(R .id.fragmentDiscover to viewModel.getDiscoveryFragment)
70+ if (viewModel.isDownloadsFragmentEnabled) {
71+ add(R .id.fragmentDownloads to DownloadsFragment ())
72+ }
73+ add(R .id.fragmentProfile to ProfileFragment ())
74+ }
4975
50- binding.bottomNavView.setOnItemSelectedListener {
51- when (it.itemId) {
52- R .id.fragmentLearn -> {
53- viewModel.logLearnTabClickedEvent()
54- binding.viewPager.setCurrentItem(0 , false )
55- }
76+ val menu = binding.bottomNavView.menu
77+ menu.clear()
78+ val tabTitles = mapOf (
79+ R .id.fragmentLearn to resources.getString(R .string.app_navigation_learn),
80+ R .id.fragmentDiscover to resources.getString(R .string.app_navigation_discovery),
81+ R .id.fragmentDownloads to resources.getString(R .string.app_navigation_downloads),
82+ R .id.fragmentProfile to resources.getString(R .string.app_navigation_profile),
83+ )
84+ val tabIcons = mapOf (
85+ R .id.fragmentLearn to R .drawable.app_ic_rows,
86+ R .id.fragmentDiscover to R .drawable.app_ic_home,
87+ R .id.fragmentDownloads to R .drawable.app_ic_download_cloud,
88+ R .id.fragmentProfile to R .drawable.app_ic_profile
89+ )
90+ for ((id, _) in tabList) {
91+ val menuItem = menu.add(Menu .NONE , id, Menu .NONE , tabTitles[id] ? : " " )
92+ tabIcons[id]?.let { menuItem.setIcon(it) }
93+ }
5694
57- R .id.fragmentDiscover -> {
58- viewModel.logDiscoveryTabClickedEvent()
59- binding.viewPager.setCurrentItem(1 , false )
60- }
95+ initViewPager(tabList)
6196
62- R .id.fragmentDownloads -> {
63- viewModel.logDownloadsTabClickedEvent()
64- binding.viewPager.setCurrentItem(2 , false )
65- }
97+ val menuIdToIndex = tabList.mapIndexed { index, pair -> pair.first to index }.toMap()
6698
67- R .id.fragmentProfile -> {
68- viewModel.logProfileTabClickedEvent()
69- binding.viewPager.setCurrentItem(3 , false )
70- }
99+ binding.bottomNavView.setOnItemSelectedListener { menuItem ->
100+ when (menuItem.itemId) {
101+ R .id.fragmentLearn -> viewModel.logLearnTabClickedEvent()
102+ R .id.fragmentDiscover -> viewModel.logDiscoveryTabClickedEvent()
103+ R .id.fragmentDownloads -> viewModel.logDownloadsTabClickedEvent()
104+ R .id.fragmentProfile -> viewModel.logProfileTabClickedEvent()
105+ }
106+ menuIdToIndex[menuItem.itemId]?.let { index ->
107+ binding.viewPager.setCurrentItem(index, false )
71108 }
72109 true
73110 }
@@ -84,59 +121,27 @@ class MainFragment : Fragment(R.layout.fragment_main) {
84121 }
85122 }
86123
87- requireArguments().apply {
88- getString(ARG_COURSE_ID ).takeIf { it.isNullOrBlank().not () }?.let { courseId ->
89- val infoType = getString(ARG_INFO_TYPE )
90-
91- if (viewModel.isDiscoveryTypeWebView && infoType != null ) {
92- router.navigateToCourseInfo(parentFragmentManager, courseId, infoType)
93- } else {
94- router.navigateToCourseDetail(parentFragmentManager, courseId)
95- }
96-
97- // Clear arguments after navigation
98- putString(ARG_COURSE_ID , " " )
99- putString(ARG_INFO_TYPE , " " )
100- }
101-
102- when (requireArguments().getString(ARG_OPEN_TAB , " " )) {
103- HomeTab .LEARN .name,
104- HomeTab .PROGRAMS .name -> {
105- binding.bottomNavView.selectedItemId = R .id.fragmentLearn
106- }
107-
108- HomeTab .DISCOVER .name -> {
109- binding.bottomNavView.selectedItemId = R .id.fragmentDiscover
110- }
111-
112- HomeTab .DOWNLOADS .name -> {
113- binding.bottomNavView.selectedItemId = R .id.fragmentDownloads
114- }
115-
116- HomeTab .PROFILE .name -> {
117- binding.bottomNavView.selectedItemId = R .id.fragmentProfile
118- }
119- }
120- requireArguments().remove(ARG_OPEN_TAB )
124+ val initialMenuId = when (openTabArg) {
125+ HomeTab .LEARN .name, HomeTab .PROGRAMS .name -> R .id.fragmentLearn
126+ HomeTab .DISCOVER .name -> R .id.fragmentDiscover
127+ HomeTab .DOWNLOADS .name -> if (viewModel.isDownloadsFragmentEnabled) R .id.fragmentDownloads else R .id.fragmentLearn
128+ HomeTab .PROFILE .name -> R .id.fragmentProfile
129+ else -> R .id.fragmentLearn
121130 }
131+ binding.bottomNavView.selectedItemId = initialMenuId
132+
133+ requireArguments().remove(ARG_OPEN_TAB )
122134 }
123135
124136 @Suppress(" MagicNumber" )
125- private fun initViewPager () {
137+ private fun initViewPager (tabList : List < Pair < Int , Fragment >> ) {
126138 binding.viewPager.orientation = ViewPager2 .ORIENTATION_HORIZONTAL
127- binding.viewPager.offscreenPageLimit = 4
139+ binding.viewPager.offscreenPageLimit = tabList.size
128140
129- val openTab = requireArguments().getString(ARG_OPEN_TAB , HomeTab .LEARN .name)
130- val learnTab = if (openTab == HomeTab .PROGRAMS .name) {
131- LearnTab .PROGRAMS
132- } else {
133- LearnTab .COURSES
134- }
135141 adapter = NavigationFragmentAdapter (this ).apply {
136- addFragment(LearnFragment .newInstance(openTab = learnTab.name))
137- addFragment(viewModel.getDiscoveryFragment)
138- addFragment(DownloadsFragment ())
139- addFragment(ProfileFragment ())
142+ tabList.forEach { (_, fragment) ->
143+ addFragment(fragment)
144+ }
140145 }
141146 binding.viewPager.adapter = adapter
142147 binding.viewPager.isUserInputEnabled = false
0 commit comments