queue: indicate playing item in list

Indicate the currently playing item in the queue list.

The item is still disabled, however it's also simultaniously activated
now, which allows it to indicate that it is playing.
This commit is contained in:
OxygenCobalt 2022-07-31 17:21:10 -06:00
parent f5542c65ba
commit 257516643f
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
9 changed files with 41 additions and 17 deletions

View file

@ -101,12 +101,19 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
invalidateIndicator() invalidateIndicator()
} }
override fun setEnabled(enabled: Boolean) {
super.setEnabled(enabled)
invalidateIndicator()
}
private fun invalidateIndicator() { private fun invalidateIndicator() {
if (isActivated) { if (isActivated) {
alpha = 1f
indicator.alpha = 1f indicator.alpha = 1f
customView?.alpha = 0f customView?.alpha = 0f
inner.alpha = 0f inner.alpha = 0f
} else { } else {
alpha = if (isEnabled) 1f else 0.5f
indicator.alpha = 0f indicator.alpha = 0f
customView?.alpha = 1f customView?.alpha = 1f
inner.alpha = 1f inner.alpha = 1f

View file

@ -33,8 +33,6 @@ import org.oxycblt.auxio.util.systemGestureInsetsCompat
* The coordinator layout behavior used for the playback sheet, hacking in the many fixes required * The coordinator layout behavior used for the playback sheet, hacking in the many fixes required
* to make bottom sheets like this work. * to make bottom sheets like this work.
* @author OxygenCobalt * @author OxygenCobalt
*
* TODO: Implement hiding because I have to
*/ */
class PlaybackSheetBehavior<V : View>(context: Context, attributeSet: AttributeSet?) : class PlaybackSheetBehavior<V : View>(context: Context, attributeSet: AttributeSet?) :
AuxioSheetBehavior<V>(context, attributeSet) { AuxioSheetBehavior<V>(context, attributeSet) {
@ -69,7 +67,7 @@ class PlaybackSheetBehavior<V : View>(context: Context, attributeSet: AttributeS
} }
// Note: This is an extension to Auxio's vendored BottomSheetBehavior // Note: This is an extension to Auxio's vendored BottomSheetBehavior
override fun enableHidingGestures() = true override fun enableHidingGestures() = false
fun hideSafe() { fun hideSafe() {
if (state != STATE_HIDDEN) { if (state != STATE_HIDDEN) {

View file

@ -49,7 +49,8 @@ class QueueAdapter(listener: QueueItemListener) :
super.onBindViewHolder(viewHolder, position, payload) super.onBindViewHolder(viewHolder, position, payload)
} }
viewHolder.isPrevious = position <= currentIndex viewHolder.isEnabled = position > currentIndex
viewHolder.isActivated = position == currentIndex
} }
fun updateIndex(index: Int) { fun updateIndex(index: Int) {
@ -89,16 +90,24 @@ private constructor(
MaterialShapeDrawable.createWithElevationOverlay(binding.root.context).apply { MaterialShapeDrawable.createWithElevationOverlay(binding.root.context).apply {
fillColor = binding.context.getAttrColorSafe(R.attr.colorSurface).stateList fillColor = binding.context.getAttrColorSafe(R.attr.colorSurface).stateList
elevation = binding.context.getDimenSafe(R.dimen.elevation_normal) * 5 elevation = binding.context.getDimenSafe(R.dimen.elevation_normal) * 5
alpha = 0
} }
var isPrevious: Boolean var isEnabled: Boolean
get() = binding.songDragHandle.alpha == 0.5f get() = binding.songAlbumCover.isEnabled
set(value) { set(value) {
val alpha = if (value) 0.5f else 1f // Don't want to disable clicking, just indicate the body and handle is disabled
binding.songAlbumCover.alpha = alpha binding.songAlbumCover.isEnabled = value
binding.songName.alpha = alpha binding.songName.isEnabled = value
binding.songInfo.alpha = alpha binding.songInfo.isEnabled = value
binding.songDragHandle.alpha = alpha binding.songDragHandle.isEnabled = value
}
var isActivated: Boolean
get() = binding.interactBody.isActivated
set(value) {
// Activation does not affect clicking, make everything activated.
binding.interactBody.setActivated(value)
} }
init { init {
@ -110,8 +119,6 @@ private constructor(
elevation = binding.context.getDimenSafe(R.dimen.elevation_normal) elevation = binding.context.getDimenSafe(R.dimen.elevation_normal)
}, },
backgroundDrawable)) backgroundDrawable))
backgroundDrawable.alpha = 0
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")

View file

@ -40,7 +40,7 @@ class QueueDragCallback(private val playbackModel: QueueViewModel) : ItemTouchHe
viewHolder: RecyclerView.ViewHolder viewHolder: RecyclerView.ViewHolder
): Int { ): Int {
val queueHolder = viewHolder as QueueSongViewHolder val queueHolder = viewHolder as QueueSongViewHolder
return if (!queueHolder.isPrevious) { return if (queueHolder.isEnabled) {
makeFlag( makeFlag(
ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP or ItemTouchHelper.DOWN) or ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP or ItemTouchHelper.DOWN) or
makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.START) makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.START)

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="0.24" android:color="?attr/colorOnSurface" android:state_enabled="false" />
<item android:color="?attr/colorPrimary" android:state_activated="true" /> <item android:color="?attr/colorPrimary" android:state_activated="true" />
<item android:color="?android:attr/textColorPrimary" /> <item android:color="?android:attr/textColorPrimary" />
</selector> </selector>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="0.24" android:color="?attr/colorOnSurface" android:state_enabled="false" />
<item android:color="?attr/colorPrimary" android:state_activated="true" /> <item android:color="?attr/colorPrimary" android:state_activated="true" />
<item android:color="?android:attr/textColorSecondary" /> <item android:color="?android:attr/textColorSecondary" />
</selector> </selector>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorPrimary" android:state_activated="true" />
<item android:color="?android:attr/textColorPrimary" android:alpha="0.5" android:state_enabled="false" />
<item android:color="?android:attr/textColorPrimary" />
</selector>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?android:attr/textColorSecondary" android:state_activated="true" />
<item android:color="?android:attr/textColorSecondary" android:alpha="0.5" android:state_enabled="false" />
<item android:color="?android:attr/textColorSecondary" />
</selector>

View file

@ -32,7 +32,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"> android:background="?attr/selectableItemBackground">
<org.oxycblt.auxio.image.StyledImageView <org.oxycblt.auxio.image.ImageGroup
android:id="@+id/song_album_cover" android:id="@+id/song_album_cover"
style="@style/Widget.Auxio.Image.Small" style="@style/Widget.Auxio.Image.Small"
android:layout_margin="@dimen/spacing_medium" android:layout_margin="@dimen/spacing_medium"
@ -47,6 +47,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/spacing_medium" android:layout_marginEnd="@dimen/spacing_medium"
android:textColor="@color/sel_toggleable_primary"
app:layout_constraintBottom_toTopOf="@+id/song_info" app:layout_constraintBottom_toTopOf="@+id/song_info"
app:layout_constraintEnd_toStartOf="@+id/song_drag_handle" app:layout_constraintEnd_toStartOf="@+id/song_drag_handle"
app:layout_constraintStart_toEndOf="@+id/song_album_cover" app:layout_constraintStart_toEndOf="@+id/song_album_cover"
@ -60,6 +61,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/spacing_medium" android:layout_marginEnd="@dimen/spacing_medium"
android:textColor="@color/sel_toggleable_secondary"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/song_drag_handle" app:layout_constraintEnd_toStartOf="@+id/song_drag_handle"
app:layout_constraintStart_toEndOf="@+id/song_album_cover" app:layout_constraintStart_toEndOf="@+id/song_album_cover"