diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt index ef31de4f1..fd5f0ad64 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -29,15 +29,12 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import org.oxycblt.auxio.R -import org.oxycblt.auxio.accent.Accent import org.oxycblt.auxio.databinding.FragmentPlaybackBinding import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.playback.state.LoopMode import org.oxycblt.auxio.ui.memberBinding import org.oxycblt.auxio.util.applyEdge import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.resolveDrawable -import org.oxycblt.auxio.util.resolveStateList /** * A [Fragment] that displays more information about the song, along with more media controls. @@ -48,7 +45,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { private val playbackModel: PlaybackViewModel by activityViewModels() private val detailModel: DetailViewModel by activityViewModels() private val binding by memberBinding(FragmentPlaybackBinding::inflate) { - playbackSong.isSelected = false + playbackSong.isSelected = false // Clear marquee to prevent a memory leak } override fun onCreateView( @@ -56,14 +53,6 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { container: ViewGroup?, savedInstanceState: Bundle? ): View { - val normalTextColor = binding.playbackDurationCurrent.currentTextColor - val accentColor = Accent.get().getStateList(requireContext()) - val controlColor = R.color.control.resolveStateList(requireContext()) - - // Can't set the tint of a MenuItem below Android 8, so use icons instead. - val iconQueueActive = R.drawable.ic_queue.resolveDrawable(requireContext()) - val iconQueueInactive = R.drawable.ic_queue_inactive.resolveDrawable(requireContext()) - val queueItem: MenuItem // --- UI SETUP --- @@ -102,6 +91,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { binding.playbackSeekBar.setOnSeekBarChangeListener(this) // --- VIEWMODEL SETUP -- + playbackModel.song.observe(viewLifecycleOwner) { song -> if (song != null) { logD("Updating song display to ${song.name}.") @@ -120,32 +110,17 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { } playbackModel.loopMode.observe(viewLifecycleOwner) { loopMode -> - when (loopMode) { - LoopMode.NONE -> { - binding.playbackLoop.imageTintList = controlColor - binding.playbackLoop.setImageResource(R.drawable.ic_loop) - } - - LoopMode.ALL -> { - binding.playbackLoop.imageTintList = accentColor - binding.playbackLoop.setImageResource(R.drawable.ic_loop) - } - - LoopMode.TRACK -> { - binding.playbackLoop.imageTintList = accentColor - binding.playbackLoop.setImageResource(R.drawable.ic_loop_one) - } - - else -> return@observe + val resId = when (loopMode) { + LoopMode.NONE, null -> R.drawable.ic_loop + LoopMode.ALL -> R.drawable.ic_loop_on + LoopMode.TRACK -> R.drawable.ic_loop_one } + + binding.playbackLoop.setImageResource(resId) } playbackModel.isSeeking.observe(viewLifecycleOwner) { isSeeking -> - if (isSeeking) { - binding.playbackDurationCurrent.setTextColor(accentColor) - } else { - binding.playbackDurationCurrent.setTextColor(normalTextColor) - } + binding.playbackDurationCurrent.isActivated = isSeeking } playbackModel.positionAsProgress.observe(viewLifecycleOwner) { pos -> @@ -155,27 +130,11 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { } playbackModel.nextItemsInQueue.observe(viewLifecycleOwner) { nextQueue -> - val userQueue = playbackModel.userQueue.value!! - - if (userQueue.isEmpty() && nextQueue.isEmpty()) { - queueItem.icon = iconQueueInactive - queueItem.isEnabled = false - } else { - queueItem.icon = iconQueueActive - queueItem.isEnabled = true - } + updateQueueIcon(queueItem) } playbackModel.userQueue.observe(viewLifecycleOwner) { userQueue -> - val nextQueue = playbackModel.nextItemsInQueue.value!! - - if (userQueue.isEmpty() && nextQueue.isEmpty()) { - queueItem.icon = iconQueueInactive - queueItem.isEnabled = false - } else { - queueItem.icon = iconQueueActive - queueItem.isEnabled = true - } + updateQueueIcon(queueItem) } playbackModel.isPlaying.observe(viewLifecycleOwner) { isPlaying -> @@ -193,6 +152,15 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { return binding.root } + private fun updateQueueIcon(queueItem: MenuItem) { + val userQueue = playbackModel.userQueue.value!! + val nextQueue = playbackModel.nextItemsInQueue.value!! + + // The queue icon uses a selector that will automatically tint the icon as active or + // inactive. We just need to set the flag. + queueItem.isEnabled = !(userQueue.isEmpty() && nextQueue.isEmpty()) + } + // --- SEEK CALLBACKS --- override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { diff --git a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt index c2329d087..c890c547e 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt @@ -75,7 +75,7 @@ fun RecyclerView.applySpans(shouldBeFullWidth: ((Int) -> Boolean)? = null) { */ fun ImageButton.disable() { if (isEnabled) { - imageTintList = R.color.inactive.resolveStateList(context) + imageTintList = ContextCompat.getColorStateList(context, R.color.overlay_disabled) isEnabled = false } } diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt b/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt index 166619469..5755d6da9 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt @@ -129,7 +129,7 @@ fun createFullWidget(context: Context, state: WidgetState): RemoteViews { val loopRes = when (state.loopMode) { LoopMode.NONE -> R.drawable.ic_loop - LoopMode.ALL -> R.drawable.ic_loop_tinted + LoopMode.ALL -> R.drawable.ic_loop_on LoopMode.TRACK -> R.drawable.ic_loop_one } diff --git a/app/src/main/res/color/overlay_disabled.xml b/app/src/main/res/color/overlay_disabled.xml new file mode 100644 index 000000000..057dffcd5 --- /dev/null +++ b/app/src/main/res/color/overlay_disabled.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/sel_accent_active.xml b/app/src/main/res/color/sel_accented.xml similarity index 100% rename from app/src/main/res/color/sel_accent_active.xml rename to app/src/main/res/color/sel_accented.xml diff --git a/app/src/main/res/color/sel_accented_track.xml b/app/src/main/res/color/sel_accented_secondary.xml similarity index 76% rename from app/src/main/res/color/sel_accented_track.xml rename to app/src/main/res/color/sel_accented_secondary.xml index 72e833a26..82ee15d01 100644 --- a/app/src/main/res/color/sel_accented_track.xml +++ b/app/src/main/res/color/sel_accented_secondary.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_loop_tinted.xml b/app/src/main/res/drawable/ic_loop_on.xml similarity index 100% rename from app/src/main/res/drawable/ic_loop_tinted.xml rename to app/src/main/res/drawable/ic_loop_on.xml diff --git a/app/src/main/res/drawable/ic_queue.xml b/app/src/main/res/drawable/ic_queue.xml index 7728677a0..bba0ecc39 100644 --- a/app/src/main/res/drawable/ic_queue.xml +++ b/app/src/main/res/drawable/ic_queue.xml @@ -2,7 +2,7 @@ - - - diff --git a/app/src/main/res/drawable/ui_circle_ripple.xml b/app/src/main/res/drawable/ui_circle_ripple.xml index 9da7508a5..88efdfd63 100644 --- a/app/src/main/res/drawable/ui_circle_ripple.xml +++ b/app/src/main/res/drawable/ui_circle_ripple.xml @@ -1,9 +1,9 @@ + android:color="@color/mtrl_btn_ripple_color"> + android:tint="@color/sel_accented"> diff --git a/app/src/main/res/layout-land/fragment_playback.xml b/app/src/main/res/layout-land/fragment_playback.xml index 2ae75d5f2..ba7929c66 100644 --- a/app/src/main/res/layout-land/fragment_playback.xml +++ b/app/src/main/res/layout-land/fragment_playback.xml @@ -116,6 +116,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_mid_large" android:text="@{playbackModel.formattedPosition}" + android:textColor="@color/sel_accented_secondary" app:layout_constraintBottom_toTopOf="@+id/playback_play_pause" app:layout_constraintStart_toEndOf="@+id/playback_cover" app:layout_constraintTop_toBottomOf="@+id/playback_seek_bar" @@ -183,7 +184,7 @@ android:contentDescription="@string/desc_shuffle" android:onClick="@{() -> playbackModel.invertShuffleStatus()}" android:src="@drawable/ic_shuffle" - app:tint="@color/sel_accent_active" + app:tint="@color/sel_accented" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_next" app:layout_constraintEnd_toEndOf="@+id/playback_song_duration" app:layout_constraintTop_toTopOf="@+id/playback_skip_next" /> diff --git a/app/src/main/res/layout-xlarge-land/fragment_playback.xml b/app/src/main/res/layout-xlarge-land/fragment_playback.xml index 306c70b98..a23fe6413 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_playback.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_playback.xml @@ -117,6 +117,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_mid_large" android:text="@{playbackModel.formattedPosition}" + android:textColor="@color/sel_accented_secondary" app:layout_constraintBottom_toTopOf="@+id/playback_play_pause" app:layout_constraintStart_toEndOf="@+id/playback_cover" app:layout_constraintTop_toBottomOf="@+id/playback_seek_bar" @@ -184,7 +185,7 @@ android:contentDescription="@string/desc_shuffle" android:onClick="@{() -> playbackModel.invertShuffleStatus()}" android:src="@drawable/ic_shuffle" - app:tint="@color/sel_accent_active" + app:tint="@color/sel_accented" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_next" app:layout_constraintStart_toEndOf="@+id/playback_skip_next" app:layout_constraintTop_toTopOf="@+id/playback_skip_next" /> diff --git a/app/src/main/res/layout-xlarge/fragment_playback.xml b/app/src/main/res/layout-xlarge/fragment_playback.xml index a775ea950..510c14b6e 100644 --- a/app/src/main/res/layout-xlarge/fragment_playback.xml +++ b/app/src/main/res/layout-xlarge/fragment_playback.xml @@ -104,6 +104,7 @@ android:layout_marginStart="@dimen/spacing_mid_huge" android:layout_marginBottom="@dimen/spacing_medium" android:text="@{playbackModel.formattedPosition}" + android:textColor="@color/sel_accented_secondary" app:layout_constraintBottom_toTopOf="@+id/playback_play_pause" app:layout_constraintStart_toStartOf="parent" tools:text="11:38" /> @@ -171,7 +172,7 @@ android:contentDescription="@string/desc_shuffle" android:onClick="@{() -> playbackModel.invertShuffleStatus()}" android:src="@drawable/ic_shuffle" - app:tint="@color/sel_accent_active" + app:tint="@color/sel_accented" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_next" app:layout_constraintStart_toEndOf="@+id/playback_skip_next" app:layout_constraintTop_toTopOf="@+id/playback_skip_next" /> diff --git a/app/src/main/res/layout/fragment_playback.xml b/app/src/main/res/layout/fragment_playback.xml index 19035e050..e57e45099 100644 --- a/app/src/main/res/layout/fragment_playback.xml +++ b/app/src/main/res/layout/fragment_playback.xml @@ -101,6 +101,7 @@ android:layout_marginStart="@dimen/spacing_mid_large" android:layout_marginBottom="@dimen/spacing_medium" android:text="@{playbackModel.formattedPosition}" + android:textColor="@color/sel_accented_secondary" app:layout_constraintBottom_toTopOf="@+id/playback_play_pause" app:layout_constraintStart_toStartOf="parent" tools:text="11:38" /> @@ -167,7 +168,7 @@ android:contentDescription="@string/desc_shuffle" android:onClick="@{() -> playbackModel.invertShuffleStatus()}" android:src="@drawable/ic_shuffle" - app:tint="@color/sel_accent_active" + app:tint="@color/sel_accented" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_next" app:layout_constraintEnd_toEndOf="@+id/playback_song_duration" app:layout_constraintTop_toTopOf="@+id/playback_skip_next" /> diff --git a/app/src/main/res/layout/item_album_song.xml b/app/src/main/res/layout/item_album_song.xml index e089213cd..82c6dd232 100644 --- a/app/src/main/res/layout/item_album_song.xml +++ b/app/src/main/res/layout/item_album_song.xml @@ -24,7 +24,7 @@ android:text="@{String.valueOf(song.track)}" android:textAlignment="center" android:textAppearance="?android:attr/textAppearanceListItem" - android:textColor="@color/sel_accented_track" + android:textColor="@color/sel_accented_secondary" android:textSize="@dimen/text_size_large" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index ce3bcfa6b..fd85e9434 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -1,7 +1,6 @@ - @color/surface_night - #404040 + #202124 #ffffff #01151515 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 9ec0a6ef8..4fdf88ce6 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,12 +1,8 @@ - #fafafa - #202124 + #fafafa @android:color/black - - @color/surface_day #202020 - #c4c4c4 #01fafafa