ui: material 3.1 (first draft)

I'm mostly cowboying through patching things to look nice. I'll re-add round mode
configs and actually try to migrate to standard spacing later.
This commit is contained in:
Alexander Capehart 2024-04-17 22:07:50 -06:00
parent b19283002f
commit 7995d3ac98
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
26 changed files with 142 additions and 85 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -79,7 +79,7 @@ class MainActivity : AppCompatActivity() {
}
}
override fun onNewIntent(intent: Intent?) {
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
startIntentAction(intent)
}

View file

@ -146,8 +146,7 @@ class MainFragment :
// Emulate the elevated bottom sheet style.
background =
MaterialShapeDrawable.createWithElevationOverlay(context).apply {
fillColor = context.getAttrColorCompat(MR.attr.colorSurface)
elevation = context.getDimen(R.dimen.elevation_normal)
fillColor = context.getAttrColorCompat(MR.attr.colorSurfaceContainerHigh)
}
// Apply bar insets for the queue's RecyclerView to use.
setOnApplyWindowInsetsListener { v, insets ->
@ -277,7 +276,7 @@ class MainFragment :
// Reduce playback sheet elevation as it expands. This involves both updating the
// shadow elevation for older versions, and fading out the background drawable
// containing the elevation overlay.
binding.playbackSheet.translationZ = elevationNormal * outPlaybackRatio
binding.playbackSheet.elevation = elevationNormal * outPlaybackRatio
playbackSheetBehavior.sheetBackgroundDrawable.alpha = (outPlaybackRatio * 255).toInt()
// Fade out the playback bar as the panel expands.

View file

@ -30,7 +30,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.R as MR
import com.google.android.material.shape.MaterialShapeDrawable
import org.oxycblt.auxio.IntegerTable
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.ItemEditHeaderBinding
import org.oxycblt.auxio.databinding.ItemEditableSongBinding
import org.oxycblt.auxio.list.EditableListListener
@ -46,7 +45,6 @@ import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.resolveNames
import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getDimen
import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.logD
@ -232,8 +230,7 @@ private constructor(private val binding: ItemEditableSongBinding) :
override val delete = binding.background
override val background =
MaterialShapeDrawable.createWithElevationOverlay(binding.root.context).apply {
fillColor = binding.context.getAttrColorCompat(MR.attr.colorSurface)
elevation = binding.context.getDimen(R.dimen.elevation_normal)
fillColor = binding.context.getAttrColorCompat(MR.attr.colorSurfaceContainerHigh)
alpha = 0
}

View file

@ -461,7 +461,9 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
companion object {
val SIZING_CORNER_RADII =
arrayOf(
R.dimen.size_corners_small, R.dimen.size_corners_small, R.dimen.size_corners_medium)
R.dimen.size_corners_small,
R.dimen.size_corners_medium,
R.dimen.size_corners_mid_large)
val SIZING_ICON_SIZE = arrayOf(R.dimen.size_icon_small, R.dimen.size_icon_medium, null)
}
}

View file

@ -15,7 +15,7 @@
* 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.music.service
import android.content.Context
@ -141,10 +141,8 @@ constructor(
is MediaSessionUID.Category -> return uid.toMediaItem(context)
is MediaSessionUID.Single ->
musicRepository.find(uid.uid)?.let { musicRepository.find(it.uid) }
is MediaSessionUID.Joined ->
musicRepository.find(uid.childUid)?.let { musicRepository.find(it.uid) }
null -> null
}
?: return null
@ -179,40 +177,32 @@ constructor(
when (mediaSessionUID) {
MediaSessionUID.Category.ROOT ->
MediaSessionUID.Category.IMPORTANT.map { it.toMediaItem(context) }
MediaSessionUID.Category.SONGS ->
listSettings.songSort.songs(deviceLibrary.songs).map {
it.toMediaItem(context, null)
}
MediaSessionUID.Category.ALBUMS ->
listSettings.albumSort.albums(deviceLibrary.albums).map {
it.toMediaItem(context)
}
MediaSessionUID.Category.ARTISTS ->
listSettings.artistSort.artists(deviceLibrary.artists).map {
it.toMediaItem(context)
}
MediaSessionUID.Category.GENRES ->
listSettings.genreSort.genres(deviceLibrary.genres).map {
it.toMediaItem(context)
}
MediaSessionUID.Category.PLAYLISTS ->
userLibrary.playlists.map { it.toMediaItem(context) }
}
}
is MediaSessionUID.Single -> {
getChildMediaItems(mediaSessionUID.uid)
}
is MediaSessionUID.Joined -> {
getChildMediaItems(mediaSessionUID.childUid)
}
null -> {
return null
}
@ -225,24 +215,20 @@ constructor(
val songs = listSettings.albumSongSort.songs(item.songs)
songs.map { it.toMediaItem(context, item) }
}
is Artist -> {
val albums = ARTIST_ALBUMS_SORT.albums(item.explicitAlbums + item.implicitAlbums)
val songs = listSettings.artistSongSort.songs(item.songs)
albums.map { it.toMediaItem(context) } + songs.map { it.toMediaItem(context, item) }
}
is Genre -> {
val artists = GENRE_ARTISTS_SORT.artists(item.artists)
val songs = listSettings.genreSongSort.songs(item.songs)
artists.map { it.toMediaItem(context) } +
songs.map { it.toMediaItem(context, null) }
songs.map { it.toMediaItem(context, null) }
}
is Playlist -> {
item.songs.map { it.toMediaItem(context, item) }
}
is Song,
null -> return null
}
@ -339,8 +325,7 @@ constructor(
deviceLibrary.albums,
deviceLibrary.artists,
deviceLibrary.genres,
userLibrary.playlists
)
userLibrary.playlists)
val results = searchEngine.search(items, query)
for (entry in searchSubscribers.entries) {
if (entry.value == query) {

View file

@ -76,6 +76,10 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
binding.playbackProgressBar.trackColor =
context.getColorCompat(R.color.sel_track).defaultColor
// binding.playbackProgressBar.wavelength = 48
// binding.playbackProgressBar.speed = 20
// binding.playbackProgressBar.amplitude = 5
// -- VIEWMODEL SETUP ---
collectImmediately(playbackModel.song, ::updateSong)
collectImmediately(playbackModel.isPlaying, ::updatePlaying)

View file

@ -29,7 +29,6 @@ import com.google.android.material.shape.MaterialShapeDrawable
import org.oxycblt.auxio.R
import org.oxycblt.auxio.ui.BaseBottomSheetBehavior
import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getDimen
/**
* The [BaseBottomSheetBehavior] for the playback bottom sheet. This bottom sheet
@ -40,8 +39,8 @@ class PlaybackBottomSheetBehavior<V : View>(context: Context, attributeSet: Attr
BaseBottomSheetBehavior<V>(context, attributeSet) {
val sheetBackgroundDrawable =
MaterialShapeDrawable.createWithElevationOverlay(context).apply {
fillColor = context.getAttrColorCompat(MR.attr.colorSurface)
elevation = context.getDimen(R.dimen.elevation_normal)
fillColor = context.getAttrColorCompat(MR.attr.colorSurfaceContainerLow)
setCornerSize(context.resources.getDimension(R.dimen.size_corners_mid_large))
}
init {

View file

@ -26,7 +26,6 @@ import androidx.core.view.isInvisible
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.R as MR
import com.google.android.material.shape.MaterialShapeDrawable
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.ItemEditableSongBinding
import org.oxycblt.auxio.list.EditClickListListener
import org.oxycblt.auxio.list.adapter.FlexibleListAdapter
@ -37,7 +36,6 @@ import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.resolveNames
import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getDimen
import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.logD
@ -120,8 +118,7 @@ class QueueSongViewHolder private constructor(private val binding: ItemEditableS
override val delete = binding.background
override val background =
MaterialShapeDrawable.createWithElevationOverlay(binding.root.context).apply {
fillColor = binding.context.getAttrColorCompat(MR.attr.colorSurface)
elevation = binding.context.getDimen(R.dimen.elevation_normal) * 5
fillColor = binding.context.getAttrColorCompat(MR.attr.colorSurfaceContainerHighest)
alpha = 0
}
@ -142,8 +139,8 @@ class QueueSongViewHolder private constructor(private val binding: ItemEditableS
LayerDrawable(
arrayOf(
MaterialShapeDrawable.createWithElevationOverlay(binding.context).apply {
fillColor = binding.context.getAttrColorCompat(MR.attr.colorSurface)
elevation = binding.context.getDimen(R.dimen.elevation_normal)
fillColor =
binding.context.getAttrColorCompat(MR.attr.colorSurfaceContainerHigh)
},
background))
}

View file

@ -28,7 +28,6 @@ import com.google.android.material.shape.MaterialShapeDrawable
import org.oxycblt.auxio.R
import org.oxycblt.auxio.ui.BaseBottomSheetBehavior
import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getDimen
import org.oxycblt.auxio.util.getDimenPixels
import org.oxycblt.auxio.util.replaceSystemBarInsetsCompat
import org.oxycblt.auxio.util.systemBarInsetsCompat
@ -65,8 +64,8 @@ class QueueBottomSheetBehavior<V : View>(context: Context, attributeSet: Attribu
override fun createBackground(context: Context) =
MaterialShapeDrawable.createWithElevationOverlay(context).apply {
// The queue sheet's background is a static elevated background.
fillColor = context.getAttrColorCompat(MR.attr.colorSurface)
elevation = context.getDimen(R.dimen.elevation_normal)
fillColor = context.getAttrColorCompat(MR.attr.colorSurfaceContainerHigh)
setCornerSize(context.resources.getDimension(R.dimen.size_corners_mid_large))
}
override fun applyWindowInsets(child: View, insets: WindowInsets): WindowInsets {

View file

@ -255,7 +255,7 @@ constructor(
mediaSession.setCustomLayout(layout)
}
override fun invalidate(ids: Map<String, Int>){
override fun invalidate(ids: Map<String, Int>) {
for (id in ids) {
mediaSession.notifyChildrenChanged(id.key, id.value, null)
}

View file

@ -21,6 +21,7 @@ package org.oxycblt.auxio.playback.ui
import android.animation.ValueAnimator
import android.content.Context
import android.util.AttributeSet
import android.view.animation.AnimationUtils
import com.google.android.material.button.MaterialButton
import org.oxycblt.auxio.R
import org.oxycblt.auxio.ui.RippleFixMaterialButton
@ -64,6 +65,9 @@ class AnimatedMaterialButton : RippleFixMaterialButton {
animator =
ValueAnimator.ofFloat(currentCornerRadiusRatio, targetRadius).apply {
duration = context.getInteger(R.integer.anim_fade_enter_duration).toLong()
interpolator =
AnimationUtils.loadInterpolator(
context, android.R.interpolator.fast_out_slow_in)
addUpdateListener { updateCornerRadiusRatio(animatedValue as Float) }
start()
}

View file

@ -1,2 +1,19 @@
/*
* Copyright (c) 2024 Auxio Project
* Tasker.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 <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.tasker

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M555,760L555,200L730,200L730,760L555,760ZM230,760L230,200L405,200L405,760L230,760Z"/>
</vector>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M320,757L320,197L760,477L320,757Z"/>
</vector>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M673.33,720L673.33,240L740,240L740,720L673.33,720ZM220,720L220,240L570.67,480L220,720Z"/>
</vector>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M220,720L220,240L286.67,240L286.67,720L220,720ZM740,720L389.33,480L740,240L740,720Z"/>
</vector>

View file

@ -8,9 +8,7 @@
android:viewportHeight="108">
<group android:name="bg"
android:pivotX="56"
android:pivotY="56"
android:scaleX="0"
android:scaleY="0">
android:pivotY="56">
<path
android:fillColor="#eef0ff"
android:pathData="M 136,54 A 82,82 0 0 1 54,136 82,82 0 0 1 -28,54 82,82 0 0 1 54,-28 82,82 0 0 1 136,54 Z"
@ -62,22 +60,6 @@
<target android:name="bg">
<aapt:attr name="android:animation">
<set>
<objectAnimator
android:duration="1000"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleX"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
<objectAnimator
android:duration="1000"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:propertyName="scaleY"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>
</aapt:attr>
</target>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_pause_48" android:state_activated="true" />
<item android:drawable="@drawable/ic_play_48" />
</selector>

View file

@ -102,11 +102,14 @@
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_prev"
style="@style/Widget.Auxio.Button.Icon.Large"
style="@style/Widget.Auxio.Button.Icon.Larger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/desc_skip_prev"
app:icon="@drawable/ic_skip_prev_24"
app:icon="@drawable/ic_skip_prev_40"
app:backgroundTint="?attr/colorSecondaryContainer"
app:iconTint="?attr/colorOnSecondaryContainer"
app:iconSize="40dp"
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
app:layout_constraintEnd_toStartOf="@+id/playback_play_pause"
app:layout_constraintStart_toEndOf="@+id/playback_repeat"
@ -118,7 +121,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/desc_play_pause"
app:icon="@drawable/sel_playing_state_24"
app:icon="@drawable/sel_playing_state_48"
app:backgroundTint="?attr/colorPrimaryContainer"
app:iconTint="?attr/colorOnPrimaryContainer"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@ -127,11 +132,13 @@
<org.oxycblt.auxio.ui.RippleFixMaterialButton
android:id="@+id/playback_skip_next"
style="@style/Widget.Auxio.Button.Icon.Large"
style="@style/Widget.Auxio.Button.Icon.Larger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/desc_skip_next"
app:icon="@drawable/ic_skip_next_24"
app:iconTint="?attr/colorOnSecondaryContainer"
app:icon="@drawable/ic_skip_next_40"
app:backgroundTint="?attr/colorSecondaryContainer"
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
app:layout_constraintEnd_toStartOf="@+id/playback_shuffle"
app:layout_constraintStart_toEndOf="@+id/playback_play_pause"

View file

@ -34,6 +34,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/Widget.Auxio.DisableDropShadows"
android:orientation="horizontal">
<androidx.fragment.app.FragmentContainerView

View file

@ -25,7 +25,6 @@
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/playback_sheet"
style="@style/Widget.Auxio.DisableDropShadows"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="org.oxycblt.auxio.playback.PlaybackBottomSheetBehavior">
@ -45,10 +44,10 @@
<LinearLayout
android:id="@+id/queue_sheet"
style="@style/Widget.Auxio.DisableDropShadows"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
style="@style/Widget.Auxio.DisableDropShadows"
app:layout_behavior="org.oxycblt.auxio.playback.queue.QueueBottomSheetBehavior">
<androidx.constraintlayout.widget.ConstraintLayout

View file

@ -2,13 +2,16 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.material.slider.Slider
android:id="@+id/seek_bar_slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/spacing_medium"
app:trackHeight="4dp"
app:thumbHeight="24dp"
android:valueFrom="0"
android:valueTo="1" />

View file

@ -16,8 +16,8 @@
<dimen name="size_cover_mid_huge">192dp</dimen>
<dimen name="size_cover_huge">256dp</dimen>
<dimen name="size_corners_small">8dp</dimen>
<dimen name="size_corners_medium">16dp</dimen>
<dimen name="size_corners_small">12dp</dimen>
<dimen name="size_corners_medium">14dp</dimen>
<dimen name="size_corners_mid_large">24dp</dimen>
<dimen name="size_btn">48dp</dimen>
@ -36,7 +36,7 @@
<dimen name="text_size_track_number_step">2sp</dimen>
<!-- Misc -->
<dimen name="elevation_normal">3dp</dimen>
<dimen name="elevation_normal">6dp</dimen>
<dimen name="fast_scroll_popup_min_width">78dp</dimen>
<dimen name="fast_scroll_popup_min_height">64dp</dimen>

View file

@ -18,7 +18,7 @@
<style name="Theme.Auxio.Base" parent="Theme.Auxio.V31">
<!-- Material configuration -->
<item name="colorOutline">@color/overlay_stroke</item>
<!-- <item name="colorOutline">@color/overlay_stroke</item>-->
<item name="toolbarStyle">@style/Widget.Auxio.Toolbar</item>
<item name="materialAlertDialogTheme">@style/Theme.Auxio.Dialog</item>
<item name="sliderStyle">@style/Widget.Auxio.Slider</item>

View file

@ -19,16 +19,15 @@
</style>
<style name="Widget.Auxio.Slider" parent="Widget.Material3.Slider">
<item name="trackColorInactive">@color/sel_track</item>
<item name="haloRadius">@dimen/spacing_medium</item>
<item name="thumbRadius">@dimen/slider_thumb_radius</item>
<item name="labelBehavior">gone</item>
<item name="tickVisible">false</item>
<item name="trackStopIndicatorSize">0dp</item>
</style>
<style name="Widget.Auxio.LinearProgressIndicator" parent="Widget.Material3.LinearProgressIndicator">
<item name="trackColor">@color/sel_track</item>
<item name="trackCornerRadius">@dimen/size_corners_medium</item>
<item name="trackStopIndicatorSize">0dp</item>
</style>
<style name="Widget.Auxio.BottomSheet" parent="Widget.Material3.BottomSheet">
@ -45,8 +44,7 @@
<item name="marginRightSystemWindowInsets">false</item>
<item name="paddingBottomSystemWindowInsets">false</item>
<item name="paddingTopSystemWindowInsets">false</item>
<item name="shapeAppearance">@style/ShapeAppearance.Material3.Corner.None</item>
<item name="shouldRemoveExpandedCorners">true</item>
<item name="shouldRemoveExpandedCorners">false</item>
</style>
<style name="Widget.Auxio.BottomSheet.Dialog" parent="ThemeOverlay.Material3.BottomSheetDialog">
@ -267,18 +265,33 @@
<item name="iconTint">@color/m3_text_button_foreground_color_selector</item>
</style>
<style name="Widget.Auxio.Button.PlayPause" parent="Widget.Material3.Button.IconButton.Filled.Tonal">
<item name="android:minWidth">@dimen/size_play_pause_button</item>
<item name="android:minHeight">@dimen/size_play_pause_button</item>
<item name="iconSize">@dimen/size_icon_medium</item>
<style name="Widget.Auxio.Button.Icon.Larger" parent="Widget.Auxio.Button.Icon.Base">
<item name="iconSize">40dp</item>
<item name="android:minWidth">@dimen/size_btn</item>
<item name="android:minHeight">@dimen/size_btn</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:insetLeft">0dp</item>
<item name="android:insetRight">0dp</item>
<item name="android:paddingStart">@dimen/spacing_mid_large</item>
<item name="android:paddingEnd">@dimen/spacing_mid_large</item>
<item name="android:paddingTop">@dimen/spacing_mid_large</item>
<item name="android:paddingBottom">@dimen/spacing_mid_large</item>
<item name="android:paddingStart">10dp</item>
<item name="android:paddingEnd">10dp</item>
<item name="android:paddingTop">10dp</item>
<item name="android:paddingBottom">10dp</item>
<item name="iconTint">@color/m3_text_button_foreground_color_selector</item>
</style>
<style name="Widget.Auxio.Button.PlayPause" parent="Widget.Material3.Button.IconButton.Filled.Tonal">
<item name="android:minWidth">@dimen/size_play_pause_button</item>
<item name="android:minHeight">@dimen/size_play_pause_button</item>
<item name="iconSize">48dp</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:insetLeft">0dp</item>
<item name="android:insetRight">0dp</item>
<item name="android:paddingStart">@dimen/spacing_medium</item>
<item name="android:paddingEnd">@dimen/spacing_medium</item>
<item name="android:paddingTop">@dimen/spacing_medium</item>
<item name="android:paddingBottom">@dimen/spacing_medium</item>
<item name="shapeAppearanceOverlay">
@style/ShapeAppearanceOverlay.Material3.FloatingActionButton
</item>