diff --git a/app/src/main/java/org/oxycblt/auxio/settings/pref/M3SwitchPreference.kt b/app/src/main/java/org/oxycblt/auxio/settings/pref/M3SwitchPreference.kt
new file mode 100644
index 000000000..c3017a072
--- /dev/null
+++ b/app/src/main/java/org/oxycblt/auxio/settings/pref/M3SwitchPreference.kt
@@ -0,0 +1,40 @@
+package org.oxycblt.auxio.settings.pref
+
+import android.content.Context
+import android.os.Build
+import android.util.AttributeSet
+import androidx.appcompat.widget.SwitchCompat
+import androidx.preference.PreferenceViewHolder
+import androidx.preference.SwitchPreferenceCompat
+import org.oxycblt.auxio.R
+import org.oxycblt.auxio.util.resolveDrawable
+import org.oxycblt.auxio.util.resolveStateList
+
+class M3SwitchPreference @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = R.attr.switchPreferenceCompatStyle,
+ defStyleRes: Int = 0
+) : SwitchPreferenceCompat(context, attrs, defStyleAttr, defStyleRes) {
+ // Lollipop cannot into ColorStateList, disable this feature on that version
+ private var needToUpdateSwitch = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+
+ override fun onBindViewHolder(holder: PreferenceViewHolder) {
+ super.onBindViewHolder(holder)
+
+ if (needToUpdateSwitch) {
+ val switch = holder.findViewById(androidx.preference.R.id.switchWidget)
+
+ if (switch is SwitchCompat) {
+ switch.apply {
+ trackDrawable = R.drawable.ui_m3_switch_track.resolveDrawable(context)
+ trackTintList = R.color.sel_m3_switch_track.resolveStateList(context)
+ thumbDrawable = R.drawable.ui_m3_switch_thumb.resolveDrawable(context)
+ thumbTintList = R.color.sel_m3_switch_thumb.resolveStateList(context)
+ }
+
+ needToUpdateSwitch = false
+ }
+ }
+ }
+}
diff --git a/app/src/main/res/color/sel_m3_switch_thumb.xml b/app/src/main/res/color/sel_m3_switch_thumb.xml
new file mode 100644
index 000000000..61c22f9ad
--- /dev/null
+++ b/app/src/main/res/color/sel_m3_switch_thumb.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/sel_m3_switch_track.xml b/app/src/main/res/color/sel_m3_switch_track.xml
new file mode 100644
index 000000000..5d2e6df2f
--- /dev/null
+++ b/app/src/main/res/color/sel_m3_switch_track.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ui_m3_switch_thumb.xml b/app/src/main/res/drawable/ui_m3_switch_thumb.xml
new file mode 100644
index 000000000..04e5221cf
--- /dev/null
+++ b/app/src/main/res/drawable/ui_m3_switch_thumb.xml
@@ -0,0 +1,15 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ui_m3_switch_track.xml b/app/src/main/res/drawable/ui_m3_switch_track.xml
new file mode 100644
index 000000000..f89e5de3a
--- /dev/null
+++ b/app/src/main/res/drawable/ui_m3_switch_track.xml
@@ -0,0 +1,12 @@
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/typography.xml b/app/src/main/res/values/typography.xml
index 07cead865..e76ae0924 100644
--- a/app/src/main/res/values/typography.xml
+++ b/app/src/main/res/values/typography.xml
@@ -72,7 +72,7 @@