Replace media3 DefaultTimeBar with custom implementation

This commit is contained in:
vfsfitvnm 2022-06-08 20:21:04 +02:00
parent 7f141fddf4
commit bb4d43d8a1
3 changed files with 24 additions and 39 deletions

View file

@ -85,7 +85,8 @@ dependencies {
implementation(libs.accompanist.systemuicontroller) implementation(libs.accompanist.systemuicontroller)
implementation(libs.android.media) implementation(libs.android.media)
implementation(libs.bundles.media3) implementation(libs.media3.session)
implementation(libs.media3.exoplayer)
implementation(libs.datastore) implementation(libs.datastore)

View file

@ -6,6 +6,7 @@ import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicText import androidx.compose.foundation.text.BasicText
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -15,19 +16,15 @@ import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity 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
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.common.C import androidx.media3.common.C
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.Player import androidx.media3.common.Player
import androidx.media3.ui.DefaultTimeBar
import androidx.media3.ui.TimeBar
import coil.compose.AsyncImage import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.Database import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.R import it.vfsfitvnm.vimusic.R
@ -179,7 +176,7 @@ fun PlayerView(
.padding(bottom = 72.dp) .padding(bottom = 72.dp)
.fillMaxSize() .fillMaxSize()
) { ) {
var scrubbingPosition by remember { var scrubbingPosition by remember(player.mediaItemIndex) {
mutableStateOf<Long?>(null) mutableStateOf<Long?>(null)
} }
@ -272,7 +269,6 @@ fun PlayerView(
.padding(horizontal = 32.dp) .padding(horizontal = 32.dp)
) )
BasicText( BasicText(
text = player.mediaMetadata.extras?.getStringArrayList("artistNames") text = player.mediaMetadata.extras?.getStringArrayList("artistNames")
?.joinToString("") ?: "", ?.joinToString("") ?: "",
@ -283,40 +279,30 @@ fun PlayerView(
.padding(horizontal = 32.dp) .padding(horizontal = 32.dp)
) )
AndroidView( SeekBar(
factory = { context -> value = scrubbingPosition ?: player.currentPosition,
DefaultTimeBar(context).also { minimumValue = 0,
it.setPlayedColor(colorPalette.text.toArgb()) maximumValue = player.duration,
it.setUnplayedColor(colorPalette.textDisabled.toArgb()) onDragStart = {
it.setScrubberColor(colorPalette.text.toArgb()) scrubbingPosition = it
it.addListener(object : TimeBar.OnScrubListener { },
override fun onScrubStart(timeBar: TimeBar, position: Long) = Unit onDrag = { delta ->
scrubbingPosition = if (player.duration != C.TIME_UNSET) {
override fun onScrubMove(timeBar: TimeBar, position: Long) { scrubbingPosition?.plus(delta)?.coerceIn(0, player.duration)
scrubbingPosition = position } else {
} null
override fun onScrubStop(
timeBar: TimeBar,
position: Long,
canceled: Boolean
) {
if (!canceled) {
scrubbingPosition = position
player.mediaController.seekTo(position)
player.currentPosition = player.mediaController.currentPosition
}
scrubbingPosition = null
}
})
} }
}, },
update = { onDragEnd = {
it.setDuration(player.duration) player.mediaController.seekTo(scrubbingPosition ?: player.mediaController.currentPosition)
it.setPosition(player.currentPosition) player.currentPosition = player.mediaController.currentPosition
scrubbingPosition = null
}, },
color = colorPalette.text,
backgroundColor = colorPalette.textDisabled,
shape = RoundedCornerShape(8.dp),
modifier = Modifier modifier = Modifier
.padding(top = 16.dp) .padding(top = 24.dp, bottom = 12.dp)
.padding(horizontal = 32.dp) .padding(horizontal = 32.dp)
.fillMaxWidth() .fillMaxWidth()
) )

View file

@ -38,10 +38,8 @@ dependencyResolutionManagement {
alias("room-compiler").to("androidx.room", "room-compiler").versionRef("room") alias("room-compiler").to("androidx.room", "room-compiler").versionRef("room")
version("media3", "1.0.0-alpha03") version("media3", "1.0.0-alpha03")
alias("media3-ui").to("androidx.media3", "media3-ui").versionRef("media3")
alias("media3-session").to("androidx.media3", "media3-session").versionRef("media3") alias("media3-session").to("androidx.media3", "media3-session").versionRef("media3")
alias("media3-exoplayer").to("androidx.media3", "media3-exoplayer").versionRef("media3") alias("media3-exoplayer").to("androidx.media3", "media3-exoplayer").versionRef("media3")
bundle("media3", listOf("media3-ui", "media3-session", "media3-exoplayer"))
version("ktor", "2.0.2") version("ktor", "2.0.2")
alias("ktor-client-core").to("io.ktor", "ktor-client-core").versionRef("ktor") alias("ktor-client-core").to("io.ktor", "ktor-client-core").versionRef("ktor")