Added CrossFade effect to Blur, Blur Card & Circle player

This commit is contained in:
Prathamesh More 2021-12-15 00:45:30 +05:30
parent 4d31c4ccc3
commit c919033a2c
4 changed files with 84 additions and 44 deletions

View file

@ -16,6 +16,7 @@ package code.name.monkey.retromusic.fragments.player.blur
import android.content.SharedPreferences import android.content.SharedPreferences
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.appcompat.widget.Toolbar 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.extensions.drawAboveSystemBars
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.glide.BlurTransformation import code.name.monkey.retromusic.glide.*
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.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur), class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences.OnSharedPreferenceChangeListener {
private var lastRequest: GlideRequest<Drawable>? = null
override fun playerToolbar(): Toolbar { override fun playerToolbar(): Toolbar {
return binding.playerToolbar return binding.playerToolbar
} }
@ -111,23 +112,21 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur),
get() = lastColor get() = lastColor
private fun updateBlur() { private fun updateBlur() {
binding.colorBackground.clearColorFilter() // https://github.com/bumptech/glide/issues/527#issuecomment-148840717
GlideApp.with(requireActivity()).asBitmapPalette() GlideApp.with(this)
.songCoverOptions(MusicPlayerRemote.currentSong)
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong)) .load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
.dontAnimate() .songCoverOptions(MusicPlayerRemote.currentSong).apply {
thumbnail(lastRequest)
.crossfadeListener()
.transform( .transform(
BlurTransformation.Builder(requireContext()) BlurTransformation.Builder(requireContext())
.blurRadius(blurAmount.toFloat()) .blurRadius(blurAmount.toFloat())
.build() .build()
) )
.into(object : RetroMusicColoredTarget(binding.colorBackground) { .into(binding.colorBackground)
override fun onColorReady(colors: MediaNotificationProcessor) { lastRequest = this
if (colors.backgroundColor == defaultFooterColor) {
binding.colorBackground.setColorFilter(colors.backgroundColor)
} }
}
})
} }
override fun onServiceConnected() { override fun onServiceConnected() {

View file

@ -16,6 +16,7 @@ package code.name.monkey.retromusic.fragments.player.cardblur
import android.content.SharedPreferences import android.content.SharedPreferences
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.appcompat.widget.Toolbar 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.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
import code.name.monkey.retromusic.glide.BlurTransformation import code.name.monkey.retromusic.glide.*
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.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil.blurAmount 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 var _binding: FragmentCardBlurPlayerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private var lastRequest: GlideRequest<Drawable>? = null
override fun onShow() { override fun onShow() {
playbackControlsFragment.show() playbackControlsFragment.show()
@ -136,23 +135,21 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player),
} }
private fun updateBlur() { private fun updateBlur() {
binding.colorBackground.clearColorFilter() // https://github.com/bumptech/glide/issues/527#issuecomment-148840717
GlideApp.with(requireActivity()).asBitmapPalette() GlideApp.with(this)
.songCoverOptions(MusicPlayerRemote.currentSong)
.load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong)) .load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
.dontAnimate() .songCoverOptions(MusicPlayerRemote.currentSong).apply {
thumbnail(lastRequest)
.crossfadeListener()
.transform( .transform(
BlurTransformation.Builder(requireContext()).blurRadius(blurAmount.toFloat()) BlurTransformation.Builder(requireContext())
.blurRadius(blurAmount.toFloat())
.build() .build()
) )
.into(object : RetroMusicColoredTarget(binding.colorBackground) { .into(binding.colorBackground)
override fun onColorReady(colors: MediaNotificationProcessor) { lastRequest = this
if (colors.backgroundColor == defaultFooterColor) {
binding.colorBackground.setColorFilter(colors.backgroundColor)
} }
} }
})
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()

View file

@ -19,6 +19,7 @@ import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.media.AudioManager import android.media.AudioManager
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater 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.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.*
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback 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 val binding get() = _binding!!
private var rotateAnimator: ObjectAnimator? = null private var rotateAnimator: ObjectAnimator? = null
private var lastRequest: GlideRequest<Drawable>? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -241,9 +242,15 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
binding.songInfo.hide() binding.songInfo.hide()
} }
GlideApp.with(this) GlideApp.with(this)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(MusicPlayerRemote.currentSong))
.songCoverOptions(song) .songCoverOptions(MusicPlayerRemote.currentSong).apply {
thumbnail(lastRequest)
.crossfadeListener()
.fitCenter()
.into(binding.albumCover) .into(binding.albumCover)
lastRequest = this
}
} }
private fun updatePlayPauseDrawableState() { private fun updatePlayPauseDrawableState() {

View file

@ -1,8 +1,10 @@
package code.name.monkey.retromusic.glide package code.name.monkey.retromusic.glide
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import androidx.core.graphics.drawable.toDrawable
import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor
import code.name.monkey.appthemehelper.util.TintHelper 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.App.Companion.getContext
import code.name.monkey.retromusic.Constants.USER_BANNER import code.name.monkey.retromusic.Constants.USER_BANNER
import code.name.monkey.retromusic.Constants.USER_PROFILE 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.GlideExtension
import com.bumptech.glide.annotation.GlideOption import com.bumptech.glide.annotation.GlideOption
import com.bumptech.glide.annotation.GlideType import com.bumptech.glide.annotation.GlideType
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.Key import com.bumptech.glide.load.Key
import com.bumptech.glide.load.engine.DiskCacheStrategy 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.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 com.bumptech.glide.signature.MediaStoreSignature
import java.io.File import java.io.File
@ -195,3 +203,32 @@ object RetroGlideExtension {
return GenericTransitionOptions<TranscodeType>().transition(DEFAULT_ANIMATION) return GenericTransitionOptions<TranscodeType>().transition(DEFAULT_ANIMATION)
} }
} }
// https://github.com/bumptech/glide/issues/527#issuecomment-148840717
fun GlideRequest<Drawable>.crossfadeListener(): GlideRequest<Drawable> {
return listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
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)
}
})
}