ui: rework cover style
Rework the style of all album covers in the app to be more in line with the new track number style. This is mostly comprised of adding a new background to all cover views and rescaling error icons to be smaller than they would normally be. This also includes a change in the cover/track background color from colorSurfaceVariant to colorOnSurfaceInverse, which seems to provide the best visibility in all cases. These changes also apply to the track number views.
This commit is contained in:
parent
e387e72b2c
commit
74f5962844
55 changed files with 254 additions and 350 deletions
11
README.md
11
README.md
|
@ -53,12 +53,15 @@ I primarily built Auxio for myself, but you can use it too, I guess.
|
|||
- Completely private and offline
|
||||
- No rounded album covers (Unless you want them. Then you can.)
|
||||
|
||||
## To possibly come in the future:
|
||||
## To come in the future:
|
||||
|
||||
- Automatic music rescanning
|
||||
- Even better metadata support
|
||||
- Playlists
|
||||
- Liked songs
|
||||
- More notification actions
|
||||
- And other things, probably
|
||||
- Artist Images
|
||||
- More customization options
|
||||
- Other things, probably
|
||||
|
||||
## Permissions
|
||||
|
||||
|
@ -69,7 +72,7 @@ I primarily built Auxio for myself, but you can use it too, I guess.
|
|||
|
||||
Auxio relies on a custom version of ExoPlayer that enables some extra features. So, the build process is as follows:
|
||||
|
||||
1. `cd` into the project directory
|
||||
1. `cd` into the project directory.
|
||||
2. Run `python3 prebuild.py`, which installs ExoPlayer and it's extensions.
|
||||
- The pre-build process only works with \*nix systems. On windows, this process must be done manually.
|
||||
3. Build the project normally in Android Studio.
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
apply plugin: "com.android.application"
|
||||
apply plugin: "kotlin-android"
|
||||
apply plugin: "kotlin-kapt"
|
||||
apply plugin: "androidx.navigation.safeargs.kotlin"
|
||||
apply plugin: "com.diffplug.spotless"
|
||||
plugins {
|
||||
id "com.android.application"
|
||||
id "kotlin-android"
|
||||
id "androidx.navigation.safeargs.kotlin"
|
||||
id "com.diffplug.spotless"
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 32
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
android:windowSoftInputMode="adjustPan">
|
||||
|
||||
<intent-filter>
|
||||
<!-- Expose that we are a music player. -->
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<action android:name="android.intent.action.MUSIC_PLAYER" />
|
||||
|
||||
|
@ -50,6 +51,11 @@
|
|||
</intent-filter>
|
||||
|
||||
<intent-filter>
|
||||
<!--
|
||||
Signal that we can take audio of *any* format, file or content. This is important,
|
||||
as some apps use this to determine if Auxio is eligible to be a default music
|
||||
player.
|
||||
-->
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
|
@ -80,6 +86,7 @@
|
|||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!-- Auxio's one and only AppWidget -->
|
||||
<receiver
|
||||
android:name=".widgets.WidgetProvider"
|
||||
android:exported="false"
|
||||
|
|
|
@ -1,80 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2021 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.coil
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.widget.ImageView
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.graphics.drawable.toBitmap
|
||||
import coil.dispose
|
||||
import coil.imageLoader
|
||||
import coil.load
|
||||
import coil.request.ImageRequest
|
||||
import coil.size.Size
|
||||
import org.oxycblt.auxio.R
|
||||
import org.oxycblt.auxio.music.Album
|
||||
import org.oxycblt.auxio.music.Artist
|
||||
import org.oxycblt.auxio.music.Genre
|
||||
import org.oxycblt.auxio.music.Music
|
||||
import org.oxycblt.auxio.music.Song
|
||||
|
||||
// --- BINDING ADAPTERS ---
|
||||
|
||||
/** Bind the album cover for a [song]. */
|
||||
fun ImageView.bindAlbumCover(song: Song?) =
|
||||
load(song, R.drawable.ic_album, R.string.desc_album_cover)
|
||||
|
||||
/** Bind the album cover for an [album]. */
|
||||
fun ImageView.bindAlbumCover(album: Album?) =
|
||||
load(album, R.drawable.ic_album, R.string.desc_album_cover)
|
||||
|
||||
/** Bind the image for an [artist] */
|
||||
fun ImageView.bindArtistImage(artist: Artist?) =
|
||||
load(artist, R.drawable.ic_artist, R.string.desc_artist_image)
|
||||
|
||||
/** Bind the image for a [genre] */
|
||||
fun ImageView.bindGenreImage(genre: Genre?) =
|
||||
load(genre, R.drawable.ic_genre, R.string.desc_genre_image)
|
||||
|
||||
fun <T : Music> ImageView.load(music: T?, @DrawableRes error: Int, @StringRes desc: Int) {
|
||||
contentDescription = context.getString(desc, music?.resolvedName)
|
||||
dispose()
|
||||
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||
load(music) {
|
||||
error(error)
|
||||
transformations(SquareFrameTransform.INSTANCE)
|
||||
}
|
||||
}
|
||||
|
||||
// --- OTHER FUNCTIONS ---
|
||||
|
||||
/**
|
||||
* Get a bitmap for a [song]. [onDone] will be called with the loaded bitmap, or null if loading
|
||||
* failed/shouldn't occur. **This not meant for UIs, instead use the Binding Adapters.**
|
||||
*/
|
||||
fun loadBitmap(context: Context, song: Song, onDone: (Bitmap?) -> Unit) {
|
||||
context.imageLoader.enqueue(
|
||||
ImageRequest.Builder(context)
|
||||
.data(song.album)
|
||||
.size(Size.ORIGINAL)
|
||||
.transformations(SquareFrameTransform())
|
||||
.target(onError = { onDone(null) }, onSuccess = { onDone(it.toBitmap()) })
|
||||
.build())
|
||||
}
|
|
@ -1,64 +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.coil
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import androidx.annotation.AttrRes
|
||||
import androidx.appcompat.widget.AppCompatImageView
|
||||
import com.google.android.material.shape.MaterialShapeDrawable
|
||||
import org.oxycblt.auxio.R
|
||||
import org.oxycblt.auxio.settings.SettingsManager
|
||||
import org.oxycblt.auxio.util.getColorSafe
|
||||
import org.oxycblt.auxio.util.stateList
|
||||
|
||||
/**
|
||||
* An [AppCompatImageView] that applies the specified cornerRadius attribute if the user has enabled
|
||||
* the "Round album covers" option. We don't round album covers by default as it desecrates album
|
||||
* artwork, but if the user desires it we do have an option to enable it.
|
||||
*/
|
||||
class RoundableImageView
|
||||
@JvmOverloads
|
||||
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
|
||||
AppCompatImageView(context, attrs, defStyleAttr) {
|
||||
init {
|
||||
val styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.RoundableImageView)
|
||||
val cornerRadius = styledAttrs.getDimension(R.styleable.RoundableImageView_cornerRadius, 0f)
|
||||
styledAttrs.recycle()
|
||||
|
||||
background =
|
||||
MaterialShapeDrawable().apply {
|
||||
setCornerSize(cornerRadius)
|
||||
fillColor = context.getColorSafe(android.R.color.transparent).stateList
|
||||
}
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
|
||||
// Use clipToOutline and a background drawable to crop images. While Coil's transformation
|
||||
// could theoretically be used to round corners, the corner radius is dependent on the
|
||||
// dimensions of the image, which will result in inconsistent corners across different
|
||||
// album covers unless we resize all covers to be the same size. clipToOutline is both
|
||||
// cheaper and more elegant.
|
||||
if (!isInEditMode) {
|
||||
val settingsManager = SettingsManager.getInstance()
|
||||
clipToOutline = settingsManager.roundCovers
|
||||
}
|
||||
}
|
||||
}
|
168
app/src/main/java/org/oxycblt/auxio/coil/StyledImageView.kt
Normal file
168
app/src/main/java/org/oxycblt/auxio/coil/StyledImageView.kt
Normal file
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
* 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.coil
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Matrix
|
||||
import android.graphics.RectF
|
||||
import android.util.AttributeSet
|
||||
import android.widget.ImageView
|
||||
import androidx.annotation.AttrRes
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.appcompat.widget.AppCompatImageView
|
||||
import androidx.core.graphics.drawable.toBitmap
|
||||
import coil.dispose
|
||||
import coil.imageLoader
|
||||
import coil.load
|
||||
import coil.request.ImageRequest
|
||||
import coil.size.Size
|
||||
import com.google.android.material.shape.MaterialShapeDrawable
|
||||
import kotlin.math.min
|
||||
import org.oxycblt.auxio.R
|
||||
import org.oxycblt.auxio.music.Album
|
||||
import org.oxycblt.auxio.music.Artist
|
||||
import org.oxycblt.auxio.music.Genre
|
||||
import org.oxycblt.auxio.music.Music
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.settings.SettingsManager
|
||||
import org.oxycblt.auxio.util.getColorStateListSafe
|
||||
|
||||
/** An [AppCompatImageView] that applies many of the stylistic choices thjat Auxio uses wi */
|
||||
class StyledImageView
|
||||
@JvmOverloads
|
||||
constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0) :
|
||||
AppCompatImageView(context, attrs, defStyleAttr) {
|
||||
private val centerMatrix = Matrix()
|
||||
private val matrixSrc = RectF()
|
||||
private val matrixDst = RectF()
|
||||
private var cornerRadius = 0f
|
||||
|
||||
init {
|
||||
val styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.StyledImageView)
|
||||
cornerRadius = styledAttrs.getDimension(R.styleable.StyledImageView_cornerRadius, 0f)
|
||||
styledAttrs.recycle()
|
||||
|
||||
clipToOutline = true
|
||||
background =
|
||||
MaterialShapeDrawable().apply {
|
||||
fillColor = context.getColorStateListSafe(R.color.sel_cover_bg)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
|
||||
// Use clipToOutline and a background drawable to crop images. While Coil's transformation
|
||||
// could theoretically be used to round corners, the corner radius is dependent on the
|
||||
// dimensions of the image, which will result in inconsistent corners across different
|
||||
// album covers unless we resize all covers to be the same size. clipToOutline is both
|
||||
// cheaper and more elegant.
|
||||
if (!isInEditMode) {
|
||||
val settingsManager = SettingsManager.getInstance()
|
||||
if (settingsManager.roundCovers) {
|
||||
(background as MaterialShapeDrawable).setCornerSize(cornerRadius)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||
|
||||
imageMatrix =
|
||||
centerMatrix.apply {
|
||||
reset()
|
||||
drawable?.let { drawable ->
|
||||
// Android is too good to allow us to set a fixed image size, so we instead need
|
||||
// to define a matrix to scale an image directly.
|
||||
|
||||
// First scale the icon up to the desired size.
|
||||
val iconSize = min(measuredWidth, measuredHeight) / 2f
|
||||
matrixSrc.set(
|
||||
0f,
|
||||
0f,
|
||||
drawable.intrinsicWidth.toFloat(),
|
||||
drawable.intrinsicHeight.toFloat())
|
||||
matrixDst.set(0f, 0f, iconSize, iconSize)
|
||||
centerMatrix.setRectToRect(matrixSrc, matrixDst, Matrix.ScaleToFit.CENTER)
|
||||
|
||||
// Then actually center it into the icon, which the previous call does not
|
||||
// actually do.
|
||||
centerMatrix.postTranslate(
|
||||
(measuredWidth - iconSize) / 2f, (measuredHeight - iconSize) / 2f)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Borg the extension methods into the view, move the loadBitmap call to the service
|
||||
// eventually
|
||||
|
||||
/** Bind the album cover for a [song]. */
|
||||
fun StyledImageView.bindAlbumCover(song: Song?) =
|
||||
load(song, R.drawable.ic_song, R.string.desc_album_cover)
|
||||
|
||||
/** Bind the album cover for an [album]. */
|
||||
fun StyledImageView.bindAlbumCover(album: Album?) =
|
||||
load(album, R.drawable.ic_album, R.string.desc_album_cover)
|
||||
|
||||
/** Bind the image for an [artist] */
|
||||
fun StyledImageView.bindArtistImage(artist: Artist?) =
|
||||
load(artist, R.drawable.ic_artist, R.string.desc_artist_image)
|
||||
|
||||
/** Bind the image for a [genre] */
|
||||
fun StyledImageView.bindGenreImage(genre: Genre?) =
|
||||
load(genre, R.drawable.ic_genre, R.string.desc_genre_image)
|
||||
|
||||
fun <T : Music> StyledImageView.load(music: T?, @DrawableRes error: Int, @StringRes desc: Int) {
|
||||
contentDescription = context.getString(desc, music?.resolvedName)
|
||||
dispose()
|
||||
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||
load(music) {
|
||||
error(error)
|
||||
transformations(SquareFrameTransform.INSTANCE)
|
||||
listener(
|
||||
onSuccess = { _, _ ->
|
||||
// Using the matrix scale type will shrink the cover images, so set it back to
|
||||
// the default scale type.
|
||||
scaleType = ImageView.ScaleType.CENTER
|
||||
},
|
||||
onError = { _, _ ->
|
||||
// Error icons need to be scaled correctly, so set it to the custom matrix
|
||||
// that the ImageView applies
|
||||
scaleType = ImageView.ScaleType.MATRIX
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// --- OTHER FUNCTIONS ---
|
||||
|
||||
/**
|
||||
* Get a bitmap for a [song]. [onDone] will be called with the loaded bitmap, or null if loading
|
||||
* failed/shouldn't occur. **This not meant for UIs, instead use the Binding Adapters.**
|
||||
*/
|
||||
fun loadBitmap(context: Context, song: Song, onDone: (Bitmap?) -> Unit) {
|
||||
context.imageLoader.enqueue(
|
||||
ImageRequest.Builder(context)
|
||||
.data(song.album)
|
||||
.size(Size.ORIGINAL)
|
||||
.transformations(SquareFrameTransform())
|
||||
.target(onError = { onDone(null) }, onSuccess = { onDone(it.toBitmap()) })
|
||||
.build())
|
||||
}
|
|
@ -158,7 +158,7 @@ class DetailViewModel : ViewModel() {
|
|||
private fun refreshAlbumData(album: Album) {
|
||||
logD("Refreshing album data")
|
||||
val data = mutableListOf<Item>(album)
|
||||
data.add(SortHeader(id = -2, R.string.lbl_albums))
|
||||
data.add(SortHeader(id = -2, R.string.lbl_songs))
|
||||
data.addAll(albumSort.album(album))
|
||||
mAlbumData.value = data
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@ package org.oxycblt.auxio.detail.recycler
|
|||
|
||||
import android.content.Context
|
||||
import androidx.core.view.isInvisible
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.oxycblt.auxio.IntegerTable
|
||||
import org.oxycblt.auxio.R
|
||||
|
@ -170,16 +169,18 @@ private class AlbumSongViewHolder private constructor(private val binding: ItemA
|
|||
binding.songTrack.apply {
|
||||
textSafe = context.getString(R.string.fmt_number, item.track)
|
||||
isInvisible = false
|
||||
contentDescription = context.getString(R.string.desc_track_number, item.track)
|
||||
}
|
||||
|
||||
binding.songTrackPlaceholder.isVisible = false
|
||||
binding.songTrackBg.imageAlpha = 0
|
||||
} else {
|
||||
binding.songTrack.apply {
|
||||
textSafe = ""
|
||||
isInvisible = true
|
||||
contentDescription = context.getString(R.string.def_track)
|
||||
}
|
||||
|
||||
binding.songTrackPlaceholder.isVisible = true
|
||||
binding.songTrackBg.imageAlpha = 255
|
||||
}
|
||||
|
||||
binding.songName.textSafe = item.resolvedName
|
||||
|
@ -197,7 +198,6 @@ private class AlbumSongViewHolder private constructor(private val binding: ItemA
|
|||
override fun setHighlighted(isHighlighted: Boolean) {
|
||||
binding.songName.isActivated = isHighlighted
|
||||
binding.songTrack.isActivated = isHighlighted
|
||||
binding.songTrackPlaceholder.isActivated = isHighlighted
|
||||
binding.songTrackBg.isActivated = isHighlighted
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@ import android.view.ViewGroup
|
|||
import android.view.WindowInsets
|
||||
import android.widget.FrameLayout
|
||||
import androidx.annotation.AttrRes
|
||||
import androidx.core.math.MathUtils
|
||||
import androidx.core.view.isInvisible
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
|
@ -38,6 +37,7 @@ import kotlin.math.abs
|
|||
import org.oxycblt.auxio.R
|
||||
import org.oxycblt.auxio.ui.EdgeRecyclerView
|
||||
import org.oxycblt.auxio.util.canScroll
|
||||
import org.oxycblt.auxio.util.clamp
|
||||
import org.oxycblt.auxio.util.getDimenOffsetSafe
|
||||
import org.oxycblt.auxio.util.getDimenSizeSafe
|
||||
import org.oxycblt.auxio.util.getDrawableSafe
|
||||
|
@ -266,8 +266,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
|||
val thumbAnchorY = thumbView.paddingTop
|
||||
|
||||
val popupTop =
|
||||
MathUtils.clamp(
|
||||
thumbTop + thumbAnchorY - popupAnchorY,
|
||||
(thumbTop + thumbAnchorY - popupAnchorY).clamp(
|
||||
thumbPadding.top + popupLayoutParams.topMargin,
|
||||
height - thumbPadding.bottom - popupLayoutParams.bottomMargin - popupHeight)
|
||||
|
||||
|
@ -365,7 +364,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
|||
}
|
||||
|
||||
private fun scrollToThumbOffset(thumbOffset: Int) {
|
||||
val clampedThumbOffset = MathUtils.clamp(thumbOffset, 0, thumbOffsetRange)
|
||||
val clampedThumbOffset = thumbOffset.clamp(0, thumbOffsetRange)
|
||||
|
||||
val scrollOffset =
|
||||
(scrollOffsetRange.toLong() * clampedThumbOffset / thumbOffsetRange).toInt() -
|
||||
|
|
|
@ -19,6 +19,8 @@ package org.oxycblt.auxio.util
|
|||
|
||||
import android.content.Context
|
||||
import android.content.res.ColorStateList
|
||||
import android.database.Cursor
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import android.graphics.Insets
|
||||
import android.graphics.Rect
|
||||
import android.graphics.drawable.Drawable
|
||||
|
@ -28,6 +30,7 @@ import android.view.WindowInsets
|
|||
import android.widget.TextView
|
||||
import androidx.annotation.ColorRes
|
||||
import androidx.core.graphics.drawable.DrawableCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.viewbinding.ViewBinding
|
||||
|
@ -137,6 +140,16 @@ fun RecyclerView.canScroll(): Boolean = computeVerticalScrollRange() > height
|
|||
val @receiver:ColorRes Int.stateList
|
||||
get() = ColorStateList.valueOf(this)
|
||||
|
||||
/** Require the fragment is attached to an activity. */
|
||||
fun Fragment.requireAttached() = check(!isDetached) { "Fragment is detached from activity" }
|
||||
|
||||
/**
|
||||
* Shortcut for querying all items in a database and running [block] with the cursor returned. Will
|
||||
* not run if the cursor is null.
|
||||
*/
|
||||
fun <R> SQLiteDatabase.queryAll(tableName: String, block: (Cursor) -> R) =
|
||||
query(tableName, null, null, null, null, null, null)?.use(block)
|
||||
|
||||
/**
|
||||
* Resolve system bar insets in a version-aware manner. This can be used to apply padding to a view
|
||||
* that properly follows all the frustrating changes that were made between 8-11.
|
|
@ -17,20 +17,10 @@
|
|||
|
||||
package org.oxycblt.auxio.util
|
||||
|
||||
import android.database.Cursor
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import android.os.Looper
|
||||
import androidx.core.math.MathUtils
|
||||
import androidx.fragment.app.Fragment
|
||||
import org.oxycblt.auxio.BuildConfig
|
||||
|
||||
/**
|
||||
* Shortcut for querying all items in a database and running [block] with the cursor returned. Will
|
||||
* not run if the cursor is null.
|
||||
*/
|
||||
fun <R> SQLiteDatabase.queryAll(tableName: String, block: (Cursor) -> R) =
|
||||
query(tableName, null, null, null, null, null, null)?.use(block)
|
||||
|
||||
/** Assert that we are on a background thread. */
|
||||
fun assertBackgroundThread() {
|
||||
check(Looper.myLooper() != Looper.getMainLooper()) {
|
||||
|
@ -50,11 +40,4 @@ fun <T> unlikelyToBeNull(value: T?): T {
|
|||
}
|
||||
}
|
||||
|
||||
/** Require the fragment is attached to an activity. */
|
||||
fun Fragment.requireAttached() = check(!isDetached) { "Fragment is detached from activity" }
|
||||
|
||||
fun Int.clamp(min: Int, max: Int): Int = MathUtils.clamp(this, min, max)
|
||||
|
||||
fun Long.clamp(min: Long, max: Long): Long = MathUtils.clamp(this, min, max)
|
||||
|
||||
fun Float.clamp(min: Float, max: Float): Float = MathUtils.clamp(this, min, max)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:alpha="0.64" android:color="?attr/colorPrimaryContainer"
|
||||
<item android:color="?attr/colorPrimaryContainer"
|
||||
android:state_activated="true" />
|
||||
<item android:alpha="0.32" android:color="?attr/colorSurfaceVariant" />
|
||||
<item android:color="?attr/colorOnSurfaceInverse" />
|
||||
</selector>
|
|
@ -2,5 +2,5 @@
|
|||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="?attr/colorOnPrimaryContainer"
|
||||
android:state_activated="true" />
|
||||
<item android:color="?attr/colorOnSurfaceVariant" />
|
||||
<item android:color="?attr/colorSurfaceInverse" />
|
||||
</selector>
|
|
@ -2,7 +2,7 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="?attr/colorPrimary"
|
||||
android:tint="@color/sel_on_cover_bg"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="?attr/colorPrimary"
|
||||
android:tint="@color/sel_on_cover_bg"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="?attr/colorPrimary"
|
||||
android:tint="@color/sel_on_cover_bg"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="?attr/colorPrimary"
|
||||
android:tint="@color/sel_on_cover_bg"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="@color/sel_track_bg" />
|
||||
</shape>
|
|
@ -6,7 +6,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/spacing_medium">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/detail_cover"
|
||||
style="@style/Widget.Auxio.Image.Huge"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
<androidx.constraintlayout.widget.ConstraintLayout 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/playback_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -15,7 +14,7 @@
|
|||
app:title="@string/lbl_playback"
|
||||
tools:subtitle="@string/lbl_all_songs" />
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Full"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
|
@ -95,7 +94,6 @@
|
|||
app:thumbRadius="@dimen/slider_thumb_radius" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_position"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
|
@ -107,7 +105,6 @@
|
|||
tools:text="11:38" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_duration"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/spacing_small_inv"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/spacing_medium">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/detail_cover"
|
||||
style="@style/Widget.Auxio.Image.Large"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
<androidx.constraintlayout.widget.ConstraintLayout 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/playback_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -15,7 +14,7 @@
|
|||
app:title="@string/lbl_playback"
|
||||
tools:subtitle="@string/lbl_all_songs" />
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Full"
|
||||
android:layout_margin="@dimen/spacing_mid_large"
|
||||
|
@ -93,7 +92,6 @@
|
|||
app:thumbRadius="@dimen/slider_thumb_radius" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_position"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
|
@ -105,7 +103,6 @@
|
|||
tools:text="11:38" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_duration"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/spacing_small_inv"
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
<androidx.constraintlayout.widget.ConstraintLayout 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/playback_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -16,7 +15,7 @@
|
|||
app:title="@string/lbl_playback"
|
||||
tools:subtitle="@string/lbl_all_songs" />
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Full"
|
||||
android:layout_margin="@dimen/spacing_large"
|
||||
|
@ -82,7 +81,6 @@
|
|||
app:thumbRadius="@dimen/slider_thumb_radius" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_position"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
|
@ -94,7 +92,6 @@
|
|||
tools:text="11:38" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_duration"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/spacing_small_inv"
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/spacing_medium">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/detail_cover"
|
||||
style="@style/Widget.Auxio.Image.MidHuge"
|
||||
app:layout_constraintDimensionRatio="1"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Medium"
|
||||
android:layout_margin="@dimen/spacing_small"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/spacing_medium">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/detail_cover"
|
||||
style="@style/Widget.Auxio.Image.Huge"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
<androidx.constraintlayout.widget.ConstraintLayout 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/playback_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -16,7 +15,7 @@
|
|||
app:title="@string/lbl_playback"
|
||||
tools:subtitle="@string/lbl_all_songs" />
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Full"
|
||||
android:layout_margin="@dimen/spacing_medium"
|
||||
|
@ -95,7 +94,6 @@
|
|||
app:thumbRadius="@dimen/slider_thumb_radius" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_position"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
|
@ -107,7 +105,6 @@
|
|||
tools:text="11:38" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_duration"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/spacing_small_inv"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Small"
|
||||
android:layout_margin="@dimen/spacing_small"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
<androidx.recyclerview.widget.RecyclerView 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"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:overScrollMode="never"
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/excluded_recycler"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="center"
|
||||
|
@ -20,7 +19,6 @@
|
|||
tools:listitem="@layout/item_excluded_dir" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/excluded_empty"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/spacing_medium"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
<androidx.recyclerview.widget.RecyclerView 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"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:overScrollMode="never"
|
||||
|
|
|
@ -8,19 +8,16 @@
|
|||
tools:context=".settings.AboutFragment">
|
||||
|
||||
<org.oxycblt.auxio.ui.EdgeAppBarLayout
|
||||
android:id="@+id/about_appbar"
|
||||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/about_toolbar"
|
||||
style="@style/Widget.Auxio.Toolbar.Icon"
|
||||
app:title="@string/lbl_about" />
|
||||
|
||||
</org.oxycblt.auxio.ui.EdgeAppBarLayout>
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/about_contents"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
|
@ -162,7 +159,6 @@
|
|||
tools:text="Songs Loaded: 1616" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/about_author"
|
||||
style="@style/Widget.Auxio.TextView.Icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
<FrameLayout 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/bar_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -11,7 +10,6 @@
|
|||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.detail.DetailAppBarLayout
|
||||
android:id="@+id/detail_appbar"
|
||||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
app:liftOnScroll="true"
|
||||
app:liftOnScrollTargetViewId="@id/detail_recycler">
|
||||
|
|
|
@ -2,23 +2,19 @@
|
|||
<org.oxycblt.auxio.ui.EdgeCoordinatorLayout 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/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.EdgeAppBarLayout
|
||||
android:id="@+id/home_appbar"
|
||||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/home_toolbar"
|
||||
style="@style/Widget.Auxio.Toolbar"
|
||||
app:menu="@menu/menu_home"
|
||||
app:title="@string/info_app_name" />
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/home_tabs"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent"
|
||||
|
@ -38,14 +34,12 @@
|
|||
tools:layout="@layout/fragment_home_list" />
|
||||
|
||||
<org.oxycblt.auxio.home.EdgeFabContainer
|
||||
android:id="@+id/home_fab_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_anchor="@id/home_pager"
|
||||
app:layout_anchorGravity="bottom|end">
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/home_fab"
|
||||
style="@style/Widget.Auxio.FloatingActionButton.Adaptive"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
<org.oxycblt.auxio.home.fastscroll.FastScrollRecyclerView 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/home_recycler"
|
||||
style="@style/Widget.Auxio.RecyclerView.WithAdaptiveFab"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.BottomSheetLayout
|
||||
android:id="@+id/bottom_sheet_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -33,7 +32,6 @@
|
|||
</org.oxycblt.auxio.ui.BottomSheetLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_too_small"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/colorSurface"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Small"
|
||||
android:layout_margin="@dimen/spacing_small"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
<androidx.constraintlayout.widget.ConstraintLayout 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/playback_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -15,7 +14,7 @@
|
|||
app:title="@string/lbl_playback"
|
||||
tools:subtitle="@string/lbl_all_songs" />
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/playback_cover"
|
||||
style="@style/Widget.Auxio.Image.Full"
|
||||
android:layout_margin="@dimen/spacing_medium"
|
||||
|
@ -79,7 +78,6 @@
|
|||
app:thumbRadius="@dimen/slider_thumb_radius" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_position"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
|
@ -91,7 +89,6 @@
|
|||
tools:text="11:38" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_duration"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/spacing_small_inv"
|
||||
|
|
|
@ -2,19 +2,16 @@
|
|||
<org.oxycblt.auxio.ui.EdgeCoordinatorLayout 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/queue_coordinator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<org.oxycblt.auxio.ui.EdgeAppBarLayout
|
||||
android:id="@+id/queue_appbar"
|
||||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
app:liftOnScroll="true"
|
||||
app:liftOnScrollTargetViewId="@id/queue_recycler">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/queue_toolbar"
|
||||
style="@style/Widget.Auxio.Toolbar.Icon.Down"
|
||||
android:elevation="0dp"
|
||||
app:navigationIcon="@drawable/ic_down"
|
||||
|
|
|
@ -6,18 +6,15 @@
|
|||
android:layout_height="match_parent">
|
||||
|
||||
<org.oxycblt.auxio.ui.EdgeAppBarLayout
|
||||
android:id="@+id/search_appbar"
|
||||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
app:liftOnScroll="true"
|
||||
app:liftOnScrollTargetViewId="@id/search_recycler">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/search_toolbar"
|
||||
style="@style/Widget.Auxio.Toolbar.Icon"
|
||||
app:menu="@menu/menu_search">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/search_text_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:endIconContentDescription="@string/desc_clear_search"
|
||||
|
@ -28,7 +25,6 @@
|
|||
app:hintEnabled="false">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/search_edit_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent"
|
||||
|
|
|
@ -2,20 +2,17 @@
|
|||
|
||||
<org.oxycblt.auxio.ui.EdgeCoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/settings_coordinator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<org.oxycblt.auxio.ui.EdgeAppBarLayout
|
||||
android:id="@+id/settings_appbar"
|
||||
style="@style/Widget.Auxio.AppBarLayout"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/settings_toolbar"
|
||||
style="@style/Widget.Auxio.Toolbar.Icon"
|
||||
app:title="@string/set_title" />
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
android:theme="@style/ThemeOverlay.Accent">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/accent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
|
|
|
@ -10,29 +10,14 @@
|
|||
to be alike to other songs. So, add a pastel-ish background to each track number
|
||||
view. The way we do this is odd, but it's designed this way-->
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
android:id="@+id/song_track_bg"
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
style="@style/Widget.Auxio.Image.Small"
|
||||
android:src="@drawable/ui_track_bg"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/song_track"
|
||||
app:layout_constraintEnd_toEndOf="@+id/song_track"
|
||||
app:layout_constraintStart_toStartOf="@+id/song_track"
|
||||
app:layout_constraintTop_toTopOf="@+id/song_track"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/song_track_placeholder"
|
||||
style="@style/Widget.Auxio.Image.Small"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:contentDescription="@string/def_track"
|
||||
android:src="@drawable/ic_song"
|
||||
android:visibility="gone"
|
||||
android:scaleType="matrix"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/song_track"
|
||||
app:layout_constraintEnd_toEndOf="@+id/song_track"
|
||||
app:layout_constraintStart_toStartOf="@+id/song_track"
|
||||
app:layout_constraintTop_toTopOf="@+id/song_track"
|
||||
app:tint="@color/sel_on_track_bg"
|
||||
tools:text="1" />
|
||||
app:layout_constraintTop_toTopOf="@+id/song_track" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/song_track"
|
||||
|
@ -46,7 +31,7 @@
|
|||
app:autoSizeStepGranularity="@dimen/text_size_track_number_step"
|
||||
android:textAlignment="center"
|
||||
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
|
||||
android:textColor="@color/sel_on_track_bg"
|
||||
android:textColor="@color/sel_on_cover_bg"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/song_name"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
style="@style/Widget.Auxio.ItemLayout">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/artist_image"
|
||||
style="@style/Widget.Auxio.Image.Medium"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/spacing_medium">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/detail_cover"
|
||||
style="@style/Widget.Auxio.Image.MidHuge"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
android:padding="0dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/excluded_path"
|
||||
style="@style/Widget.Auxio.TextView.Item.Primary"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
style="@style/Widget.Auxio.ItemLayout">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/parent_image"
|
||||
style="@style/Widget.Auxio.Image.Medium"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
android:layout_height="wrap_content">
|
||||
|
||||
<View
|
||||
android:id="@+id/background"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/colorPrimary"
|
||||
|
@ -22,12 +21,11 @@
|
|||
app:tint="?attr/colorSurface" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/body"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/colorSurface">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/song_album_cover"
|
||||
style="@style/Widget.Auxio.Image.Small"
|
||||
android:layout_margin="@dimen/spacing_medium"
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
style="@style/Widget.Auxio.ItemLayout">
|
||||
|
||||
<org.oxycblt.auxio.coil.RoundableImageView
|
||||
<org.oxycblt.auxio.coil.StyledImageView
|
||||
android:id="@+id/song_album_cover"
|
||||
style="@style/Widget.Auxio.Image.Small"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/header_title"
|
||||
style="@style/Widget.Auxio.TextView.Header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -17,7 +16,6 @@
|
|||
tools:text="Songs" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/header_button"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge 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"
|
||||
tools:layout_height="wrap_content"
|
||||
tools:layout_width="match_parent"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
<com.google.android.material.slider.Slider
|
||||
android:id="@+id/seek_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/spacing_medium"
|
||||
android:paddingStart="@dimen/spacing_small"
|
||||
android:paddingEnd="@dimen/spacing_small"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="1"
|
||||
app:haloRadius="@dimen/slider_halo_radius"
|
||||
app:labelBehavior="gone"
|
||||
app:labelStyle="@style/TextAppearance.Auxio.BodySmall"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:thumbRadius="@dimen/slider_thumb_radius" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_position"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:layout_marginBottom="@dimen/spacing_small"
|
||||
android:textAppearance="@style/TextAppearance.Auxio.BodyMedium"
|
||||
android:textColor="@color/sel_accented_secondary"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="11:38" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/playback_duration"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/spacing_medium"
|
||||
android:layout_marginBottom="@dimen/spacing_small"
|
||||
android:textAppearance="@style/TextAppearance.Auxio.BodyMedium"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:text="16:16" />
|
||||
|
||||
</merge>
|
|
@ -24,7 +24,7 @@
|
|||
<color name="red_surface_variant">#534341</color>
|
||||
<color name="red_on_surface_variant">#D8C2BF</color>
|
||||
<color name="red_surface_inverse">#EDE0DE</color>
|
||||
<color name="red_on_surface_inverse">#211A19</color>
|
||||
<color name="red_on_surface_inverse">#362F2E</color>
|
||||
|
||||
<color name="pink_primary">#FFB2C0</color>
|
||||
<color name="pink_on_primary">#670024</color>
|
||||
|
@ -48,7 +48,7 @@
|
|||
<color name="pink_surface_variant">#524345</color>
|
||||
<color name="pink_on_surface_variant">#D6C1C3</color>
|
||||
<color name="pink_surface_inverse">#ECE0E0</color>
|
||||
<color name="pink_on_surface_inverse">#201A1B</color>
|
||||
<color name="pink_on_surface_inverse">#352F2F</color>
|
||||
|
||||
<color name="purple_primary">#FBAAFF</color>
|
||||
<color name="purple_on_primary">#570068</color>
|
||||
|
@ -72,7 +72,7 @@
|
|||
<color name="purple_surface_variant">#4D444C</color>
|
||||
<color name="purple_on_surface_variant">#D0C3CC</color>
|
||||
<color name="purple_surface_inverse">#E9E0E5</color>
|
||||
<color name="purple_on_surface_inverse">#1E1A1D</color>
|
||||
<color name="purple_on_surface_inverse">#332F32</color>
|
||||
|
||||
<color name="deep_purple_primary">#D4BAFF</color>
|
||||
<color name="deep_purple_on_primary">#3E008E</color>
|
||||
|
@ -96,7 +96,7 @@
|
|||
<color name="deep_purple_surface_variant">#49454E</color>
|
||||
<color name="deep_purple_on_surface_variant">#CBC4CF</color>
|
||||
<color name="deep_purple_surface_inverse">#E6E1E5</color>
|
||||
<color name="deep_purple_on_surface_inverse">#1D1B1F</color>
|
||||
<color name="deep_purple_on_surface_inverse">#323033</color>
|
||||
|
||||
<color name="indigo_primary">#B9C3FF</color>
|
||||
<color name="indigo_on_primary">#08218A</color>
|
||||
|
@ -120,7 +120,7 @@
|
|||
<color name="indigo_surface_variant">#46464F</color>
|
||||
<color name="indigo_on_surface_variant">#C6C5D0</color>
|
||||
<color name="indigo_surface_inverse">#E4E1E6</color>
|
||||
<color name="indigo_on_surface_inverse">#1B1B1F</color>
|
||||
<color name="indigo_on_surface_inverse">#303034</color>
|
||||
|
||||
<color name="blue_primary">#9CCAFF</color>
|
||||
<color name="blue_on_primary">#00325A</color>
|
||||
|
@ -144,7 +144,7 @@
|
|||
<color name="blue_surface_variant">#42474E</color>
|
||||
<color name="blue_on_surface_variant">#C3C7D0</color>
|
||||
<color name="blue_surface_inverse">#E2E2E6</color>
|
||||
<color name="blue_on_surface_inverse">#1B1B1B</color>
|
||||
<color name="blue_on_surface_inverse">#2F3033</color>
|
||||
|
||||
<color name="deep_blue_primary">#62D3FF</color>
|
||||
<color name="deep_blue_on_primary">#003546</color>
|
||||
|
@ -168,7 +168,7 @@
|
|||
<color name="deep_blue_surface_variant">#40484C</color>
|
||||
<color name="deep_blue_on_surface_variant">#C0C8CD</color>
|
||||
<color name="deep_blue_surface_inverse">#E1E2E4</color>
|
||||
<color name="deep_blue_on_surface_inverse">#191C1E</color>
|
||||
<color name="deep_blue_on_surface_inverse">#2F3132</color>
|
||||
|
||||
<color name="cyan_primary">#44D8F1</color>
|
||||
<color name="cyan_on_primary">#00363F</color>
|
||||
|
@ -192,7 +192,7 @@
|
|||
<color name="cyan_surface_variant">#3F484A</color>
|
||||
<color name="cyan_on_surface_variant">#BFC8CA</color>
|
||||
<color name="cyan_surface_inverse">#E1E3E3</color>
|
||||
<color name="cyan_on_surface_inverse">#191C1D</color>
|
||||
<color name="cyan_on_surface_inverse">#2D3132</color>
|
||||
|
||||
<color name="teal_primary">#53DBC9</color>
|
||||
<color name="teal_on_primary">#003730</color>
|
||||
|
@ -216,7 +216,7 @@
|
|||
<color name="teal_surface_variant">#3F4947</color>
|
||||
<color name="teal_on_surface_variant">#BFC9C6</color>
|
||||
<color name="teal_surface_inverse">#E0E3E1</color>
|
||||
<color name="teal_on_surface_inverse">#191C1B</color>
|
||||
<color name="teal_on_surface_inverse">#2E3130</color>
|
||||
|
||||
<color name="green_primary">#78DC77</color>
|
||||
<color name="green_on_primary">#003907</color>
|
||||
|
@ -240,7 +240,7 @@
|
|||
<color name="green_surface_variant">#424840</color>
|
||||
<color name="green_on_surface_variant">#C2C8BD</color>
|
||||
<color name="green_surface_inverse">#E2E3DD</color>
|
||||
<color name="green_on_surface_inverse">#1A1C19</color>
|
||||
<color name="green_on_surface_inverse">#2F312D</color>
|
||||
|
||||
<color name="deep_green_primary">#9ED75C</color>
|
||||
<color name="deep_green_on_primary">#1C3700</color>
|
||||
|
@ -264,7 +264,7 @@
|
|||
<color name="deep_green_surface_variant">#44483D</color>
|
||||
<color name="deep_green_on_surface_variant">#C4C8B9</color>
|
||||
<color name="deep_green_surface_inverse">#E3E3DB</color>
|
||||
<color name="deep_green_on_surface_inverse">#1A1C17</color>
|
||||
<color name="deep_green_on_surface_inverse">#2F312C</color>
|
||||
|
||||
<color name="lime_primary">#C1D02C</color>
|
||||
<color name="lime_on_primary">#2E3400</color>
|
||||
|
@ -288,7 +288,7 @@
|
|||
<color name="lime_surface_variant">#47473B</color>
|
||||
<color name="lime_on_surface_variant">#C8C7B7</color>
|
||||
<color name="lime_surface_inverse">#E5E2DA</color>
|
||||
<color name="lime_on_surface_inverse">#1C1C17</color>
|
||||
<color name="lime_on_surface_inverse">#31312B</color>
|
||||
|
||||
<color name="yellow_primary">#FABD00</color>
|
||||
<color name="yellow_on_primary">#402D00</color>
|
||||
|
@ -312,7 +312,7 @@
|
|||
<color name="yellow_surface_variant">#4D4639</color>
|
||||
<color name="yellow_on_surface_variant">#D0C5B4</color>
|
||||
<color name="yellow_surface_inverse">#E9E1D8</color>
|
||||
<color name="yellow_on_surface_inverse">#1E1B16</color>
|
||||
<color name="yellow_on_surface_inverse">#3C2E16</color>
|
||||
|
||||
<color name="orange_primary">#FFB86D</color>
|
||||
<color name="orange_on_primary">#4B2800</color>
|
||||
|
@ -336,7 +336,7 @@
|
|||
<color name="orange_surface_variant">#51453A</color>
|
||||
<color name="orange_on_surface_variant">#D5C3B5</color>
|
||||
<color name="orange_surface_inverse">#EBE0D9</color>
|
||||
<color name="orange_on_surface_inverse">#1F1B17</color>
|
||||
<color name="orange_on_surface_inverse">#352F2B</color>
|
||||
|
||||
<color name="brown_primary">#E7BEB0</color>
|
||||
<color name="brown_on_primary">#442A20</color>
|
||||
|
@ -360,7 +360,7 @@
|
|||
<color name="brown_surface_variant">#52433E</color>
|
||||
<color name="brown_on_surface_variant">#D8C2BB</color>
|
||||
<color name="brown_surface_inverse">#EDE0DC</color>
|
||||
<color name="brown_on_surface_inverse">#201A18</color>
|
||||
<color name="brown_on_surface_inverse">#362F2D</color>
|
||||
|
||||
<color name="grey_primary">#EEEEEE</color>
|
||||
<color name="grey_on_primary">#424242</color>
|
||||
|
@ -384,7 +384,7 @@
|
|||
<color name="grey_surface_variant">#484848</color>
|
||||
<color name="grey_on_surface_variant">#C8C8C8</color>
|
||||
<color name="grey_surface_inverse">#fafafa</color>
|
||||
<color name="grey_on_surface_inverse">#191919</color>
|
||||
<color name="grey_on_surface_inverse">#2D3132</color>
|
||||
|
||||
<color name="widget_surface">@color/material_dynamic_secondary20</color>
|
||||
<color name="widget_surface_inverse">@color/material_dynamic_neutral90</color>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<declare-styleable name="RoundableImageView">
|
||||
<declare-styleable name="StyledImageView">
|
||||
<attr name="cornerRadius" format="dimension" />
|
||||
</declare-styleable>
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
<dimen name="size_corners_small">8dp</dimen>
|
||||
<dimen name="size_corners_large">16dp</dimen>
|
||||
|
||||
<dimen name="size_track_number">32dp</dimen>
|
||||
<dimen name="size_playback_icon">32dp</dimen>
|
||||
|
||||
<dimen name="text_size_ext_label_larger">16sp</dimen>
|
||||
|
|
|
@ -99,11 +99,6 @@
|
|||
<item name="android:textColor">?android:attr/textColorSecondary</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Auxio.TextView.Item.Tertiary" parent="Widget.Auxio.TextView.Item.Base">
|
||||
<item name="android:textAppearance">@style/TextAppearance.Auxio.BodyMedium</item>
|
||||
<item name="android:textColor">?android:attr/textColorSecondary</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Auxio.TextView.Primary" parent="Widget.Auxio.TextView.Base">
|
||||
<item name="android:ellipsize">marquee</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
|
|
Loading…
Reference in a new issue