diff --git a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
index b88c42884..cc7da68ea 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
@@ -21,7 +21,6 @@ import android.os.Bundle
import android.text.format.Formatter
import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog
-import androidx.core.view.isGone
import androidx.core.view.isInvisible
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
diff --git a/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt b/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt
index 07313b57d..220da2510 100644
--- a/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt
+++ b/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt
@@ -20,16 +20,21 @@ package org.oxycblt.auxio.image
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
+import android.view.Gravity
import android.view.View
import android.widget.FrameLayout
+import android.widget.ImageView
import androidx.annotation.AttrRes
+import androidx.core.view.updateMarginsRelative
import com.google.android.material.shape.MaterialShapeDrawable
import org.oxycblt.auxio.R
import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.Song
+import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getColorCompat
+import org.oxycblt.auxio.util.getDimenSize
/**
* Effectively a super-charged [StyledImageView].
@@ -51,7 +56,8 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
private val cornerRadius: Float
private val inner: StyledImageView
private var customView: View? = null
- private val indicator: IndicatorView
+ private val playingIndicator: IndicatorView
+ private val selectionIndicator: ImageView
init {
// Android wants you to make separate attributes for each view type, but will
@@ -62,7 +68,14 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
styledAttrs.recycle()
inner = StyledImageView(context, attrs)
- indicator = IndicatorView(context).apply { cornerRadius = this@ImageGroup.cornerRadius }
+ playingIndicator =
+ IndicatorView(context).apply { cornerRadius = this@ImageGroup.cornerRadius }
+ selectionIndicator =
+ ImageView(context).apply {
+ imageTintList = context.getAttrColorCompat(R.attr.colorOnPrimary)
+ setImageResource(R.drawable.ic_check_20)
+ setBackgroundResource(R.drawable.ui_selection_badge_bg)
+ }
addView(inner)
}
@@ -83,44 +96,65 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
}
}
- addView(indicator)
+ addView(playingIndicator)
+ addView(
+ selectionIndicator,
+ LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply {
+ gravity = Gravity.BOTTOM or Gravity.END
+ val spacing = context.getDimenSize(R.dimen.spacing_tiny)
+ updateMarginsRelative(bottom = spacing, end = spacing)
+ })
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
- invalidateIndicator()
+ invalidateAlpha()
+ invalidatePlayingIndicator()
}
override fun setActivated(activated: Boolean) {
super.setActivated(activated)
- invalidateIndicator()
+ invalidateAlpha()
+ invalidatePlayingIndicator()
}
override fun setEnabled(enabled: Boolean) {
super.setEnabled(enabled)
- invalidateIndicator()
+ invalidateAlpha()
+ invalidatePlayingIndicator()
+ }
+
+ override fun setSelected(selected: Boolean) {
+ super.setSelected(selected)
+ invalidateSelectionIndicator()
}
var isPlaying: Boolean
- get() = indicator.isPlaying
+ get() = playingIndicator.isPlaying
set(value) {
- indicator.isPlaying = value
+ playingIndicator.isPlaying = value
}
- private fun invalidateIndicator() {
+ private fun invalidateAlpha() {
+ alpha = if (isActivated || isEnabled) 1f else 0.5f
+ }
+
+ private fun invalidatePlayingIndicator() {
if (isActivated) {
- alpha = 1f
customView?.alpha = 0f
inner.alpha = 0f
- indicator.alpha = 1f
+ playingIndicator.alpha = 1f
} else {
- alpha = if (isEnabled) 1f else 0.5f
customView?.alpha = 1f
inner.alpha = 1f
- indicator.alpha = 0f
+ playingIndicator.alpha = 0f
}
}
+ private fun invalidateSelectionIndicator() {
+ selectionIndicator.alpha = if (isSelected) 1f else 0f
+ }
+
fun bind(song: Song) {
inner.bind(song)
contentDescription =
diff --git a/app/src/main/res/drawable/ic_check_20.xml b/app/src/main/res/drawable/ic_check_20.xml
new file mode 100644
index 000000000..99a030a4c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_check_20.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ui_selection_badge_bg.xml b/app/src/main/res/drawable/ui_selection_badge_bg.xml
new file mode 100644
index 000000000..5c568b2ff
--- /dev/null
+++ b/app/src/main/res/drawable/ui_selection_badge_bg.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file