Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import `in`.testpress.course.TestpressCourse
import `in`.testpress.course.di.InjectorUtils
import `in`.testpress.course.viewmodels.ContentViewModel
import android.os.Bundle
import android.os.Handler
import androidx.annotation.VisibleForTesting
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
Expand All @@ -27,4 +28,12 @@ open class BaseVideoWidgetFragment : Fragment() {
}

open fun seekTo(milliSeconds: Long?) {}

open fun setupQuiz(
positions: List<Int>,
positionsMs: LongArray,
callbackHandler: Handler
) {}
open fun pauseVideo() {}
open fun playVideo() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import `in`.testpress.course.ui.ContentActivity.CONTENT_ID
import `in`.testpress.course.util.ExoPlayerUtil
import `in`.testpress.course.util.ExoplayerFullscreenHelper
import android.os.Bundle
import android.os.Handler
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand Down Expand Up @@ -148,4 +149,20 @@ class NativeVideoWidgetFragment : BaseVideoWidgetFragment() {
super.onDestroy()
exoplayerFullscreenHelper?.disableOrientationListener()
}

override fun setupQuiz(
positions: List<Int>,
positionsMs: LongArray,
callbackHandler: Handler
) {
exoPlayerUtil?.setupQuiz(positions, positionsMs, callbackHandler)
}

override fun pauseVideo() {
exoPlayerUtil?.pauseVideo()
}

override fun playVideo() {
exoPlayerUtil?.playVideo()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import android.app.AlertDialog
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
Expand All @@ -30,10 +32,15 @@ import androidx.core.text.HtmlCompat
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import `in`.testpress.course.repository.ContentRepository
import `in`.testpress.course.viewmodels.VideoQuizViewModel
import `in`.testpress.course.network.NetworkVideoQuestion
import `in`.testpress.enums.Status
import io.netopen.hotbitmapgg.library.view.RingProgressBar
import java.util.regex.Pattern

open class VideoContentFragment : BaseContentDetailFragment() {
open class VideoContentFragment : BaseContentDetailFragment(), VideoQuizDialogFragment.OnQuizCompleteListener {

protected lateinit var titleView: TextView
protected lateinit var description: TextView
protected lateinit var titleLayout: LinearLayout
Expand All @@ -44,6 +51,15 @@ open class VideoContentFragment : BaseContentDetailFragment() {
protected lateinit var instituteSettings: InstituteSettings;
protected var remainingDownloadCount :Int? = null

private lateinit var contentRepository: ContentRepository
private lateinit var videoQuizViewModel: VideoQuizViewModel

private val quizCallbackHandler = Handler(Looper.getMainLooper()) { message ->
val positionInSeconds = message.what.toLong()
handleQuizTrigger(positionInSeconds)
true
}

override var isBookmarkEnabled: Boolean
get() = false
set(value) {}
Expand All @@ -56,6 +72,9 @@ open class VideoContentFragment : BaseContentDetailFragment() {
return OfflineVideoViewModel(OfflineVideoRepository(requireContext())) as T
}
}).get(OfflineVideoViewModel::class.java)

videoQuizViewModel = ViewModelProvider(this).get(VideoQuizViewModel::class.java)
contentRepository = ContentRepository(requireContext())
}

override fun onCreateView(
Expand Down Expand Up @@ -211,6 +230,7 @@ open class VideoContentFragment : BaseContentDetailFragment() {
val transaction = childFragmentManager.beginTransaction()
transaction.replace(R.id.video_widget_fragment, videoWidgetFragment)
transaction.commit()
fetchVideoQuestions()
}

override fun onResume() {
Expand Down Expand Up @@ -276,6 +296,69 @@ open class VideoContentFragment : BaseContentDetailFragment() {
videoWidgetFragment.onActivityResult(requestCode, resultCode, data)
}
}


private fun fetchVideoQuestions() {
content.video?.id?.let { videoId ->
contentRepository.loadVideoQuestions(videoContentId = videoId).observe(viewLifecycleOwner, Observer { resource ->
when (resource.status) {
Status.SUCCESS -> {
resource.data?.let { questions ->
if (questions.isNotEmpty()) {
setupQuizLogic(questions)
}
}
}
Status.ERROR -> {
// Handle or log error
}
Status.LOADING -> {
// Handle or log error
}
}
})
}
}

private fun setupQuizLogic(questions: List<NetworkVideoQuestion>) {
val validQuestions = questions.filter { q ->
!(q.question.type == "G" && q.question.answers.isNullOrEmpty())
}

videoQuizViewModel.setQuestions(validQuestions)
val positions = videoQuizViewModel.getUniquePositions()
val positionsMs = videoQuizViewModel.getUniquePositionMs()
videoWidgetFragment.setupQuiz(
positions,
positionsMs,
quizCallbackHandler
)
}

private fun handleQuizTrigger(position: Long) {
val question = videoQuizViewModel.getNextQuestionForPosition(position.toInt())

if (question == null) {
return
}

videoWidgetFragment.pauseVideo()

VideoQuizDialogFragment.newInstance(question)
.show(childFragmentManager, "VideoQuizDialogFragment")
}

override fun onQuizCompleted(questionId: Long) {
val position = videoQuizViewModel.markQuestionAsCompleted(questionId)
val nextQuestion = videoQuizViewModel.getNextQuestionForPosition(position)

if (nextQuestion != null) {
VideoQuizDialogFragment.newInstance(nextQuestion)
.show(childFragmentManager, "VideoQuizDialogFragment")
} else {
videoWidgetFragment.playVideo()
}
}
}

class VideoWidgetFragmentFactory {
Expand Down
Loading