all: misc ui reworks

Miscellanious UI reworks that accumulated over the past few days.
This commit is contained in:
OxygenCobalt 2022-07-07 10:32:08 -06:00
parent 1730a73eac
commit 83d6c529e2
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
42 changed files with 236 additions and 252 deletions

View file

@ -18,7 +18,7 @@
- Fixed broken tablet layouts - Fixed broken tablet layouts
- Fixed seam that would appear on some album covers - Fixed seam that would appear on some album covers
- Fixed visual issue with the queue opening animation - Fixed visual issue with the queue opening animation
- Fixed miscellanious startup issues - Fixed miscellaneous startup issues
- Fixed crash if settings was navigated away before playback state - Fixed crash if settings was navigated away before playback state
finished saving finished saving
- Fixed broken album menu - Fixed broken album menu
@ -63,7 +63,7 @@ finished saving
- Fixed unusable excluded directory UI - Fixed unusable excluded directory UI
- Songs with no data (i.e size of 0) are now filtered out - Songs with no data (i.e size of 0) are now filtered out
- Fixed nonsensical menu items from appearing on songs - Fixed nonsensical menu items from appearing on songs
- Fixed issue where multiple menus would open if long-clicks occured simultaneously - Fixed issue where multiple menus would open if long-clicks occurred simultaneously
#### Dev/Meta #### Dev/Meta
- New translations [Fjuro -> Czech, Konstantin Tutsch -> German] - New translations [Fjuro -> Czech, Konstantin Tutsch -> German]

View file

@ -191,7 +191,6 @@ class GenreDetailFragment :
if (parent is Genre && parent.id == unlikelyToBeNull(detailModel.currentGenre.value).id) { if (parent is Genre && parent.id == unlikelyToBeNull(detailModel.currentGenre.value).id) {
detailAdapter.highlightSong(song) detailAdapter.highlightSong(song)
} else { } else {
// Clear any highlighting if playback is not occuring from this item.
detailAdapter.highlightSong(null) detailAdapter.highlightSong(null)
} }
} }

View file

@ -26,10 +26,10 @@ import androidx.core.view.updatePadding
import org.oxycblt.auxio.util.systemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
/** /**
* A container for a FloatingActionButton that enables edge-to-edge support. * A [FrameLayout] that automatically applies bottom insets.
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class EdgeFabContainer class EdgeFrameLayout
@JvmOverloads @JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) : constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
FrameLayout(context, attrs, defStyleAttr) { FrameLayout(context, attrs, defStyleAttr) {

View file

@ -64,7 +64,6 @@ import org.oxycblt.auxio.util.lazyReflectedField
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logE import org.oxycblt.auxio.util.logE
import org.oxycblt.auxio.util.logTraceOrThrow import org.oxycblt.auxio.util.logTraceOrThrow
import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.textSafe import org.oxycblt.auxio.util.textSafe
/** /**
@ -98,7 +97,7 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
binding.homeToolbar.alpha = 1f - (abs(offset.toFloat()) / (range.toFloat() / 2)) binding.homeToolbar.alpha = 1f - (abs(offset.toFloat()) / (range.toFloat() / 2))
binding.homePager.updatePadding( binding.homeContent.updatePadding(
bottom = binding.homeAppbar.totalScrollRange + offset) bottom = binding.homeAppbar.totalScrollRange + offset)
} }
} }
@ -107,11 +106,6 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
updateTabConfiguration() updateTabConfiguration()
binding.homeIndexingWrapper.setOnApplyWindowInsetsListener { view, insets ->
view.updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
insets
}
// Load the track color in manually as it's unclear whether the track actually supports // Load the track color in manually as it's unclear whether the track actually supports
// using a ColorStateList in the resources // using a ColorStateList in the resources
binding.homeIndexingProgress.trackColor = binding.homeIndexingProgress.trackColor =
@ -141,7 +135,7 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
// --- VIEWMODEL SETUP --- // --- VIEWMODEL SETUP ---
collect(homeModel.isFastScrolling) { updateFab() } collectImmediately(homeModel.songs, homeModel.isFastScrolling, ::updateFab)
collect(homeModel.recreateTabs, ::handleRecreateTabs) collect(homeModel.recreateTabs, ::handleRecreateTabs)
collectImmediately(homeModel.currentTab, ::updateCurrentTab) collectImmediately(homeModel.currentTab, ::updateCurrentTab)
collectImmediately(indexerModel.state, ::handleIndexerState) collectImmediately(indexerModel.state, ::handleIndexerState)
@ -265,8 +259,6 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
binding.homeIndexingContainer.visibility = View.INVISIBLE binding.homeIndexingContainer.visibility = View.INVISIBLE
} }
} }
updateFab()
} }
private fun handleIndexerResponse(binding: FragmentHomeBinding, response: Indexer.Response) { private fun handleIndexerResponse(binding: FragmentHomeBinding, response: Indexer.Response) {
@ -336,12 +328,9 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
} }
} }
private fun updateFab() { private fun updateFab(songs: List<Song>, isFastScrolling: Boolean) {
val binding = requireBinding() val binding = requireBinding()
val fastScrolling = homeModel.isFastScrolling.value if (isFastScrolling || songs.isEmpty()) {
val state = indexerModel.state.value
if (fastScrolling ||
!(state is Indexer.State.Complete && state.response is Indexer.Response.Ok)) {
binding.homeFab.hide() binding.homeFab.hide()
} else { } else {
binding.homeFab.show() binding.homeFab.show()

View file

@ -30,7 +30,8 @@ import org.oxycblt.auxio.util.unlikelyToBeNull
/** [Item] variant that represents a music item. */ /** [Item] variant that represents a music item. */
sealed class Music : Item() { sealed class Music : Item() {
// TODO: Split ID into an ID derived from all fields and a persistent ID derived from stable fields // TODO: Split ID into an ID derived from all fields and a persistent ID derived from stable
// fields
/** The raw name of this item. Null if unknown. */ /** The raw name of this item. Null if unknown. */
abstract val rawName: String? abstract val rawName: String?

View file

@ -61,7 +61,7 @@ val Long.albumCoverUri: Uri
* they are invalid. * they are invalid.
*/ */
val String.plainTrackNo: Int? val String.plainTrackNo: Int?
get() = toIntOrNull()?.let { if (it > 0) it else null } get() = toIntOrNull()?.nonZeroOrNull()
/** /**
* Parse out the track number field as if the given Int is formatted as DTTT, where D Is the disc * Parse out the track number field as if the given Int is formatted as DTTT, where D Is the disc
@ -69,28 +69,28 @@ val String.plainTrackNo: Int?
* invalid. * invalid.
*/ */
val Int.packedTrackNo: Int? val Int.packedTrackNo: Int?
get() = div(1000).let { if (it > 0) it else null } get() = div(1000).nonZeroOrNull()
/** /**
* Parse out the disc number field as if the given Int is formatted as DTTT, where D Is the disc and * Parse out the disc number field as if the given Int is formatted as DTTT, where D Is the disc and
* T is the track number. Values of zero will be ignored under the assumption that they are invalid. * T is the track number. Values of zero will be ignored under the assumption that they are invalid.
*/ */
val Int.packedDiscNo: Int? val Int.packedDiscNo: Int?
get() = mod(1000).let { if (it > 0) it else null } get() = mod(1000).nonZeroOrNull()
/** /**
* Parse out the number field from an NN/TT string that is typically found in DISC_NUMBER and * Parse out the number field from an NN/TT string that is typically found in DISC_NUMBER and
* CD_TRACK_NUMBER. Values of zero will be ignored under the assumption that they are invalid. * CD_TRACK_NUMBER. Values of zero will be ignored under the assumption that they are invalid.
*/ */
val String.trackDiscNo: Int? val String.trackDiscNo: Int?
get() = split('/', limit = 2)[0].toIntOrNull()?.let { if (it > 0) it else null } get() = split('/', limit = 2)[0].toIntOrNull()?.nonZeroOrNull()
/** /**
* Parse out a plain year from a string. Values of 0 will be ignored under the assumption that they * Parse out a plain year from a string. Values of 0 will be ignored under the assumption that they
* are invalid. * are invalid.
*/ */
val String.year: Int? val String.year: Int?
get() = toIntOrNull()?.let { if (it > 0) it else null } get() = toIntOrNull()?.nonZeroOrNull()
/** /**
* Parse out the year field from a (presumably) ISO-8601-like date. This differs across tag formats * Parse out the year field from a (presumably) ISO-8601-like date. This differs across tag formats
@ -99,7 +99,9 @@ val String.year: Int?
* under the assumption that they are invalid. * under the assumption that they are invalid.
*/ */
val String.iso8601year: Int? val String.iso8601year: Int?
get() = split('-', limit = 2)[0].toIntOrNull()?.let { if (it > 0) it else null } get() = split('-', limit = 2)[0].toIntOrNull()?.nonZeroOrNull()
private fun Int.nonZeroOrNull() = if (this > 0) this else null
/** /**
* Slice a string so that any preceding articles like The/A(n) are truncated. This is hilariously * Slice a string so that any preceding articles like The/A(n) are truncated. This is hilariously
@ -181,6 +183,7 @@ private val GENRE_RE = Regex("((?:\\(([0-9]+|RX|CR)\\))*)(.+)?")
/** /**
* A complete table of all the constant genre values for ID3(v2), including non-standard extensions. * A complete table of all the constant genre values for ID3(v2), including non-standard extensions.
* Note that we do not translate these, as that greatly increases technical complexity.
*/ */
private val GENRE_TABLE = private val GENRE_TABLE =
arrayOf( arrayOf(

View file

@ -35,7 +35,7 @@ import android.widget.FrameLayout
* *
* @author OxygenCobalt * @author OxygenCobalt
*/ */
open class NoRtlFrameLayout open class ForcedLTRFrameLayout
@JvmOverloads @JvmOverloads
constructor( constructor(
context: Context, context: Context,
@ -44,7 +44,7 @@ constructor(
) : FrameLayout(context, attrs, defStyleAttr) { ) : FrameLayout(context, attrs, defStyleAttr) {
override fun onFinishInflate() { override fun onFinishInflate() {
super.onFinishInflate() super.onFinishInflate()
check(childCount == 1) { "This view should only contain one child" } check(childCount == 1) { "This layout should only contain one child" }
getChildAt(0).layoutDirection = View.LAYOUT_DIRECTION_LTR getChildAt(0).layoutDirection = View.LAYOUT_DIRECTION_LTR
} }
} }

View file

@ -282,7 +282,10 @@ class PlaybackViewModel(application: Application) :
} }
} }
/** Force restore the last [PlaybackStateManager] saved state */ /**
* Force restore the last [PlaybackStateManager] saved state, regardless of if a library exists
* or not.
*/
fun restorePlaybackState(onDone: (Boolean) -> Unit) { fun restorePlaybackState(onDone: (Boolean) -> Unit) {
viewModelScope.launch { viewModelScope.launch {
val restored = val restored =

View file

@ -51,7 +51,7 @@ constructor(
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0, defStyleAttr: Int = 0,
) : ) :
NoRtlFrameLayout(context, attrs, defStyleAttr), ForcedLTRFrameLayout(context, attrs, defStyleAttr),
Slider.OnSliderTouchListener, Slider.OnSliderTouchListener,
Slider.OnChangeListener { Slider.OnChangeListener {
private val binding = ViewSeekBarBinding.inflate(context.inflater, this, true) private val binding = ViewSeekBarBinding.inflate(context.inflater, this, true)

View file

@ -387,8 +387,7 @@ class PlaybackStateManager private constructor() {
suspend fun sanitize(database: PlaybackStateDatabase, newLibrary: MusicStore.Library) { suspend fun sanitize(database: PlaybackStateDatabase, newLibrary: MusicStore.Library) {
// Since we need to sanitize the state and re-save it for consistency, take the // Since we need to sanitize the state and re-save it for consistency, take the
// easy way out and just write a new state and restore from it. Don't really care. // easy way out and just write a new state and restore from it. Don't really care.
// FIXME: This hack actually creates bugs if a user were to save the state at just // TODO: Do we even need to save here? Doesn't seem like it's required for
// the right time, replace it with something that operates at runtime
logD("Sanitizing state") logD("Sanitizing state")
val state = synchronized(this) { makeStateImpl() } val state = synchronized(this) { makeStateImpl() }

View file

@ -69,6 +69,8 @@ import org.oxycblt.auxio.widgets.WidgetProvider
* *
* TODO: Android Auto * TODO: Android Auto
* *
* TODO: Attempt to re-unify delayed actions again
*
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class PlaybackService : class PlaybackService :
@ -285,10 +287,10 @@ class PlaybackService :
// --- SETTINGSMANAGER OVERRIDES --- // --- SETTINGSMANAGER OVERRIDES ---
override fun onSettingChanged(key: String) { override fun onSettingChanged(key: String) {
when (key) { if (key == getString(R.string.set_key_replay_gain) ||
getString(R.string.set_key_replay_gain), key == getString(R.string.set_key_pre_amp_with) ||
getString(R.string.set_key_pre_amp_with), key == getString(R.string.set_key_pre_amp_without)) {
getString(R.string.set_key_pre_amp_without) -> onTracksChanged(player.currentTracks) onTracksChanged(player.currentTracks)
} }
} }

View file

@ -1,53 +0,0 @@
/*
* Copyright (c) 2022 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 androidx.core.view.updatePaddingRelative
import com.google.android.material.appbar.MaterialToolbar
import org.oxycblt.auxio.R
import org.oxycblt.auxio.util.getDimenSizeSafe
/**
* [MaterialToolbar] that automatically fixes padding in order to align with the M3 specs.
* @author OxygenCobalt
*/
class M3Toolbar : MaterialToolbar {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(
context: Context,
attrs: AttributeSet?,
@AttrRes defStyleAttr: Int
) : super(context, attrs, defStyleAttr)
init {
val tinySpacing = context.getDimenSizeSafe(R.dimen.spacing_tiny)
if (navigationIcon != null) {
updatePaddingRelative(start = tinySpacing)
}
if (menu != null) {
updatePaddingRelative(end = tinySpacing)
}
}
}

View file

@ -26,6 +26,7 @@ import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
// TODO: Differentiate between replace and diffing w/item updates
/** /**
* An adapter for one viewholder tied to one type of data. All functionality is derived from the * An adapter for one viewholder tied to one type of data. All functionality is derived from the
* overridden values. * overridden values.
@ -40,7 +41,7 @@ abstract class MonoAdapter<T, L, VH : BindingViewHolder<T, L>>(private val liste
/** /**
* An optional override to further modify the given [viewHolder]. The normal operation is to * An optional override to further modify the given [viewHolder]. The normal operation is to
* bind the viewholder, with nothing more. * bind the viewholder.
*/ */
open fun onBind(viewHolder: VH, item: T, listener: L, payload: List<Any>) { open fun onBind(viewHolder: VH, item: T, listener: L, payload: List<Any>) {
viewHolder.bind(item, listener) viewHolder.bind(item, listener)

View file

@ -34,7 +34,7 @@ import org.oxycblt.auxio.util.getDimenSizeSafe
* used in dialogs. * used in dialogs.
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class DialogRecyclerView class ScrollIndicatorRecyclerView
@JvmOverloads @JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) : constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
RecyclerView(context, attrs, defStyleAttr) { RecyclerView(context, attrs, defStyleAttr) {

View file

@ -97,7 +97,7 @@ private fun RemoteViews.applyRoundingToBackground(context: Context): RemoteViews
private fun RemoteViews.applyRoundingToBar(context: Context): RemoteViews { private fun RemoteViews.applyRoundingToBar(context: Context): RemoteViews {
if (Settings(context).roundMode && Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { if (Settings(context).roundMode && Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
setInt(R.id.widget_controls, "setBackgroundResource", R.drawable.ui_widget_bg_round) setInt(R.id.widget_controls, "setBackgroundResource", R.drawable.ui_widget_bar_round)
} else { } else {
setInt(R.id.widget_controls, "setBackgroundResource", R.drawable.ui_widget_bar) setInt(R.id.widget_controls, "setBackgroundResource", R.drawable.ui_widget_bar)
} }

View file

@ -88,7 +88,7 @@ class WidgetComponent(private val context: Context) :
context.getDimenSizeSafe(android.R.dimen.system_app_widget_inner_radius) context.getDimenSizeSafe(android.R.dimen.system_app_widget_inner_radius)
} else if (settings.roundMode) { } else if (settings.roundMode) {
// < Android 12, but the user still enabled round mode. // < Android 12, but the user still enabled round mode.
context.getDimenSizeSafe(R.dimen.size_corners_large) context.getDimenSizeSafe(R.dimen.size_corners_medium)
} else { } else {
// User did not enable round mode. // User did not enable round mode.
0 0

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="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,12Q10.35,12 9.175,10.825Q8,9.65 8,8Q8,6.35 9.175,5.175Q10.35,4 12,4Q13.65,4 14.825,5.175Q16,6.35 16,8Q16,9.65 14.825,10.825Q13.65,12 12,12ZM4,20V17.2Q4,16.35 4.438,15.637Q4.875,14.925 5.6,14.55Q7.15,13.775 8.75,13.387Q10.35,13 12,13Q13.65,13 15.25,13.387Q16.85,13.775 18.4,14.55Q19.125,14.925 19.562,15.637Q20,16.35 20,17.2V20ZM6,18H18V17.2Q18,16.925 17.863,16.7Q17.725,16.475 17.5,16.35Q16.15,15.675 14.775,15.337Q13.4,15 12,15Q10.6,15 9.225,15.337Q7.85,15.675 6.5,16.35Q6.275,16.475 6.138,16.7Q6,16.925 6,17.2ZM12,10Q12.825,10 13.413,9.412Q14,8.825 14,8Q14,7.175 13.413,6.588Q12.825,6 12,6Q11.175,6 10.588,6.588Q10,7.175 10,8Q10,8.825 10.588,9.412Q11.175,10 12,10ZM12,8Q12,8 12,8Q12,8 12,8Q12,8 12,8Q12,8 12,8Q12,8 12,8Q12,8 12,8Q12,8 12,8Q12,8 12,8ZM12,18Q12,18 12,18Q12,18 12,18Q12,18 12,18Q12,18 12,18Q12,18 12,18Q12,18 12,18Q12,18 12,18Q12,18 12,18Z"/>
</vector>

View file

@ -5,9 +5,9 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <path
android:fillColor="?attr/colorPrimary" android:fillColor="?attr/colorSurfaceInverse"
android:pathData="M12,16.5Q13.875,16.5 15.188,15.188Q16.5,13.875 16.5,12Q16.5,10.125 15.188,8.812Q13.875,7.5 12,7.5Q10.125,7.5 8.812,8.812Q7.5,10.125 7.5,12Q7.5,13.875 8.812,15.188Q10.125,16.5 12,16.5ZM12,13Q11.575,13 11.288,12.712Q11,12.425 11,12Q11,11.575 11.288,11.287Q11.575,11 12,11Q12.425,11 12.713,11.287Q13,11.575 13,12Q13,12.425 12.713,12.712Q12.425,13 12,13ZM12,22Q9.925,22 8.1,21.212Q6.275,20.425 4.925,19.075Q3.575,17.725 2.788,15.9Q2,14.075 2,12Q2,9.925 2.788,8.1Q3.575,6.275 4.925,4.925Q6.275,3.575 8.1,2.787Q9.925,2 12,2Q14.075,2 15.9,2.787Q17.725,3.575 19.075,4.925Q20.425,6.275 21.212,8.1Q22,9.925 22,12Q22,14.075 21.212,15.9Q20.425,17.725 19.075,19.075Q17.725,20.425 15.9,21.212Q14.075,22 12,22ZM12,20Q15.35,20 17.675,17.675Q20,15.35 20,12Q20,8.65 17.675,6.325Q15.35,4 12,4Q8.65,4 6.325,6.325Q4,8.65 4,12Q4,15.35 6.325,17.675Q8.65,20 12,20ZM12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Z" /> android:pathData="M12,16.5Q13.875,16.5 15.188,15.188Q16.5,13.875 16.5,12Q16.5,10.125 15.188,8.812Q13.875,7.5 12,7.5Q10.125,7.5 8.812,8.812Q7.5,10.125 7.5,12Q7.5,13.875 8.812,15.188Q10.125,16.5 12,16.5ZM12,13Q11.575,13 11.288,12.712Q11,12.425 11,12Q11,11.575 11.288,11.287Q11.575,11 12,11Q12.425,11 12.713,11.287Q13,11.575 13,12Q13,12.425 12.713,12.712Q12.425,13 12,13ZM12,22Q9.925,22 8.1,21.212Q6.275,20.425 4.925,19.075Q3.575,17.725 2.788,15.9Q2,14.075 2,12Q2,9.925 2.788,8.1Q3.575,6.275 4.925,4.925Q6.275,3.575 8.1,2.787Q9.925,2 12,2Q14.075,2 15.9,2.787Q17.725,3.575 19.075,4.925Q20.425,6.275 21.212,8.1Q22,9.925 22,12Q22,14.075 21.212,15.9Q20.425,17.725 19.075,19.075Q17.725,20.425 15.9,21.212Q14.075,22 12,22ZM12,20Q15.35,20 17.675,17.675Q20,15.35 20,12Q20,8.65 17.675,6.325Q15.35,4 12,4Q8.65,4 6.325,6.325Q4,8.65 4,12Q4,15.35 6.325,17.675Q8.65,20 12,20ZM12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Z" />
<path <path
android:fillColor="?attr/colorSurface" android:fillColor="?attr/colorOnSurfaceInverse"
android:pathData="M 11.999784 1.9998779 A 10 9.999999 0 0 1 22.000208 11.999784 C 22.000208 10.616452 21.737475 9.3164294 21.212142 8.099764 C 20.687476 6.8830985 19.974804 5.8247631 19.074805 4.924764 C 18.174806 4.0247649 17.11647 3.3122428 15.899805 2.78691 C 14.683139 2.2622439 13.383116 1.9998779 11.999784 1.9998779 z M 11.999784 1.9998779 C 10.616452 1.9998779 9.3164294 2.2622439 8.099764 2.78691 C 6.8830985 3.3122428 5.8247631 4.0247649 4.924764 4.924764 C 4.0247649 5.8247631 3.3126097 6.8830985 2.7879435 8.099764 C 2.2626107 9.3164294 1.9998779 10.616452 1.9998779 11.999784 A 10 9.999999 0 0 1 11.999784 1.9998779 z M 1.9998779 11.999784 C 1.9998779 13.383116 2.2626107 14.683139 2.7879435 15.899805 C 3.3126097 17.11647 4.0247649 18.174806 4.924764 19.074805 C 5.8247631 19.974804 6.8830985 20.687476 8.099764 21.212142 C 9.3164294 21.737475 10.616452 22.000208 11.999784 22.000208 A 10 9.999999 0 0 1 1.9998779 11.999784 z M 11.999784 22.000208 C 13.383116 22.000208 14.683139 21.737475 15.899805 21.212142 C 17.11647 20.687476 18.174806 19.974804 19.074805 19.074805 C 19.974804 18.174806 20.687476 17.11647 21.212142 15.899805 C 21.737475 14.683139 22.000208 13.383116 22.000208 11.999784 A 10 9.999999 0 0 1 11.999784 22.000208 z M 11.999784 3.9997559 C 9.7664532 3.9997559 7.8751938 4.7751969 6.3251953 6.3251953 C 4.7751969 7.8751938 3.9997559 9.7664532 3.9997559 11.999784 C 3.9997559 14.233115 4.7751969 16.124892 6.3251953 17.67489 C 7.8751938 19.224889 9.7664532 19.999813 11.999784 19.999813 C 14.233115 19.999813 16.124892 19.224889 17.67489 17.67489 C 19.224889 16.124892 19.999813 14.233115 19.999813 11.999784 C 19.999813 9.7664532 19.224889 7.8751938 17.67489 6.3251953 C 16.124892 4.7751969 14.233115 3.9997559 11.999784 3.9997559 z M 11.999784 7.4998006 C 13.249783 7.4998006 14.312888 7.9371994 15.18822 8.8118652 C 16.062886 9.6871977 16.499768 10.749786 16.499768 11.999784 C 16.499768 13.249783 16.062886 14.312888 15.18822 15.18822 C 14.312888 16.062886 13.249783 16.499768 11.999784 16.499768 C 10.749786 16.499768 9.6871977 16.062886 8.8118652 15.18822 C 7.9371994 14.312888 7.4998006 13.249783 7.4998006 11.999784 C 7.4998006 10.749786 7.9371994 9.6871977 8.8118652 8.8118652 C 9.6871977 7.9371994 10.749786 7.4998006 11.999784 7.4998006 z M 11.999784 10.999845 C 11.716451 10.999845 11.479533 11.095833 11.2882 11.287166 C 11.0962 11.479166 10.999845 11.716451 10.999845 11.999784 C 10.999845 12.283117 11.0962 12.520552 11.2882 12.711886 C 11.479533 12.903885 11.716451 13.00024 11.999784 13.00024 C 12.283117 13.00024 12.520919 12.903885 12.712919 12.711886 C 12.904252 12.520552 13.00024 12.283117 13.00024 11.999784 C 13.00024 11.716451 12.904252 11.479166 12.712919 11.287166 C 12.520919 11.095833 12.283117 10.999845 11.999784 10.999845 z " /> android:pathData="M 11.999784 1.9998779 A 10 9.999999 0 0 1 22.000208 11.999784 C 22.000208 10.616452 21.737475 9.3164294 21.212142 8.099764 C 20.687476 6.8830985 19.974804 5.8247631 19.074805 4.924764 C 18.174806 4.0247649 17.11647 3.3122428 15.899805 2.78691 C 14.683139 2.2622439 13.383116 1.9998779 11.999784 1.9998779 z M 11.999784 1.9998779 C 10.616452 1.9998779 9.3164294 2.2622439 8.099764 2.78691 C 6.8830985 3.3122428 5.8247631 4.0247649 4.924764 4.924764 C 4.0247649 5.8247631 3.3126097 6.8830985 2.7879435 8.099764 C 2.2626107 9.3164294 1.9998779 10.616452 1.9998779 11.999784 A 10 9.999999 0 0 1 11.999784 1.9998779 z M 1.9998779 11.999784 C 1.9998779 13.383116 2.2626107 14.683139 2.7879435 15.899805 C 3.3126097 17.11647 4.0247649 18.174806 4.924764 19.074805 C 5.8247631 19.974804 6.8830985 20.687476 8.099764 21.212142 C 9.3164294 21.737475 10.616452 22.000208 11.999784 22.000208 A 10 9.999999 0 0 1 1.9998779 11.999784 z M 11.999784 22.000208 C 13.383116 22.000208 14.683139 21.737475 15.899805 21.212142 C 17.11647 20.687476 18.174806 19.974804 19.074805 19.074805 C 19.974804 18.174806 20.687476 17.11647 21.212142 15.899805 C 21.737475 14.683139 22.000208 13.383116 22.000208 11.999784 A 10 9.999999 0 0 1 11.999784 22.000208 z M 11.999784 3.9997559 C 9.7664532 3.9997559 7.8751938 4.7751969 6.3251953 6.3251953 C 4.7751969 7.8751938 3.9997559 9.7664532 3.9997559 11.999784 C 3.9997559 14.233115 4.7751969 16.124892 6.3251953 17.67489 C 7.8751938 19.224889 9.7664532 19.999813 11.999784 19.999813 C 14.233115 19.999813 16.124892 19.224889 17.67489 17.67489 C 19.224889 16.124892 19.999813 14.233115 19.999813 11.999784 C 19.999813 9.7664532 19.224889 7.8751938 17.67489 6.3251953 C 16.124892 4.7751969 14.233115 3.9997559 11.999784 3.9997559 z M 11.999784 7.4998006 C 13.249783 7.4998006 14.312888 7.9371994 15.18822 8.8118652 C 16.062886 9.6871977 16.499768 10.749786 16.499768 11.999784 C 16.499768 13.249783 16.062886 14.312888 15.18822 15.18822 C 14.312888 16.062886 13.249783 16.499768 11.999784 16.499768 C 10.749786 16.499768 9.6871977 16.062886 8.8118652 15.18822 C 7.9371994 14.312888 7.4998006 13.249783 7.4998006 11.999784 C 7.4998006 10.749786 7.9371994 9.6871977 8.8118652 8.8118652 C 9.6871977 7.9371994 10.749786 7.4998006 11.999784 7.4998006 z M 11.999784 10.999845 C 11.716451 10.999845 11.479533 11.095833 11.2882 11.287166 C 11.0962 11.479166 10.999845 11.716451 10.999845 11.999784 C 10.999845 12.283117 11.0962 12.520552 11.2882 12.711886 C 11.479533 12.903885 11.716451 13.00024 11.999784 13.00024 C 12.283117 13.00024 12.520919 12.903885 12.712919 12.711886 C 12.904252 12.520552 13.00024 12.283117 13.00024 11.999784 C 13.00024 11.716451 12.904252 11.479166 12.712919 11.287166 C 12.520919 11.095833 12.283117 10.999845 11.999784 10.999845 z " />
</vector> </vector>

View file

@ -2,7 +2,7 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<corners android:radius="@dimen/size_corners_large" /> <corners android:radius="@dimen/size_corners_medium" />
<solid android:color="?attr/colorPrimary" /> <solid android:color="?attr/colorPrimary" />
</shape> </shape>
</item> </item>
@ -12,7 +12,7 @@
<item android:id="@android:id/mask"> <item android:id="@android:id/mask">
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="@android:color/white" /> <solid android:color="@android:color/white" />
<corners android:radius="@dimen/size_corners_large" /> <corners android:radius="@dimen/size_corners_medium" />
</shape> </shape>
</item> </item>
</ripple> </ripple>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/size_corners_mid_large" />
<solid android:color="@android:color/white" />
</shape>

View file

@ -5,9 +5,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/playback_toolbar" android:id="@+id/playback_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon.Down" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_down_24"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/menu_playback" app:menu="@menu/menu_playback"
@ -86,7 +88,7 @@
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_controls_container" android:id="@+id/playback_controls_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -165,7 +167,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -5,9 +5,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/playback_toolbar" android:id="@+id/playback_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon.Down" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_down_24"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/menu_playback" app:menu="@menu/menu_playback"
@ -84,7 +86,7 @@
app:layout_constraintStart_toStartOf="@+id/playback_album" app:layout_constraintStart_toStartOf="@+id/playback_album"
app:layout_constraintTop_toBottomOf="@+id/playback_album" /> app:layout_constraintTop_toBottomOf="@+id/playback_album" />
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_controls_container" android:id="@+id/playback_controls_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -163,7 +165,7 @@
app:tint="@color/sel_accented" /> app:tint="@color/sel_accented" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -43,7 +43,7 @@
app:layout_constraintTop_toBottomOf="@+id/playback_song" app:layout_constraintTop_toBottomOf="@+id/playback_song"
tools:text="Artist Name / Album Name" /> tools:text="Artist Name / Album Name" />
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_controls_wrapper" android:id="@+id/playback_controls_wrapper"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -74,9 +74,9 @@
app:icon="@drawable/ic_skip_next_24" /> app:icon="@drawable/ic_skip_next_24" />
</LinearLayout> </LinearLayout>
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_progress_container" android:id="@+id/playback_progress_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -92,6 +92,6 @@
android:layout_marginEnd="@dimen/spacing_small" android:layout_marginEnd="@dimen/spacing_small"
tools:progress="70" /> tools:progress="70" />
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -6,9 +6,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/playback_toolbar" android:id="@+id/playback_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon.Down" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_down_24"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/menu_playback" app:menu="@menu/menu_playback"
@ -73,7 +75,7 @@
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_controls_container" android:id="@+id/playback_controls_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -152,6 +154,6 @@
app:tint="@color/sel_accented" /> app:tint="@color/sel_accented" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -5,9 +5,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/playback_toolbar" android:id="@+id/playback_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon.Down" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_down_24"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/menu_playback" app:menu="@menu/menu_playback"
@ -86,7 +88,7 @@
app:layout_constraintStart_toEndOf="@+id/playback_cover" app:layout_constraintStart_toEndOf="@+id/playback_cover"
app:layout_constraintTop_toBottomOf="@+id/playback_album" /> app:layout_constraintTop_toBottomOf="@+id/playback_album" />
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_controls_container" android:id="@+id/playback_controls_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -165,6 +167,6 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<org.oxycblt.auxio.ui.recycler.DialogRecyclerView xmlns:android="http://schemas.android.com/apk/res/android" <org.oxycblt.auxio.ui.recycler.ScrollIndicatorRecyclerView 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"
android:id="@+id/accent_recycler" android:id="@+id/accent_recycler"

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<org.oxycblt.auxio.ui.recycler.DialogRecyclerView xmlns:android="http://schemas.android.com/apk/res/android" <org.oxycblt.auxio.ui.recycler.ScrollIndicatorRecyclerView 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"
android:id="@+id/tab_recycler" android:id="@+id/tab_recycler"

View file

@ -12,9 +12,11 @@
style="@style/Widget.Auxio.AppBarLayout" style="@style/Widget.Auxio.AppBarLayout"
app:liftOnScroll="true"> app:liftOnScroll="true">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/about_toolbar" android:id="@+id/about_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon" android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationIcon="@drawable/ic_back_24"
app:title="@string/lbl_about" /> app:title="@string/lbl_about" />
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout> </org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>
@ -77,47 +79,41 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/about_auxio_icon" /> app:layout_constraintTop_toBottomOf="@+id/about_auxio_icon" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/version_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/spacing_medium"
app:layout_constraintTop_toBottomOf="@+id/about_desc"
app:layout_constraintVertical_chainStyle="packed">
<ImageView <ImageView
android:id="@+id/about_version_icon" android:id="@+id/about_version_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:contentDescription="@string/lbl_version" android:contentDescription="@string/lbl_version"
android:src="@drawable/ic_about_24" android:src="@drawable/ic_about_24"
app:layout_constraintBottom_toBottomOf="parent" android:layout_marginStart="@dimen/spacing_medium"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="@+id/about_version"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/about_version_title" />
<TextView <TextView
android:id="@+id/about_version_title" android:id="@+id/about_version_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_medium" android:layout_marginTop="@dimen/spacing_medium"
android:text="@string/lbl_version" android:layout_marginStart="@dimen/spacing_medium"
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge" android:text="@string/lbl_version"
app:layout_constraintBottom_toTopOf="@+id/about_version" android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
app:layout_constraintStart_toEndOf="@+id/about_version_icon" app:layout_constraintBottom_toTopOf="@+id/about_version"
app:layout_constraintTop_toTopOf="@+id/about_version_icon" /> app:layout_constraintStart_toEndOf="@+id/about_version_icon"
app:layout_constraintTop_toBottomOf="@+id/about_desc" />
<TextView
android:id="@+id/about_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Auxio.BodySmall"
app:layout_constraintStart_toStartOf="@+id/about_version_title"
app:layout_constraintTop_toBottomOf="@+id/about_version_title"
android:layout_marginBottom="@dimen/spacing_medium"
tools:text="16.16.16" />
<TextView
android:id="@+id/about_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_medium"
android:textAppearance="@style/TextAppearance.Auxio.BodySmall"
app:layout_constraintBottom_toBottomOf="@+id/about_version_icon"
app:layout_constraintStart_toEndOf="@+id/about_version_icon"
app:layout_constraintTop_toBottomOf="@+id/about_version_title"
tools:text="16.16.16" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView <TextView
android:id="@+id/about_code" android:id="@+id/about_code"
@ -125,11 +121,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/lbl_code" android:text="@string/lbl_code"
android:layout_marginTop="@dimen/spacing_medium"
app:drawableStartCompat="@drawable/ic_code_24" app:drawableStartCompat="@drawable/ic_code_24"
app:layout_constraintBottom_toTopOf="@+id/about_faq" app:layout_constraintBottom_toTopOf="@+id/about_faq"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/version_container" /> app:layout_constraintTop_toBottomOf="@+id/about_version" />
<TextView <TextView
android:id="@+id/about_faq" android:id="@+id/about_faq"
@ -159,7 +156,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/lbl_author" android:text="@string/lbl_author"
app:drawableStartCompat="@drawable/ic_artist_24" app:drawableStartCompat="@drawable/ic_author_24"
app:drawableTint="?attr/colorControlNormal" app:drawableTint="?attr/colorControlNormal"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View file

@ -15,9 +15,11 @@
app:liftOnScroll="true" app:liftOnScroll="true"
app:liftOnScrollTargetViewId="@id/detail_recycler"> app:liftOnScrollTargetViewId="@id/detail_recycler">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/detail_toolbar" android:id="@+id/detail_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon" /> android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_back_24" />
</org.oxycblt.auxio.detail.DetailAppBarLayout> </org.oxycblt.auxio.detail.DetailAppBarLayout>

View file

@ -11,7 +11,7 @@
style="@style/Widget.Auxio.AppBarLayout" style="@style/Widget.Auxio.AppBarLayout"
app:liftOnScroll="true"> app:liftOnScroll="true">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/home_toolbar" android:id="@+id/home_toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -30,80 +30,88 @@
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout> </org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/home_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
tools:layout="@layout/fragment_home_list" />
<FrameLayout <FrameLayout
android:id="@+id/home_indexing_wrapper" android:id="@+id/home_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_gravity="bottom" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
android:animateLayoutChanges="true" android:animateLayoutChanges="true"
android:clipToPadding="false"> android:clipToPadding="false">
<com.google.android.material.card.MaterialCardView <androidx.viewpager2.widget.ViewPager2
android:id="@+id/home_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
tools:layout="@layout/fragment_home_list" />
<org.oxycblt.auxio.home.EdgeFrameLayout
android:id="@+id/home_indexing_container" android:id="@+id/home_indexing_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_medium"
android:visibility="invisible" android:visibility="invisible"
android:layout_margin="@dimen/spacing_medium"> android:layout_gravity="center">
<androidx.constraintlayout.widget.ConstraintLayout <com.google.android.material.card.MaterialCardView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:animateLayoutChanges="true"> android:layout_gravity="center">
<TextView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/home_indexing_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_medium" android:animateLayoutChanges="true">
android:gravity="center"
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
app:layout_constraintBottom_toTopOf="@+id/home_indexing_action"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Status" />
<com.google.android.material.progressindicator.LinearProgressIndicator <TextView
android:id="@+id/home_indexing_progress" android:id="@+id/home_indexing_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_medium" android:layout_margin="@dimen/spacing_medium"
android:layout_marginEnd="@dimen/spacing_medium" android:gravity="center"
android:indeterminate="true" android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
app:indeterminateAnimationType="disjoint" app:layout_constraintBottom_toTopOf="@+id/home_indexing_action"
app:layout_constraintBottom_toBottomOf="@+id/home_indexing_action" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintTop_toTopOf="@+id/home_indexing_action" app:layout_constraintVertical_chainStyle="packed"
app:trackColor="@color/sel_track" /> tools:text="Status" />
<Button <com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/home_indexing_action" android:id="@+id/home_indexing_progress"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/lbl_retry" android:layout_marginStart="@dimen/spacing_medium"
android:layout_marginStart="@dimen/spacing_medium" android:layout_marginEnd="@dimen/spacing_medium"
android:layout_marginEnd="@dimen/spacing_medium" android:indeterminate="true"
android:layout_marginBottom="@dimen/spacing_medium" app:indeterminateAnimationType="disjoint"
android:visibility="invisible" app:layout_constraintBottom_toBottomOf="@+id/home_indexing_action"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="@+id/home_indexing_action"
app:layout_constraintTop_toBottomOf="@+id/home_indexing_status" /> app:trackColor="@color/sel_track" />
</androidx.constraintlayout.widget.ConstraintLayout> <Button
android:id="@+id/home_indexing_action"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/lbl_retry"
android:layout_marginStart="@dimen/spacing_medium"
android:layout_marginEnd="@dimen/spacing_medium"
android:layout_marginBottom="@dimen/spacing_medium"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/home_indexing_status" />
</com.google.android.material.card.MaterialCardView> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</org.oxycblt.auxio.home.EdgeFrameLayout>
</FrameLayout> </FrameLayout>
<org.oxycblt.auxio.home.EdgeFabContainer <org.oxycblt.auxio.home.EdgeFrameLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_anchor="@id/home_pager" app:layout_anchor="@id/home_content"
app:layout_anchorGravity="bottom|end"> app:layout_anchorGravity="bottom|end">
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
@ -115,6 +123,6 @@
android:contentDescription="@string/desc_shuffle_all" android:contentDescription="@string/desc_shuffle_all"
android:src="@drawable/ic_shuffle_off_24" /> android:src="@drawable/ic_shuffle_off_24" />
</org.oxycblt.auxio.home.EdgeFabContainer> </org.oxycblt.auxio.home.EdgeFrameLayout>
</org.oxycblt.auxio.ui.coordinator.EdgeCoordinatorLayout> </org.oxycblt.auxio.ui.coordinator.EdgeCoordinatorLayout>

View file

@ -43,7 +43,7 @@
app:layout_constraintTop_toBottomOf="@+id/playback_song" app:layout_constraintTop_toBottomOf="@+id/playback_song"
tools:text="Artist Name / Album Name" /> tools:text="Artist Name / Album Name" />
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_controls_wrapper" android:id="@+id/playback_controls_wrapper"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -74,9 +74,9 @@
app:icon="@drawable/ic_skip_next_24" /> app:icon="@drawable/ic_skip_next_24" />
</LinearLayout> </LinearLayout>
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_progress_container" android:id="@+id/playback_progress_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -92,6 +92,6 @@
android:layout_marginEnd="@dimen/spacing_small" android:layout_marginEnd="@dimen/spacing_small"
tools:progress="70" /> tools:progress="70" />
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -5,9 +5,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/playback_toolbar" android:id="@+id/playback_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon.Down" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_down_24"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/menu_playback" app:menu="@menu/menu_playback"
@ -70,7 +72,7 @@
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<org.oxycblt.auxio.playback.NoRtlFrameLayout <org.oxycblt.auxio.playback.ForcedLTRFrameLayout
android:id="@+id/playback_controls_container" android:id="@+id/playback_controls_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -148,6 +150,6 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</org.oxycblt.auxio.playback.NoRtlFrameLayout> </org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -12,11 +12,12 @@
app:liftOnScroll="true" app:liftOnScroll="true"
app:liftOnScrollTargetViewId="@id/queue_recycler"> app:liftOnScrollTargetViewId="@id/queue_recycler">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/queue_toolbar" android:id="@+id/queue_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon.Down" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_down_24"
android:elevation="0dp" android:elevation="0dp"
app:navigationIcon="@drawable/ic_down_24"
app:title="@string/lbl_queue" /> app:title="@string/lbl_queue" />
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout> </org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>

View file

@ -10,9 +10,11 @@
app:liftOnScroll="true" app:liftOnScroll="true"
app:liftOnScrollTargetViewId="@id/search_recycler"> app:liftOnScrollTargetViewId="@id/search_recycler">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/search_toolbar" android:id="@+id/search_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_back_24"
app:menu="@menu/menu_search"> app:menu="@menu/menu_search">
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
@ -38,7 +40,7 @@
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
</org.oxycblt.auxio.ui.M3Toolbar> </com.google.android.material.appbar.MaterialToolbar>
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout> </org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>

View file

@ -13,9 +13,11 @@
android:focusable="true" android:focusable="true"
app:liftOnScroll="true"> app:liftOnScroll="true">
<org.oxycblt.auxio.ui.M3Toolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/settings_toolbar" android:id="@+id/settings_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon" android:layout_height="wrap_content"
android:layout_width="match_parent"
app:navigationIcon="@drawable/ic_back_24"
app:title="@string/set_title" /> app:title="@string/set_title" />
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout> </org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.Widget" parent="@android:style/Theme.DeviceDefault.DayNight"> <style name="Theme.Widget" parent="@android:style/Theme.DeviceDefault.DayNight">
<item name="colorSurface">@color/widget_surface</item> <item name="colorSurface">@color/widget_surface</item>
<item name="colorPrimary">?android:attr/colorAccent</item> <item name="colorPrimary">?android:attr/colorAccent</item>

View file

@ -21,7 +21,8 @@
<dimen name="size_cover_huge">256dp</dimen> <dimen name="size_cover_huge">256dp</dimen>
<dimen name="size_corners_small">8dp</dimen> <dimen name="size_corners_small">8dp</dimen>
<dimen name="size_corners_large">16dp</dimen> <dimen name="size_corners_medium">16dp</dimen>
<dimen name="size_corners_mid_large">24dp</dimen>
<dimen name="size_btn">48dp</dimen> <dimen name="size_btn">48dp</dimen>
<dimen name="size_play_pause_button">72dp</dimen> <dimen name="size_play_pause_button">72dp</dimen>

View file

@ -30,6 +30,7 @@
<item name="android:textColorHighlightInverse">@color/overlay_text_highlight_inverse</item> <item name="android:textColorHighlightInverse">@color/overlay_text_highlight_inverse</item>
<!-- Material configuration --> <!-- Material configuration -->
<item name="toolbarStyle">@style/Widget.Auxio.Toolbar</item>
<item name="materialAlertDialogTheme">@style/Theme.Auxio.Dialog</item> <item name="materialAlertDialogTheme">@style/Theme.Auxio.Dialog</item>
<item name="sliderStyle">@style/Widget.Auxio.Slider</item> <item name="sliderStyle">@style/Widget.Auxio.Slider</item>
<item name="linearProgressIndicatorStyle">@style/Widget.Auxio.LinearProgressIndicator</item> <item name="linearProgressIndicatorStyle">@style/Widget.Auxio.LinearProgressIndicator</item>

View file

@ -8,17 +8,12 @@
</style> </style>
<!-- Base toolbar style --> <!-- Base toolbar style -->
<style name="Widget.Auxio.Toolbar.Base" parent=""> <style name="Widget.Auxio.Toolbar" parent="Widget.Material3.Toolbar">
<item name="android:layout_width">match_parent</item> <item name="maxButtonHeight">@dimen/size_btn</item>
<item name="android:layout_height">wrap_content</item> <item name="android:paddingLeft">@dimen/spacing_tiny</item>
</style> <item name="android:paddingStart">@dimen/spacing_tiny</item>
<item name="android:paddingRight">@dimen/spacing_tiny</item>
<style name="Widget.Auxio.Toolbar.Icon" parent="Widget.Auxio.Toolbar.Base"> <item name="android:paddingEnd">@dimen/spacing_tiny</item>
<item name="navigationIcon">@drawable/ic_back_24</item>
</style>
<style name="Widget.Auxio.Toolbar.Icon.Down" parent="Widget.Auxio.Toolbar.Base">
<item name="navigationIcon">@drawable/ic_down_24</item>
</style> </style>
<style name="Widget.Auxio.Slider" parent="Widget.Material3.Slider"> <style name="Widget.Auxio.Slider" parent="Widget.Material3.Slider">
@ -31,7 +26,7 @@
<style name="Widget.Auxio.LinearProgressIndicator" parent="Widget.Material3.LinearProgressIndicator"> <style name="Widget.Auxio.LinearProgressIndicator" parent="Widget.Material3.LinearProgressIndicator">
<item name="trackColor">@color/sel_track</item> <item name="trackColor">@color/sel_track</item>
<item name="trackCornerRadius">@dimen/size_corners_large</item> <item name="trackCornerRadius">@dimen/size_corners_medium</item>
</style> </style>
<style name="Widget.Auxio.Button.Icon.Base" parent="Widget.Material3.Button.TextButton"> <style name="Widget.Auxio.Button.Icon.Base" parent="Widget.Material3.Button.TextButton">
@ -81,21 +76,21 @@
<style name="Widget.Auxio.Image.Large" parent=""> <style name="Widget.Auxio.Image.Large" parent="">
<item name="android:layout_width">@dimen/size_cover_large</item> <item name="android:layout_width">@dimen/size_cover_large</item>
<item name="android:layout_height">@dimen/size_cover_large</item> <item name="android:layout_height">@dimen/size_cover_large</item>
<item name="cornerRadius">@dimen/size_corners_large</item> <item name="cornerRadius">@dimen/size_corners_medium</item>
<item name="useLargeIcon">true</item> <item name="useLargeIcon">true</item>
</style> </style>
<style name="Widget.Auxio.Image.MidHuge" parent=""> <style name="Widget.Auxio.Image.MidHuge" parent="">
<item name="android:layout_width">@dimen/size_cover_mid_huge</item> <item name="android:layout_width">@dimen/size_cover_mid_huge</item>
<item name="android:layout_height">@dimen/size_cover_mid_huge</item> <item name="android:layout_height">@dimen/size_cover_mid_huge</item>
<item name="cornerRadius">@dimen/size_corners_large</item> <item name="cornerRadius">@dimen/size_corners_medium</item>
<item name="useLargeIcon">true</item> <item name="useLargeIcon">true</item>
</style> </style>
<style name="Widget.Auxio.Image.Huge" parent=""> <style name="Widget.Auxio.Image.Huge" parent="">
<item name="android:layout_width">@dimen/size_cover_huge</item> <item name="android:layout_width">@dimen/size_cover_huge</item>
<item name="android:layout_height">@dimen/size_cover_huge</item> <item name="android:layout_height">@dimen/size_cover_huge</item>
<item name="cornerRadius">@dimen/size_corners_large</item> <item name="cornerRadius">@dimen/size_corners_medium</item>
<item name="useLargeIcon">true</item> <item name="useLargeIcon">true</item>
</style> </style>
@ -103,7 +98,7 @@
<item name="android:layout_width">0dp</item> <item name="android:layout_width">0dp</item>
<item name="android:layout_height">0dp</item> <item name="android:layout_height">0dp</item>
<item name="layout_constraintDimensionRatio">1</item> <item name="layout_constraintDimensionRatio">1</item>
<item name="cornerRadius">@dimen/size_corners_large</item> <item name="cornerRadius">@dimen/size_corners_medium</item>
<item name="useLargeIcon">true</item> <item name="useLargeIcon">true</item>
</style> </style>
@ -215,6 +210,7 @@
1. We upscale the play icon to 32dp, so the total FAB size also needs to increase to 1. We upscale the play icon to 32dp, so the total FAB size also needs to increase to
compensate. compensate.
2. For some reason elevation behaves strangely in the playback panel, so we disable it. 2. For some reason elevation behaves strangely in the playback panel, so we disable it.
TODO: I think I could just make a tonal button instead of this
--> -->
<item name="maxImageSize">@dimen/size_icon_large</item> <item name="maxImageSize">@dimen/size_icon_large</item>
<item name="fabCustomSize">@dimen/size_play_pause_button</item> <item name="fabCustomSize">@dimen/size_play_pause_button</item>

View file

@ -5,7 +5,7 @@ One of the reasons I built Auxio was out of frustration with other FOSS android
These will likely be accepted as long as they do not cause too much harm to the codebase. These will likely be accepted as long as they do not cause too much harm to the codebase.
## New Customizations/Options ## New Customizations/Options
While I do like adding new behavior/UI customizations, these will be looked at more closely as certain additions can cause harm to the apps UI/UX while not providing alot of benefit. These tend to be accepted however. While I do like adding new behavior/UI customizations, these will be looked at more closely as certain additions can cause harm to the apps UI/UX while not providing a lot of benefit. These tend to be accepted however.
## Feature Additions and UI Changes ## Feature Additions and UI Changes
These arent as likely to be accepted. As I said, I do not want Auxio to become overly bloated with features that are rarely used, therefore I only tend to accept features that: These arent as likely to be accepted. As I said, I do not want Auxio to become overly bloated with features that are rarely used, therefore I only tend to accept features that:

View file

@ -270,7 +270,7 @@ Shared views and view configuration models. This contains:
Shared utilities. This is primarily for QoL when developing Auxio. Documentation is provided on each method. Shared utilities. This is primarily for QoL when developing Auxio. Documentation is provided on each method.
Utilities are separated into a few groups: Utilities are separated into a few groups:
- Context utilties are extensions of `Context` and generally act as shortcuts for that class. - Context utilities are extensions of `Context` and generally act as shortcuts for that class.
- Framework utilities extend a variety of view implementations to add new behavior or shortcuts. - Framework utilities extend a variety of view implementations to add new behavior or shortcuts.
- Primitive utilities operate on basic datatypes and are mostly shortcuts. - Primitive utilities operate on basic datatypes and are mostly shortcuts.
- Log utilities are a more light-weight logging framework that Auxio leverages instead of - Log utilities are a more light-weight logging framework that Auxio leverages instead of
@ -288,5 +288,5 @@ of the problems with using a volatile shared object.
`WidgetProvider` is the widget "implementation" exposed in the manifest. When `WidgetComponent` updates it, the class will create `WidgetProvider` is the widget "implementation" exposed in the manifest. When `WidgetComponent` updates it, the class will create
a series of layouts [e.g "Forms"] for a variety of "size buckets" that would adequately contain the widget. This is then used as a series of layouts [e.g "Forms"] for a variety of "size buckets" that would adequately contain the widget. This is then used as
the widget views, either with the native responsive behavior on Android 12 and above, or with the responsive behavior backported the widget views, either with the native responsive behavior on Android 12 and above, or with the responsive behavior back-ported
to older devices. to older devices.

View file

@ -1,5 +1,9 @@
# Licenses # Licenses
Auxio uses a number of third-party libraries, which are listed below with their licenses:
Auxio is licensed under the GPLv3.
Alongside this, Auxio uses a number of third-party libraries. These are listed below with
their licenses:
| Library Name | Author(s) | Purpose | License | | Library Name | Author(s) | Purpose | License |
|--------------|-----------|---------|---------| |--------------|-----------|---------|---------|