Reintroduce "loop none" option (#276)

This commit is contained in:
vfsfitvnm
2022-10-19 14:22:34 +02:00
parent 720c73d9fb
commit fc569ea5f9
4 changed files with 67 additions and 37 deletions

View File

@@ -44,13 +44,14 @@ import it.vfsfitvnm.vimusic.ui.components.SeekBar
import it.vfsfitvnm.vimusic.ui.components.themed.IconButton
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.favoritesIcon
import it.vfsfitvnm.vimusic.utils.DisposableListener
import it.vfsfitvnm.vimusic.utils.bold
import it.vfsfitvnm.vimusic.utils.forceSeekToNext
import it.vfsfitvnm.vimusic.utils.forceSeekToPrevious
import it.vfsfitvnm.vimusic.utils.formatAsDuration
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.trackLoopEnabledKey
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOn
@@ -70,17 +71,7 @@ fun Controls(
val binder = LocalPlayerServiceBinder.current
binder?.player ?: return
var repeatMode by remember {
mutableStateOf(binder.player.repeatMode)
}
binder.player.DisposableListener {
object : Player.Listener {
override fun onRepeatModeChanged(newRepeatMode: Int) {
repeatMode = newRepeatMode
}
}
}
var trackLoopEnabled by rememberPreference(trackLoopEnabledKey, defaultValue = false)
var scrubbingPosition by remember(mediaId) {
mutableStateOf<Long?>(null)
@@ -277,17 +268,8 @@ fun Controls(
IconButton(
icon = R.drawable.infinite,
color = if (repeatMode == Player.REPEAT_MODE_ONE) {
colorPalette.text
} else {
colorPalette.textDisabled
},
onClick = {
binder.player.repeatMode = when (binder.player.repeatMode) {
Player.REPEAT_MODE_ONE -> Player.REPEAT_MODE_ALL
else -> Player.REPEAT_MODE_ONE
}
},
color = if (trackLoopEnabled) colorPalette.text else colorPalette.textDisabled,
onClick = { trackLoopEnabled = !trackLoopEnabled },
modifier = Modifier
.weight(1f)
.size(24.dp)

View File

@@ -1,7 +1,11 @@
package it.vfsfitvnm.vimusic.ui.screens.player
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ContentTransform
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.animateContentSize
import androidx.compose.animation.core.tween
import androidx.compose.animation.core.updateTransition
import androidx.compose.animation.fadeIn
@@ -14,6 +18,7 @@ import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.asPaddingValues
@@ -37,6 +42,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
@@ -69,6 +75,8 @@ import it.vfsfitvnm.vimusic.ui.styling.onOverlay
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.DisposableListener
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.queueLoopEnabledKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.shouldBePlaying
import it.vfsfitvnm.vimusic.utils.shuffleQueue
import it.vfsfitvnm.vimusic.utils.smoothScrollToTop
@@ -120,6 +128,8 @@ fun Queue(
val player = binder.player
var queueLoopEnabled by rememberPreference(queueLoopEnabledKey, defaultValue = true)
val menuState = LocalMenuState.current
val thumbnailSizeDp = Dimensions.thumbnails.song
@@ -340,6 +350,38 @@ fun Queue(
.align(Alignment.Center)
.size(18.dp)
)
Row(
modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.clickable { queueLoopEnabled = !queueLoopEnabled }
.background(colorPalette.background1)
.padding(horizontal = 16.dp, vertical = 8.dp)
.align(Alignment.CenterEnd)
.animateContentSize()
) {
BasicText(
text = "Queue loop ",
style = typography.xxs.medium,
)
AnimatedContent(
targetState = queueLoopEnabled,
transitionSpec = {
val slideDirection = if (targetState) AnimatedContentScope.SlideDirection.Up else AnimatedContentScope.SlideDirection.Down
ContentTransform(
targetContentEnter = slideIntoContainer(slideDirection) + fadeIn(),
initialContentExit = slideOutOfContainer(slideDirection) + fadeOut(),
)
}
) {
BasicText(
text = if (it) "on" else "off",
style = typography.xxs.medium,
)
}
}
}
}
}