all: misc ui reworks
Miscellanious UI reworks that accumulated over the past few days.
This commit is contained in:
parent
1730a73eac
commit
83d6c529e2
42 changed files with 236 additions and 252 deletions
|
@ -18,7 +18,7 @@
|
|||
- Fixed broken tablet layouts
|
||||
- Fixed seam that would appear on some album covers
|
||||
- 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
|
||||
finished saving
|
||||
- Fixed broken album menu
|
||||
|
@ -63,7 +63,7 @@ finished saving
|
|||
- Fixed unusable excluded directory UI
|
||||
- Songs with no data (i.e size of 0) are now filtered out
|
||||
- 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
|
||||
- New translations [Fjuro -> Czech, Konstantin Tutsch -> German]
|
||||
|
|
|
@ -191,7 +191,6 @@ class GenreDetailFragment :
|
|||
if (parent is Genre && parent.id == unlikelyToBeNull(detailModel.currentGenre.value).id) {
|
||||
detailAdapter.highlightSong(song)
|
||||
} else {
|
||||
// Clear any highlighting if playback is not occuring from this item.
|
||||
detailAdapter.highlightSong(null)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,10 +26,10 @@ import androidx.core.view.updatePadding
|
|||
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
|
||||
*/
|
||||
class EdgeFabContainer
|
||||
class EdgeFrameLayout
|
||||
@JvmOverloads
|
||||
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
|
||||
FrameLayout(context, attrs, defStyleAttr) {
|
|
@ -64,7 +64,6 @@ import org.oxycblt.auxio.util.lazyReflectedField
|
|||
import org.oxycblt.auxio.util.logD
|
||||
import org.oxycblt.auxio.util.logE
|
||||
import org.oxycblt.auxio.util.logTraceOrThrow
|
||||
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||
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.homePager.updatePadding(
|
||||
binding.homeContent.updatePadding(
|
||||
bottom = binding.homeAppbar.totalScrollRange + offset)
|
||||
}
|
||||
}
|
||||
|
@ -107,11 +106,6 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
|
|||
|
||||
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
|
||||
// using a ColorStateList in the resources
|
||||
binding.homeIndexingProgress.trackColor =
|
||||
|
@ -141,7 +135,7 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
|
|||
|
||||
// --- VIEWMODEL SETUP ---
|
||||
|
||||
collect(homeModel.isFastScrolling) { updateFab() }
|
||||
collectImmediately(homeModel.songs, homeModel.isFastScrolling, ::updateFab)
|
||||
collect(homeModel.recreateTabs, ::handleRecreateTabs)
|
||||
collectImmediately(homeModel.currentTab, ::updateCurrentTab)
|
||||
collectImmediately(indexerModel.state, ::handleIndexerState)
|
||||
|
@ -265,8 +259,6 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
|
|||
binding.homeIndexingContainer.visibility = View.INVISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
updateFab()
|
||||
}
|
||||
|
||||
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 fastScrolling = homeModel.isFastScrolling.value
|
||||
val state = indexerModel.state.value
|
||||
if (fastScrolling ||
|
||||
!(state is Indexer.State.Complete && state.response is Indexer.Response.Ok)) {
|
||||
if (isFastScrolling || songs.isEmpty()) {
|
||||
binding.homeFab.hide()
|
||||
} else {
|
||||
binding.homeFab.show()
|
||||
|
|
|
@ -30,7 +30,8 @@ import org.oxycblt.auxio.util.unlikelyToBeNull
|
|||
|
||||
/** [Item] variant that represents a 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. */
|
||||
abstract val rawName: String?
|
||||
|
|
|
@ -61,7 +61,7 @@ val Long.albumCoverUri: Uri
|
|||
* they are invalid.
|
||||
*/
|
||||
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
|
||||
|
@ -69,28 +69,28 @@ val String.plainTrackNo: Int?
|
|||
* invalid.
|
||||
*/
|
||||
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
|
||||
* T is the track number. Values of zero will be ignored under the assumption that they are invalid.
|
||||
*/
|
||||
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
|
||||
* CD_TRACK_NUMBER. Values of zero will be ignored under the assumption that they are invalid.
|
||||
*/
|
||||
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
|
||||
* are invalid.
|
||||
*/
|
||||
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
|
||||
|
@ -99,7 +99,9 @@ val String.year: Int?
|
|||
* under the assumption that they are invalid.
|
||||
*/
|
||||
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
|
||||
|
@ -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.
|
||||
* Note that we do not translate these, as that greatly increases technical complexity.
|
||||
*/
|
||||
private val GENRE_TABLE =
|
||||
arrayOf(
|
||||
|
|
|
@ -35,7 +35,7 @@ import android.widget.FrameLayout
|
|||
*
|
||||
* @author OxygenCobalt
|
||||
*/
|
||||
open class NoRtlFrameLayout
|
||||
open class ForcedLTRFrameLayout
|
||||
@JvmOverloads
|
||||
constructor(
|
||||
context: Context,
|
||||
|
@ -44,7 +44,7 @@ constructor(
|
|||
) : FrameLayout(context, attrs, defStyleAttr) {
|
||||
override fun 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
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
viewModelScope.launch {
|
||||
val restored =
|
||||
|
|
|
@ -51,7 +51,7 @@ constructor(
|
|||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0,
|
||||
) :
|
||||
NoRtlFrameLayout(context, attrs, defStyleAttr),
|
||||
ForcedLTRFrameLayout(context, attrs, defStyleAttr),
|
||||
Slider.OnSliderTouchListener,
|
||||
Slider.OnChangeListener {
|
||||
private val binding = ViewSeekBarBinding.inflate(context.inflater, this, true)
|
||||
|
|
|
@ -387,8 +387,7 @@ class PlaybackStateManager private constructor() {
|
|||
suspend fun sanitize(database: PlaybackStateDatabase, newLibrary: MusicStore.Library) {
|
||||
// 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.
|
||||
// FIXME: This hack actually creates bugs if a user were to save the state at just
|
||||
// the right time, replace it with something that operates at runtime
|
||||
// TODO: Do we even need to save here? Doesn't seem like it's required for
|
||||
logD("Sanitizing state")
|
||||
val state = synchronized(this) { makeStateImpl() }
|
||||
|
||||
|
|
|
@ -69,6 +69,8 @@ import org.oxycblt.auxio.widgets.WidgetProvider
|
|||
*
|
||||
* TODO: Android Auto
|
||||
*
|
||||
* TODO: Attempt to re-unify delayed actions again
|
||||
*
|
||||
* @author OxygenCobalt
|
||||
*/
|
||||
class PlaybackService :
|
||||
|
@ -285,10 +287,10 @@ class PlaybackService :
|
|||
// --- SETTINGSMANAGER OVERRIDES ---
|
||||
|
||||
override fun onSettingChanged(key: String) {
|
||||
when (key) {
|
||||
getString(R.string.set_key_replay_gain),
|
||||
getString(R.string.set_key_pre_amp_with),
|
||||
getString(R.string.set_key_pre_amp_without) -> onTracksChanged(player.currentTracks)
|
||||
if (key == getString(R.string.set_key_replay_gain) ||
|
||||
key == getString(R.string.set_key_pre_amp_with) ||
|
||||
key == getString(R.string.set_key_pre_amp_without)) {
|
||||
onTracksChanged(player.currentTracks)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -26,6 +26,7 @@ import androidx.recyclerview.widget.AsyncListDiffer
|
|||
import androidx.recyclerview.widget.DiffUtil
|
||||
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
|
||||
* 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
|
||||
* bind the viewholder, with nothing more.
|
||||
* bind the viewholder.
|
||||
*/
|
||||
open fun onBind(viewHolder: VH, item: T, listener: L, payload: List<Any>) {
|
||||
viewHolder.bind(item, listener)
|
||||
|
|
|
@ -34,7 +34,7 @@ import org.oxycblt.auxio.util.getDimenSizeSafe
|
|||
* used in dialogs.
|
||||
* @author OxygenCobalt
|
||||
*/
|
||||
class DialogRecyclerView
|
||||
class ScrollIndicatorRecyclerView
|
||||
@JvmOverloads
|
||||
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
|
||||
RecyclerView(context, attrs, defStyleAttr) {
|
|
@ -97,7 +97,7 @@ private fun RemoteViews.applyRoundingToBackground(context: Context): RemoteViews
|
|||
|
||||
private fun RemoteViews.applyRoundingToBar(context: Context): RemoteViews {
|
||||
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 {
|
||||
setInt(R.id.widget_controls, "setBackgroundResource", R.drawable.ui_widget_bar)
|
||||
}
|
||||
|
|
|
@ -88,7 +88,7 @@ class WidgetComponent(private val context: Context) :
|
|||
context.getDimenSizeSafe(android.R.dimen.system_app_widget_inner_radius)
|
||||
} else if (settings.roundMode) {
|
||||
// < Android 12, but the user still enabled round mode.
|
||||
context.getDimenSizeSafe(R.dimen.size_corners_large)
|
||||
context.getDimenSizeSafe(R.dimen.size_corners_medium)
|
||||
} else {
|
||||
// User did not enable round mode.
|
||||
0
|
||||
|
|
11
app/src/main/res/drawable/ic_author_24.xml
Normal file
11
app/src/main/res/drawable/ic_author_24.xml
Normal 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>
|
|
@ -5,9 +5,9 @@
|
|||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<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" />
|
||||
<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 " />
|
||||
</vector>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="@dimen/size_corners_large" />
|
||||
<corners android:radius="@dimen/size_corners_medium" />
|
||||
<solid android:color="?attr/colorPrimary" />
|
||||
</shape>
|
||||
</item>
|
||||
|
@ -12,7 +12,7 @@
|
|||
<item android:id="@android:id/mask">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@android:color/white" />
|
||||
<corners android:radius="@dimen/size_corners_large" />
|
||||
<corners android:radius="@dimen/size_corners_medium" />
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
|
|
6
app/src/main/res/drawable/ui_widget_bar_round.xml
Normal file
6
app/src/main/res/drawable/ui_widget_bar_round.xml
Normal 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>
|
|
@ -5,9 +5,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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_constraintTop_toTopOf="parent"
|
||||
app:menu="@menu/menu_playback"
|
||||
|
@ -86,7 +88,7 @@
|
|||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<org.oxycblt.auxio.playback.NoRtlFrameLayout
|
||||
<org.oxycblt.auxio.playback.ForcedLTRFrameLayout
|
||||
android:id="@+id/playback_controls_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -165,7 +167,7 @@
|
|||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</org.oxycblt.auxio.playback.NoRtlFrameLayout>
|
||||
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -5,9 +5,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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_constraintTop_toTopOf="parent"
|
||||
app:menu="@menu/menu_playback"
|
||||
|
@ -84,7 +86,7 @@
|
|||
app:layout_constraintStart_toStartOf="@+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:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -163,7 +165,7 @@
|
|||
app:tint="@color/sel_accented" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</org.oxycblt.auxio.playback.NoRtlFrameLayout>
|
||||
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
app:layout_constraintTop_toBottomOf="@+id/playback_song"
|
||||
tools:text="Artist Name / Album Name" />
|
||||
|
||||
<org.oxycblt.auxio.playback.NoRtlFrameLayout
|
||||
<org.oxycblt.auxio.playback.ForcedLTRFrameLayout
|
||||
android:id="@+id/playback_controls_wrapper"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -74,9 +74,9 @@
|
|||
app:icon="@drawable/ic_skip_next_24" />
|
||||
</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:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -92,6 +92,6 @@
|
|||
android:layout_marginEnd="@dimen/spacing_small"
|
||||
tools:progress="70" />
|
||||
|
||||
</org.oxycblt.auxio.playback.NoRtlFrameLayout>
|
||||
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -6,9 +6,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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_constraintTop_toTopOf="parent"
|
||||
app:menu="@menu/menu_playback"
|
||||
|
@ -73,7 +75,7 @@
|
|||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<org.oxycblt.auxio.playback.NoRtlFrameLayout
|
||||
<org.oxycblt.auxio.playback.ForcedLTRFrameLayout
|
||||
android:id="@+id/playback_controls_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -152,6 +154,6 @@
|
|||
app:tint="@color/sel_accented" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</org.oxycblt.auxio.playback.NoRtlFrameLayout>
|
||||
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -5,9 +5,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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_constraintTop_toTopOf="parent"
|
||||
app:menu="@menu/menu_playback"
|
||||
|
@ -86,7 +88,7 @@
|
|||
app:layout_constraintStart_toEndOf="@+id/playback_cover"
|
||||
app:layout_constraintTop_toBottomOf="@+id/playback_album" />
|
||||
|
||||
<org.oxycblt.auxio.playback.NoRtlFrameLayout
|
||||
<org.oxycblt.auxio.playback.ForcedLTRFrameLayout
|
||||
android:id="@+id/playback_controls_container"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -165,6 +167,6 @@
|
|||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</org.oxycblt.auxio.playback.NoRtlFrameLayout>
|
||||
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?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:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/accent_recycler"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?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:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/tab_recycler"
|
||||
|
|
|
@ -12,9 +12,11 @@
|
|||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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" />
|
||||
|
||||
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>
|
||||
|
@ -77,47 +79,41 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
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
|
||||
android:id="@+id/about_version_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/lbl_version"
|
||||
android:src="@drawable/ic_about_24"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
<ImageView
|
||||
android:id="@+id/about_version_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/lbl_version"
|
||||
android:src="@drawable/ic_about_24"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/about_version"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/about_version_title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/about_version_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:text="@string/lbl_version"
|
||||
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
|
||||
app:layout_constraintBottom_toTopOf="@+id/about_version"
|
||||
app:layout_constraintStart_toEndOf="@+id/about_version_icon"
|
||||
app:layout_constraintTop_toTopOf="@+id/about_version_icon" />
|
||||
<TextView
|
||||
android:id="@+id/about_version_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/spacing_medium"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:text="@string/lbl_version"
|
||||
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
|
||||
app:layout_constraintBottom_toTopOf="@+id/about_version"
|
||||
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
|
||||
android:id="@+id/about_code"
|
||||
|
@ -125,11 +121,12 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/lbl_code"
|
||||
android:layout_marginTop="@dimen/spacing_medium"
|
||||
app:drawableStartCompat="@drawable/ic_code_24"
|
||||
app:layout_constraintBottom_toTopOf="@+id/about_faq"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/version_container" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/about_version" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/about_faq"
|
||||
|
@ -159,7 +156,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/lbl_author"
|
||||
app:drawableStartCompat="@drawable/ic_artist_24"
|
||||
app:drawableStartCompat="@drawable/ic_author_24"
|
||||
app:drawableTint="?attr/colorControlNormal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
|
@ -15,9 +15,11 @@
|
|||
app:liftOnScroll="true"
|
||||
app:liftOnScrollTargetViewId="@id/detail_recycler">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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>
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/home_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -30,80 +30,88 @@
|
|||
|
||||
</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
|
||||
android:id="@+id/home_indexing_wrapper"
|
||||
android:id="@+id/home_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
|
||||
android:animateLayoutChanges="true"
|
||||
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:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/spacing_medium"
|
||||
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_height="wrap_content"
|
||||
android:animateLayoutChanges="true">
|
||||
android:layout_gravity="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/home_indexing_status"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/spacing_medium"
|
||||
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" />
|
||||
android:animateLayoutChanges="true">
|
||||
|
||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
android:id="@+id/home_indexing_progress"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:layout_marginEnd="@dimen/spacing_medium"
|
||||
android:indeterminate="true"
|
||||
app:indeterminateAnimationType="disjoint"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/home_indexing_action"
|
||||
app:layout_constraintTop_toTopOf="@+id/home_indexing_action"
|
||||
app:trackColor="@color/sel_track" />
|
||||
<TextView
|
||||
android:id="@+id/home_indexing_status"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/spacing_medium"
|
||||
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" />
|
||||
|
||||
<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.progressindicator.LinearProgressIndicator
|
||||
android:id="@+id/home_indexing_progress"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:layout_marginEnd="@dimen/spacing_medium"
|
||||
android:indeterminate="true"
|
||||
app:indeterminateAnimationType="disjoint"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/home_indexing_action"
|
||||
app:layout_constraintTop_toTopOf="@+id/home_indexing_action"
|
||||
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>
|
||||
|
||||
<org.oxycblt.auxio.home.EdgeFabContainer
|
||||
<org.oxycblt.auxio.home.EdgeFrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_anchor="@id/home_pager"
|
||||
app:layout_anchor="@id/home_content"
|
||||
app:layout_anchorGravity="bottom|end">
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
@ -115,6 +123,6 @@
|
|||
android:contentDescription="@string/desc_shuffle_all"
|
||||
android:src="@drawable/ic_shuffle_off_24" />
|
||||
|
||||
</org.oxycblt.auxio.home.EdgeFabContainer>
|
||||
</org.oxycblt.auxio.home.EdgeFrameLayout>
|
||||
|
||||
</org.oxycblt.auxio.ui.coordinator.EdgeCoordinatorLayout>
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
app:layout_constraintTop_toBottomOf="@+id/playback_song"
|
||||
tools:text="Artist Name / Album Name" />
|
||||
|
||||
<org.oxycblt.auxio.playback.NoRtlFrameLayout
|
||||
<org.oxycblt.auxio.playback.ForcedLTRFrameLayout
|
||||
android:id="@+id/playback_controls_wrapper"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -74,9 +74,9 @@
|
|||
app:icon="@drawable/ic_skip_next_24" />
|
||||
</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:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -92,6 +92,6 @@
|
|||
android:layout_marginEnd="@dimen/spacing_small"
|
||||
tools:progress="70" />
|
||||
|
||||
</org.oxycblt.auxio.playback.NoRtlFrameLayout>
|
||||
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -5,9 +5,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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_constraintTop_toTopOf="parent"
|
||||
app:menu="@menu/menu_playback"
|
||||
|
@ -70,7 +72,7 @@
|
|||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<org.oxycblt.auxio.playback.NoRtlFrameLayout
|
||||
<org.oxycblt.auxio.playback.ForcedLTRFrameLayout
|
||||
android:id="@+id/playback_controls_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -148,6 +150,6 @@
|
|||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</org.oxycblt.auxio.playback.NoRtlFrameLayout>
|
||||
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -12,11 +12,12 @@
|
|||
app:liftOnScroll="true"
|
||||
app:liftOnScrollTargetViewId="@id/queue_recycler">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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"
|
||||
app:navigationIcon="@drawable/ic_down_24"
|
||||
app:title="@string/lbl_queue" />
|
||||
|
||||
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>
|
||||
|
|
|
@ -10,9 +10,11 @@
|
|||
app:liftOnScroll="true"
|
||||
app:liftOnScrollTargetViewId="@id/search_recycler">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
|
@ -38,7 +40,7 @@
|
|||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
</org.oxycblt.auxio.ui.M3Toolbar>
|
||||
</com.google.android.material.appbar.MaterialToolbar>
|
||||
|
||||
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>
|
||||
|
||||
|
|
|
@ -13,9 +13,11 @@
|
|||
android:focusable="true"
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<org.oxycblt.auxio.ui.M3Toolbar
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
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" />
|
||||
|
||||
</org.oxycblt.auxio.ui.coordinator.EdgeAppBarLayout>
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<style name="Theme.Widget" parent="@android:style/Theme.DeviceDefault.DayNight">
|
||||
<item name="colorSurface">@color/widget_surface</item>
|
||||
<item name="colorPrimary">?android:attr/colorAccent</item>
|
||||
|
|
|
@ -21,7 +21,8 @@
|
|||
<dimen name="size_cover_huge">256dp</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_play_pause_button">72dp</dimen>
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
<item name="android:textColorHighlightInverse">@color/overlay_text_highlight_inverse</item>
|
||||
|
||||
<!-- Material configuration -->
|
||||
<item name="toolbarStyle">@style/Widget.Auxio.Toolbar</item>
|
||||
<item name="materialAlertDialogTheme">@style/Theme.Auxio.Dialog</item>
|
||||
<item name="sliderStyle">@style/Widget.Auxio.Slider</item>
|
||||
<item name="linearProgressIndicatorStyle">@style/Widget.Auxio.LinearProgressIndicator</item>
|
||||
|
|
|
@ -8,17 +8,12 @@
|
|||
</style>
|
||||
|
||||
<!-- Base toolbar style -->
|
||||
<style name="Widget.Auxio.Toolbar.Base" parent="">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Auxio.Toolbar.Icon" parent="Widget.Auxio.Toolbar.Base">
|
||||
<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 name="Widget.Auxio.Toolbar" parent="Widget.Material3.Toolbar">
|
||||
<item name="maxButtonHeight">@dimen/size_btn</item>
|
||||
<item name="android:paddingLeft">@dimen/spacing_tiny</item>
|
||||
<item name="android:paddingStart">@dimen/spacing_tiny</item>
|
||||
<item name="android:paddingRight">@dimen/spacing_tiny</item>
|
||||
<item name="android:paddingEnd">@dimen/spacing_tiny</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Auxio.Slider" parent="Widget.Material3.Slider">
|
||||
|
@ -31,7 +26,7 @@
|
|||
|
||||
<style name="Widget.Auxio.LinearProgressIndicator" parent="Widget.Material3.LinearProgressIndicator">
|
||||
<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 name="Widget.Auxio.Button.Icon.Base" parent="Widget.Material3.Button.TextButton">
|
||||
|
@ -81,21 +76,21 @@
|
|||
<style name="Widget.Auxio.Image.Large" parent="">
|
||||
<item name="android:layout_width">@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>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Auxio.Image.MidHuge" parent="">
|
||||
<item name="android:layout_width">@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>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Auxio.Image.Huge" parent="">
|
||||
<item name="android:layout_width">@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>
|
||||
</style>
|
||||
|
||||
|
@ -103,7 +98,7 @@
|
|||
<item name="android:layout_width">0dp</item>
|
||||
<item name="android:layout_height">0dp</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>
|
||||
</style>
|
||||
|
||||
|
@ -215,6 +210,7 @@
|
|||
1. We upscale the play icon to 32dp, so the total FAB size also needs to increase to
|
||||
compensate.
|
||||
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="fabCustomSize">@dimen/size_play_pause_button</item>
|
||||
|
|
|
@ -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.
|
||||
|
||||
## 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
|
||||
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:
|
||||
|
|
|
@ -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.
|
||||
|
||||
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.
|
||||
- Primitive utilities operate on basic datatypes and are mostly shortcuts.
|
||||
- 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
|
||||
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.
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
# 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 |
|
||||
|--------------|-----------|---------|---------|
|
||||
|
|
Loading…
Reference in a new issue