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 @@