diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt index 6cc200f51..403d5d6a8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt @@ -25,7 +25,6 @@ import android.media.MediaMetadataRetriever import android.os.Build import android.os.Bundle import android.provider.MediaStore -import android.text.TextUtils import android.view.GestureDetector import android.view.MenuItem import android.view.MotionEvent @@ -33,6 +32,7 @@ import android.view.View import android.widget.RelativeLayout import android.widget.Toast import androidx.annotation.LayoutRes +import androidx.appcompat.graphics.drawable.DrawableWrapper import androidx.appcompat.widget.Toolbar import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope @@ -57,7 +57,6 @@ import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.IPaletteColorHolder import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.model.lyrics.Lyrics import code.name.monkey.retromusic.repository.RealRepository import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.* @@ -67,7 +66,6 @@ import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koin.android.ext.android.get -import java.io.FileNotFoundException import kotlin.math.abs abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragment(layout), @@ -81,8 +79,8 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme val song = MusicPlayerRemote.currentSong when (item.itemId) { R.id.action_toggle_lyrics -> { - PreferenceUtil.showLyrics = !PreferenceUtil.showLyrics - showLyricsIcon(item) + PreferenceUtil.showLyrics = !item.isChecked + item.isChecked = !item.isChecked return true } R.id.action_go_to_lyrics -> { @@ -195,18 +193,6 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme return false } - private fun showLyricsIcon(item: MenuItem) { - val icon = - if (PreferenceUtil.showLyrics) R.drawable.ic_lyrics else R.drawable.ic_lyrics_outline - val drawable: Drawable = RetroUtil.getTintedVectorDrawable( - requireContext(), - icon, - toolbarIconColor() - ) - item.isChecked = PreferenceUtil.showLyrics - item.icon = drawable - } - abstract fun playerToolbar(): Toolbar? abstract fun onShow() @@ -223,7 +209,6 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme override fun onPlayingMetaChanged() { updateIsFavorite() - updateLyrics() } override fun onFavoriteStateChanged() { @@ -279,32 +264,6 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme } } - private fun updateLyrics() { - setLyrics(null) - lifecycleScope.launch(IO) { - val song = MusicPlayerRemote.currentSong - val lyrics = try { - var data: String? = LyricUtil.getStringFromFile(song.title, song.artistName) - if (TextUtils.isEmpty(data)) { - data = MusicUtil.getLyrics(song) - if (TextUtils.isEmpty(data)) { - null - } else { - Lyrics.parse(song, data) - } - } else Lyrics.parse(song, data!!) - } catch (err: FileNotFoundException) { - null - } - withContext(Main) { - setLyrics(lyrics) - } - } - } - - open fun setLyrics(l: Lyrics?) { - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if (PreferenceUtil.isFullScreenMode && @@ -320,8 +279,19 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme } @SuppressLint("ClickableViewAccessibility") - override fun onStart() { - super.onStart() + override fun onResume() { + super.onResume() + val nps = PreferenceUtil.nowPlayingScreen + + if (nps == NowPlayingScreen.Circle || nps == NowPlayingScreen.Peak || nps == NowPlayingScreen.Tiny) { + playerToolbar()?.menu?.removeItem(R.id.action_toggle_lyrics) + } else { + playerToolbar()?.menu?.findItem(R.id.action_toggle_lyrics)?.apply { + fixCheckStateOnIcon() + isCheckable = true + isChecked = PreferenceUtil.showLyrics + } + } requireView().setOnTouchListener( SwipeDetector( requireContext(), @@ -329,12 +299,6 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragme requireView() ) ) - val nps = PreferenceUtil.nowPlayingScreen - if (nps == NowPlayingScreen.Circle || nps == NowPlayingScreen.Peak || nps == NowPlayingScreen.Tiny) { - playerToolbar()?.menu?.removeItem(R.id.action_toggle_lyrics) - } else { - playerToolbar()?.menu?.findItem(R.id.action_toggle_lyrics)?.let { showLyricsIcon(it) } - } } class SwipeDetector(val context: Context, val viewPager: ViewPager?, val view: View) : @@ -448,4 +412,15 @@ fun goToLyrics(activity: Activity) { null ) } -} \ No newline at end of file +} +/** Fixes checked state being ignored by injecting checked state directly into drawable */ +@SuppressLint("RestrictedApi") +class CheckDrawableWrapper(val menuItem: MenuItem) : DrawableWrapper(menuItem.icon) { + // inject checked state into drawable state set + override fun setState(stateSet: IntArray) = super.setState( + if (menuItem.isChecked) stateSet + android.R.attr.state_checked else stateSet + ) +} + +/** Wrap icon drawable with [CheckDrawableWrapper]. */ +fun MenuItem.fixCheckStateOnIcon() = apply { icon = CheckDrawableWrapper(this) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt index 8b627eee3..d4a278cb9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt @@ -202,7 +202,7 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe private fun maybeInitLyrics() { val nps = PreferenceUtil.nowPlayingScreen // Don't show lyrics container for below conditions - if (nps != Circle && nps != Peak && nps != Tiny && PreferenceUtil.showLyrics) { + if (lyricViewNpsList.contains(nps) && PreferenceUtil.showLyrics) { showLyrics(true) progressViewUpdateHelper?.start() lrcView.animate().alpha(1f).duration = @@ -272,5 +272,9 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe companion object { val TAG: String = PlayerAlbumCoverFragment::class.java.simpleName + } + + private val lyricViewNpsList = + listOf(Blur, Classic, Color, Flat, Material, Normal, Plain, Simple) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt index 703052b17..24098816e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt @@ -204,6 +204,7 @@ class FullPlaybackControlsFragment : popupMenu.setOnMenuItemClickListener(this) popupMenu.inflate(R.menu.menu_player) popupMenu.menu.findItem(R.id.action_toggle_favorite).isVisible = false + popupMenu.menu.findItem(R.id.action_toggle_lyrics).isChecked = PreferenceUtil.showLyrics popupMenu.show() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt index ddfc188ee..c9a2bc778 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt @@ -123,6 +123,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play popupMenu.setOnMenuItemClickListener(this) popupMenu.inflate(R.menu.menu_player) popupMenu.menu.findItem(R.id.action_toggle_favorite).isVisible = false + popupMenu.menu.findItem(R.id.action_toggle_lyrics).isChecked = PreferenceUtil.showLyrics popupMenu.show() } } @@ -157,7 +158,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play } ViewCompat.setOnApplyWindowInsetsListener( (binding.container) - ) { v: View, insets: WindowInsetsCompat -> + ) { _: View, insets: WindowInsetsCompat -> navBarHeight = insets.safeGetBottomInsets() binding.recyclerView.updatePadding(top = navBarHeight) insets diff --git a/app/src/main/res/drawable/sld_lyrics.xml b/app/src/main/res/drawable/sld_lyrics.xml new file mode 100644 index 000000000..fda662bc9 --- /dev/null +++ b/app/src/main/res/drawable/sld_lyrics.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_player.xml b/app/src/main/res/menu/menu_player.xml index 3882f8f40..948fc66fb 100755 --- a/app/src/main/res/menu/menu_player.xml +++ b/app/src/main/res/menu/menu_player.xml @@ -4,16 +4,16 @@