diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt
index dd7a23c1..52394da5 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt
@@ -8,13 +8,17 @@
package org.moire.ultrasonic.fragment
import android.annotation.SuppressLint
+import android.content.Context
import android.graphics.Canvas
import android.graphics.Color.argb
import android.graphics.Point
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.LayerDrawable
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
+import android.util.TypedValue
import android.view.GestureDetector
import android.view.LayoutInflater
import android.view.Menu
@@ -34,6 +38,8 @@ import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.TextView
import android.widget.Toast
import android.widget.ViewFlipper
+import androidx.annotation.AttrRes
+import androidx.annotation.ColorInt
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.MenuHost
@@ -52,6 +58,7 @@ import androidx.recyclerview.widget.ItemTouchHelper.ACTION_STATE_DRAG
import androidx.recyclerview.widget.ItemTouchHelper.ACTION_STATE_IDLE
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.R as RM
import com.google.android.material.button.MaterialButton
import com.google.android.material.progressindicator.CircularProgressIndicator
import io.reactivex.rxjava3.disposables.CompositeDisposable
@@ -167,8 +174,10 @@ class PlayerFragment :
private lateinit var repeatButton: MaterialButton
private lateinit var progressBar: SeekBar
private lateinit var progressIndicator: CircularProgressIndicator
- private val hollowStar = R.drawable.ic_star_hollow
- private val fullStar = R.drawable.ic_star_full
+ private val hollowStar = R.drawable.star_hollow_outline
+ private val fullStar = R.drawable.star_full_outline
+ private lateinit var hollowStarDrawable: Drawable
+ private lateinit var fullStarDrawable: Drawable
private var _binding: CurrentPlayingBinding? = null
// This property is only valid between onCreateView and
@@ -270,6 +279,11 @@ class PlayerFragment :
val ratingLinearLayout = view.findViewById(R.id.song_rating)
if (!useFiveStarRating) ratingLinearLayout.isVisible = false
+ hollowStarDrawable = ResourcesCompat.getDrawable(resources, hollowStar, null)!!
+ fullStarDrawable = ResourcesCompat.getDrawable(resources, fullStar, null)!!
+ setLayerDrawableColors(hollowStarDrawable as LayerDrawable)
+ setLayerDrawableColors(fullStarDrawable as LayerDrawable)
+
fiveStar1ImageView.setOnClickListener { setSongRating(1) }
fiveStar2ImageView.setOnClickListener { setSongRating(2) }
fiveStar3ImageView.setOnClickListener { setSongRating(3) }
@@ -1100,7 +1114,7 @@ class PlayerFragment :
it.loadImage(albumArtImageView, currentSong, true, 0)
}
- updateSongRating()
+ updateSongRatingDisplay()
} else {
currentSong = null
songTitleTextView.text = null
@@ -1115,7 +1129,7 @@ class PlayerFragment :
}
}
- updateSongRating()
+ updateSongRatingDisplay()
updateMediaButtonActivationState()
}
@@ -1276,20 +1290,36 @@ class PlayerFragment :
return false
}
- private fun updateSongRating() {
+ private fun updateSongRatingDisplay() {
val rating = currentSong?.userRating ?: 0
- fiveStar1ImageView.setImageResource(if (rating > 0) fullStar else hollowStar)
- fiveStar2ImageView.setImageResource(if (rating > 1) fullStar else hollowStar)
- fiveStar3ImageView.setImageResource(if (rating > 2) fullStar else hollowStar)
- fiveStar4ImageView.setImageResource(if (rating > 3) fullStar else hollowStar)
- fiveStar5ImageView.setImageResource(if (rating > 4) fullStar else hollowStar)
+ fiveStar1ImageView.setImageDrawable(getStarForRating(rating, 0))
+ fiveStar2ImageView.setImageDrawable(getStarForRating(rating, 1))
+ fiveStar3ImageView.setImageDrawable(getStarForRating(rating, 2))
+ fiveStar4ImageView.setImageDrawable(getStarForRating(rating, 3))
+ fiveStar5ImageView.setImageDrawable(getStarForRating(rating, 4))
}
+ private fun getStarForRating(rating: Int, position: Int): Drawable {
+ return if (rating > position) fullStarDrawable else hollowStarDrawable
+ }
+
+ private fun setLayerDrawableColors(drawable: LayerDrawable) {
+ drawable.apply {
+ getDrawable(0).setTint(requireContext().themeColor(RM.attr.colorSurface))
+ getDrawable(1).setTint(requireContext().themeColor(RM.attr.colorAccent))
+ }
+ }
+
+ @ColorInt
+ fun Context.themeColor(@AttrRes attrRes: Int): Int = TypedValue()
+ .apply { theme.resolveAttribute(attrRes, this, true) }
+ .data
+
private fun setSongRating(rating: Int) {
if (currentSong == null) return
currentSong?.userRating = rating
- updateSongRating()
+ updateSongRatingDisplay()
RxBus.ratingSubmitter.onNext(
RatingUpdate(
diff --git a/ultrasonic/src/main/res/drawable/ic_star_full_outline.xml b/ultrasonic/src/main/res/drawable/ic_star_full_outline.xml
new file mode 100644
index 00000000..c5c42cf3
--- /dev/null
+++ b/ultrasonic/src/main/res/drawable/ic_star_full_outline.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/ultrasonic/src/main/res/drawable/ic_star_hollow_outline.xml b/ultrasonic/src/main/res/drawable/ic_star_hollow_outline.xml
new file mode 100644
index 00000000..cc029c03
--- /dev/null
+++ b/ultrasonic/src/main/res/drawable/ic_star_hollow_outline.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/ultrasonic/src/main/res/drawable/star_full_outline.xml b/ultrasonic/src/main/res/drawable/star_full_outline.xml
new file mode 100644
index 00000000..5932d246
--- /dev/null
+++ b/ultrasonic/src/main/res/drawable/star_full_outline.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/ultrasonic/src/main/res/drawable/star_hollow_outline.xml b/ultrasonic/src/main/res/drawable/star_hollow_outline.xml
new file mode 100644
index 00000000..ab2c6c3e
--- /dev/null
+++ b/ultrasonic/src/main/res/drawable/star_hollow_outline.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/ultrasonic/src/main/res/layout-land/current_playing.xml b/ultrasonic/src/main/res/layout-land/current_playing.xml
index 575f62c2..af77ad49 100644
--- a/ultrasonic/src/main/res/layout-land/current_playing.xml
+++ b/ultrasonic/src/main/res/layout-land/current_playing.xml
@@ -56,7 +56,7 @@
a:importantForAccessibility="no"
a:padding="10dip"
a:scaleType="fitCenter"
- a:src="@drawable/ic_star_hollow" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />
diff --git a/ultrasonic/src/main/res/layout/current_playing.xml b/ultrasonic/src/main/res/layout/current_playing.xml
index c73d42ce..7b674824 100644
--- a/ultrasonic/src/main/res/layout/current_playing.xml
+++ b/ultrasonic/src/main/res/layout/current_playing.xml
@@ -48,65 +48,65 @@
a:layout_width="0dip"
a:layout_height="fill_parent"
a:layout_weight="1"
- a:padding="5dip"
a:background="@android:color/transparent"
a:focusable="false"
a:gravity="center_vertical"
+ a:importantForAccessibility="no"
+ a:padding="5dip"
a:scaleType="fitCenter"
- a:src="@drawable/ic_star_hollow"
- a:importantForAccessibility="no" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />
+ a:src="@drawable/star_hollow_outline" />