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 @@