package com.suno.android.omniplayer import androidx.annotation.OptIn import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.pager.PagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.media3.common.util.UnstableApi import coil3.compose.AsyncImage import com.suno.android.common_core_utils.model.Url import com.suno.android.common_ui.components.SongVideoCoverPlayer @Composable fun BoxScope.AudioPlayerCover( viewModel: AudioPlayerViewModel = hiltViewModel(), page: Int, parentPagerState: PagerState, albumArtImageUrl: Url?, videoCoverUrl: Url?, dominantColor: Color?, ) { if (videoCoverUrl != null && viewModel.isVideoCoverGateEnabled) { AudioWithVideoCover( viewModel = viewModel, page = page, parentPagerState = parentPagerState, videoCoverUrl = videoCoverUrl, ) } else { // Display the cover art image AsyncImage( modifier = Modifier.fillMaxHeight(), model = albumArtImageUrl, placeholder = ColorPainter(Color.LightGray), contentDescription = null, contentScale = ContentScale.Crop, ) GradientCover(dominantColor) } } @OptIn(UnstableApi::class) @Composable private fun AudioWithVideoCover( viewModel: AudioPlayerViewModel, page: Int, parentPagerState: PagerState, videoCoverUrl: Url?, ) { val context = LocalContext.current val player by viewModel.getVideoCoverPlayerState(page).collectAsStateWithLifecycle() val currentPage = parentPagerState.currentPage LaunchedEffect(videoCoverUrl) { viewModel.setVideoCoverUrl( page = page, videoCoverUrl = videoCoverUrl, context = context, ) } LaunchedEffect(page, currentPage) { if (page == currentPage) { viewModel.handlePageFocused(page) } } DisposableEffect(Unit) { onDispose { viewModel.handleDispose(page) } } SongVideoCoverPlayer(player) }