@@ -27,16 +27,18 @@ import androidx.compose.animation.core.tween
27
27
import androidx.compose.animation.fadeIn
28
28
import androidx.compose.animation.fadeOut
29
29
import androidx.compose.foundation.background
30
+ import androidx.compose.foundation.basicMarquee
31
+ import androidx.compose.foundation.layout.Arrangement
30
32
import androidx.compose.foundation.layout.Box
31
33
import androidx.compose.foundation.layout.Column
32
- import androidx.compose.foundation.layout.PaddingValues
33
34
import androidx.compose.foundation.layout.Row
35
+ import androidx.compose.foundation.layout.Spacer
36
+ import androidx.compose.foundation.layout.fillMaxHeight
34
37
import androidx.compose.foundation.layout.fillMaxSize
35
38
import androidx.compose.foundation.layout.fillMaxWidth
36
39
import androidx.compose.foundation.layout.height
37
40
import androidx.compose.foundation.layout.offset
38
41
import androidx.compose.foundation.layout.padding
39
- import androidx.compose.foundation.layout.width
40
42
import androidx.compose.foundation.layout.windowInsetsPadding
41
43
import androidx.compose.foundation.layout.wrapContentHeight
42
44
import androidx.compose.foundation.layout.wrapContentSize
@@ -50,26 +52,24 @@ import androidx.compose.runtime.Composable
50
52
import androidx.compose.ui.Alignment
51
53
import androidx.compose.ui.Modifier
52
54
import androidx.compose.ui.res.stringResource
53
- import androidx.compose.ui.text.style.TextOverflow
54
55
import androidx.compose.ui.tooling.preview.Preview
55
56
import androidx.compose.ui.unit.dp
56
- import androidx.compose.ui.unit.em
57
57
import androidx.media3.common.util.UnstableApi
58
58
import net.newpipe.newplayer.R
59
- import net.newpipe.newplayer.uiModel.NewPlayerUIState
60
- import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
61
- import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
62
- import net.newpipe.newplayer.uiModel.UIModeState
63
59
import net.newpipe.newplayer.ui.common.NewPlayerSeeker
64
60
import net.newpipe.newplayer.ui.common.ThumbPreview
65
- import net.newpipe.newplayer.ui.selection_ui.ChapterSelectUI
66
- import net.newpipe.newplayer.ui.selection_ui.StreamSelectUI
67
- import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
68
61
import net.newpipe.newplayer.ui.common.Thumbnail
69
62
import net.newpipe.newplayer.ui.common.getInsets
70
63
import net.newpipe.newplayer.ui.common.getLocale
71
64
import net.newpipe.newplayer.ui.common.getTimeStringFromMs
72
65
import net.newpipe.newplayer.ui.seeker.SeekerDefaults
66
+ import net.newpipe.newplayer.ui.selection_ui.ChapterSelectUI
67
+ import net.newpipe.newplayer.ui.selection_ui.StreamSelectUI
68
+ import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
69
+ import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
70
+ import net.newpipe.newplayer.uiModel.NewPlayerUIState
71
+ import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
72
+ import net.newpipe.newplayer.uiModel.UIModeState
73
73
74
74
75
75
private val UI_ENTER_ANIMATION = fadeIn(tween(200 ))
@@ -88,7 +88,11 @@ internal fun lightAudioControlButtonColorScheme() = ButtonDefaults.buttonColors(
88
88
@Composable
89
89
90
90
/* * @hide */
91
- internal fun AudioPlayerUI (viewModel : InternalNewPlayerViewModel , uiState : NewPlayerUIState , isLandScape : Boolean ) {
91
+ internal fun AudioPlayerUI (
92
+ viewModel : InternalNewPlayerViewModel ,
93
+ uiState : NewPlayerUIState ,
94
+ isLandScape : Boolean
95
+ ) {
92
96
val insets = getInsets()
93
97
94
98
Box (
@@ -125,23 +129,22 @@ internal fun AudioPlayerUI(viewModel: InternalNewPlayerViewModel, uiState: NewPl
125
129
enter = UI_ENTER_ANIMATION ,
126
130
exit = UI_EXIT_ANIMATION
127
131
) {
128
- Scaffold (modifier = Modifier
129
- .fillMaxSize()
130
- .windowInsetsPadding(insets),
131
- topBar = {
132
-
133
- }) { innerPadding ->
132
+ Scaffold (
133
+ modifier = Modifier
134
+ .fillMaxSize()
135
+ .windowInsetsPadding(insets),
136
+ ) { innerPadding ->
134
137
if (isLandScape) {
135
138
LandscapeLayout (
136
139
viewModel = viewModel,
137
140
uiState = uiState,
138
- innerPadding = innerPadding
141
+ modifier = Modifier .padding( innerPadding).padding( 16 .dp),
139
142
)
140
143
} else {
141
144
PortraitLayout (
142
145
viewModel = viewModel,
143
146
uiState = uiState,
144
- innerPadding = innerPadding
147
+ modifier = Modifier .padding( innerPadding).padding( 16 .dp),
145
148
)
146
149
}
147
150
}
@@ -152,145 +155,66 @@ internal fun AudioPlayerUI(viewModel: InternalNewPlayerViewModel, uiState: NewPl
152
155
@OptIn(UnstableApi ::class )
153
156
@Composable
154
157
private fun LandscapeLayout (
155
- modifier : Modifier = Modifier ,
156
158
viewModel : InternalNewPlayerViewModel ,
157
159
uiState : NewPlayerUIState ,
158
- innerPadding : PaddingValues
160
+ modifier : Modifier = Modifier ,
159
161
) {
160
- Row (
161
- modifier = modifier
162
- .fillMaxSize()
163
- .padding(20 .dp)
164
- ) {
165
- Column (
162
+ Column (modifier = modifier) {
163
+ TitleView (
166
164
modifier = Modifier
167
- .fillMaxSize()
168
- .weight(1f )
165
+ .fillMaxWidth(),
166
+ uiState = uiState,
167
+ )
168
+
169
+ Spacer (modifier = Modifier .height(8 .dp))
170
+
171
+ Row (
172
+ verticalAlignment = Alignment .CenterVertically ,
173
+ horizontalArrangement = Arrangement .spacedBy(32 .dp),
169
174
) {
170
175
CoverArt (
171
- modifier = Modifier
172
- .fillMaxSize()
173
- .weight(0.9f ), uiState = uiState
176
+ uiState = uiState,
177
+ modifier = Modifier .weight(1f )
174
178
)
175
179
176
- TitleView (
177
- modifier = Modifier
178
- .fillMaxSize()
179
- .weight(0.1f ), uiState = uiState
180
- )
181
- }
182
-
183
- Box (modifier = Modifier .width(20 .dp))
184
-
185
- Column (
186
- modifier = Modifier
187
- .fillMaxSize()
188
- .weight(1f )
189
- ) {
190
180
Column (
191
- modifier = Modifier
192
- .fillMaxSize()
193
- .weight(1f )
181
+ verticalArrangement = Arrangement .SpaceEvenly ,
182
+ modifier = Modifier .fillMaxHeight().weight(1f )
194
183
) {
195
- Box (
196
- modifier = Modifier
197
- .fillMaxSize()
198
- .weight(1f )
199
- )
200
- AudioPlaybackController (
201
- viewModel = viewModel,
202
- uiState = uiState
203
- )
204
- Box (
205
- modifier = Modifier
206
- .fillMaxSize()
207
- .weight(1f )
208
- )
209
- ProgressUI (
210
- viewModel = viewModel,
211
- uiState = uiState
212
- )
213
- Box (
214
- modifier = Modifier
215
- .fillMaxSize()
216
- .weight(1f )
217
- )
184
+ AudioPlaybackController (viewModel = viewModel, uiState = uiState)
185
+ ProgressUI (viewModel = viewModel, uiState = uiState)
186
+ AudioBottomUI (viewModel = viewModel, uiState = uiState)
218
187
}
219
- AudioBottomUI (viewModel, uiState)
220
- Box (
221
- modifier = Modifier
222
- .fillMaxSize()
223
- .weight(0.025f )
224
- )
225
188
}
226
189
}
227
190
}
228
191
229
192
@OptIn(UnstableApi ::class )
230
193
@Composable
231
194
private fun PortraitLayout (
232
- modifier : Modifier = Modifier ,
233
195
viewModel : InternalNewPlayerViewModel ,
234
196
uiState : NewPlayerUIState ,
235
- innerPadding : PaddingValues
197
+ modifier : Modifier = Modifier ,
236
198
) {
237
- Box (
238
- modifier = modifier
239
- .fillMaxSize()
240
- .padding(innerPadding)
199
+ Column (
200
+ modifier = modifier,
201
+ horizontalAlignment = Alignment . CenterHorizontally ,
202
+ verticalArrangement = Arrangement .spacedBy( 32 .dp),
241
203
) {
242
204
Column (
243
205
modifier = Modifier
244
- .fillMaxSize()
206
+ .fillMaxHeight()
207
+ .weight(1f ),
208
+ horizontalAlignment = Alignment .CenterHorizontally ,
209
+ verticalArrangement = Arrangement .Center ,
245
210
) {
246
- Column (
247
- modifier = Modifier
248
- .fillMaxSize()
249
- .padding(20 .dp)
250
- .weight(1f ),
251
- horizontalAlignment = Alignment .CenterHorizontally ,
252
- ) {
253
- Box (
254
- modifier = Modifier
255
- .fillMaxSize()
256
- .weight(0.5f )
257
- )
258
- CoverArt (uiState = uiState)
259
- Box (
260
- modifier = Modifier
261
- .fillMaxSize()
262
- .weight(0.3f )
263
- )
264
-
265
- TitleView (uiState = uiState)
266
-
267
- Box (
268
- modifier = Modifier
269
- .fillMaxSize()
270
- .weight(0.45f )
271
- )
272
- AudioPlaybackController (viewModel = viewModel, uiState = uiState)
273
-
274
-
275
- Box (
276
- modifier = Modifier
277
- .fillMaxSize()
278
- .weight(0.2f )
279
- )
280
- ProgressUI (viewModel = viewModel, uiState = uiState)
281
- Box (
282
- modifier = Modifier
283
- .fillMaxSize()
284
- .weight(0.2f )
285
- )
286
- }
287
- AudioBottomUI (viewModel, uiState)
288
- Box (
289
- modifier = Modifier
290
- .fillMaxSize()
291
- .weight(0.025f )
292
- )
211
+ CoverArt (uiState = uiState)
212
+ Spacer (modifier = Modifier .height(24 .dp))
213
+ TitleView (uiState = uiState)
293
214
}
215
+ AudioPlaybackController (viewModel = viewModel, uiState = uiState)
216
+ ProgressUI (viewModel = viewModel, uiState = uiState)
217
+ AudioBottomUI (viewModel, uiState)
294
218
}
295
219
}
296
220
@@ -347,23 +271,24 @@ private fun TitleView(modifier: Modifier = Modifier, uiState: NewPlayerUIState)
347
271
Column (modifier = modifier) {
348
272
Text (
349
273
text = uiState.currentlyPlaying?.mediaMetadata?.title.toString(),
350
- overflow = TextOverflow .Ellipsis ,
351
274
maxLines = 1 ,
352
- fontSize = 6 .em
275
+ style = MaterialTheme .typography.headlineMedium,
276
+ modifier = Modifier .basicMarquee(),
353
277
)
278
+ Spacer (modifier = Modifier .height(6 .dp))
354
279
Text (
355
280
text = uiState.currentlyPlaying?.mediaMetadata?.artist.toString(),
356
- overflow = TextOverflow .Ellipsis ,
357
281
maxLines = 1 ,
358
- fontSize = 4 .em
282
+ style = MaterialTheme .typography.bodyLarge,
283
+ modifier = Modifier .basicMarquee(),
359
284
)
360
285
}
361
286
}
362
287
363
288
@OptIn(UnstableApi ::class )
364
289
@Composable
365
290
private fun CoverArt (modifier : Modifier = Modifier , uiState : NewPlayerUIState ) {
366
- Box {
291
+ Box (modifier = modifier) {
367
292
Card (
368
293
elevation = CardDefaults .cardElevation(defaultElevation = 4 .dp)
369
294
) {
0 commit comments