diff --git a/README.md b/README.md
index a5a281200..17572d179 100644
--- a/README.md
+++ b/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.
diff --git a/app/build.gradle b/app/build.gradle
index ea9707d8c..259cd2476 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 17c808f45..66e423a74 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -41,6 +41,7 @@
android:windowSoftInputMode="adjustPan">
+
@@ -50,6 +51,11 @@
+
@@ -80,6 +86,7 @@
+
.
- */
-
-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 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())
-}
diff --git a/app/src/main/java/org/oxycblt/auxio/coil/RoundableImageView.kt b/app/src/main/java/org/oxycblt/auxio/coil/RoundableImageView.kt
deleted file mode 100644
index 32d291179..000000000
--- a/app/src/main/java/org/oxycblt/auxio/coil/RoundableImageView.kt
+++ /dev/null
@@ -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 .
- */
-
-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
- }
- }
-}
diff --git a/app/src/main/java/org/oxycblt/auxio/coil/StyledImageView.kt b/app/src/main/java/org/oxycblt/auxio/coil/StyledImageView.kt
new file mode 100644
index 000000000..30ca20a4e
--- /dev/null
+++ b/app/src/main/java/org/oxycblt/auxio/coil/StyledImageView.kt
@@ -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 .
+ */
+
+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 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())
+}
diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt
index 79697ed86..6795b822d 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt
@@ -158,7 +158,7 @@ class DetailViewModel : ViewModel() {
private fun refreshAlbumData(album: Album) {
logD("Refreshing album data")
val data = mutableListOf- (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
}
diff --git a/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt
index cc7f31823..5c6f063a1 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt
@@ -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
}
diff --git a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt
index f491c83c3..339e78a87 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt
@@ -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() -
diff --git a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt
similarity index 91%
rename from app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt
rename to app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt
index 0c02a577f..6d3ae3ee3 100644
--- a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt
+++ b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt
@@ -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 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.
diff --git a/app/src/main/java/org/oxycblt/auxio/util/PrimitiveUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/PrimitiveUtil.kt
index 8bd7a18a6..ff2e37bf1 100644
--- a/app/src/main/java/org/oxycblt/auxio/util/PrimitiveUtil.kt
+++ b/app/src/main/java/org/oxycblt/auxio/util/PrimitiveUtil.kt
@@ -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 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 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)
diff --git a/app/src/main/res/color/sel_track_bg.xml b/app/src/main/res/color/sel_cover_bg.xml
similarity index 51%
rename from app/src/main/res/color/sel_track_bg.xml
rename to app/src/main/res/color/sel_cover_bg.xml
index 8eaa5f689..263db8a89 100644
--- a/app/src/main/res/color/sel_track_bg.xml
+++ b/app/src/main/res/color/sel_cover_bg.xml
@@ -1,6 +1,6 @@
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/color/sel_on_track_bg.xml b/app/src/main/res/color/sel_on_cover_bg.xml
similarity index 79%
rename from app/src/main/res/color/sel_on_track_bg.xml
rename to app/src/main/res/color/sel_on_cover_bg.xml
index cee50ef26..1adeb1060 100644
--- a/app/src/main/res/color/sel_on_track_bg.xml
+++ b/app/src/main/res/color/sel_on_cover_bg.xml
@@ -2,5 +2,5 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_album.xml b/app/src/main/res/drawable/ic_album.xml
index d5e444134..1c00b9e96 100644
--- a/app/src/main/res/drawable/ic_album.xml
+++ b/app/src/main/res/drawable/ic_album.xml
@@ -2,7 +2,7 @@
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout-h600dp/item_detail.xml b/app/src/main/res/layout-h600dp/item_detail.xml
index 64d5410f3..23514b56e 100644
--- a/app/src/main/res/layout-h600dp/item_detail.xml
+++ b/app/src/main/res/layout-h600dp/item_detail.xml
@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:padding="@dimen/spacing_medium">
-
@@ -15,7 +14,7 @@
app:title="@string/lbl_playback"
tools:subtitle="@string/lbl_all_songs" />
-
-
@@ -15,7 +14,7 @@
app:title="@string/lbl_playback"
tools:subtitle="@string/lbl_all_songs" />
-
@@ -16,7 +15,7 @@
app:title="@string/lbl_playback"
tools:subtitle="@string/lbl_all_songs" />
-
-
-
-
@@ -16,7 +15,7 @@
app:title="@string/lbl_playback"
tools:subtitle="@string/lbl_all_songs" />
-
-
@@ -11,7 +10,6 @@
android:layout_height="match_parent">
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 36b41da81..0d7d1a1d1 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -2,23 +2,19 @@
@@ -33,7 +32,6 @@
-
@@ -15,7 +14,7 @@
app:title="@string/lbl_playback"
tools:subtitle="@string/lbl_all_songs" />
-
diff --git a/app/src/main/res/layout/item_accent.xml b/app/src/main/res/layout/item_accent.xml
index 212ca04d5..d47d7e5df 100644
--- a/app/src/main/res/layout/item_accent.xml
+++ b/app/src/main/res/layout/item_accent.xml
@@ -8,7 +8,6 @@
android:theme="@style/ThemeOverlay.Accent">
-
-
-
+ app:layout_constraintTop_toTopOf="@+id/song_track" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml
index 2a00d3b84..903992c11 100644
--- a/app/src/main/res/values-night/colors.xml
+++ b/app/src/main/res/values-night/colors.xml
@@ -24,7 +24,7 @@
#534341
#D8C2BF
#EDE0DE
- #211A19
+ #362F2E
#FFB2C0
#670024
@@ -48,7 +48,7 @@
#524345
#D6C1C3
#ECE0E0
- #201A1B
+ #352F2F
#FBAAFF
#570068
@@ -72,7 +72,7 @@
#4D444C
#D0C3CC
#E9E0E5
- #1E1A1D
+ #332F32
#D4BAFF
#3E008E
@@ -96,7 +96,7 @@
#49454E
#CBC4CF
#E6E1E5
- #1D1B1F
+ #323033
#B9C3FF
#08218A
@@ -120,7 +120,7 @@
#46464F
#C6C5D0
#E4E1E6
- #1B1B1F
+ #303034
#9CCAFF
#00325A
@@ -144,7 +144,7 @@
#42474E
#C3C7D0
#E2E2E6
- #1B1B1B
+ #2F3033
#62D3FF
#003546
@@ -168,7 +168,7 @@
#40484C
#C0C8CD
#E1E2E4
- #191C1E
+ #2F3132
#44D8F1
#00363F
@@ -192,7 +192,7 @@
#3F484A
#BFC8CA
#E1E3E3
- #191C1D
+ #2D3132
#53DBC9
#003730
@@ -216,7 +216,7 @@
#3F4947
#BFC9C6
#E0E3E1
- #191C1B
+ #2E3130
#78DC77
#003907
@@ -240,7 +240,7 @@
#424840
#C2C8BD
#E2E3DD
- #1A1C19
+ #2F312D
#9ED75C
#1C3700
@@ -264,7 +264,7 @@
#44483D
#C4C8B9
#E3E3DB
- #1A1C17
+ #2F312C
#C1D02C
#2E3400
@@ -288,7 +288,7 @@
#47473B
#C8C7B7
#E5E2DA
- #1C1C17
+ #31312B
#FABD00
#402D00
@@ -312,7 +312,7 @@
#4D4639
#D0C5B4
#E9E1D8
- #1E1B16
+ #3C2E16
#FFB86D
#4B2800
@@ -336,7 +336,7 @@
#51453A
#D5C3B5
#EBE0D9
- #1F1B17
+ #352F2B
#E7BEB0
#442A20
@@ -360,7 +360,7 @@
#52433E
#D8C2BB
#EDE0DC
- #201A18
+ #362F2D
#EEEEEE
#424242
@@ -384,7 +384,7 @@
#484848
#C8C8C8
#fafafa
- #191919
+ #2D3132
@color/material_dynamic_secondary20
@color/material_dynamic_neutral90
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 616f08ecc..59ea42f73 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 942d3c352..a5192db02 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -21,7 +21,6 @@
8dp
16dp
- 32dp
32dp
16sp
diff --git a/app/src/main/res/values/styles_ui.xml b/app/src/main/res/values/styles_ui.xml
index a68d4ddb4..b5d836d1f 100644
--- a/app/src/main/res/values/styles_ui.xml
+++ b/app/src/main/res/values/styles_ui.xml
@@ -99,11 +99,6 @@
- ?android:attr/textColorSecondary
-
-