diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt index aec5f2e57..6f9b3798d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt @@ -16,6 +16,7 @@ package code.name.monkey.retromusic.fragments.player.blur import android.content.SharedPreferences import android.graphics.Color +import android.graphics.drawable.Drawable import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar @@ -27,18 +28,18 @@ import code.name.monkey.retromusic.databinding.FragmentBlurBinding import code.name.monkey.retromusic.extensions.drawAboveSystemBars import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment -import code.name.monkey.retromusic.glide.BlurTransformation -import code.name.monkey.retromusic.glide.GlideApp -import code.name.monkey.retromusic.glide.RetroGlideExtension -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount import code.name.monkey.retromusic.util.color.MediaNotificationProcessor + class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur), SharedPreferences.OnSharedPreferenceChangeListener { + private var lastRequest: GlideRequest? = null + override fun playerToolbar(): Toolbar { return binding.playerToolbar } @@ -111,23 +112,21 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur), get() = lastColor private fun updateBlur() { - binding.colorBackground.clearColorFilter() - GlideApp.with(requireActivity()).asBitmapPalette() - .songCoverOptions(MusicPlayerRemote.currentSong) + // https://github.com/bumptech/glide/issues/527#issuecomment-148840717 + GlideApp.with(this) .load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong)) - .dontAnimate() - .transform( - BlurTransformation.Builder(requireContext()) - .blurRadius(blurAmount.toFloat()) - .build() - ) - .into(object : RetroMusicColoredTarget(binding.colorBackground) { - override fun onColorReady(colors: MediaNotificationProcessor) { - if (colors.backgroundColor == defaultFooterColor) { - binding.colorBackground.setColorFilter(colors.backgroundColor) - } - } - }) + .songCoverOptions(MusicPlayerRemote.currentSong).apply { + thumbnail(lastRequest) + .crossfadeListener() + .transform( + BlurTransformation.Builder(requireContext()) + .blurRadius(blurAmount.toFloat()) + .build() + ) + .into(binding.colorBackground) + lastRequest = this + } + } override fun onServiceConnected() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt index bec78c7e5..dc78a10cd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt @@ -16,6 +16,7 @@ package code.name.monkey.retromusic.fragments.player.cardblur import android.content.SharedPreferences import android.graphics.Color +import android.graphics.drawable.Drawable import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar @@ -28,10 +29,7 @@ import code.name.monkey.retromusic.extensions.drawAboveSystemBars import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment -import code.name.monkey.retromusic.glide.BlurTransformation -import code.name.monkey.retromusic.glide.GlideApp -import code.name.monkey.retromusic.glide.RetroGlideExtension -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount @@ -50,6 +48,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player), private var _binding: FragmentCardBlurPlayerBinding? = null private val binding get() = _binding!! + private var lastRequest: GlideRequest? = null override fun onShow() { playbackControlsFragment.show() @@ -136,22 +135,20 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player), } private fun updateBlur() { - binding.colorBackground.clearColorFilter() - GlideApp.with(requireActivity()).asBitmapPalette() - .songCoverOptions(MusicPlayerRemote.currentSong) + // https://github.com/bumptech/glide/issues/527#issuecomment-148840717 + GlideApp.with(this) .load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong)) - .dontAnimate() - .transform( - BlurTransformation.Builder(requireContext()).blurRadius(blurAmount.toFloat()) - .build() - ) - .into(object : RetroMusicColoredTarget(binding.colorBackground) { - override fun onColorReady(colors: MediaNotificationProcessor) { - if (colors.backgroundColor == defaultFooterColor) { - binding.colorBackground.setColorFilter(colors.backgroundColor) - } - } - }) + .songCoverOptions(MusicPlayerRemote.currentSong).apply { + thumbnail(lastRequest) + .crossfadeListener() + .transform( + BlurTransformation.Builder(requireContext()) + .blurRadius(blurAmount.toFloat()) + .build() + ) + .into(binding.colorBackground) + lastRequest = this + } } override fun onResume() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index 10de5dc26..1e68528bd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -19,6 +19,7 @@ import android.content.Context import android.graphics.Color import android.graphics.PorterDuff import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.media.AudioManager import android.os.Bundle import android.view.LayoutInflater @@ -37,8 +38,7 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.base.goToAlbum import code.name.monkey.retromusic.fragments.base.goToArtist -import code.name.monkey.retromusic.glide.GlideApp -import code.name.monkey.retromusic.glide.RetroGlideExtension +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback @@ -70,6 +70,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), private val binding get() = _binding!! private var rotateAnimator: ObjectAnimator? = null + private var lastRequest: GlideRequest? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -241,9 +242,15 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), binding.songInfo.hide() } GlideApp.with(this) - .load(RetroGlideExtension.getSongModel(song)) - .songCoverOptions(song) - .into(binding.albumCover) + .load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong)) + .songCoverOptions(MusicPlayerRemote.currentSong).apply { + thumbnail(lastRequest) + .crossfadeListener() + .fitCenter() + .into(binding.albumCover) + lastRequest = this + } + } private fun updatePlayPauseDrawableState() { diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt index 9db983669..e16971768 100644 --- a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt +++ b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt @@ -1,8 +1,10 @@ package code.name.monkey.retromusic.glide import android.graphics.drawable.Drawable +import androidx.core.graphics.drawable.toDrawable import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor import code.name.monkey.appthemehelper.util.TintHelper +import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App.Companion.getContext import code.name.monkey.retromusic.Constants.USER_BANNER import code.name.monkey.retromusic.Constants.USER_PROFILE @@ -23,9 +25,15 @@ import com.bumptech.glide.RequestBuilder import com.bumptech.glide.annotation.GlideExtension import com.bumptech.glide.annotation.GlideOption import com.bumptech.glide.annotation.GlideType +import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.Key import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.BaseRequestOptions +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.bumptech.glide.request.transition.DrawableCrossFadeFactory +import com.bumptech.glide.request.transition.Transition import com.bumptech.glide.signature.MediaStoreSignature import java.io.File @@ -194,4 +202,33 @@ object RetroGlideExtension { fun getDefaultTransition(): GenericTransitionOptions { return GenericTransitionOptions().transition(DEFAULT_ANIMATION) } +} + +// https://github.com/bumptech/glide/issues/527#issuecomment-148840717 +fun GlideRequest.crossfadeListener(): GlideRequest { + return listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + return if (isFirstResource) { + false // thumbnail was not shown, do as usual + } else DrawableCrossFadeFactory.Builder() + .setCrossFadeEnabled(true).build() + .build(dataSource, isFirstResource) + .transition(resource, target as Transition.ViewAdapter) + } + }) } \ No newline at end of file