@@ -6,7 +6,15 @@ import android.view.LayoutInflater
66import android.view.View
77import android.view.ViewGroup
88import androidx.activity.OnBackPressedCallback
9+ import androidx.compose.foundation.layout.Arrangement
10+ import androidx.compose.foundation.layout.Column
11+ import androidx.compose.foundation.layout.PaddingValues
12+ import androidx.compose.foundation.layout.Spacer
13+ import androidx.compose.foundation.layout.height
914import androidx.compose.foundation.layout.width
15+ import androidx.compose.foundation.lazy.LazyRow
16+ import androidx.compose.foundation.lazy.items
17+ import androidx.compose.material.Divider
1018import androidx.compose.material.MaterialTheme
1119import androidx.compose.runtime.Composable
1220import androidx.compose.runtime.collectAsState
@@ -31,16 +39,19 @@ import org.koin.android.ext.android.inject
3139import org.koin.androidx.viewmodel.ext.android.viewModel
3240import org.koin.core.parameter.parametersOf
3341import org.openedx.core.BlockType
42+ import org.openedx.core.domain.model.Block
3443import org.openedx.core.presentation.course.CourseViewMode
3544import org.openedx.core.presentation.global.InsetHolder
3645import org.openedx.core.ui.theme.OpenEdXTheme
3746import org.openedx.core.ui.theme.appColors
47+ import org.openedx.core.ui.theme.appTypography
3848import org.openedx.course.R
3949import org.openedx.course.databinding.FragmentCourseUnitContainerBinding
4050import org.openedx.course.presentation.ChapterEndFragmentDialog
4151import org.openedx.course.presentation.CourseRouter
4252import org.openedx.course.presentation.DialogListener
4353import org.openedx.course.presentation.ui.CourseUnitToolbar
54+ import org.openedx.course.presentation.ui.CourseVideoItem
4455import org.openedx.course.presentation.ui.HorizontalPageIndicator
4556import org.openedx.course.presentation.ui.NavigationUnitsButtons
4657import org.openedx.course.presentation.ui.SubSectionUnitsList
@@ -57,7 +68,8 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
5768 private val viewModel by viewModel<CourseUnitContainerViewModel > {
5869 parametersOf(
5970 requireArguments().getString(ARG_COURSE_ID , " " ),
60- requireArguments().getString(UNIT_ID , " " )
71+ requireArguments().getString(UNIT_ID , " " ),
72+ requireArguments().serializable(ARG_MODE )
6173 )
6274 }
6375
@@ -96,7 +108,7 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
96108 fm = requireActivity().supportFragmentManager,
97109 courseId = viewModel.courseId,
98110 unitId = it.id,
99- mode = requireArguments().serializable( ARG_MODE ) !!
111+ mode = viewModel.mode
100112 )
101113 }
102114 }
@@ -133,7 +145,7 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
133145 super .onCreate(savedInstanceState)
134146 lifecycle.addObserver(viewModel)
135147 componentId = requireArguments().getString(ARG_COMPONENT_ID , " " )
136- viewModel.loadBlocks(requireArguments().serializable( ARG_MODE ) !! , componentId)
148+ viewModel.loadBlocks(viewModel.mode , componentId)
137149 viewModel.courseUnitContainerShowedEvent()
138150 }
139151
@@ -157,6 +169,7 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
157169 setupProgressIndicators()
158170 setupBackButton()
159171 setupSubSectionUnits()
172+ setupVideoList()
160173 checkUnitsListShown()
161174 setupChapterEndDialogListener()
162175 }
@@ -210,7 +223,7 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
210223 blocks = descendantsBlocks,
211224 selectedPage = index,
212225 completedAndSelectedColor =
213- MaterialTheme .appColors.componentHorizontalProgressCompletedAndSelected,
226+ MaterialTheme .appColors.componentHorizontalProgressCompletedAndSelected,
214227 completedColor = MaterialTheme .appColors.componentHorizontalProgressCompleted,
215228 selectedColor = MaterialTheme .appColors.componentHorizontalProgressSelected,
216229 defaultColor = MaterialTheme .appColors.componentHorizontalProgressDefault
@@ -294,7 +307,7 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
294307 fm = requireActivity().supportFragmentManager,
295308 courseId = viewModel.courseId,
296309 unitId = unit.id,
297- mode = requireArguments().serializable( ARG_MODE ) !!
310+ mode = viewModel.mode
298311 )
299312 } else {
300313 handleUnitsClick()
@@ -308,6 +321,37 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
308321 }
309322 }
310323
324+ private fun setupVideoList () {
325+ binding.videoList?.setContent {
326+ OpenEdXTheme {
327+ Column {
328+ VideoList (
329+ onVideoClick = { block ->
330+ val currentBlock = viewModel.currentBlock.value
331+ if (currentBlock?.id != block.id) {
332+ viewModel.setSelectedVideoBlock(block)
333+ updateViewPagerAdapter()
334+ val blockIndex =
335+ viewModel.getUnitBlocks().indexOfFirst { it.id == block.id }
336+ if (blockIndex != - 1 ) {
337+ binding.viewPager.currentItem = blockIndex
338+ }
339+ }
340+ }
341+ )
342+ Spacer (modifier = Modifier .height(8 .dp))
343+ Divider ()
344+ Spacer (modifier = Modifier .height(8 .dp))
345+ }
346+ }
347+ }
348+ }
349+
350+ private fun updateViewPagerAdapter () {
351+ adapter = CourseUnitContainerAdapter (this , viewModel.getUnitBlocks(), viewModel)
352+ binding.viewPager.adapter = adapter
353+ }
354+
311355 private fun checkUnitsListShown () {
312356 if (viewModel.unitsListShowed.value == true ) {
313357 handleUnitsClick()
@@ -475,6 +519,42 @@ class CourseUnitContainerFragment : Fragment(R.layout.fragment_course_unit_conta
475519 }
476520 }
477521
522+ @Composable
523+ private fun VideoList (
524+ onVideoClick : (Block ) -> Unit
525+ ) {
526+ val videoBlocks by viewModel.videoList.collectAsState()
527+ val videoPreview by viewModel.videoPreview.collectAsState()
528+ val videoProgress by viewModel.videoProgress.collectAsState()
529+ val currentBlock by viewModel.currentBlock.collectAsState()
530+
531+ if (videoBlocks.isNotEmpty()) {
532+ LazyRow (
533+ horizontalArrangement = Arrangement .spacedBy(8 .dp),
534+ contentPadding = PaddingValues (horizontal = 16 .dp, vertical = 8 .dp)
535+ ) {
536+ items(videoBlocks) { block ->
537+ val playButtonSize = if (block.id == currentBlock?.id) {
538+ 0 .dp
539+ } else {
540+ 14 .dp
541+ }
542+ CourseVideoItem (
543+ modifier = Modifier
544+ .width(112 .dp)
545+ .height(63 .dp),
546+ videoBlock = block,
547+ preview = videoPreview[block.id],
548+ progress = videoProgress[block.id] ? : 0f ,
549+ onClick = { onVideoClick(block) },
550+ style = MaterialTheme .appTypography.labelSmall,
551+ playButtonSize = playButtonSize,
552+ )
553+ }
554+ }
555+ }
556+ }
557+
478558 companion object {
479559
480560 private const val ARG_COURSE_ID = " courseId"
0 commit comments