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 // General
// 1.4.0 is used in order to avoid a ripple bug in material components // 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.core:core-ktx:1.9.0"
implementation "androidx.activity:activity-ktx:1.6.1" implementation "androidx.activity:activity-ktx:1.6.1"
implementation "androidx.fragment:fragment-ktx:1.5.5" implementation "androidx.fragment:fragment-ktx:1.5.5"
@ -113,14 +113,16 @@ dependencies {
implementation fileTree(dir: "libs", include: ["extension-*.aar"]) implementation fileTree(dir: "libs", include: ["extension-*.aar"])
// Image loading // Image loading
implementation "io.coil-kt:coil-base:2.1.0" implementation "io.coil-kt:coil-base:2.2.0"
// Material // Material
// Locked below 1.7.0-alpha03 to avoid the same ripple bug // TODO: Stuck on 1.8.0-alpha01 until ripple bug with tab layout can be worked around
implementation "com.google.android.material:material:1.7.0-alpha02" // 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 // Dependency Injection
def dagger_version = "2.40" def dagger_version = "2.44.2"
implementation "com.google.dagger:dagger:$dagger_version" implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:hilt-android:$hilt_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) override fun resolveGenreContents(context: Context) = resolveNames(context, genres)
/** /**
* The [RawAlbum] instances collated by the [Song]. This can be used to group [Song]s * The [RawAlbum] instances collated by the [Song]. This can be used to group [Song]s into an
* into an [Album]. * [Album].
*/ */
val rawAlbum = val rawAlbum =
RawAlbum( RawAlbum(
@ -167,8 +167,8 @@ class SongImpl(rawSong: RawSong, musicSettings: MusicSettings) : Song {
rawIndividualArtists.ifEmpty { rawAlbumArtists }.ifEmpty { listOf(RawArtist()) } rawIndividualArtists.ifEmpty { rawAlbumArtists }.ifEmpty { listOf(RawArtist()) }
/** /**
* The [RawGenre] instances collated by the [Song]. This can be used to group up [Song]s * The [RawGenre] instances collated by the [Song]. This can be used to group up [Song]s into a
* into a [Genre]. ID3v2 Genre names are automatically converted to their resolved names. * [Genre]. ID3v2 Genre names are automatically converted to their resolved names.
*/ */
val rawGenres = val rawGenres =
rawSong.genreNames rawSong.genreNames
@ -233,8 +233,8 @@ class SongImpl(rawSong: RawSong, musicSettings: MusicSettings) : Song {
/** /**
* Library-backed implementation of [Album]. * Library-backed implementation of [Album].
* @param rawAlbum The [RawAlbum] to derive the member data from. * @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 * @param songs The [Song]s that are a part of this [Album]. These items will be linked to this
* this [Album]. * [Album].
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class AlbumImpl(val rawAlbum: RawAlbum, override val songs: List<SongImpl>) : Album { 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]. * Library-backed implementation of [Artist].
* @param rawArtist The [RawArtist] to derive the member data from. * @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] * @param songAlbums A list of the [Song]s and [Album]s that are a part of this [Artist] , either
* , either through artist or album artist tags. Providing [Song]s to the artist is optional. * through artist or album artist tags. Providing [Song]s to the artist is optional. These instances
* These instances will be linked to this [Artist]. * will be linked to this [Artist].
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class ArtistImpl(private val rawArtist: RawArtist, songAlbums: List<Music>) : Artist { 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] * 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 * list. This can be used to create a consistent ordering within child [Artist] lists based on
* on the original tag order. * the original tag order.
* @param rawArtists The [RawArtist] instances to check. It is assumed that this [Artist]'s * @param rawArtists The [RawArtist] instances to check. It is assumed that this [Artist]'s
* [RawArtist] will be within the list. * [RawArtist] will be within the list.
* @return The index of the [Artist]'s [RawArtist] 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] * Returns the original position of this [Genre]'s [RawGenre] within the given [RawGenre] list.
* list. This can be used to create a consistent ordering within child [Genre] lists based * This can be used to create a consistent ordering within child [Genre] lists based on the
* on the original tag order. * original tag order.
* @param rawGenres The [RawGenre] instances to check. It is assumed that this [Genre] 's * @param rawGenres The [RawGenre] instances to check. It is assumed that this [Genre] 's
* [RawGenre] will be within the list. * [RawGenre] will be within the list.
* @return The index of the [Genre]'s [RawGenre] within the list. * @return The index of the [Genre]'s [RawGenre] within the list.

View file

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

View file

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

View file

@ -18,10 +18,13 @@
package org.oxycblt.auxio.settings.ui package org.oxycblt.auxio.settings.ui
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatButton
import androidx.preference.PreferenceDialogFragmentCompat import androidx.preference.PreferenceDialogFragmentCompat
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.util.fixDoubleRipple
/** /**
* The companion dialog to [IntListPreference]. Use [from] to create an instance. * The companion dialog to [IntListPreference]. Use [from] to create an instance.
@ -32,6 +35,16 @@ class IntListPreferenceDialog : PreferenceDialogFragmentCompat() {
get() = (preference as IntListPreference) get() = (preference as IntListPreference)
private var pendingValueIndex = -1 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?) = override fun onCreateDialog(savedInstanceState: Bundle?) =
// PreferenceDialogFragmentCompat does not allow us to customize the actual creation // 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 // 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.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatButton
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.oxycblt.auxio.util.fixDoubleRipple
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.unlikelyToBeNull import org.oxycblt.auxio.util.unlikelyToBeNull
@ -102,6 +104,16 @@ abstract class ViewBindingDialogFragment<VB : ViewBinding> : DialogFragment() {
logD("Fragment created") 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() { final override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
onDestroyBinding(unlikelyToBeNull(_binding)) onDestroyBinding(unlikelyToBeNull(_binding))

View file

@ -24,6 +24,7 @@ import android.os.Build
import android.view.View import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.appcompat.widget.AppCompatButton
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
@ -106,6 +107,17 @@ val ViewBinding.context: Context
*/ */
fun RecyclerView.canScroll() = computeVerticalScrollRange() > height 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 * 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]. * [CoordinatorLayout] or does not have a [CoordinatorLayout.Behavior].

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -69,7 +69,7 @@
app:layout_constraintTop_toBottomOf="@+id/detail_subhead" app:layout_constraintTop_toBottomOf="@+id/detail_subhead"
tools:text="Info B" /> tools:text="Info B" />
<Button <org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_play_button" android:id="@+id/detail_play_button"
style="@style/Widget.Auxio.Button.Secondary" style="@style/Widget.Auxio.Button.Secondary"
android:layout_width="0dp" android:layout_width="0dp"
@ -84,7 +84,7 @@
app:layout_constraintStart_toEndOf="@+id/detail_cover" app:layout_constraintStart_toEndOf="@+id/detail_cover"
app:layout_constraintTop_toBottomOf="@+id/detail_info" /> app:layout_constraintTop_toBottomOf="@+id/detail_info" />
<Button <org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/detail_shuffle_button" android:id="@+id/detail_shuffle_button"
style="@style/Widget.Auxio.Button.Primary" style="@style/Widget.Auxio.Button.Primary"
android:layout_width="0dp" 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:selectionRequired="true"
app:singleSelection="true"> app:singleSelection="true">
<com.google.android.material.button.MaterialButton <org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/dirs_mode_exclude" android:id="@+id/dirs_mode_exclude"
style="@style/Widget.Material3.Button.OutlinedButton" style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp" android:layout_width="0dp"
@ -44,7 +44,7 @@
tools:icon="@drawable/ic_check_24" tools:icon="@drawable/ic_check_24"
android:text="@string/set_dirs_mode_exclude" /> android:text="@string/set_dirs_mode_exclude" />
<com.google.android.material.button.MaterialButton <org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/dirs_mode_include" android:id="@+id/dirs_mode_include"
style="@style/Widget.Material3.Button.OutlinedButton" style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp" android:layout_width="0dp"
@ -82,7 +82,7 @@
android:text="@string/set_dirs_list" android:text="@string/set_dirs_list"
app:layout_constraintTop_toBottomOf="@+id/dirs_list_header_divider" /> app:layout_constraintTop_toBottomOf="@+id/dirs_list_header_divider" />
<Button <org.oxycblt.auxio.ui.RippleFixMaterialButton
style="@style/Widget.Auxio.Button.Icon.Small" style="@style/Widget.Auxio.Button.Icon.Small"
android:id="@+id/dirs_add" android:id="@+id/dirs_add"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?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:id="@+id/switchWidget"
android:layout_width="wrap_content" 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"> <style name="Widget.Auxio.AppBarLayout" parent="Widget.Material3.AppBarLayout">
<item name="android:layout_width">match_parent</item> <item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<!-- Resolve lifted state flickering when scrolling fast. -->
<item name="android:stateListAnimator">@null</item>
</style> </style>
<!-- Base toolbar style --> <!-- Base toolbar style -->

View file

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