From f06ca142f685ae4c042938af70d3eaf38bde55bb Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sat, 21 Aug 2021 12:09:17 -0600 Subject: [PATCH] style: fix accessibility issues Fix a plethora of style issues that lead to a worse touch experience. I tried to optimize these solutions so that they didn't reduce the layout density too much. More updates may have to be made in the future. --- .../main/java/org/oxycblt/auxio/AuxioUtils.kt | 7 --- .../java/org/oxycblt/auxio/MainFragment.kt | 2 - .../auxio/excluded/ExcludedDatabase.kt | 2 +- .../auxio/playback/CompactPlaybackFragment.kt | 10 +--- .../oxycblt/auxio/playback/PlayPauseButton.kt | 47 ------------------- .../auxio/playback/PlaybackFragment.kt | 24 +--------- .../auxio/playback/PlaybackViewModel.kt | 18 ------- .../java/org/oxycblt/auxio/widgets/Forms.kt | 13 ++--- .../main/res/color/color_accent_active.xml | 6 +++ app/src/main/res/drawable/ic_loop_one.xml | 2 +- .../main/res/drawable/ic_loop_one_tinted.xml | 11 ----- ...loop_all_tinted.xml => ic_loop_tinted.xml} | 0 .../main/res/drawable/ic_playing_state.xml | 6 +++ .../res/drawable/ui_background_ripple.xml | 10 ++-- .../main/res/drawable/ui_circle_ripple.xml | 3 +- .../layout-land/fragment_compact_playback.xml | 7 ++- .../res/layout-land/fragment_playback.xml | 4 +- .../layout-xlarge-land/fragment_playback.xml | 4 +- .../res/layout-xlarge/fragment_playback.xml | 4 +- .../res/layout/fragment_compact_playback.xml | 6 +-- app/src/main/res/layout/fragment_playback.xml | 6 ++- app/src/main/res/layout/item_accent.xml | 2 +- .../main/res/layout/item_action_header.xml | 2 +- app/src/main/res/layout/item_album.xml | 4 +- app/src/main/res/layout/item_album_song.xml | 4 +- app/src/main/res/layout/item_artist.xml | 4 +- app/src/main/res/layout/item_artist_album.xml | 4 +- app/src/main/res/layout/item_artist_song.xml | 6 +-- app/src/main/res/layout/item_excluded_dir.xml | 6 +-- app/src/main/res/layout/item_genre.xml | 4 +- app/src/main/res/layout/item_genre_song.xml | 6 +-- app/src/main/res/layout/item_queue_song.xml | 22 ++++----- app/src/main/res/layout/item_song.xml | 4 +- app/src/main/res/layout/widget_full.xml | 2 +- app/src/main/res/values-night/colors.xml | 3 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/dimens.xml | 21 ++++----- app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/styles_component.xml | 12 ++--- app/src/main/res/values/styles_core.xml | 2 + app/src/main/res/values/styles_ui.xml | 18 +++---- 41 files changed, 113 insertions(+), 208 deletions(-) delete mode 100644 app/src/main/java/org/oxycblt/auxio/playback/PlayPauseButton.kt create mode 100644 app/src/main/res/color/color_accent_active.xml delete mode 100644 app/src/main/res/drawable/ic_loop_one_tinted.xml rename app/src/main/res/drawable/{ic_loop_all_tinted.xml => ic_loop_tinted.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_playing_state.xml diff --git a/app/src/main/java/org/oxycblt/auxio/AuxioUtils.kt b/app/src/main/java/org/oxycblt/auxio/AuxioUtils.kt index 2bc079132..1bf82d042 100644 --- a/app/src/main/java/org/oxycblt/auxio/AuxioUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/AuxioUtils.kt @@ -185,13 +185,6 @@ fun @receiver:ColorRes Int.resolveStateList(context: Context) = fun @receiver:DrawableRes Int.resolveDrawable(context: Context) = requireNotNull(ContextCompat.getDrawable(context, this)) -/** - * Resolve a drawable resource into an [AnimatedVectorDrawable] - * @see resolveDrawable - */ -fun @receiver:DrawableRes Int.resolveAnimDrawable(context: Context) = - resolveDrawable(context) as AnimatedVectorDrawable - /** * Resolve this int into a color as if it was an attribute */ diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index ccf032694..1de60aba4 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -161,8 +161,6 @@ class MainFragment : Fragment() { } else { View.GONE } - - playbackModel.disableAnimation() } else { binding.compactPlayback.visibility = View.VISIBLE } diff --git a/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDatabase.kt b/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDatabase.kt index 0d15ce5e1..b1478b022 100644 --- a/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDatabase.kt +++ b/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDatabase.kt @@ -97,7 +97,7 @@ class ExcludedDatabase(context: Context) : SQLiteOpenHelper(context, DB_NAME, nu private var INSTANCE: ExcludedDatabase? = null /** - * Get/Instantiate the single instance of [PlaybackStateDatabase]. + * Get/Instantiate the single instance of [ExcludedDatabase]. */ fun getInstance(context: Context): ExcludedDatabase { val currentInstance = INSTANCE diff --git a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt index acdc2b086..dd15199c5 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt @@ -79,19 +79,11 @@ class CompactPlaybackFragment : Fragment() { } playbackModel.isPlaying.observe(viewLifecycleOwner) { isPlaying -> - binding.playbackPlayPause.setPlaying(isPlaying, playbackModel.canAnimate) - - playbackModel.enableAnimation() + binding.playbackPlayPause.isActivated = isPlaying } logD("Fragment Created") return binding.root } - - override fun onStart() { - super.onStart() - - playbackModel.disableAnimation() - } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlayPauseButton.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlayPauseButton.kt deleted file mode 100644 index 3dd1eb994..000000000 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlayPauseButton.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2021 Auxio Project - * PlayPauseButton.kt is part of Auxio. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.oxycblt.auxio.playback - -import android.content.Context -import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatImageButton -import org.oxycblt.auxio.R - -/** - * Custom [AppCompatImageButton] that handles the animated play/pause icons. - * @author OxygenCobalt - * TODO: Replace this with a material icon that does the path manipulation manually. - */ -class PlayPauseButton @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = -1 -) : AppCompatImageButton(context, attrs, defStyleAttr) { - /** - * Update the play/pause icon to reflect [isPlaying] - * @param animate Whether the icon change should be animated or not. - */ - fun setPlaying(isPlaying: Boolean, animate: Boolean) { - if (isPlaying) { - setImageResource(R.drawable.ic_pause) - } else { - setImageResource(R.drawable.ic_play) - } - } -} 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 58838df52..f979fb285 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -107,11 +107,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { } playbackModel.isShuffling.observe(viewLifecycleOwner) { isShuffling -> - binding.playbackShuffle.imageTintList = if (isShuffling) { - accentColor - } else { - controlColor - } + binding.playbackShuffle.isActivated = isShuffling } playbackModel.loopMode.observe(viewLifecycleOwner) { loopMode -> @@ -174,17 +170,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { } playbackModel.isPlaying.observe(viewLifecycleOwner) { isPlaying -> - binding.playbackPlayPause.apply { - if (isPlaying) { - backgroundTintList = accentColor - setPlaying(true, playbackModel.canAnimate) - } else { - backgroundTintList = controlColor - setPlaying(false, playbackModel.canAnimate) - } - } - - playbackModel.enableAnimation() + binding.playbackPlayPause.isActivated = isPlaying } detailModel.navToItem.observe(viewLifecycleOwner) { item -> @@ -198,12 +184,6 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { return binding.root } - override fun onStart() { - super.onStart() - - playbackModel.disableAnimation() - } - // --- SEEK CALLBACKS --- override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index bf1e2ef57..8fcf0834d 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -70,7 +70,6 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { // Other private val mIsSeeking = MutableLiveData(false) private var mIntentUri: Uri? = null - private var mCanAnimate = false /** The current song. */ val song: LiveData get() = mSong @@ -94,7 +93,6 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { val loopMode: LiveData get() = mLoopMode val isSeeking: LiveData get() = mIsSeeking - val canAnimate: Boolean get() = mCanAnimate /** The position as a duration string. */ val formattedPosition = Transformations.map(mPosition) { @@ -351,8 +349,6 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { * Flip the playing status, e.g from playing to paused */ fun invertPlayingStatus() { - enableAnimation() - playbackManager.setPlaying(!playbackManager.isPlaying) } @@ -435,20 +431,6 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { mIsSeeking.value = isSeeking } - /** - * Enable animation on the play/pause button, usually done after the first LiveData fire - */ - fun enableAnimation() { - mCanAnimate = true - } - - /** - * Disable animation on play/pause button, usually done after when a UI is created - */ - fun disableAnimation() { - mCanAnimate = false - } - // --- OVERRIDES --- override fun onCleared() { 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 93c6093ae..5e47eaa43 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt @@ -19,6 +19,7 @@ package org.oxycblt.auxio.widgets import android.content.Context +import android.util.Log import android.widget.RemoteViews import androidx.annotation.LayoutRes import org.oxycblt.auxio.R @@ -118,20 +119,20 @@ fun createFullWidget(context: Context, state: WidgetState): RemoteViews { ) ) - // The main way the large widget differs from the other widgets is the addition of extra - // controls. However, since we can't retrieve the context of our views here, we cant - // dynamically set the image view attributes. More duplicate resources it is. This is - // getting really tiring. + // While it is technically possible to use the setColorFilter to tint these buttons, its + // actually less efficent than using duplicate drawables. + // And no, we can't control state drawables with RemoteViews. Because of course we can't. val shuffleRes = when { state.isShuffled -> R.drawable.ic_shuffle_tinted else -> R.drawable.ic_shuffle } + val loopRes = when (state.loopMode) { LoopMode.NONE -> R.drawable.ic_loop - LoopMode.ALL -> R.drawable.ic_loop_all_tinted - LoopMode.TRACK -> R.drawable.ic_loop_one_tinted + LoopMode.ALL -> R.drawable.ic_loop_tinted + LoopMode.TRACK -> R.drawable.ic_loop_one } views.setImageViewResource(R.id.widget_shuffle, shuffleRes) diff --git a/app/src/main/res/color/color_accent_active.xml b/app/src/main/res/color/color_accent_active.xml new file mode 100644 index 000000000..9b80db312 --- /dev/null +++ b/app/src/main/res/color/color_accent_active.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_loop_one.xml b/app/src/main/res/drawable/ic_loop_one.xml index cdcdfc760..349dd776a 100644 --- a/app/src/main/res/drawable/ic_loop_one.xml +++ b/app/src/main/res/drawable/ic_loop_one.xml @@ -2,7 +2,7 @@ - - - diff --git a/app/src/main/res/drawable/ic_loop_all_tinted.xml b/app/src/main/res/drawable/ic_loop_tinted.xml similarity index 100% rename from app/src/main/res/drawable/ic_loop_all_tinted.xml rename to app/src/main/res/drawable/ic_loop_tinted.xml diff --git a/app/src/main/res/drawable/ic_playing_state.xml b/app/src/main/res/drawable/ic_playing_state.xml new file mode 100644 index 000000000..b03eab616 --- /dev/null +++ b/app/src/main/res/drawable/ic_playing_state.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ui_background_ripple.xml b/app/src/main/res/drawable/ui_background_ripple.xml index 1c6a4919c..de45c3c95 100644 --- a/app/src/main/res/drawable/ui_background_ripple.xml +++ b/app/src/main/res/drawable/ui_background_ripple.xml @@ -1,15 +1,11 @@ - - - - - - - + + diff --git a/app/src/main/res/drawable/ui_circle_ripple.xml b/app/src/main/res/drawable/ui_circle_ripple.xml index bf4d9664d..8875a4317 100644 --- a/app/src/main/res/drawable/ui_circle_ripple.xml +++ b/app/src/main/res/drawable/ui_circle_ripple.xml @@ -2,7 +2,8 @@ - + diff --git a/app/src/main/res/layout-land/fragment_compact_playback.xml b/app/src/main/res/layout-land/fragment_compact_playback.xml index 4e25f0afc..d2ef2e9d8 100644 --- a/app/src/main/res/layout-land/fragment_compact_playback.xml +++ b/app/src/main/res/layout-land/fragment_compact_playback.xml @@ -60,17 +60,16 @@ app:layout_constraintTop_toBottomOf="@+id/playback_song" tools:text="Artist Name / Album Name" /> - + app:layout_constraintTop_toTopOf="parent" /> - 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 049f9cab1..9923ab0ef 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_playback.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_playback.xml @@ -157,9 +157,10 @@ app:layout_constraintEnd_toStartOf="@+id/playback_play_pause" app:layout_constraintTop_toTopOf="@+id/playback_play_pause" /> - diff --git a/app/src/main/res/layout-xlarge/fragment_playback.xml b/app/src/main/res/layout-xlarge/fragment_playback.xml index 2fdf0d76f..50409b5c4 100644 --- a/app/src/main/res/layout-xlarge/fragment_playback.xml +++ b/app/src/main/res/layout-xlarge/fragment_playback.xml @@ -144,11 +144,12 @@ app:layout_constraintEnd_toStartOf="@+id/playback_play_pause" app:layout_constraintTop_toTopOf="@+id/playback_play_pause" /> - diff --git a/app/src/main/res/layout/fragment_compact_playback.xml b/app/src/main/res/layout/fragment_compact_playback.xml index a795c2eff..46f4c3354 100644 --- a/app/src/main/res/layout/fragment_compact_playback.xml +++ b/app/src/main/res/layout/fragment_compact_playback.xml @@ -68,16 +68,16 @@ app:layout_constraintTop_toBottomOf="@+id/playback_song" tools:text="Artist Name / Album Name" /> - + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_playback.xml b/app/src/main/res/layout/fragment_playback.xml index d76d2198e..2cb8f0d5a 100644 --- a/app/src/main/res/layout/fragment_playback.xml +++ b/app/src/main/res/layout/fragment_playback.xml @@ -140,15 +140,16 @@ app:layout_constraintStart_toEndOf="@+id/playback_loop" app:layout_constraintTop_toTopOf="@+id/playback_play_pause" /> - + tools:src="@drawable/ic_play" /> diff --git a/app/src/main/res/layout/item_accent.xml b/app/src/main/res/layout/item_accent.xml index e63fa0f71..ee375e862 100644 --- a/app/src/main/res/layout/item_accent.xml +++ b/app/src/main/res/layout/item_accent.xml @@ -18,7 +18,7 @@ android:scaleType="fitCenter" android:src="@drawable/ic_check" tools:backgroundTint="?attr/colorAccent" - tools:ignore="contentDescription" /> + tools:ignore="ContentDescription, SpeakableTextPresentCheck" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_action_header.xml b/app/src/main/res/layout/item_action_header.xml index 817c1acd6..4ba795879 100644 --- a/app/src/main/res/layout/item_action_header.xml +++ b/app/src/main/res/layout/item_action_header.xml @@ -34,7 +34,7 @@ android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="@+id/header_title" + app:layout_constraintTop_toTopOf="parent" tools:ignore="ContentDescription" tools:src="@drawable/ic_clear" /> diff --git a/app/src/main/res/layout/item_album.xml b/app/src/main/res/layout/item_album.xml index ed2f28932..d1ff4cc86 100644 --- a/app/src/main/res/layout/item_album.xml +++ b/app/src/main/res/layout/item_album.xml @@ -25,7 +25,7 @@ diff --git a/app/src/main/res/layout/item_genre.xml b/app/src/main/res/layout/item_genre.xml index 04acededd..7ec5daddc 100644 --- a/app/src/main/res/layout/item_genre.xml +++ b/app/src/main/res/layout/item_genre.xml @@ -25,7 +25,7 @@ + android:layout_height="wrap_content"> + app:layout_constraintTop_toTopOf="@+id/song_name" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_song.xml b/app/src/main/res/layout/item_song.xml index 57231417c..d09fd4f14 100644 --- a/app/src/main/res/layout/item_song.xml +++ b/app/src/main/res/layout/item_song.xml @@ -26,7 +26,7 @@ + android:src="@drawable/ic_playing_state" /> #404040 #ffffff #01151515 + #bebebe - 2dp 4dp 8dp 16dp 24dp 32dp 48dp - 64dp 128dp @@ -24,7 +19,10 @@ 20dp - 18dp + 48dp + 64dp + + 20dp 24dp 48dp @@ -32,15 +30,12 @@ 136dp 264dp - 64dp - 36dp - 48dp - 32dp - - 48dp 1dp 2dp + 48dp + 48dp + 16sp 18sp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ef84afa6d..d32fd8453 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -121,6 +121,7 @@ Turn shuffle on or off Clear queue + Move queue song Clear search query Remove excluded directory @@ -130,6 +131,7 @@ Artist Image for %s Genre Image for %s + Unknown Genre Unknown Artist diff --git a/app/src/main/res/values/styles_component.xml b/app/src/main/res/values/styles_component.xml index ecfa3b15d..96019796e 100644 --- a/app/src/main/res/values/styles_component.xml +++ b/app/src/main/res/values/styles_component.xml @@ -3,13 +3,13 @@ - - - @@ -141,7 +141,9 @@ @dimen/spacing_small @dimen/spacing_small @dimen/spacing_medium + @dimen/size_btn_small @dimen/text_size_medium + center_vertical ?android:attr/textColorPrimary @font/inter_semibold @drawable/ui_header_dividers @@ -175,16 +177,16 @@