Skip to content

Commit f0a8dbf

Browse files
author
oxy
committed
Update Playlist Configuration layout.
1 parent a32cdb4 commit f0a8dbf

File tree

2 files changed

+64
-72
lines changed

2 files changed

+64
-72
lines changed

feature/playlist-configuration/src/main/java/com/m3u/feature/playlist/configuration/PlaylistConfigurationScreen.kt

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ import androidx.compose.foundation.layout.Box
1515
import androidx.compose.foundation.layout.Column
1616
import androidx.compose.foundation.layout.PaddingValues
1717
import androidx.compose.foundation.layout.WindowInsets
18-
import androidx.compose.foundation.layout.WindowInsetsSides
1918
import androidx.compose.foundation.layout.asPaddingValues
2019
import androidx.compose.foundation.layout.fillMaxWidth
2120
import androidx.compose.foundation.layout.ime
2221
import androidx.compose.foundation.layout.padding
22+
import androidx.compose.foundation.lazy.LazyColumn
2323
import androidx.compose.material.icons.Icons
2424
import androidx.compose.material.icons.rounded.Save
2525
import androidx.compose.material3.FloatingActionButton
26+
import androidx.compose.material3.MaterialTheme
2627
import androidx.compose.runtime.Composable
2728
import androidx.compose.runtime.derivedStateOf
2829
import androidx.compose.runtime.getValue
@@ -54,10 +55,12 @@ import com.m3u.material.components.Background
5455
import com.m3u.material.components.Icon
5556
import com.m3u.material.components.PlaceholderField
5657
import com.m3u.material.ktx.checkPermissionOrRationale
57-
import com.m3u.material.ktx.split
58+
import com.m3u.material.model.LocalHazeState
5859
import com.m3u.material.model.LocalSpacing
5960
import com.m3u.ui.helper.LocalHelper
6061
import com.m3u.ui.helper.Metadata
62+
import dev.chrisbanes.haze.HazeStyle
63+
import dev.chrisbanes.haze.haze
6164
import kotlinx.datetime.LocalDateTime
6265

6366
@Composable
@@ -144,60 +147,72 @@ private fun PlaylistConfigurationScreen(
144147
}
145148
Background(modifier) {
146149
Box {
147-
val (outer, inner) = contentPadding split WindowInsetsSides.Top
148-
Column(
150+
LazyColumn(
149151
verticalArrangement = Arrangement.spacedBy(spacing.small),
152+
contentPadding = contentPadding,
150153
modifier = Modifier
151-
.padding(outer)
154+
.haze(
155+
LocalHazeState.current,
156+
HazeStyle(MaterialTheme.colorScheme.surface)
157+
)
152158
.padding(spacing.medium)
153159
) {
154-
PlaceholderField(
155-
text = title,
156-
placeholder = stringResource(string.feat_playlist_configuration_title).title(),
157-
onValueChange = { title = it },
158-
)
159-
PlaceholderField(
160-
text = userAgent,
161-
placeholder = stringResource(string.feat_playlist_configuration_user_agent).title(),
162-
onValueChange = { userAgent = it }
163-
)
164-
AnimatedVisibility(playlist.epgUrlsOrXtreamXmlUrl().isNotEmpty()) {
165-
Column(
166-
verticalArrangement = Arrangement.spacedBy(spacing.small)
167-
) {
168-
SyncProgrammesButton(
169-
subscribingOrRefreshing = subscribingOrRefreshing,
170-
expired = expired,
171-
onSyncProgrammes = onSyncProgrammes
172-
)
173-
AutoSyncProgrammesButton(
174-
checked = playlist.autoRefreshProgrammes,
175-
onCheckedChange = onUpdatePlaylistAutoRefreshProgrammes
176-
)
160+
item {
161+
PlaceholderField(
162+
text = title,
163+
placeholder = stringResource(string.feat_playlist_configuration_title).title(),
164+
onValueChange = { title = it },
165+
)
166+
}
167+
168+
item {
169+
PlaceholderField(
170+
text = userAgent,
171+
placeholder = stringResource(string.feat_playlist_configuration_user_agent).title(),
172+
onValueChange = { userAgent = it }
173+
)
174+
}
175+
176+
item {
177+
AnimatedVisibility(playlist.epgUrlsOrXtreamXmlUrl().isNotEmpty()) {
178+
Column(
179+
verticalArrangement = Arrangement.spacedBy(spacing.small)
180+
) {
181+
SyncProgrammesButton(
182+
subscribingOrRefreshing = subscribingOrRefreshing,
183+
expired = expired,
184+
onSyncProgrammes = onSyncProgrammes
185+
)
186+
AutoSyncProgrammesButton(
187+
checked = playlist.autoRefreshProgrammes,
188+
onCheckedChange = onUpdatePlaylistAutoRefreshProgrammes
189+
)
190+
}
177191
}
178192
}
193+
179194
if (playlist.source == DataSource.M3U) {
180195
EpgManifestGallery(
181196
playlistUrl = playlist.url,
182197
manifest = manifest,
183-
contentPadding = inner,
184-
onUpdateEpgPlaylist = onUpdateEpgPlaylist,
185-
modifier = Modifier.fillMaxWidth()
198+
onUpdateEpgPlaylist = onUpdateEpgPlaylist
186199
)
187200
}
188201

189202
if (playlist.source == DataSource.Xtream) {
190-
XtreamPanel(
191-
info = xtreamUserInfo,
192-
modifier = Modifier.fillMaxWidth()
193-
)
203+
item {
204+
XtreamPanel(
205+
info = xtreamUserInfo,
206+
modifier = Modifier.fillMaxWidth()
207+
)
208+
}
194209
}
195210
}
196211

197212
val fabBottomPadding by animateDpAsState(
198213
targetValue = maxOf(
199214
WindowInsets.ime.asPaddingValues().calculateBottomPadding(),
200-
inner.calculateBottomPadding()
215+
contentPadding.calculateBottomPadding()
201216
),
202217
label = "apply changes bottom padding"
203218
)

feature/playlist-configuration/src/main/java/com/m3u/feature/playlist/configuration/components/EpgManifestGallery.kt

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@ package com.m3u.feature.playlist.configuration.components
33
import androidx.compose.foundation.background
44
import androidx.compose.foundation.border
55
import androidx.compose.foundation.clickable
6-
import androidx.compose.foundation.layout.Arrangement
7-
import androidx.compose.foundation.layout.Column
8-
import androidx.compose.foundation.layout.PaddingValues
96
import androidx.compose.foundation.layout.fillMaxWidth
107
import androidx.compose.foundation.layout.padding
11-
import androidx.compose.foundation.lazy.LazyColumn
8+
import androidx.compose.foundation.lazy.LazyListScope
129
import androidx.compose.foundation.lazy.items
1310
import androidx.compose.material3.ListItem
1411
import androidx.compose.material3.ListItemDefaults
@@ -28,25 +25,16 @@ import com.m3u.data.repository.playlist.PlaylistRepository
2825
import com.m3u.feature.playlist.configuration.EpgManifest
2926
import com.m3u.i18n.R.string
3027
import com.m3u.material.components.SelectionsDefaults
31-
import com.m3u.material.model.LocalHazeState
3228
import com.m3u.material.model.LocalSpacing
3329
import com.m3u.material.shape.AbsoluteSmoothCornerShape
34-
import dev.chrisbanes.haze.HazeDefaults
35-
import dev.chrisbanes.haze.haze
3630

37-
@Composable
38-
internal fun EpgManifestGallery(
31+
internal fun LazyListScope.EpgManifestGallery(
3932
playlistUrl: String,
4033
manifest: EpgManifest,
41-
contentPadding: PaddingValues,
42-
onUpdateEpgPlaylist: (PlaylistRepository.UpdateEpgPlaylistUseCase) -> Unit,
43-
modifier: Modifier = Modifier
34+
onUpdateEpgPlaylist: (PlaylistRepository.UpdateEpgPlaylistUseCase) -> Unit
4435
) {
45-
val spacing = LocalSpacing.current
46-
Column(
47-
verticalArrangement = Arrangement.spacedBy(spacing.medium),
48-
modifier = modifier
49-
) {
36+
stickyHeader {
37+
val spacing = LocalSpacing.current
5038
Text(
5139
text = stringResource(string.feat_playlist_configuration_enabled_epgs).title(),
5240
style = MaterialTheme.typography.titleMedium,
@@ -58,25 +46,14 @@ internal fun EpgManifestGallery(
5846
vertical = spacing.small
5947
)
6048
)
61-
LazyColumn(
62-
contentPadding = contentPadding,
63-
verticalArrangement = Arrangement.spacedBy(spacing.medium),
64-
modifier = Modifier
65-
.haze(
66-
LocalHazeState.current,
67-
HazeDefaults.style(MaterialTheme.colorScheme.surface)
68-
)
69-
.fillMaxWidth()
70-
) {
71-
items(manifest.entries.toList()) { (epg, associated) ->
72-
EpgManifestGalleryItem(
73-
playlistUrl = playlistUrl,
74-
epg = epg,
75-
associated = associated,
76-
onUpdateEpgPlaylist = onUpdateEpgPlaylist,
77-
)
78-
}
79-
}
49+
}
50+
items(manifest.entries.toList()) { (epg, associated) ->
51+
EpgManifestGalleryItem(
52+
playlistUrl = playlistUrl,
53+
epg = epg,
54+
associated = associated,
55+
onUpdateEpgPlaylist = onUpdateEpgPlaylist,
56+
)
8057
}
8158
}
8259

0 commit comments

Comments
 (0)