Tweak code

This commit is contained in:
vfsfitvnm
2022-10-04 21:45:40 +02:00
parent 047231e389
commit 5e6787567e
14 changed files with 148 additions and 94 deletions

View File

@@ -45,7 +45,6 @@ import it.vfsfitvnm.vimusic.models.Playlist
import it.vfsfitvnm.vimusic.models.SongPlaylistMap import it.vfsfitvnm.vimusic.models.SongPlaylistMap
import it.vfsfitvnm.vimusic.query import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.transaction import it.vfsfitvnm.vimusic.transaction
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.screens.albumRoute import it.vfsfitvnm.vimusic.ui.screens.albumRoute
import it.vfsfitvnm.vimusic.ui.screens.artistRoute import it.vfsfitvnm.vimusic.ui.screens.artistRoute
import it.vfsfitvnm.vimusic.ui.screens.viewPlaylistsRoute import it.vfsfitvnm.vimusic.ui.screens.viewPlaylistsRoute
@@ -62,9 +61,9 @@ import kotlinx.coroutines.flow.flowOf
@ExperimentalAnimationApi @ExperimentalAnimationApi
@Composable @Composable
fun InFavoritesMediaItemMenu( fun InFavoritesMediaItemMenu(
onDismiss: () -> Unit,
song: DetailedSong, song: DetailedSong,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onDismiss: (() -> Unit)? = null
) { ) {
NonQueuedMediaItemMenu( NonQueuedMediaItemMenu(
mediaItem = song.asMediaItem, mediaItem = song.asMediaItem,
@@ -81,11 +80,10 @@ fun InFavoritesMediaItemMenu(
@ExperimentalAnimationApi @ExperimentalAnimationApi
@Composable @Composable
fun InHistoryMediaItemMenu( fun InHistoryMediaItemMenu(
onDismiss: () -> Unit,
song: DetailedSong, song: DetailedSong,
modifier: Modifier = Modifier, modifier: Modifier = Modifier
onDismiss: (() -> Unit)? = null
) { ) {
val menuState = LocalMenuState.current
val binder = LocalPlayerServiceBinder.current val binder = LocalPlayerServiceBinder.current
var isHiding by remember { var isHiding by remember {
@@ -97,7 +95,7 @@ fun InHistoryMediaItemMenu(
text = "Do you really hide this song? Its playback time and cache will be wiped.\nThis action is irreversible.", text = "Do you really hide this song? Its playback time and cache will be wiped.\nThis action is irreversible.",
onDismiss = { isHiding = false }, onDismiss = { isHiding = false },
onConfirm = { onConfirm = {
(onDismiss ?: menuState::hide).invoke() onDismiss()
query { query {
// Not sure we can to this here // Not sure we can to this here
binder?.cache?.removeResource(song.id) binder?.cache?.removeResource(song.id)
@@ -118,11 +116,11 @@ fun InHistoryMediaItemMenu(
@ExperimentalAnimationApi @ExperimentalAnimationApi
@Composable @Composable
fun InPlaylistMediaItemMenu( fun InPlaylistMediaItemMenu(
onDismiss: () -> Unit,
playlistId: Long, playlistId: Long,
positionInPlaylist: Int, positionInPlaylist: Int,
song: DetailedSong, song: DetailedSong,
modifier: Modifier = Modifier, modifier: Modifier = Modifier
onDismiss: (() -> Unit)? = null
) { ) {
NonQueuedMediaItemMenu( NonQueuedMediaItemMenu(
mediaItem = song.asMediaItem, mediaItem = song.asMediaItem,
@@ -140,19 +138,18 @@ fun InPlaylistMediaItemMenu(
@ExperimentalAnimationApi @ExperimentalAnimationApi
@Composable @Composable
fun NonQueuedMediaItemMenu( fun NonQueuedMediaItemMenu(
onDismiss: () -> Unit,
mediaItem: MediaItem, mediaItem: MediaItem,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onDismiss: (() -> Unit)? = null,
onRemoveFromPlaylist: (() -> Unit)? = null, onRemoveFromPlaylist: (() -> Unit)? = null,
onHideFromDatabase: (() -> Unit)? = null, onHideFromDatabase: (() -> Unit)? = null,
onRemoveFromFavorites: (() -> Unit)? = null, onRemoveFromFavorites: (() -> Unit)? = null,
) { ) {
val menuState = LocalMenuState.current
val binder = LocalPlayerServiceBinder.current val binder = LocalPlayerServiceBinder.current
BaseMediaItemMenu( BaseMediaItemMenu(
mediaItem = mediaItem, mediaItem = mediaItem,
onDismiss = onDismiss ?: menuState::hide, onDismiss = onDismiss,
onStartRadio = { onStartRadio = {
binder?.stopRadio() binder?.stopRadio()
binder?.player?.forcePlay(mediaItem) binder?.player?.forcePlay(mediaItem)
@@ -175,17 +172,16 @@ fun NonQueuedMediaItemMenu(
@ExperimentalAnimationApi @ExperimentalAnimationApi
@Composable @Composable
fun QueuedMediaItemMenu( fun QueuedMediaItemMenu(
onDismiss: () -> Unit,
mediaItem: MediaItem, mediaItem: MediaItem,
indexInQueue: Int?, indexInQueue: Int?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier
onDismiss: (() -> Unit)? = null
) { ) {
val menuState = LocalMenuState.current
val binder = LocalPlayerServiceBinder.current val binder = LocalPlayerServiceBinder.current
BaseMediaItemMenu( BaseMediaItemMenu(
mediaItem = mediaItem, mediaItem = mediaItem,
onDismiss = onDismiss ?: menuState::hide, onDismiss = onDismiss,
onRemoveFromQueue = if (indexInQueue != null) ({ onRemoveFromQueue = if (indexInQueue != null) ({
binder?.player?.removeMediaItem(indexInQueue) binder?.player?.removeMediaItem(indexInQueue)
}) else null, }) else null,
@@ -196,11 +192,11 @@ fun QueuedMediaItemMenu(
@ExperimentalAnimationApi @ExperimentalAnimationApi
@Composable @Composable
fun BaseMediaItemMenu( fun BaseMediaItemMenu(
mediaItem: MediaItem,
onDismiss: () -> Unit, onDismiss: () -> Unit,
mediaItem: MediaItem,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onGoToEqualizer: (() -> Unit)? = null, onGoToEqualizer: (() -> Unit)? = null,
onSetSleepTimer: (() -> Unit)? = null, onShowSleepTimer: (() -> Unit)? = null,
onStartRadio: (() -> Unit)? = null, onStartRadio: (() -> Unit)? = null,
onPlayNext: (() -> Unit)? = null, onPlayNext: (() -> Unit)? = null,
onEnqueue: (() -> Unit)? = null, onEnqueue: (() -> Unit)? = null,
@@ -215,7 +211,7 @@ fun BaseMediaItemMenu(
mediaItem = mediaItem, mediaItem = mediaItem,
onDismiss = onDismiss, onDismiss = onDismiss,
onGoToEqualizer = onGoToEqualizer, onGoToEqualizer = onGoToEqualizer,
onSetSleepTimer = onSetSleepTimer, onShowSleepTimer = onShowSleepTimer,
onStartRadio = onStartRadio, onStartRadio = onStartRadio,
onPlayNext = onPlayNext, onPlayNext = onPlayNext,
onEnqueue = onEnqueue, onEnqueue = onEnqueue,
@@ -256,11 +252,11 @@ fun BaseMediaItemMenu(
@ExperimentalAnimationApi @ExperimentalAnimationApi
@Composable @Composable
fun MediaItemMenu( fun MediaItemMenu(
mediaItem: MediaItem,
onDismiss: () -> Unit, onDismiss: () -> Unit,
mediaItem: MediaItem,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onGoToEqualizer: (() -> Unit)? = null, onGoToEqualizer: (() -> Unit)? = null,
onSetSleepTimer: (() -> Unit)? = null, onShowSleepTimer: (() -> Unit)? = null,
onStartRadio: (() -> Unit)? = null, onStartRadio: (() -> Unit)? = null,
onPlayNext: (() -> Unit)? = null, onPlayNext: (() -> Unit)? = null,
onEnqueue: (() -> Unit)? = null, onEnqueue: (() -> Unit)? = null,
@@ -413,7 +409,8 @@ fun MediaItemMenu(
) )
} }
onSetSleepTimer?.let { // TODO: find solution to this shit
onShowSleepTimer?.let {
val binder = LocalPlayerServiceBinder.current val binder = LocalPlayerServiceBinder.current
val (colorPalette, typography) = LocalAppearance.current val (colorPalette, typography) = LocalAppearance.current
@@ -432,17 +429,15 @@ fun MediaItemMenu(
confirmText = "Stop", confirmText = "Stop",
onDismiss = { onDismiss = {
isShowingSleepTimerDialog = false isShowingSleepTimerDialog = false
onDismiss()
}, },
onConfirm = { onConfirm = {
binder?.cancelSleepTimer() binder?.cancelSleepTimer()
onDismiss()
} }
) )
} else { } else {
DefaultDialog( DefaultDialog(onDismiss = { isShowingSleepTimerDialog = false }) {
onDismiss = {
isShowingSleepTimerDialog = false
}
) {
var amount by remember { var amount by remember {
mutableStateOf(1) mutableStateOf(1)
} }
@@ -514,7 +509,10 @@ fun MediaItemMenu(
) { ) {
DialogTextButton( DialogTextButton(
text = "Cancel", text = "Cancel",
onClick = { isShowingSleepTimerDialog = false } onClick = {
isShowingSleepTimerDialog = false
onDismiss()
}
) )
DialogTextButton( DialogTextButton(
@@ -523,6 +521,7 @@ fun MediaItemMenu(
onClick = { onClick = {
binder?.startSleepTimer(amount * 10 * 60 * 1000L) binder?.startSleepTimer(amount * 10 * 60 * 1000L)
isShowingSleepTimerDialog = false isShowingSleepTimerDialog = false
onDismiss()
} }
) )
} }

View File

@@ -117,7 +117,10 @@ fun AlbumSongs(
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {

View File

@@ -102,12 +102,18 @@ fun ArtistLocalSongs(
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {
binder?.stopRadio() binder?.stopRadio()
binder?.player?.forcePlayAtIndex(songs.map(DetailedSong::asMediaItem), index) binder?.player?.forcePlayAtIndex(
songs.map(DetailedSong::asMediaItem),
index
)
} }
) )
) )

View File

@@ -125,7 +125,10 @@ fun ArtistOverview(
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {

View File

@@ -284,7 +284,10 @@ fun ArtistScreen(browseId: String) {
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {

View File

@@ -116,8 +116,14 @@ fun BuiltInPlaylistSongs(builtInPlaylist: BuiltInPlaylist) {
onLongClick = { onLongClick = {
menuState.display { menuState.display {
when (builtInPlaylist) { when (builtInPlaylist) {
BuiltInPlaylist.Favorites -> InFavoritesMediaItemMenu(song = song) BuiltInPlaylist.Favorites -> InFavoritesMediaItemMenu(
BuiltInPlaylist.Offline -> InHistoryMediaItemMenu(song = song) song = song,
onDismiss = menuState::hide
)
BuiltInPlaylist.Offline -> InHistoryMediaItemMenu(
song = song,
onDismiss = menuState::hide
)
} }
} }
}, },

View File

@@ -168,12 +168,18 @@ fun HomeSongs() {
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
InHistoryMediaItemMenu(song = song) InHistoryMediaItemMenu(
song = song,
onDismiss = menuState::hide
)
} }
}, },
onClick = { onClick = {
binder?.stopRadio() binder?.stopRadio()
binder?.player?.forcePlayAtIndex(items.map(DetailedSong::asMediaItem), index) binder?.player?.forcePlayAtIndex(
items.map(DetailedSong::asMediaItem),
index
)
} }
) )
.animateItemPlacement() .animateItemPlacement()

View File

@@ -138,7 +138,10 @@ fun QuickPicks(
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {
@@ -168,7 +171,10 @@ fun QuickPicks(
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {

View File

@@ -172,13 +172,13 @@ fun LocalPlaylistSongs(
transaction { transaction {
runBlocking(Dispatchers.IO) { runBlocking(Dispatchers.IO) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
Innertube.playlistPage(BrowseBody(browseId = browseId))?.completed() Innertube.playlistPage(BrowseBody(browseId = browseId))
?.completed()
} }
}?.getOrNull()?.let { remotePlaylist -> }?.getOrNull()?.let { remotePlaylist ->
Database.clearPlaylist(playlistId) Database.clearPlaylist(playlistId)
remotePlaylist. remotePlaylist.songsPage
songsPage
?.items ?.items
?.map(Innertube.SongItem::asMediaItem) ?.map(Innertube.SongItem::asMediaItem)
?.onEach(Database::insert) ?.onEach(Database::insert)
@@ -240,12 +240,14 @@ fun LocalPlaylistSongs(
InPlaylistMediaItemMenu( InPlaylistMediaItemMenu(
playlistId = playlistId, playlistId = playlistId,
positionInPlaylist = index, positionInPlaylist = index,
song = song song = song,
onDismiss = menuState::hide
) )
} }
}, },
onClick = { onClick = {
playlistWithSongs?.songs?.map(DetailedSong::asMediaItem) playlistWithSongs?.songs
?.map(DetailedSong::asMediaItem)
?.let { mediaItems -> ?.let { mediaItems ->
binder?.stopRadio() binder?.stopRadio()
binder?.player?.forcePlayAtIndex(mediaItems, index) binder?.player?.forcePlayAtIndex(mediaItems, index)

View File

@@ -210,7 +210,8 @@ fun PlayerBottomSheet(
menuState.display { menuState.display {
QueuedMediaItemMenu( QueuedMediaItemMenu(
mediaItem = window.mediaItem, mediaItem = window.mediaItem,
indexInQueue = if (isPlayingThisMediaItem) null else window.firstPeriodIndex indexInQueue = if (isPlayingThisMediaItem) null else window.firstPeriodIndex,
onDismiss = menuState::hide
) )
} }
}, },
@@ -268,7 +269,10 @@ fun PlayerBottomSheet(
text = "${windows.size} songs", text = "${windows.size} songs",
style = typography.xxs.medium, style = typography.xxs.medium,
modifier = Modifier modifier = Modifier
.background(color = colorPalette.background1, shape = RoundedCornerShape(16.dp)) .background(
color = colorPalette.background1,
shape = RoundedCornerShape(16.dp)
)
.align(Alignment.CenterStart) .align(Alignment.CenterStart)
.padding(all = 8.dp) .padding(all = 8.dp)
) )

View File

@@ -44,11 +44,13 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalLayoutDirection
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
import androidx.media3.common.MediaItem
import androidx.media3.common.Player import androidx.media3.common.Player
import coil.compose.AsyncImage import coil.compose.AsyncImage
import it.vfsfitvnm.route.OnGlobalRoute import it.vfsfitvnm.route.OnGlobalRoute
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.service.PlayerService
import it.vfsfitvnm.vimusic.ui.components.BottomSheet 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.LocalMenuState import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
@@ -219,7 +221,10 @@ fun PlayerView(
} }
val paddingValues = WindowInsets.navigationBars.asPaddingValues() val paddingValues = WindowInsets.navigationBars.asPaddingValues()
val playerBottomSheetState = rememberBottomSheetState(64.dp + paddingValues.calculateBottomPadding(), layoutState.expandedBound) val playerBottomSheetState = rememberBottomSheetState(
64.dp + paddingValues.calculateBottomPadding(),
layoutState.expandedBound
)
when (configuration.orientation) { when (configuration.orientation) {
Configuration.ORIENTATION_LANDSCAPE -> { Configuration.ORIENTATION_LANDSCAPE -> {
@@ -265,6 +270,7 @@ fun PlayerView(
) )
} }
} }
else -> { else -> {
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
@@ -325,50 +331,10 @@ fun PlayerView(
color = colorPalette.text, color = colorPalette.text,
onClick = { onClick = {
menuState.display { menuState.display {
val resultRegistryOwner = PlayerMenu(
LocalActivityResultRegistryOwner.current onDismiss = menuState::hide,
BaseMediaItemMenu(
mediaItem = mediaItem, mediaItem = mediaItem,
onStartRadio = { binder = binder
binder.stopRadio()
binder.player.seamlessPlay(mediaItem)
binder.setupRadio(
NavigationEndpoint.Endpoint.Watch(videoId = mediaItem.mediaId)
)
},
onGoToEqualizer = {
val intent =
Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL).apply {
putExtra(
AudioEffect.EXTRA_AUDIO_SESSION,
binder.player.audioSessionId
)
putExtra(
AudioEffect.EXTRA_PACKAGE_NAME,
context.packageName
)
putExtra(
AudioEffect.EXTRA_CONTENT_TYPE,
AudioEffect.CONTENT_TYPE_MUSIC
)
}
if (intent.resolveActivity(context.packageManager) != null) {
val contract =
ActivityResultContracts.StartActivityForResult()
resultRegistryOwner?.activityResultRegistry
?.register("", contract) {}
?.launch(intent)
} else {
Toast
.makeText(context, "No equalizer app found!", Toast.LENGTH_SHORT)
.show()
}
},
onSetSleepTimer = {},
onDismiss = menuState::hide
) )
} }
}, },
@@ -389,3 +355,41 @@ fun PlayerView(
) )
} }
} }
@ExperimentalAnimationApi
@Composable
private fun PlayerMenu(
binder: PlayerService.Binder,
mediaItem: MediaItem,
onDismiss: () -> Unit
) {
val context = LocalContext.current
val resultRegistryOwner = LocalActivityResultRegistryOwner.current
BaseMediaItemMenu(
mediaItem = mediaItem,
onStartRadio = {
binder.stopRadio()
binder.player.seamlessPlay(mediaItem)
binder.setupRadio(NavigationEndpoint.Endpoint.Watch(videoId = mediaItem.mediaId))
},
onGoToEqualizer = {
val intent = Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL).apply {
putExtra(AudioEffect.EXTRA_AUDIO_SESSION, binder.player.audioSessionId)
putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName)
putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC)
}
if (intent.resolveActivity(context.packageManager) != null) {
val contract = ActivityResultContracts.StartActivityForResult()
resultRegistryOwner?.activityResultRegistry
?.register("", contract) {}?.launch(intent)
} else {
Toast.makeText(context, "No equalizer app found!", Toast.LENGTH_SHORT).show()
}
},
onShowSleepTimer = {},
onDismiss = onDismiss
)
}

View File

@@ -199,7 +199,10 @@ fun PlaylistSongList(
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {

View File

@@ -110,7 +110,10 @@ fun LocalSongSearch(
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
InHistoryMediaItemMenu(song = song) InHistoryMediaItemMenu(
song = song,
onDismiss = menuState::hide
)
} }
}, },
onClick = { onClick = {

View File

@@ -124,7 +124,10 @@ fun SearchResultScreen(query: String, onSearchAgain: () -> Unit) {
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) NonQueuedMediaItemMenu(
onDismiss = menuState::hide,
mediaItem = song.asMediaItem,
)
} }
}, },
onClick = { onClick = {
@@ -246,7 +249,10 @@ fun SearchResultScreen(query: String, onSearchAgain: () -> Unit) {
.combinedClickable( .combinedClickable(
onLongClick = { onLongClick = {
menuState.display { menuState.display {
NonQueuedMediaItemMenu(mediaItem = video.asMediaItem) NonQueuedMediaItemMenu(
mediaItem = video.asMediaItem,
onDismiss = menuState::hide
)
} }
}, },
onClick = { onClick = {