Skip to content

Commit baeffc4

Browse files
fix: changes according code review feedback
1 parent a0bf106 commit baeffc4

File tree

5 files changed

+79
-24
lines changed

5 files changed

+79
-24
lines changed

app/src/main/java/org/openedx/app/di/AppModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import org.openedx.core.data.model.CourseEnrollments
3535
import org.openedx.core.data.storage.CalendarPreferences
3636
import org.openedx.core.data.storage.CorePreferences
3737
import org.openedx.core.data.storage.InAppReviewPreferences
38+
import org.openedx.core.domain.helper.VideoPreviewHelper
3839
import org.openedx.core.module.DownloadWorkerController
3940
import org.openedx.core.module.TranscriptManager
4041
import org.openedx.core.module.download.DownloadHelper
@@ -216,6 +217,7 @@ val appModule = module {
216217
factory { MicrosoftAuthHelper() }
217218
factory { BrowserAuthHelper(get()) }
218219
factory { OAuthHelper(get(), get(), get()) }
220+
factory { VideoPreviewHelper(get(), get()) }
219221

220222
factory { FileUtil(get(), get<ResourceManager>().getString(R.string.app_name)) }
221223
single { DownloadHelper(get(), get()) }
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.openedx.core.domain.helper
2+
3+
import android.content.Context
4+
import org.openedx.core.domain.model.Block
5+
import org.openedx.core.system.connection.NetworkConnection
6+
import org.openedx.core.utils.VideoPreview
7+
8+
/**
9+
* Helper class for handling video preview generation.
10+
* This class encapsulates the logic for getting video previews from blocks,
11+
* avoiding the need to inject Context directly into ViewModels.
12+
*/
13+
class VideoPreviewHelper(
14+
private val context: Context,
15+
private val networkConnection: NetworkConnection
16+
) {
17+
18+
/**
19+
* Gets video preview for a single block
20+
* @param block The block to get video preview for
21+
* @param offlineUrl Optional offline URL for the video
22+
* @return VideoPreview object or null if no preview available
23+
*/
24+
fun getVideoPreview(block: Block, offlineUrl: String? = null): VideoPreview? {
25+
return block.getVideoPreview(
26+
context = context,
27+
isOnline = networkConnection.isOnline(),
28+
offlineUrl = offlineUrl
29+
)
30+
}
31+
32+
/**
33+
* Gets video previews for multiple blocks
34+
* @param blocks List of blocks to get video previews for
35+
* @param offlineUrls Optional map of block IDs to offline URLs
36+
* @return Map of block IDs to VideoPreview objects
37+
*/
38+
fun getVideoPreviews(
39+
blocks: List<Block>,
40+
offlineUrls: Map<String, String>? = null
41+
): Map<String, VideoPreview?> {
42+
return blocks.associate { block ->
43+
val offlineUrl = offlineUrls?.get(block.id)
44+
block.id to getVideoPreview(block, offlineUrl)
45+
}
46+
}
47+
48+
/**
49+
* Gets video preview for a single block with a specific offline URL
50+
* @param blockId The ID of the block
51+
* @param block The block to get video preview for
52+
* @param offlineUrl Optional offline URL for the video
53+
* @return Pair of block ID and VideoPreview object or null
54+
*/
55+
fun getVideoPreviewWithId(
56+
blockId: String,
57+
block: Block,
58+
offlineUrl: String? = null
59+
): Pair<String, VideoPreview?> {
60+
return blockId to getVideoPreview(block, offlineUrl)
61+
}
62+
}

course/src/main/java/org/openedx/course/presentation/home/CourseHomeViewModel.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.openedx.course.presentation.home
22

3-
import android.content.Context
43
import androidx.fragment.app.FragmentManager
54
import androidx.lifecycle.viewModelScope
65
import kotlinx.coroutines.Dispatchers
@@ -18,6 +17,7 @@ import org.openedx.core.BlockType
1817
import org.openedx.core.R
1918
import org.openedx.core.config.Config
2019
import org.openedx.core.data.storage.CorePreferences
20+
import org.openedx.core.domain.helper.VideoPreviewHelper
2121
import org.openedx.core.domain.model.Block
2222
import org.openedx.core.domain.model.CourseComponentStatus
2323
import org.openedx.core.domain.model.CourseDatesBannerInfo
@@ -54,7 +54,6 @@ import org.openedx.course.R as courseR
5454
class CourseHomeViewModel(
5555
val courseId: String,
5656
private val courseTitle: String,
57-
private val context: Context,
5857
private val config: Config,
5958
private val interactor: CourseInteractor,
6059
private val resourceManager: ResourceManager,
@@ -65,6 +64,7 @@ class CourseHomeViewModel(
6564
private val downloadDialogManager: DownloadDialogManager,
6665
private val fileUtil: FileUtil,
6766
val courseRouter: CourseRouter,
67+
private val videoPreviewHelper: VideoPreviewHelper,
6868
coreAnalytics: CoreAnalytics,
6969
downloadDao: DownloadDao,
7070
workerController: DownloadWorkerController,
@@ -270,11 +270,9 @@ class CourseHomeViewModel(
270270

271271
private fun getVideoPreview(videoBlock: Block?) {
272272
viewModelScope.launch(Dispatchers.IO) {
273-
val videoPreview = videoBlock?.getVideoPreview(
274-
context,
275-
networkConnection.isOnline(),
276-
null
277-
)
273+
val videoPreview = videoBlock?.let { block ->
274+
videoPreviewHelper.getVideoPreview(block, null)
275+
}
278276
_uiState.value = (_uiState.value as? CourseHomeUIState.CourseData)
279277
?.copy(
280278
videoPreview = videoPreview

course/src/main/java/org/openedx/course/presentation/unit/container/CourseUnitContainerViewModel.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.openedx.course.presentation.unit.container
22

3-
import android.content.Context
43
import androidx.lifecycle.LiveData
54
import androidx.lifecycle.MutableLiveData
65
import androidx.lifecycle.viewModelScope
@@ -13,6 +12,7 @@ import kotlinx.coroutines.runBlocking
1312
import kotlinx.coroutines.withContext
1413
import org.openedx.core.BlockType
1514
import org.openedx.core.config.Config
15+
import org.openedx.core.domain.helper.VideoPreviewHelper
1616
import org.openedx.core.domain.model.Block
1717
import org.openedx.core.extension.safeDivBy
1818
import org.openedx.core.module.db.DownloadModel
@@ -34,12 +34,12 @@ class CourseUnitContainerViewModel(
3434
val courseId: String,
3535
val unitId: String,
3636
val mode: CourseViewMode,
37-
private val context: Context,
3837
private val config: Config,
3938
private val interactor: CourseInteractor,
4039
private val notifier: CourseNotifier,
4140
private val analytics: CourseAnalytics,
4241
private val networkConnection: NetworkConnection,
42+
private val videoPreviewHelper: VideoPreviewHelper,
4343
) : BaseViewModel() {
4444

4545
private val blocks = ArrayList<Block>()
@@ -408,13 +408,7 @@ class CourseUnitContainerViewModel(
408408
private suspend fun loadVideoPreview() {
409409
val videoBlocks = getAllVideoBlocks()
410410
val videoPreview = withContext(Dispatchers.IO) {
411-
videoBlocks.associate { block ->
412-
block.id to block.getVideoPreview(
413-
context,
414-
networkConnection.isOnline(),
415-
null
416-
)
417-
}
411+
videoPreviewHelper.getVideoPreviews(videoBlocks)
418412
}
419413
_videoPreview.value = videoPreview
420414
}

course/src/main/java/org/openedx/course/presentation/videos/CourseVideoViewModel.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.openedx.course.presentation.videos
22

3-
import android.annotation.SuppressLint
4-
import android.content.Context
53
import androidx.fragment.app.FragmentManager
64
import androidx.lifecycle.viewModelScope
75
import kotlinx.coroutines.Dispatchers
@@ -15,6 +13,7 @@ import kotlinx.coroutines.launch
1513
import org.openedx.core.BlockType
1614
import org.openedx.core.config.Config
1715
import org.openedx.core.data.storage.CorePreferences
16+
import org.openedx.core.domain.helper.VideoPreviewHelper
1817
import org.openedx.core.domain.model.Block
1918
import org.openedx.core.extension.safeDivBy
2019
import org.openedx.core.module.DownloadWorkerController
@@ -37,10 +36,8 @@ import org.openedx.foundation.presentation.UIMessage
3736
import org.openedx.foundation.system.ResourceManager
3837
import org.openedx.foundation.utils.FileUtil
3938

40-
@SuppressLint("StaticFieldLeak")
4139
class CourseVideoViewModel(
4240
val courseId: String,
43-
private val context: Context,
4441
private val config: Config,
4542
private val interactor: CourseInteractor,
4643
private val resourceManager: ResourceManager,
@@ -51,6 +48,7 @@ class CourseVideoViewModel(
5148
private val fileUtil: FileUtil,
5249
val courseRouter: CourseRouter,
5350
private val analytics: CourseAnalytics,
51+
private val videoPreviewHelper: VideoPreviewHelper,
5452
coreAnalytics: CoreAnalytics,
5553
downloadDao: DownloadDao,
5654
workerController: DownloadWorkerController,
@@ -188,10 +186,11 @@ class CourseVideoViewModel(
188186
viewModelScope.launch(Dispatchers.IO) {
189187
val downloadingModels = getDownloadModelList()
190188
courseVideos.values.flatten().forEach { block ->
191-
val previewMap = block.id to block.getVideoPreview(
192-
context,
193-
networkConnection.isOnline(),
194-
downloadingModels.find { block.id == it.id }?.path
189+
val offlineUrl = downloadingModels.find { block.id == it.id }?.path
190+
val previewMap = videoPreviewHelper.getVideoPreviewWithId(
191+
blockId = block.id,
192+
block = block,
193+
offlineUrl = offlineUrl
195194
)
196195
val currentUiState =
197196
(_uiState.value as? CourseVideoUIState.CourseData) ?: return@forEach

0 commit comments

Comments
 (0)