Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skeleton progress for servers and play queue #368

Merged
merged 1 commit into from
Feb 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@ import android.content.res.Configuration
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.DragHandle
import androidx.compose.material.icons.rounded.MusicNote
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.LargeTopAppBar
import androidx.compose.material3.ListItem
Expand All @@ -35,6 +37,8 @@ import ru.stersh.youamp.core.ui.Artwork
import ru.stersh.youamp.core.ui.ArtworkMaskColor
import ru.stersh.youamp.core.ui.BackNavigationButton
import ru.stersh.youamp.core.ui.DragAndDropLazyColumn
import ru.stersh.youamp.core.ui.SkeletonLayout
import ru.stersh.youamp.core.ui.SkeletonScope
import ru.stersh.youamp.core.ui.SongPlayAnimation
import ru.stersh.youamp.core.ui.YouampPlayerTheme
import ru.stersh.youamp.feature.player.queue.R
Expand Down Expand Up @@ -85,13 +89,11 @@ private fun PlayerQueueScreen(
}
) { padding ->
if (state.progress) {
Box(
Progress(
modifier = Modifier
.padding(padding)
.fillMaxSize()
) {
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
}
)
} else {
DragAndDropLazyColumn(
items = state.songs,
Expand All @@ -114,6 +116,49 @@ private fun PlayerQueueScreen(
}
}

@Composable
private fun Progress(modifier: Modifier = Modifier) {
SkeletonLayout(modifier = modifier) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
ProgressItem()
ProgressItem()
ProgressItem()
}
}
}

@Composable
private fun SkeletonScope.ProgressItem() {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
SkeletonItem(
modifier = Modifier.size(48.dp),
shape = MaterialTheme.shapes.medium
)
Column(
verticalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier.weight(1f)
) {
SkeletonItem(modifier = Modifier.size(160.dp, 16.dp))
SkeletonItem(modifier = Modifier.size(100.dp, 16.dp))
}
SkeletonItem(
modifier = Modifier
.padding(end = 8.dp)
.size(24.dp, 12.dp),
shape = MaterialTheme.shapes.small
)
}
}

@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun SongItem(
Expand Down Expand Up @@ -205,4 +250,20 @@ private fun PlayerQueueScreenPreview() {
onBackClick = {}
)
}
}

@Composable
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
@Preview
private fun PlayerQueueScreenProgressPreview() {
YouampPlayerTheme {
val state = StateUi()
PlayerQueueScreen(
state = state,
onSongClick = {},
onSongLongClick = {},
onMoveSong = { from, to -> },
onBackClick = {}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@ package ru.stersh.youamp.feature.server.list.ui

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
Expand All @@ -12,7 +16,6 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material.icons.rounded.Dns
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
Expand Down Expand Up @@ -40,6 +43,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.collections.immutable.persistentListOf
import org.koin.androidx.compose.koinViewModel
import ru.stersh.youamp.core.ui.BackNavigationButton
import ru.stersh.youamp.core.ui.SkeletonLayout
import ru.stersh.youamp.core.ui.SkeletonScope
import ru.stersh.youamp.core.ui.YouampPlayerTheme
import ru.stersh.youamp.feature.server.list.R

Expand Down Expand Up @@ -94,11 +99,11 @@ private fun ServerListScreen(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection)
) {
if (state.progress) {
Box(modifier = Modifier.fillMaxSize()) {
CircularProgressIndicator(
modifier = Modifier.align(Alignment.Center)
)
}
Progress(
modifier = Modifier
.padding(it)
.fillMaxSize()
)
} else {
LazyColumn(
modifier = Modifier.padding(it)
Expand All @@ -120,6 +125,49 @@ private fun ServerListScreen(
}
}

@Composable
private fun Progress(modifier: Modifier = Modifier) {
SkeletonLayout(modifier = modifier) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
ProgressItem()
ProgressItem()
ProgressItem()
}
}
}

@Composable
private fun SkeletonScope.ProgressItem() {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
SkeletonItem(
modifier = Modifier.size(48.dp),
shape = CircleShape
)
Column(
verticalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier.weight(1f)
) {
SkeletonItem(modifier = Modifier.size(100.dp, 16.dp))
SkeletonItem(modifier = Modifier.size(160.dp, 16.dp))
}
SkeletonItem(
modifier = Modifier
.padding(end = 8.dp)
.size(24.dp),
shape = CircleShape
)
}
}

@Composable
private fun ServerItem(
item: ServerUi,
Expand Down
Loading