11package org.openedx.downloads.presentation.download
22
3+ import android.content.res.Configuration.ORIENTATION_LANDSCAPE
34import androidx.compose.animation.animateContentSize
45import androidx.compose.foundation.background
56import androidx.compose.foundation.layout.Arrangement
@@ -9,6 +10,7 @@ import androidx.compose.foundation.layout.PaddingValues
910import androidx.compose.foundation.layout.Row
1011import androidx.compose.foundation.layout.Spacer
1112import androidx.compose.foundation.layout.defaultMinSize
13+ import androidx.compose.foundation.layout.fillMaxHeight
1214import androidx.compose.foundation.layout.fillMaxSize
1315import androidx.compose.foundation.layout.fillMaxWidth
1416import androidx.compose.foundation.layout.height
@@ -17,6 +19,10 @@ import androidx.compose.foundation.layout.size
1719import androidx.compose.foundation.layout.width
1820import androidx.compose.foundation.layout.widthIn
1921import androidx.compose.foundation.lazy.LazyColumn
22+ import androidx.compose.foundation.lazy.grid.GridCells
23+ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
24+ import androidx.compose.foundation.lazy.grid.items
25+ import androidx.compose.foundation.lazy.grid.rememberLazyGridState
2026import androidx.compose.foundation.lazy.items
2127import androidx.compose.foundation.rememberScrollState
2228import androidx.compose.foundation.shape.CircleShape
@@ -52,6 +58,7 @@ import androidx.compose.ui.Modifier
5258import androidx.compose.ui.draw.clip
5359import androidx.compose.ui.graphics.Color
5460import androidx.compose.ui.layout.ContentScale
61+ import androidx.compose.ui.platform.LocalConfiguration
5562import androidx.compose.ui.platform.LocalContext
5663import androidx.compose.ui.platform.testTag
5764import androidx.compose.ui.res.painterResource
@@ -98,6 +105,7 @@ fun DownloadsScreen(
98105) {
99106 val scaffoldState = rememberScaffoldState()
100107 val windowSize = rememberWindowSize()
108+ val configuration = LocalConfiguration .current
101109 val contentWidth by remember(key1 = windowSize) {
102110 mutableStateOf(
103111 windowSize.windowSizeValue(
@@ -158,34 +166,72 @@ fun DownloadsScreen(
158166 .padding(horizontal = 16 .dp),
159167 contentAlignment = Alignment .TopCenter
160168 ) {
161- LazyColumn (
162- modifier = contentWidth,
163- contentPadding = PaddingValues (bottom = 20 .dp, top = 12 .dp),
164- verticalArrangement = Arrangement .spacedBy(20 .dp)
165- ) {
166- items(uiState.downloadCoursePreviews) { item ->
167- val downloadModels =
168- uiState.downloadModels.filter { it.courseId == item.id }
169- val downloadState = uiState.courseDownloadState[item.id]
170- ? : DownloadedState .NOT_DOWNLOADED
171- CourseItem (
172- downloadCoursePreview = item,
173- downloadModels = downloadModels,
174- downloadedState = downloadState,
175- apiHostUrl = apiHostUrl,
176- onCourseClick = {
177- onAction(DownloadsViewActions .OpenCourse (item.id))
178- },
179- onDownloadClick = {
180- onAction(DownloadsViewActions .DownloadCourse (item.id))
181- },
182- onCancelClick = {
183- onAction(DownloadsViewActions .CancelDownloading (item.id))
184- },
185- onRemoveClick = {
186- onAction(DownloadsViewActions .RemoveDownloads (item.id))
169+ if (configuration.orientation == ORIENTATION_LANDSCAPE || windowSize.isTablet) {
170+ LazyVerticalGrid (
171+ modifier = contentWidth.fillMaxHeight(),
172+ state = rememberLazyGridState(),
173+ columns = GridCells .Fixed (2 ),
174+ verticalArrangement = Arrangement .spacedBy(20 .dp),
175+ horizontalArrangement = Arrangement .spacedBy(20 .dp),
176+ contentPadding = PaddingValues (bottom = 20 .dp, top = 12 .dp),
177+ content = {
178+ items(uiState.downloadCoursePreviews) { item ->
179+ val downloadModels =
180+ uiState.downloadModels.filter { it.courseId == item.id }
181+ val downloadState = uiState.courseDownloadState[item.id]
182+ ? : DownloadedState .NOT_DOWNLOADED
183+ CourseItem (
184+ modifier = Modifier .height(314 .dp),
185+ downloadCoursePreview = item,
186+ downloadModels = downloadModels,
187+ downloadedState = downloadState,
188+ apiHostUrl = apiHostUrl,
189+ onCourseClick = {
190+ onAction(DownloadsViewActions .OpenCourse (item.id))
191+ },
192+ onDownloadClick = {
193+ onAction(DownloadsViewActions .DownloadCourse (item.id))
194+ },
195+ onCancelClick = {
196+ onAction(DownloadsViewActions .CancelDownloading (item.id))
197+ },
198+ onRemoveClick = {
199+ onAction(DownloadsViewActions .RemoveDownloads (item.id))
200+ }
201+ )
187202 }
188- )
203+ }
204+ )
205+ } else {
206+ LazyColumn (
207+ modifier = contentWidth,
208+ contentPadding = PaddingValues (bottom = 20 .dp, top = 12 .dp),
209+ verticalArrangement = Arrangement .spacedBy(20 .dp)
210+ ) {
211+ items(uiState.downloadCoursePreviews) { item ->
212+ val downloadModels =
213+ uiState.downloadModels.filter { it.courseId == item.id }
214+ val downloadState = uiState.courseDownloadState[item.id]
215+ ? : DownloadedState .NOT_DOWNLOADED
216+ CourseItem (
217+ downloadCoursePreview = item,
218+ downloadModels = downloadModels,
219+ downloadedState = downloadState,
220+ apiHostUrl = apiHostUrl,
221+ onCourseClick = {
222+ onAction(DownloadsViewActions .OpenCourse (item.id))
223+ },
224+ onDownloadClick = {
225+ onAction(DownloadsViewActions .DownloadCourse (item.id))
226+ },
227+ onCancelClick = {
228+ onAction(DownloadsViewActions .CancelDownloading (item.id))
229+ },
230+ onRemoveClick = {
231+ onAction(DownloadsViewActions .RemoveDownloads (item.id))
232+ }
233+ )
234+ }
189235 }
190236 }
191237 }
@@ -231,6 +277,8 @@ private fun CourseItem(
231277 onRemoveClick : () -> Unit ,
232278 onCancelClick : () -> Unit
233279) {
280+ val windowSize = rememberWindowSize()
281+ val configuration = LocalConfiguration .current
234282 var isDropdownExpanded by remember { mutableStateOf(false ) }
235283 val downloadedSize = downloadModels
236284 .filter { it.downloadedState == DownloadedState .DOWNLOADED }
@@ -254,17 +302,21 @@ private fun CourseItem(
254302 Column (
255303 modifier = Modifier .animateContentSize()
256304 ) {
305+ val imageModifier =
306+ if (configuration.orientation == ORIENTATION_LANDSCAPE || windowSize.isTablet) {
307+ Modifier .weight(1f )
308+ } else {
309+ Modifier .height(120 .dp)
310+ }
257311 AsyncImage (
312+ modifier = imageModifier.fillMaxWidth(),
258313 model = ImageRequest .Builder (LocalContext .current)
259314 .data(downloadCoursePreview.image.toImageLink(apiHostUrl))
260315 .error(org.openedx.core.R .drawable.core_no_image_course)
261316 .placeholder(org.openedx.core.R .drawable.core_no_image_course)
262317 .build(),
263318 contentDescription = null ,
264319 contentScale = ContentScale .Crop ,
265- modifier = Modifier
266- .fillMaxWidth()
267- .height(120 .dp)
268320 )
269321 Column (
270322 modifier = Modifier
0 commit comments