deps: update to mdc 1.8.0-alpha01

FINALLY update to MDC 1.7.0. After over half a year.

I have been continually blocked by doing this due to this absurd ripple
bug that was so continually frustrating. Today, I finally figred out
how to hack a fix in by using R E F L E C T I O N and manually
disabling the bugged code path since google apparently can't be bothered
to fix it.

Now, you might wonder why I didn't update to 1.8.0. That is because
there is ANOTHER RIPPLE BUG. THIS TIME WITH THE TAB LAYOUT. AND ONLY IF
IT'S IN A COLLAPSING TOOLBAR LAYOUT. Can't wait to finally use the new
1.8.0 features in December!
This commit is contained in:
Alexander Capehart 2023-02-12 21:45:47 -07:00
parent bc96c761a0
commit 1826ae3215
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
31 changed files with 146 additions and 77 deletions

View file

@ -67,7 +67,7 @@ dependencies {
// General
// 1.4.0 is used in order to avoid a ripple bug in material components
implementation "androidx.appcompat:appcompat:1.4.0"
implementation "androidx.appcompat:appcompat:1.6.1"
implementation "androidx.core:core-ktx:1.9.0"
implementation "androidx.activity:activity-ktx:1.6.1"
implementation "androidx.fragment:fragment-ktx:1.5.5"
@ -113,14 +113,16 @@ dependencies {
implementation fileTree(dir: "libs", include: ["extension-*.aar"])
// Image loading
implementation "io.coil-kt:coil-base:2.1.0"
implementation "io.coil-kt:coil-base:2.2.0"
// Material
// Locked below 1.7.0-alpha03 to avoid the same ripple bug
implementation "com.google.android.material:material:1.7.0-alpha02"
// TODO: Stuck on 1.8.0-alpha01 until ripple bug with tab layout can be worked around
// TODO: Exactly figure out the conditions that the 1.7.0 ripple bug occurred so you can just
// PR a fix.
implementation "com.google.android.material:material:1.8.0-alpha01"
// Dependency Injection
def dagger_version = "2.40"
def dagger_version = "2.44.2"
implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:hilt-android:$hilt_version"

View file

@ -143,8 +143,8 @@ class SongImpl(rawSong: RawSong, musicSettings: MusicSettings) : Song {
override fun resolveGenreContents(context: Context) = resolveNames(context, genres)
/**
* The [RawAlbum] instances collated by the [Song]. This can be used to group [Song]s
* into an [Album].
* The [RawAlbum] instances collated by the [Song]. This can be used to group [Song]s into an
* [Album].
*/
val rawAlbum =
RawAlbum(
@ -167,8 +167,8 @@ class SongImpl(rawSong: RawSong, musicSettings: MusicSettings) : Song {
rawIndividualArtists.ifEmpty { rawAlbumArtists }.ifEmpty { listOf(RawArtist()) }
/**
* The [RawGenre] instances collated by the [Song]. This can be used to group up [Song]s
* into a [Genre]. ID3v2 Genre names are automatically converted to their resolved names.
* The [RawGenre] instances collated by the [Song]. This can be used to group up [Song]s into a
* [Genre]. ID3v2 Genre names are automatically converted to their resolved names.
*/
val rawGenres =
rawSong.genreNames
@ -233,8 +233,8 @@ class SongImpl(rawSong: RawSong, musicSettings: MusicSettings) : Song {
/**
* Library-backed implementation of [Album].
* @param rawAlbum The [RawAlbum] to derive the member data from.
* @param songs The [Song]s that are a part of this [Album]. These items will be linked to
* this [Album].
* @param songs The [Song]s that are a part of this [Album]. These items will be linked to this
* [Album].
* @author Alexander Capehart (OxygenCobalt)
*/
class AlbumImpl(val rawAlbum: RawAlbum, override val songs: List<SongImpl>) : Album {
@ -334,9 +334,9 @@ class AlbumImpl(val rawAlbum: RawAlbum, override val songs: List<SongImpl>) : Al
/**
* Library-backed implementation of [Artist].
* @param rawArtist The [RawArtist] to derive the member data from.
* @param songAlbums A list of the [Song]s and [Album]s that are a part of this [Artist]
* , either through artist or album artist tags. Providing [Song]s to the artist is optional.
* These instances will be linked to this [Artist].
* @param songAlbums A list of the [Song]s and [Album]s that are a part of this [Artist] , either
* through artist or album artist tags. Providing [Song]s to the artist is optional. These instances
* will be linked to this [Artist].
* @author Alexander Capehart (OxygenCobalt)
*/
class ArtistImpl(private val rawArtist: RawArtist, songAlbums: List<Music>) : Artist {
@ -404,8 +404,8 @@ class ArtistImpl(private val rawArtist: RawArtist, songAlbums: List<Music>) : Ar
/**
* Returns the original position of this [Artist]'s [RawArtist] within the given [RawArtist]
* list. This can be used to create a consistent ordering within child [Artist] lists based
* on the original tag order.
* list. This can be used to create a consistent ordering within child [Artist] lists based on
* the original tag order.
* @param rawArtists The [RawArtist] instances to check. It is assumed that this [Artist]'s
* [RawArtist] will be within the list.
* @return The index of the [Artist]'s [RawArtist] within the list.
@ -467,9 +467,9 @@ class GenreImpl(private val rawGenre: RawGenre, override val songs: List<SongImp
}
/**
* Returns the original position of this [Genre]'s [RawGenre] within the given [RawGenre]
* list. This can be used to create a consistent ordering within child [Genre] lists based
* on the original tag order.
* Returns the original position of this [Genre]'s [RawGenre] within the given [RawGenre] list.
* This can be used to create a consistent ordering within child [Genre] lists based on the
* original tag order.
* @param rawGenres The [RawGenre] instances to check. It is assumed that this [Genre] 's
* [RawGenre] will be within the list.
* @return The index of the [Genre]'s [RawGenre] within the list.

View file

@ -366,6 +366,10 @@ constructor(
mediaStoreJob.await()
metadataJob.await()
if (rawSongs.isEmpty()) {
throw Indexer.NoMusicException()
}
// Successfully loaded the library, now save the cache and create the library in
// parallel.
emitIndexing(Indexer.Indexing.Indeterminate)

View file

@ -22,6 +22,7 @@ import android.content.Context
import android.util.AttributeSet
import com.google.android.material.button.MaterialButton
import org.oxycblt.auxio.R
import org.oxycblt.auxio.ui.RippleFixMaterialButton
import org.oxycblt.auxio.util.getInteger
/**
@ -32,7 +33,7 @@ import org.oxycblt.auxio.util.getInteger
class AnimatedMaterialButton
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
MaterialButton(context, attrs, defStyleAttr) {
RippleFixMaterialButton(context, attrs, defStyleAttr) {
private var currentCornerRadiusRatio = 0f
private var animator: ValueAnimator? = null

View file

@ -18,10 +18,13 @@
package org.oxycblt.auxio.settings.ui
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatButton
import androidx.preference.PreferenceDialogFragmentCompat
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.R
import org.oxycblt.auxio.util.fixDoubleRipple
/**
* The companion dialog to [IntListPreference]. Use [from] to create an instance.
@ -32,6 +35,16 @@ class IntListPreferenceDialog : PreferenceDialogFragmentCompat() {
get() = (preference as IntListPreference)
private var pendingValueIndex = -1
override fun onStart() {
super.onStart()
(requireDialog() as AlertDialog).apply {
(getButton(AlertDialog.BUTTON_NEUTRAL) as AppCompatButton).fixDoubleRipple()
(getButton(AlertDialog.BUTTON_POSITIVE) as AppCompatButton).fixDoubleRipple()
(getButton(AlertDialog.BUTTON_NEGATIVE) as AppCompatButton).fixDoubleRipple()
}
}
override fun onCreateDialog(savedInstanceState: Bundle?) =
// PreferenceDialogFragmentCompat does not allow us to customize the actual creation
// of the alert dialog, so we have to override onCreateDialog and create a new dialog

View file

@ -0,0 +1,38 @@
/*
* Copyright (c) 2023 Auxio Project
*
* 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 <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.ui
import android.content.Context
import android.util.AttributeSet
import androidx.annotation.AttrRes
import com.google.android.material.button.MaterialButton
import org.oxycblt.auxio.util.fixDoubleRipple
/**
* Fixes an issue where double ripples appear on [MaterialButton] from AppCompat 1.5 afterwards due
* to a currently unfixed change.
* @author Alexander Capehart (OxygenCobalt)
*/
open class RippleFixMaterialButton
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
MaterialButton(context, attrs, defStyleAttr) {
init {
fixDoubleRipple()
}
}

View file

@ -22,9 +22,11 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatButton
import androidx.fragment.app.DialogFragment
import androidx.viewbinding.ViewBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.oxycblt.auxio.util.fixDoubleRipple
import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.unlikelyToBeNull
@ -102,6 +104,16 @@ abstract class ViewBindingDialogFragment<VB : ViewBinding> : DialogFragment() {
logD("Fragment created")
}
override fun onStart() {
super.onStart()
(requireDialog() as AlertDialog).apply {
(getButton(AlertDialog.BUTTON_NEUTRAL) as AppCompatButton).fixDoubleRipple()
(getButton(AlertDialog.BUTTON_POSITIVE) as AppCompatButton).fixDoubleRipple()
(getButton(AlertDialog.BUTTON_NEGATIVE) as AppCompatButton).fixDoubleRipple()
}
}
final override fun onDestroyView() {
super.onDestroyView()
onDestroyBinding(unlikelyToBeNull(_binding))

View file

@ -24,6 +24,7 @@ import android.os.Build
import android.view.View
import android.view.WindowInsets
import androidx.annotation.RequiresApi
import androidx.appcompat.widget.AppCompatButton
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.graphics.Insets
import androidx.core.graphics.drawable.DrawableCompat
@ -106,6 +107,17 @@ val ViewBinding.context: Context
*/
fun RecyclerView.canScroll() = computeVerticalScrollRange() > height
/**
* Fix the double ripple that appears in MaterialButton instances due to an issue with AppCompat 1.5
* or higher.
*/
fun AppCompatButton.fixDoubleRipple() {
AppCompatButton::class.java.getDeclaredField("mBackgroundTintHelper").apply {
isAccessible = true
set(this@fixDoubleRipple, null)
}
}
/**
* Get the [CoordinatorLayout.Behavior] of a [View], or null if the [View] is not part of a
* [CoordinatorLayout] or does not have a [CoordinatorLayout.Behavior].

View file

@ -87,7 +87,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_repeat"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -99,7 +99,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/playback_skip_prev" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_prev"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -124,7 +124,7 @@
app:layout_constraintTop_toTopOf="parent"
tools:icon="@drawable/ic_play_24" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_next"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -136,7 +136,7 @@
app:layout_constraintStart_toEndOf="@+id/playback_play_pause"
app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_shuffle"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"

View file

@ -60,7 +60,7 @@
app:layout_constraintTop_toBottomOf="@+id/detail_subhead"
tools:text="Info B" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_play_button"
style="@style/Widget.Auxio.Button.Secondary"
android:layout_width="0dp"
@ -72,7 +72,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/detail_info" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_shuffle_button"
style="@style/Widget.Auxio.Button.Primary"
android:layout_width="0dp"

View file

@ -74,7 +74,7 @@
app:layout_constraintTop_toBottomOf="@+id/detail_subhead"
tools:text="Info B" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_play_button"
style="@style/Widget.Auxio.Button.Secondary"
android:layout_width="0dp"
@ -87,7 +87,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/detail_cover" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_shuffle_button"
style="@style/Widget.Auxio.Button.Primary"
android:layout_width="0dp"

View file

@ -88,7 +88,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_repeat"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -102,7 +102,7 @@
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintTop_toTopOf="@+id/playback_skip_prev" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_prev"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -127,7 +127,7 @@
app:layout_constraintTop_toTopOf="parent"
tools:icon="@drawable/ic_pause_24" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_next"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -139,7 +139,7 @@
app:layout_constraintStart_toEndOf="@+id/playback_play_pause"
app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_shuffle"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"

View file

@ -73,7 +73,7 @@
tools:text="Info B" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_play_button"
style="@style/Widget.Auxio.Button.Secondary"
android:layout_width="0dp"
@ -88,7 +88,7 @@
app:layout_constraintStart_toEndOf="@+id/detail_cover"
app:layout_constraintTop_toBottomOf="@+id/detail_info" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_shuffle_button"
style="@style/Widget.Auxio.Button.Primary"
android:layout_width="0dp"

View file

@ -69,7 +69,7 @@
app:layout_constraintTop_toBottomOf="@+id/detail_subhead"
tools:text="Info B" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_play_button"
style="@style/Widget.Auxio.Button.Secondary"
android:layout_width="0dp"
@ -84,7 +84,7 @@
app:layout_constraintStart_toEndOf="@+id/detail_cover"
app:layout_constraintTop_toBottomOf="@+id/detail_info" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_shuffle_button"
style="@style/Widget.Auxio.Button.Primary"
android:layout_width="0dp"

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.switchmaterial.SwitchMaterial xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:thumb="@drawable/ui_m3_switch_thumb"
app:thumbTint="@color/sel_m3_switch_thumb"
app:track="@drawable/ui_m3_switch_track"
app:trackTint="@color/sel_m3_switch_track" />

View file

@ -35,7 +35,7 @@
app:selectionRequired="true"
app:singleSelection="true">
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/dirs_mode_exclude"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp"
@ -44,7 +44,7 @@
tools:icon="@drawable/ic_check_24"
android:text="@string/set_dirs_mode_exclude" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/dirs_mode_include"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp"
@ -82,7 +82,7 @@
android:text="@string/set_dirs_list"
app:layout_constraintTop_toBottomOf="@+id/dirs_list_header_divider" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
style="@style/Widget.Auxio.Button.Icon.Small"
android:id="@+id/dirs_add"
android:layout_width="wrap_content"

View file

@ -10,8 +10,7 @@
<org.oxycblt.auxio.ui.CoordinatorAppBarLayout
android:id="@+id/home_appbar"
style="@style/Widget.Auxio.AppBarLayout"
android:fitsSystemWindows="true">
style="@style/Widget.Auxio.AppBarLayout">
<org.oxycblt.auxio.list.selection.SelectionToolbarOverlay
android:id="@+id/home_selection_toolbar"
@ -98,7 +97,7 @@
app:layout_constraintBottom_toBottomOf="@+id/home_indexing_action"
app:layout_constraintTop_toTopOf="@+id/home_indexing_action" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/home_indexing_action"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View file

@ -58,7 +58,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_play_pause"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"
@ -66,7 +66,7 @@
android:contentDescription="@string/desc_play_pause"
app:icon="@drawable/sel_playing_state_24" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_secondary_action"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -102,7 +102,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_repeat"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -114,7 +114,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/playback_skip_prev" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_prev"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -139,7 +139,7 @@
app:layout_constraintTop_toTopOf="parent"
tools:icon="@drawable/ic_play_24" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_next"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"
@ -151,7 +151,7 @@
app:layout_constraintStart_toEndOf="@+id/playback_play_pause"
app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_shuffle"
style="@style/Widget.Auxio.Button.Icon.Large"
android:layout_width="wrap_content"

View file

@ -7,7 +7,7 @@
android:padding="@dimen/spacing_tiny"
android:theme="@style/ThemeOverlay.Accent">
<com.google.android.material.button.MaterialButton
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/accent"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
@ -75,7 +74,7 @@
app:layout_constraintTop_toBottomOf="@+id/song_name"
tools:text="16:16" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/song_menu"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -63,7 +63,7 @@
tools:text="Info B" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_play_button"
style="@style/Widget.Auxio.Button.Secondary"
android:layout_width="0dp"
@ -75,7 +75,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/detail_info" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_shuffle_button"
style="@style/Widget.Auxio.Button.Primary"
android:layout_width="0dp"

View file

@ -22,7 +22,7 @@
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
tools:text="primary:path/to/music" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/dir_delete"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -44,7 +44,7 @@
app:layout_constraintTop_toBottomOf="@+id/parent_name"
tools:text="Info" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/parent_menu"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -73,7 +73,7 @@
app:layout_constraintTop_toBottomOf="@+id/song_name"
tools:text="Artist / Album" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/song_drag_handle"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -44,7 +44,7 @@
app:layout_constraintTop_toBottomOf="@+id/song_name"
tools:text="Info" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/song_menu"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -18,7 +18,7 @@
app:layout_constraintStart_toStartOf="parent"
tools:text="Songs" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/header_button"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -26,7 +26,7 @@
tools:ignore="RtlSymmetry,contentDescription"
tools:text="Artists" />
<Button
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/tab_drag_handle"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.switchmaterial.SwitchMaterial xmlns:android="http://schemas.android.com/apk/res/android"
<com.google.android.material.materialswitch.MaterialSwitch xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_height="wrap_content" />

View file

@ -5,8 +5,6 @@
<style name="Widget.Auxio.AppBarLayout" parent="Widget.Material3.AppBarLayout">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<!-- Resolve lifted state flickering when scrolling fast. -->
<item name="android:stateListAnimator">@null</item>
</style>
<!-- Base toolbar style -->

View file

@ -86,10 +86,10 @@
</style>
<style name="TextAppearance.Auxio.TitleSmall" parent="TextAppearance.Material3.TitleSmall">
<item name="fontFamily">@font/inter_regular</item>
<item name="android:fontFamily">@font/inter_regular</item>
<item name="android:textStyle">normal</item>
<item name="android:letterSpacing">0.01</item>
<item name="fontFamily">@font/inter_semibold</item>
<item name="android:fontFamily">@font/inter_semibold</item>
<item name="android:textStyle">bold</item>
<item name="android:letterSpacing">-0.003</item>
</style>
<!-- Label styles are used for elements that can be interacted with. -->