Fix album cover jank (#1658)

* fix album cover jank

* reduce album resolution
This commit is contained in:
leekleak
2025-11-11 20:15:41 +02:00
committed by GitHub
parent d8c2803562
commit 9d638d5984
4 changed files with 9 additions and 17 deletions

View File

@@ -229,21 +229,7 @@ fun MusicWidget(widget: MusicWidget) {
} }
} }
} }
AnimatedContent( AnimatedContent(albumArt) { art ->
albumArt,
transitionSpec = {
if (targetState != null && initialState == null) {
fadeIn() togetherWith fadeOut()
} else {
(fadeIn(animationSpec = tween(220, delayMillis = 90)) +
scaleIn(
initialScale = 0.92f,
animationSpec = tween(220, delayMillis = 90)
))
.togetherWith(fadeOut(animationSpec = tween(90)))
}
}
) { art ->
Box( Box(
modifier = Modifier modifier = Modifier
.padding(top = 16.dp, end = 16.dp) .padding(top = 16.dp, end = 16.dp)

View File

@@ -14,6 +14,7 @@ import de.mm20.launcher2.music.SupportedActions
import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.permissions.PermissionsManager
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.debounce
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import org.koin.core.component.inject import org.koin.core.component.inject
@@ -23,7 +24,7 @@ class MusicWidgetVM: ViewModel(), KoinComponent {
val title: Flow<String?> = musicService.title val title: Flow<String?> = musicService.title
val artist: Flow<String?> = musicService.artist val artist: Flow<String?> = musicService.artist
val albumArt: Flow<Bitmap?> = musicService.albumArt val albumArt: Flow<Bitmap?> = musicService.albumArt.debounce { if (it == null) 500 else 0L }
val playbackState: Flow<PlaybackState> = musicService.playbackState val playbackState: Flow<PlaybackState> = musicService.playbackState
val duration: Flow<Long?> = musicService.duration val duration: Flow<Long?> = musicService.duration
val position: Flow<Long?> = musicService.position val position: Flow<Long?> = musicService.position

View File

@@ -320,6 +320,7 @@ internal class MusicServiceImpl(
override val albumArt: Flow<Bitmap?> = channelFlow { override val albumArt: Flow<Bitmap?> = channelFlow {
val size = context.resources.getDimensionPixelSize(R.dimen.album_art_size) val size = context.resources.getDimensionPixelSize(R.dimen.album_art_size)
var lastBitmap: Bitmap? = null
currentMetadata.collectLatest { metadata -> currentMetadata.collectLatest { metadata ->
if (metadata == null) { if (metadata == null) {
val isNull = preferences.getString(PREFS_KEY_ALBUM_ART, "null") == "null" val isNull = preferences.getString(PREFS_KEY_ALBUM_ART, "null") == "null"
@@ -345,6 +346,9 @@ internal class MusicServiceImpl(
?.let { loadBitmapFromUri(Uri.parse(it), size) } ?.let { loadBitmapFromUri(Uri.parse(it), size) }
?: metadata.getString(MediaMetadata.METADATA_KEY_ART_URI) ?: metadata.getString(MediaMetadata.METADATA_KEY_ART_URI)
?.let { loadBitmapFromUri(Uri.parse(it), size) } ?.let { loadBitmapFromUri(Uri.parse(it), size) }
if (lastBitmap != null && lastBitmap!!.sameAs(bitmap))
return@collectLatest
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
if (bitmap == null) { if (bitmap == null) {
preferences.edit { preferences.edit {
@@ -359,6 +363,7 @@ internal class MusicServiceImpl(
} }
} }
send(bitmap) send(bitmap)
lastBitmap = bitmap
} }
}.shareIn(scope, SharingStarted.WhileSubscribed(), 1) }.shareIn(scope, SharingStarted.WhileSubscribed(), 1)

View File

@@ -1,3 +1,3 @@
<resources> <resources>
<dimen name="album_art_size">144dp</dimen> <dimen name="album_art_size">96dp</dimen>
</resources> </resources>