16
16
17
17
package com.example.jetcaster.ui.home
18
18
19
+ import android.util.Log
19
20
import androidx.compose.foundation.ExperimentalFoundationApi
20
21
import androidx.compose.foundation.Image
21
22
import androidx.compose.foundation.background
@@ -37,6 +38,7 @@ import androidx.compose.foundation.layout.statusBars
37
38
import androidx.compose.foundation.layout.systemBars
38
39
import androidx.compose.foundation.layout.windowInsetsPadding
39
40
import androidx.compose.foundation.layout.windowInsetsTopHeight
41
+ import androidx.compose.foundation.lazy.LazyColumn
40
42
import androidx.compose.foundation.pager.HorizontalPager
41
43
import androidx.compose.foundation.pager.PagerState
42
44
import androidx.compose.foundation.pager.rememberPagerState
@@ -46,6 +48,7 @@ import androidx.compose.material.Icon
46
48
import androidx.compose.material.IconButton
47
49
import androidx.compose.material.LocalContentAlpha
48
50
import androidx.compose.material.MaterialTheme
51
+ import androidx.compose.material.Scaffold
49
52
import androidx.compose.material.Surface
50
53
import androidx.compose.material.Tab
51
54
import androidx.compose.material.TabPosition
@@ -74,8 +77,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
74
77
import androidx.lifecycle.viewmodel.compose.viewModel
75
78
import coil.compose.AsyncImage
76
79
import com.example.jetcaster.R
80
+ import com.example.jetcaster.data.Category
77
81
import com.example.jetcaster.data.PodcastWithExtraInfo
78
- import com.example.jetcaster.ui.home.discover.Discover
82
+ import com.example.jetcaster.ui.home.category.PodcastCategoryViewState
83
+ import com.example.jetcaster.ui.home.discover.DiscoverViewState
84
+ import com.example.jetcaster.ui.home.discover.discoverItems
79
85
import com.example.jetcaster.ui.theme.JetcasterTheme
80
86
import com.example.jetcaster.ui.theme.Keyline1
81
87
import com.example.jetcaster.ui.theme.MinContrastOfPrimaryVsSurface
@@ -102,9 +108,13 @@ fun Home(
102
108
isRefreshing = viewState.refreshing,
103
109
homeCategories = viewState.homeCategories,
104
110
selectedHomeCategory = viewState.selectedHomeCategory,
105
- onCategorySelected = viewModel::onHomeCategorySelected,
111
+ discoverViewState = viewState.discoverViewState,
112
+ podcastCategoryViewState = viewState.podcastCategoryViewState,
113
+ onHomeCategorySelected = viewModel::onHomeCategorySelected,
114
+ onCategorySelected = viewModel::onCategorySelected,
106
115
onPodcastUnfollowed = viewModel::onPodcastUnfollowed,
107
116
navigateToPlayer = navigateToPlayer,
117
+ onTogglePodcastFollowed = viewModel::onTogglePodcastFollowed,
108
118
modifier = Modifier .fillMaxSize()
109
119
)
110
120
}
@@ -163,10 +173,14 @@ fun HomeContent(
163
173
isRefreshing : Boolean ,
164
174
selectedHomeCategory : HomeCategory ,
165
175
homeCategories : List <HomeCategory >,
176
+ discoverViewState : DiscoverViewState ,
177
+ podcastCategoryViewState : PodcastCategoryViewState ,
166
178
modifier : Modifier = Modifier ,
167
179
onPodcastUnfollowed : (String ) -> Unit ,
168
- onCategorySelected : (HomeCategory ) -> Unit ,
169
- navigateToPlayer : (String ) -> Unit
180
+ onHomeCategorySelected : (HomeCategory ) -> Unit ,
181
+ onCategorySelected : (Category ) -> Unit ,
182
+ navigateToPlayer : (String ) -> Unit ,
183
+ onTogglePodcastFollowed : (String ) -> Unit ,
170
184
) {
171
185
Column (
172
186
modifier = modifier.windowInsetsPadding(
@@ -198,72 +212,106 @@ fun HomeContent(
198
212
}
199
213
}
200
214
201
- Column (
202
- modifier = Modifier
203
- .fillMaxWidth()
204
- .verticalGradientScrim(
205
- color = MaterialTheme .colors.primary.copy(alpha = 0.38f ),
206
- startYPercentage = 1f ,
207
- endYPercentage = 0f
208
- )
209
- ) {
210
- // Draw a scrim over the status bar which matches the app bar
211
- Spacer (
212
- Modifier
213
- .background(appBarColor)
214
- .fillMaxWidth()
215
- .windowInsetsTopHeight(WindowInsets .statusBars)
216
- )
215
+ val scrimColor = MaterialTheme .colors.primary.copy(alpha = 0.38f )
216
+ Scaffold (
217
+ topBar = {
218
+ Column (
219
+ modifier = Modifier
220
+ .fillMaxWidth()
221
+ .background(color = scrimColor)
222
+ ) {
223
+ // Draw a scrim over the status bar which matches the app bar
224
+ Spacer (
225
+ Modifier
226
+ .background(appBarColor)
227
+ .fillMaxWidth()
228
+ .windowInsetsTopHeight(WindowInsets .statusBars)
229
+ )
230
+ HomeAppBar (
231
+ backgroundColor = appBarColor,
232
+ modifier = Modifier .fillMaxWidth()
233
+ )
234
+ }
235
+ },
236
+ ) { contentPadding ->
237
+ LazyColumn (
238
+ contentPadding = contentPadding,
239
+ modifier = Modifier .fillMaxSize()
240
+ ) {
241
+ if (featuredPodcasts.isNotEmpty()) {
242
+ item {
243
+ FollowedPodcastItem (
244
+ items = featuredPodcasts,
245
+ pagerState = pagerState,
246
+ onPodcastUnfollowed = onPodcastUnfollowed,
247
+ modifier = Modifier
248
+ .fillMaxWidth()
249
+ .verticalGradientScrim(
250
+ color = scrimColor,
251
+ startYPercentage = 1f ,
252
+ endYPercentage = 0f
253
+ )
254
+ )
255
+ }
217
256
218
- HomeAppBar (
219
- backgroundColor = appBarColor,
220
- modifier = Modifier .fillMaxWidth()
221
- )
257
+ if (isRefreshing) {
258
+ // TODO show a progress indicator or similar
259
+ }
222
260
223
- if (featuredPodcasts.isNotEmpty()) {
224
- Spacer (Modifier .height(16 .dp))
261
+ stickyHeader {
262
+ if (homeCategories.isNotEmpty()) {
263
+ HomeCategoryTabs (
264
+ categories = homeCategories,
265
+ selectedCategory = selectedHomeCategory,
266
+ onCategorySelected = onHomeCategorySelected
267
+ )
268
+ }
269
+ }
225
270
226
- FollowedPodcasts (
227
- items = featuredPodcasts,
228
- pagerState = pagerState,
229
- onPodcastUnfollowed = onPodcastUnfollowed,
230
- modifier = Modifier
231
- .padding(start = Keyline1 , top = 16 .dp, end = Keyline1 )
232
- .fillMaxWidth()
233
- .height(200 .dp)
234
- )
271
+ when (selectedHomeCategory) {
272
+ HomeCategory .Library -> {
273
+ // TODO
274
+ }
235
275
236
- Spacer (Modifier .height(16 .dp))
276
+ HomeCategory .Discover -> {
277
+ discoverItems(
278
+ discoverViewState = discoverViewState,
279
+ podcastCategoryViewState = podcastCategoryViewState,
280
+ navigateToPlayer = navigateToPlayer,
281
+ onCategorySelected = onCategorySelected,
282
+ onTogglePodcastFollowed = onTogglePodcastFollowed
283
+ )
284
+ }
285
+ }
286
+ }
237
287
}
238
288
}
239
289
}
290
+ }
291
+ }
240
292
241
- if (isRefreshing) {
242
- // TODO show a progress indicator or similar
243
- }
244
-
245
- if (homeCategories.isNotEmpty()) {
246
- HomeCategoryTabs (
247
- categories = homeCategories,
248
- selectedCategory = selectedHomeCategory,
249
- onCategorySelected = onCategorySelected
250
- )
251
- }
293
+ @OptIn(ExperimentalFoundationApi ::class )
294
+ @Composable
295
+ private fun FollowedPodcastItem (
296
+ items : PersistentList <PodcastWithExtraInfo >,
297
+ pagerState : PagerState ,
298
+ onPodcastUnfollowed : (String ) -> Unit ,
299
+ modifier : Modifier = Modifier ,
300
+ ) {
301
+ Column (modifier = modifier) {
302
+ Spacer (Modifier .height(16 .dp))
252
303
253
- when (selectedHomeCategory) {
254
- HomeCategory .Library -> {
255
- // TODO
256
- }
304
+ FollowedPodcasts (
305
+ items = items,
306
+ pagerState = pagerState,
307
+ onPodcastUnfollowed = onPodcastUnfollowed,
308
+ modifier = Modifier
309
+ .padding(start = Keyline1 , top = 16 .dp, end = Keyline1 )
310
+ .fillMaxWidth()
311
+ .height(200 .dp)
312
+ )
257
313
258
- HomeCategory .Discover -> {
259
- Discover (
260
- navigateToPlayer = navigateToPlayer,
261
- Modifier
262
- .fillMaxWidth()
263
- .weight(1f )
264
- )
265
- }
266
- }
314
+ Spacer (Modifier .height(16 .dp))
267
315
}
268
316
}
269
317
@@ -410,23 +458,31 @@ private fun lastUpdated(updated: OffsetDateTime): String {
410
458
}
411
459
}
412
460
413
- /*
414
- TODO: Fix preview error
415
461
@Composable
416
462
@Preview
417
463
fun PreviewHomeContent () {
418
464
JetcasterTheme {
419
465
HomeContent (
420
466
featuredPodcasts = PreviewPodcastsWithExtraInfo ,
421
467
isRefreshing = false ,
422
- homeCategories = HomeCategory.values().asList() ,
468
+ homeCategories = HomeCategory .entries ,
423
469
selectedHomeCategory = HomeCategory .Discover ,
470
+ discoverViewState = DiscoverViewState (
471
+ categories = PreviewCategories ,
472
+ selectedCategory = PreviewCategories .first(),
473
+ ),
474
+ podcastCategoryViewState = PodcastCategoryViewState (
475
+ topPodcasts = PreviewPodcastsWithExtraInfo ,
476
+ episodes = PreviewEpisodeToPodcasts ,
477
+ ),
424
478
onCategorySelected = {},
425
- onPodcastUnfollowed = {}
479
+ onPodcastUnfollowed = {},
480
+ navigateToPlayer = {},
481
+ onHomeCategorySelected = {},
482
+ onTogglePodcastFollowed = {}
426
483
)
427
484
}
428
485
}
429
- */
430
486
431
487
@Composable
432
488
@Preview
0 commit comments