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 - -