Add Dimensions class
This commit is contained in:
@@ -144,7 +144,7 @@ class MainActivity : ComponentActivity() {
|
|||||||
|
|
||||||
PlayerView(
|
PlayerView(
|
||||||
layoutState = rememberBottomSheetState(
|
layoutState = rememberBottomSheetState(
|
||||||
lowerBound = 64.dp, upperBound = maxHeight
|
lowerBound = Dimensions.collapsedPlayer, upperBound = maxHeight
|
||||||
),
|
),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.align(Alignment.BottomCenter)
|
.align(Alignment.BottomCenter)
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import androidx.compose.ui.draw.shadow
|
|||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -39,8 +38,10 @@ import it.vfsfitvnm.vimusic.models.SongAlbumMap
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
||||||
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
import it.vfsfitvnm.youtubemusic.YouTube
|
import it.vfsfitvnm.youtubemusic.YouTube
|
||||||
@@ -109,18 +110,12 @@ fun AlbumScreen(
|
|||||||
|
|
||||||
host {
|
host {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val density = LocalDensity.current
|
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
|
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
val menuState = LocalMenuState.current
|
val menuState = LocalMenuState.current
|
||||||
|
|
||||||
val (thumbnailSizeDp, thumbnailSizePx) = remember {
|
|
||||||
density.run {
|
|
||||||
128.dp to 128.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = lazyListState,
|
state = lazyListState,
|
||||||
@@ -208,12 +203,12 @@ fun AlbumScreen(
|
|||||||
.padding(bottom = 16.dp)
|
.padding(bottom = 16.dp)
|
||||||
) {
|
) {
|
||||||
AsyncImage(
|
AsyncImage(
|
||||||
model = album.thumbnailUrl?.thumbnail(thumbnailSizePx),
|
model = album.thumbnailUrl?.thumbnail(Dimensions.thumbnails.album.px),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
contentScale = ContentScale.Crop,
|
contentScale = ContentScale.Crop,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clip(ThumbnailRoundness.shape)
|
.clip(ThumbnailRoundness.shape)
|
||||||
.size(thumbnailSizeDp)
|
.size(Dimensions.thumbnails.album)
|
||||||
)
|
)
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
@@ -350,7 +345,7 @@ private fun LoadingOrError(
|
|||||||
Spacer(
|
Spacer(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(color = LocalColorPalette.current.darkGray, shape = ThumbnailRoundness.shape)
|
.background(color = LocalColorPalette.current.darkGray, shape = ThumbnailRoundness.shape)
|
||||||
.size(128.dp)
|
.size(Dimensions.thumbnails.album)
|
||||||
)
|
)
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import androidx.compose.ui.draw.alpha
|
|||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.draw.shadow
|
import androidx.compose.ui.draw.shadow
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.zIndex
|
import androidx.compose.ui.zIndex
|
||||||
@@ -37,8 +36,10 @@ import it.vfsfitvnm.vimusic.ui.components.themed.InHistoryMediaItemMenu
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError
|
import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.TextCard
|
import it.vfsfitvnm.vimusic.ui.components.themed.TextCard
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
|
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
import it.vfsfitvnm.youtubemusic.YouTube
|
import it.vfsfitvnm.youtubemusic.YouTube
|
||||||
@@ -76,7 +77,6 @@ fun ArtistScreen(
|
|||||||
host {
|
host {
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
|
|
||||||
val density = LocalDensity.current
|
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
|
|
||||||
@@ -100,17 +100,7 @@ fun ArtistScreen(
|
|||||||
}.distinctUntilChanged()
|
}.distinctUntilChanged()
|
||||||
}.collectAsState(initial = null, context = Dispatchers.IO)
|
}.collectAsState(initial = null, context = Dispatchers.IO)
|
||||||
|
|
||||||
val (thumbnailSizeDp, thumbnailSizePx) = remember {
|
val songThumbnailSizePx = Dimensions.thumbnails.song.px
|
||||||
density.run {
|
|
||||||
192.dp to 192.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val songThumbnailSizePx = remember {
|
|
||||||
density.run {
|
|
||||||
54.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val songs by remember(browseId) {
|
val songs by remember(browseId) {
|
||||||
Database.artistSongs(browseId)
|
Database.artistSongs(browseId)
|
||||||
@@ -145,7 +135,7 @@ fun ArtistScreen(
|
|||||||
item {
|
item {
|
||||||
artistResult?.getOrNull()?.let { artist ->
|
artistResult?.getOrNull()?.let { artist ->
|
||||||
AsyncImage(
|
AsyncImage(
|
||||||
model = artist.thumbnailUrl?.thumbnail(thumbnailSizePx),
|
model = artist.thumbnailUrl?.thumbnail(Dimensions.thumbnails.artist.px),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clip(CircleShape)
|
.clip(CircleShape)
|
||||||
@@ -160,7 +150,7 @@ fun ArtistScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.size(thumbnailSizeDp)
|
.size(Dimensions.thumbnails.artist)
|
||||||
)
|
)
|
||||||
|
|
||||||
BasicText(
|
BasicText(
|
||||||
@@ -205,7 +195,8 @@ fun ArtistScreen(
|
|||||||
.clickable {
|
.clickable {
|
||||||
binder?.playRadio(
|
binder?.playRadio(
|
||||||
NavigationEndpoint.Endpoint.Watch(
|
NavigationEndpoint.Endpoint.Watch(
|
||||||
videoId = artist.radioVideoId ?: artist.shuffleVideoId,
|
videoId = artist.radioVideoId
|
||||||
|
?: artist.shuffleVideoId,
|
||||||
playlistId = artist.radioPlaylistId
|
playlistId = artist.radioPlaylistId
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -320,7 +311,7 @@ private fun LoadingOrError(
|
|||||||
Spacer(
|
Spacer(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(color = colorPalette.darkGray, shape = CircleShape)
|
.background(color = colorPalette.darkGray, shape = CircleShape)
|
||||||
.size(192.dp)
|
.size(Dimensions.thumbnails.artist)
|
||||||
)
|
)
|
||||||
|
|
||||||
TextPlaceholder(
|
TextPlaceholder(
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.shadow
|
import androidx.compose.ui.draw.shadow
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import it.vfsfitvnm.route.RouteHandler
|
import it.vfsfitvnm.route.RouteHandler
|
||||||
@@ -30,8 +29,10 @@ import it.vfsfitvnm.vimusic.models.DetailedSong
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
||||||
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -62,18 +63,13 @@ fun BuiltInPlaylistScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
host {
|
host {
|
||||||
val density = LocalDensity.current
|
|
||||||
val menuState = LocalMenuState.current
|
val menuState = LocalMenuState.current
|
||||||
|
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
|
|
||||||
val thumbnailSize = remember {
|
val thumbnailSize = Dimensions.thumbnails.song.px
|
||||||
density.run {
|
|
||||||
54.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val songs by remember(binder?.cache, builtInPlaylist) {
|
val songs by remember(binder?.cache, builtInPlaylist) {
|
||||||
when (builtInPlaylist) {
|
when (builtInPlaylist) {
|
||||||
@@ -90,7 +86,7 @@ fun BuiltInPlaylistScreen(
|
|||||||
|
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = lazyListState,
|
state = lazyListState,
|
||||||
contentPadding = PaddingValues(bottom = 64.dp),
|
contentPadding = PaddingValues(bottom = Dimensions.collapsedPlayer),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(colorPalette.background)
|
.background(colorPalette.background)
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
|
|||||||
@@ -48,8 +48,10 @@ import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.themed.DropdownMenu
|
import it.vfsfitvnm.vimusic.ui.components.themed.DropdownMenu
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.InHistoryMediaItemMenu
|
import it.vfsfitvnm.vimusic.ui.components.themed.InHistoryMediaItemMenu
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.TextFieldDialog
|
import it.vfsfitvnm.vimusic.ui.components.themed.TextFieldDialog
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.ui.views.PlaylistPreviewItem
|
import it.vfsfitvnm.vimusic.ui.views.PlaylistPreviewItem
|
||||||
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
@@ -148,13 +150,8 @@ fun HomeScreen() {
|
|||||||
@Suppress("UNUSED_EXPRESSION") songCollection
|
@Suppress("UNUSED_EXPRESSION") songCollection
|
||||||
|
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
val density = LocalDensity.current
|
|
||||||
|
|
||||||
val thumbnailSize = remember {
|
val thumbnailSize = Dimensions.thumbnails.song.px
|
||||||
density.run {
|
|
||||||
54.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var isGridExpanded by remember {
|
var isGridExpanded by remember {
|
||||||
mutableStateOf(false)
|
mutableStateOf(false)
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.alpha
|
import androidx.compose.ui.draw.alpha
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import it.vfsfitvnm.route.RouteHandler
|
import it.vfsfitvnm.route.RouteHandler
|
||||||
@@ -27,7 +26,9 @@ import it.vfsfitvnm.vimusic.transaction
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
||||||
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.utils.asMediaItem
|
import it.vfsfitvnm.vimusic.utils.asMediaItem
|
||||||
import it.vfsfitvnm.vimusic.utils.enqueue
|
import it.vfsfitvnm.vimusic.utils.enqueue
|
||||||
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
|
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
|
||||||
@@ -36,6 +37,7 @@ import it.vfsfitvnm.youtubemusic.YouTube
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
|
|
||||||
@ExperimentalAnimationApi
|
@ExperimentalAnimationApi
|
||||||
@Composable
|
@Composable
|
||||||
fun IntentUriScreen(uri: Uri) {
|
fun IntentUriScreen(uri: Uri) {
|
||||||
@@ -60,9 +62,10 @@ fun IntentUriScreen(uri: Uri) {
|
|||||||
host {
|
host {
|
||||||
val menuState = LocalMenuState.current
|
val menuState = LocalMenuState.current
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val density = LocalDensity.current
|
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
|
|
||||||
|
val thumbnailSizePx = Dimensions.thumbnails.song.px
|
||||||
|
|
||||||
var itemsResult by remember(uri) {
|
var itemsResult by remember(uri) {
|
||||||
mutableStateOf<Result<List<YouTube.Item.Song>>?>(null)
|
mutableStateOf<Result<List<YouTube.Item.Song>>?>(null)
|
||||||
}
|
}
|
||||||
@@ -125,7 +128,7 @@ fun IntentUriScreen(uri: Uri) {
|
|||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = lazyListState,
|
state = lazyListState,
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
contentPadding = PaddingValues(bottom = 64.dp),
|
contentPadding = PaddingValues(bottom = Dimensions.collapsedPlayer),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(colorPalette.background)
|
.background(colorPalette.background)
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
@@ -189,7 +192,6 @@ fun IntentUriScreen(uri: Uri) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
itemsResult?.getOrNull()?.let { items ->
|
itemsResult?.getOrNull()?.let { items ->
|
||||||
if (items.isEmpty()) {
|
if (items.isEmpty()) {
|
||||||
item {
|
item {
|
||||||
@@ -205,7 +207,7 @@ fun IntentUriScreen(uri: Uri) {
|
|||||||
) { index, item ->
|
) { index, item ->
|
||||||
SmallSongItem(
|
SmallSongItem(
|
||||||
song = item,
|
song = item,
|
||||||
thumbnailSizePx = density.run { 54.dp.roundToPx() },
|
thumbnailSizePx = thumbnailSizePx,
|
||||||
onClick = {
|
onClick = {
|
||||||
binder?.stopRadio()
|
binder?.stopRadio()
|
||||||
binder?.player?.forcePlayAtIndex(items.map(YouTube.Item.Song::asMediaItem), index)
|
binder?.player?.forcePlayAtIndex(items.map(YouTube.Item.Song::asMediaItem), index)
|
||||||
@@ -239,7 +241,7 @@ private fun LoadingOrError(
|
|||||||
) {
|
) {
|
||||||
repeat(5) { index ->
|
repeat(5) { index ->
|
||||||
SmallSongItemShimmer(
|
SmallSongItemShimmer(
|
||||||
thumbnailSizeDp = 54.dp,
|
thumbnailSizeDp = Dimensions.thumbnails.song,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.alpha(1f - index * 0.175f)
|
.alpha(1f - index * 0.175f)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.draw.shadow
|
import androidx.compose.ui.draw.shadow
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -26,14 +25,16 @@ import it.vfsfitvnm.reordering.verticalDragAfterLongPressToReorder
|
|||||||
import it.vfsfitvnm.route.RouteHandler
|
import it.vfsfitvnm.route.RouteHandler
|
||||||
import it.vfsfitvnm.vimusic.*
|
import it.vfsfitvnm.vimusic.*
|
||||||
import it.vfsfitvnm.vimusic.R
|
import it.vfsfitvnm.vimusic.R
|
||||||
|
import it.vfsfitvnm.vimusic.models.DetailedSong
|
||||||
import it.vfsfitvnm.vimusic.models.PlaylistWithSongs
|
import it.vfsfitvnm.vimusic.models.PlaylistWithSongs
|
||||||
import it.vfsfitvnm.vimusic.models.SongPlaylistMap
|
import it.vfsfitvnm.vimusic.models.SongPlaylistMap
|
||||||
import it.vfsfitvnm.vimusic.models.DetailedSong
|
|
||||||
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
||||||
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -68,7 +69,6 @@ fun LocalPlaylistScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
host {
|
host {
|
||||||
val density = LocalDensity.current
|
|
||||||
val hapticFeedback = LocalHapticFeedback.current
|
val hapticFeedback = LocalHapticFeedback.current
|
||||||
val menuState = LocalMenuState.current
|
val menuState = LocalMenuState.current
|
||||||
|
|
||||||
@@ -76,11 +76,7 @@ fun LocalPlaylistScreen(
|
|||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
|
|
||||||
val thumbnailSize = remember {
|
val thumbnailSize = Dimensions.thumbnails.song.px
|
||||||
density.run {
|
|
||||||
54.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val reorderingState = rememberReorderingState(playlistWithSongs.songs)
|
val reorderingState = rememberReorderingState(playlistWithSongs.songs)
|
||||||
|
|
||||||
@@ -124,7 +120,7 @@ fun LocalPlaylistScreen(
|
|||||||
|
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = lazyListState,
|
state = lazyListState,
|
||||||
contentPadding = PaddingValues(bottom = 64.dp),
|
contentPadding = PaddingValues(bottom = Dimensions.collapsedPlayer),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(colorPalette.background)
|
.background(colorPalette.background)
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import androidx.compose.ui.draw.shadow
|
|||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -36,8 +35,10 @@ import it.vfsfitvnm.vimusic.transaction
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
||||||
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
import it.vfsfitvnm.vimusic.ui.components.themed.*
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
import it.vfsfitvnm.youtubemusic.YouTube
|
import it.vfsfitvnm.youtubemusic.YouTube
|
||||||
@@ -70,24 +71,14 @@ fun PlaylistScreen(
|
|||||||
|
|
||||||
host {
|
host {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val density = LocalDensity.current
|
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
|
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
val menuState = LocalMenuState.current
|
val menuState = LocalMenuState.current
|
||||||
|
|
||||||
val (thumbnailSizeDp, thumbnailSizePx) = remember {
|
val thumbnailSizePx = Dimensions.thumbnails.playlist.px
|
||||||
density.run {
|
val songThumbnailSizePx = Dimensions.thumbnails.song.px
|
||||||
128.dp to 128.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val (songThumbnailSizeDp, songThumbnailSizePx) = remember {
|
|
||||||
density.run {
|
|
||||||
54.dp to 54.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var playlist by remember {
|
var playlist by remember {
|
||||||
mutableStateOf<Result<YouTube.PlaylistOrAlbum>?>(null)
|
mutableStateOf<Result<YouTube.PlaylistOrAlbum>?>(null)
|
||||||
@@ -239,7 +230,7 @@ fun PlaylistScreen(
|
|||||||
contentScale = ContentScale.Crop,
|
contentScale = ContentScale.Crop,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clip(ThumbnailRoundness.shape)
|
.clip(ThumbnailRoundness.shape)
|
||||||
.size(thumbnailSizeDp)
|
.size(Dimensions.thumbnails.playlist)
|
||||||
)
|
)
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
@@ -372,7 +363,7 @@ fun PlaylistScreen(
|
|||||||
contentScale = ContentScale.Crop,
|
contentScale = ContentScale.Crop,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clip(ThumbnailRoundness.shape)
|
.clip(ThumbnailRoundness.shape)
|
||||||
.size(songThumbnailSizeDp)
|
.size(Dimensions.thumbnails.song)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -414,7 +405,7 @@ private fun LoadingOrError(
|
|||||||
Spacer(
|
Spacer(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(color = colorPalette.darkGray, shape = ThumbnailRoundness.shape)
|
.background(color = colorPalette.darkGray, shape = ThumbnailRoundness.shape)
|
||||||
.size(128.dp)
|
.size(Dimensions.thumbnails.playlist)
|
||||||
)
|
)
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
@@ -439,7 +430,7 @@ private fun LoadingOrError(
|
|||||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.alpha(0.6f - it * 0.1f)
|
.alpha(0.6f - it * 0.1f)
|
||||||
.height(54.dp)
|
.height(Dimensions.thumbnails.song)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(vertical = 4.dp, horizontal = 16.dp)
|
.padding(vertical = 4.dp, horizontal = 16.dp)
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import androidx.compose.ui.draw.alpha
|
|||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
@@ -37,8 +36,10 @@ import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
|
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.TextCard
|
import it.vfsfitvnm.vimusic.ui.components.themed.TextCard
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
|
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
import it.vfsfitvnm.vimusic.ui.views.SongItem
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
import it.vfsfitvnm.youtubemusic.YouTube
|
import it.vfsfitvnm.youtubemusic.YouTube
|
||||||
@@ -52,7 +53,6 @@ fun SearchResultScreen(
|
|||||||
query: String,
|
query: String,
|
||||||
onSearchAgain: () -> Unit,
|
onSearchAgain: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val density = LocalDensity.current
|
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
val preferences = LocalPreferences.current
|
val preferences = LocalPreferences.current
|
||||||
@@ -83,11 +83,7 @@ fun SearchResultScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val thumbnailSizePx = remember {
|
val thumbnailSizePx = Dimensions.thumbnails.song.px
|
||||||
density.run {
|
|
||||||
54.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val albumRoute = rememberAlbumRoute()
|
val albumRoute = rememberAlbumRoute()
|
||||||
val playlistRoute = rememberPlaylistRoute()
|
val playlistRoute = rememberPlaylistRoute()
|
||||||
@@ -118,7 +114,7 @@ fun SearchResultScreen(
|
|||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = lazyListState,
|
state = lazyListState,
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
contentPadding = PaddingValues(bottom = 64.dp),
|
contentPadding = PaddingValues(bottom = Dimensions.collapsedPlayer),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.background(colorPalette.background)
|
.background(colorPalette.background)
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
@@ -212,7 +208,7 @@ fun SearchResultScreen(
|
|||||||
) { item ->
|
) { item ->
|
||||||
SmallItem(
|
SmallItem(
|
||||||
item = item,
|
item = item,
|
||||||
thumbnailSizeDp = 54.dp,
|
thumbnailSizeDp = Dimensions.thumbnails.song,
|
||||||
thumbnailSizePx = thumbnailSizePx,
|
thumbnailSizePx = thumbnailSizePx,
|
||||||
onClick = {
|
onClick = {
|
||||||
when (item) {
|
when (item) {
|
||||||
@@ -571,7 +567,7 @@ private fun LoadingOrError(
|
|||||||
repeat(itemCount) { index ->
|
repeat(itemCount) { index ->
|
||||||
if (isLoadingArtists) {
|
if (isLoadingArtists) {
|
||||||
SmallArtistItemShimmer(
|
SmallArtistItemShimmer(
|
||||||
thumbnailSizeDp = 54.dp,
|
thumbnailSizeDp = Dimensions.thumbnails.song,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.alpha(1f - index * 0.125f)
|
.alpha(1f - index * 0.125f)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
@@ -579,7 +575,7 @@ private fun LoadingOrError(
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
SmallSongItemShimmer(
|
SmallSongItemShimmer(
|
||||||
thumbnailSizeDp = 54.dp,
|
thumbnailSizeDp = Dimensions.thumbnails.song,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.alpha(1f - index * 0.125f)
|
.alpha(1f - index * 0.125f)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import it.vfsfitvnm.vimusic.R
|
|||||||
import it.vfsfitvnm.vimusic.query
|
import it.vfsfitvnm.vimusic.query
|
||||||
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
import it.vfsfitvnm.vimusic.ui.components.TopAppBar
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError
|
import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
import it.vfsfitvnm.vimusic.utils.medium
|
import it.vfsfitvnm.vimusic.utils.medium
|
||||||
@@ -245,7 +246,7 @@ fun SearchScreen(
|
|||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.verticalScroll(rememberScrollState())
|
.verticalScroll(rememberScrollState())
|
||||||
.padding(bottom = 64.dp)
|
.padding(bottom = Dimensions.collapsedPlayer)
|
||||||
) {
|
) {
|
||||||
history?.forEach { searchQuery ->
|
history?.forEach { searchQuery ->
|
||||||
Row(
|
Row(
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package it.vfsfitvnm.vimusic.ui.styling
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.platform.LocalConfiguration
|
||||||
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
|
import androidx.compose.ui.unit.Dp
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("ClassName")
|
||||||
|
object Dimensions {
|
||||||
|
object thumbnails {
|
||||||
|
val album = 128.dp
|
||||||
|
val artist = 192.dp
|
||||||
|
val song = 54.dp
|
||||||
|
val playlist = album
|
||||||
|
|
||||||
|
object player {
|
||||||
|
val songPreview = collapsedPlayer
|
||||||
|
val song: Dp
|
||||||
|
@Composable
|
||||||
|
get() = with (LocalConfiguration.current) {
|
||||||
|
minOf(screenHeightDp, screenWidthDp)
|
||||||
|
}.dp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val collapsedPlayer = 64.dp
|
||||||
|
val playerBottomSheetPeekHeight = 128.dp
|
||||||
|
}
|
||||||
|
|
||||||
|
inline val Dp.px: Int
|
||||||
|
@Composable
|
||||||
|
inline get() = with (LocalDensity.current) { roundToPx() }
|
||||||
@@ -37,8 +37,10 @@ import it.vfsfitvnm.vimusic.ui.components.BottomSheetState
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.MusicBars
|
import it.vfsfitvnm.vimusic.ui.components.MusicBars
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu
|
import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu
|
||||||
import it.vfsfitvnm.vimusic.ui.screens.SmallSongItemShimmer
|
import it.vfsfitvnm.vimusic.ui.screens.SmallSongItemShimmer
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LightColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LightColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.px
|
||||||
import it.vfsfitvnm.vimusic.utils.PlayerState
|
import it.vfsfitvnm.vimusic.utils.PlayerState
|
||||||
|
|
||||||
|
|
||||||
@@ -52,14 +54,9 @@ fun CurrentPlaylistView(
|
|||||||
) {
|
) {
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
val hapticFeedback = LocalHapticFeedback.current
|
val hapticFeedback = LocalHapticFeedback.current
|
||||||
val density = LocalDensity.current
|
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
|
|
||||||
val thumbnailSize = remember {
|
val thumbnailSize = Dimensions.thumbnails.song.px
|
||||||
density.run {
|
|
||||||
54.dp.roundToPx()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val isPaused by derivedStateOf {
|
val isPaused by derivedStateOf {
|
||||||
playerState?.playbackState == Player.STATE_ENDED || playerState?.playWhenReady == false
|
playerState?.playbackState == Player.STATE_ENDED || playerState?.playWhenReady == false
|
||||||
@@ -119,7 +116,7 @@ fun CurrentPlaylistView(
|
|||||||
color = Color.Black.copy(alpha = 0.25f),
|
color = Color.Black.copy(alpha = 0.25f),
|
||||||
shape = ThumbnailRoundness.shape
|
shape = ThumbnailRoundness.shape
|
||||||
)
|
)
|
||||||
.size(54.dp)
|
.size(Dimensions.thumbnails.song)
|
||||||
) {
|
) {
|
||||||
if (isPaused) {
|
if (isPaused) {
|
||||||
Image(
|
Image(
|
||||||
@@ -175,7 +172,7 @@ fun CurrentPlaylistView(
|
|||||||
) {
|
) {
|
||||||
repeat(3) { index ->
|
repeat(3) { index ->
|
||||||
SmallSongItemShimmer(
|
SmallSongItemShimmer(
|
||||||
thumbnailSizeDp = 54.dp,
|
thumbnailSizeDp = Dimensions.thumbnails.song,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.alpha(1f - index * 0.125f)
|
.alpha(1f - index * 0.125f)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import it.vfsfitvnm.vimusic.ui.components.BottomSheet
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.BottomSheetState
|
import it.vfsfitvnm.vimusic.ui.components.BottomSheetState
|
||||||
import it.vfsfitvnm.vimusic.ui.components.HorizontalTabPager
|
import it.vfsfitvnm.vimusic.ui.components.HorizontalTabPager
|
||||||
import it.vfsfitvnm.vimusic.ui.components.rememberTabPagerState
|
import it.vfsfitvnm.vimusic.ui.components.rememberTabPagerState
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
import it.vfsfitvnm.vimusic.utils.PlayerState
|
import it.vfsfitvnm.vimusic.utils.PlayerState
|
||||||
@@ -60,7 +61,7 @@ fun PlayerBottomSheet(
|
|||||||
|
|
||||||
BottomSheet(
|
BottomSheet(
|
||||||
state = layoutState,
|
state = layoutState,
|
||||||
peekHeight = 128.dp,
|
peekHeight = Dimensions.playerBottomSheetPeekHeight,
|
||||||
elevation = 16.dp,
|
elevation = 16.dp,
|
||||||
shape = RoundedCornerShape(topStart = 8.dp, topEnd = 8.dp),
|
shape = RoundedCornerShape(topStart = 8.dp, topEnd = 8.dp),
|
||||||
handleOutsideInteractionsWhenExpanded = true,
|
handleOutsideInteractionsWhenExpanded = true,
|
||||||
|
|||||||
@@ -25,9 +25,7 @@ import androidx.compose.ui.graphics.ColorFilter
|
|||||||
import androidx.compose.ui.graphics.graphicsLayer
|
import androidx.compose.ui.graphics.graphicsLayer
|
||||||
import androidx.compose.ui.input.pointer.pointerInput
|
import androidx.compose.ui.input.pointer.pointerInput
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -45,9 +43,7 @@ import it.vfsfitvnm.vimusic.query
|
|||||||
import it.vfsfitvnm.vimusic.ui.components.*
|
import it.vfsfitvnm.vimusic.ui.components.*
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError
|
import it.vfsfitvnm.vimusic.ui.components.themed.LoadingOrError
|
||||||
import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu
|
import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.BlackColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.*
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
|
||||||
import it.vfsfitvnm.vimusic.utils.*
|
import it.vfsfitvnm.vimusic.utils.*
|
||||||
import it.vfsfitvnm.youtubemusic.YouTube
|
import it.vfsfitvnm.youtubemusic.YouTube
|
||||||
import it.vfsfitvnm.youtubemusic.models.PlayerResponse
|
import it.vfsfitvnm.youtubemusic.models.PlayerResponse
|
||||||
@@ -67,26 +63,19 @@ fun PlayerView(
|
|||||||
val preferences = LocalPreferences.current
|
val preferences = LocalPreferences.current
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
val density = LocalDensity.current
|
|
||||||
val configuration = LocalConfiguration.current
|
|
||||||
val binder = LocalPlayerServiceBinder.current
|
val binder = LocalPlayerServiceBinder.current
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
|
||||||
val player = binder?.player
|
val player = binder?.player
|
||||||
val playerState = rememberPlayerState(player)
|
val playerState = rememberPlayerState(player)
|
||||||
|
|
||||||
val coroutineScope = rememberCoroutineScope()
|
|
||||||
|
|
||||||
player ?: return
|
player ?: return
|
||||||
playerState?.mediaItem ?: return
|
playerState?.mediaItem ?: return
|
||||||
|
|
||||||
val smallThumbnailSize = remember {
|
val coroutineScope = rememberCoroutineScope()
|
||||||
density.run { 64.dp.roundToPx() }
|
|
||||||
}
|
|
||||||
|
|
||||||
val (thumbnailSizeDp, thumbnailSizePx) = remember {
|
val (thumbnailSizeDp, thumbnailSizePx) = Dimensions.thumbnails.player.song.let {
|
||||||
val size = minOf(configuration.screenHeightDp, configuration.screenWidthDp).dp
|
it to (it - 64.dp).px
|
||||||
size to density.run { size.minus(64.dp).roundToPx() }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BottomSheet(
|
BottomSheet(
|
||||||
@@ -105,7 +94,7 @@ fun PlayerView(
|
|||||||
}
|
}
|
||||||
.background(colorPalette.elevatedBackground)
|
.background(colorPalette.elevatedBackground)
|
||||||
.drawBehind {
|
.drawBehind {
|
||||||
val offset = 64.dp.toPx()
|
val offset = Dimensions.thumbnails.player.songPreview.toPx()
|
||||||
|
|
||||||
drawLine(
|
drawLine(
|
||||||
color = colorPalette.text,
|
color = colorPalette.text,
|
||||||
@@ -122,11 +111,11 @@ fun PlayerView(
|
|||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
AsyncImage(
|
AsyncImage(
|
||||||
model = playerState.mediaMetadata.artworkUri.thumbnail(smallThumbnailSize),
|
model = playerState.mediaMetadata.artworkUri.thumbnail(Dimensions.thumbnails.player.songPreview.px),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
contentScale = ContentScale.Crop,
|
contentScale = ContentScale.Crop,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.size(64.dp)
|
.size(Dimensions.thumbnails.player.songPreview)
|
||||||
)
|
)
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
@@ -631,11 +620,11 @@ fun PlayerView(
|
|||||||
|
|
||||||
PlayerBottomSheet(
|
PlayerBottomSheet(
|
||||||
playerState = playerState,
|
playerState = playerState,
|
||||||
layoutState = rememberBottomSheetState(64.dp, layoutState.upperBound - 128.dp),
|
layoutState = rememberBottomSheetState(64.dp, layoutState.upperBound - Dimensions.playerBottomSheetPeekHeight),
|
||||||
onGlobalRouteEmitted = layoutState.collapse,
|
onGlobalRouteEmitted = layoutState.collapse,
|
||||||
song = song,
|
song = song,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(bottom = 128.dp)
|
.padding(bottom = Dimensions.playerBottomSheetPeekHeight)
|
||||||
.align(Alignment.BottomCenter)
|
.align(Alignment.BottomCenter)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp
|
|||||||
import coil.compose.AsyncImage
|
import coil.compose.AsyncImage
|
||||||
import it.vfsfitvnm.vimusic.Database
|
import it.vfsfitvnm.vimusic.Database
|
||||||
import it.vfsfitvnm.vimusic.models.PlaylistPreview
|
import it.vfsfitvnm.vimusic.models.PlaylistPreview
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
import it.vfsfitvnm.vimusic.utils.color
|
import it.vfsfitvnm.vimusic.utils.color
|
||||||
@@ -30,11 +31,12 @@ import it.vfsfitvnm.vimusic.utils.thumbnail
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun PlaylistPreviewItem(
|
fun PlaylistPreviewItem(
|
||||||
playlistPreview: PlaylistPreview,
|
playlistPreview: PlaylistPreview,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
thumbnailSize: Dp = 54.dp,
|
thumbnailSize: Dp = Dimensions.thumbnails.song,
|
||||||
) {
|
) {
|
||||||
val colorPalette = LocalColorPalette.current
|
val colorPalette = LocalColorPalette.current
|
||||||
val typography = LocalTypography.current
|
val typography = LocalTypography.current
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import coil.request.ImageRequest
|
|||||||
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
|
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
|
||||||
import it.vfsfitvnm.vimusic.models.DetailedSong
|
import it.vfsfitvnm.vimusic.models.DetailedSong
|
||||||
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
||||||
|
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||||
import it.vfsfitvnm.vimusic.utils.secondary
|
import it.vfsfitvnm.vimusic.utils.secondary
|
||||||
@@ -113,7 +114,7 @@ fun SongItem(
|
|||||||
startContent = {
|
startContent = {
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.size(54.dp)
|
.size(Dimensions.thumbnails.song)
|
||||||
) {
|
) {
|
||||||
AsyncImage(
|
AsyncImage(
|
||||||
model = thumbnailModel,
|
model = thumbnailModel,
|
||||||
|
|||||||
Reference in New Issue
Block a user