all: general cleanup
A bunch of changes that accumulated that I'm too lazy to split into good commits.
This commit is contained in:
parent
630950ea5d
commit
3fcd7e1a63
21 changed files with 90 additions and 80 deletions
|
|
@ -56,7 +56,7 @@ dependencies {
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2'
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3"
|
||||||
|
|
||||||
// --- SUPPORT ---
|
// --- SUPPORT ---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,11 +55,19 @@ val Long.audioUri: Uri
|
||||||
val Long.albumCoverUri: Uri
|
val Long.albumCoverUri: Uri
|
||||||
get() = ContentUris.withAppendedId(EXTERNAL_ALBUM_ART_URI, this)
|
get() = ContentUris.withAppendedId(EXTERNAL_ALBUM_ART_URI, this)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse out the number field from a field assumed to be NN, where NN is a track number. This is
|
||||||
|
* most commonly found on vorbis comments. Values of zero will be ignored under the assumption that
|
||||||
|
* they are invalid.
|
||||||
|
*/
|
||||||
|
val String.trackNo: Int?
|
||||||
|
get() = toIntOrNull()?.let { if (it > 0) it else null }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse out the number field from an NN/TT string that is typically found in DISC_NUMBER and
|
* Parse out the number field from an NN/TT string that is typically found in DISC_NUMBER and
|
||||||
* CD_TRACK_NUMBER. Values of zero will be ignored under the assumption that they are invalid.
|
* CD_TRACK_NUMBER. Values of zero will be ignored under the assumption that they are invalid.
|
||||||
*/
|
*/
|
||||||
val String.no: Int?
|
val String.trackDiscNo: Int?
|
||||||
get() = split('/', limit = 2)[0].toIntOrNull()?.let { if (it > 0) it else null }
|
get() = split('/', limit = 2)[0].toIntOrNull()?.let { if (it > 0) it else null }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,13 @@ import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.util.lazyReflectedMethod
|
import org.oxycblt.auxio.util.lazyReflectedMethod
|
||||||
import org.oxycblt.auxio.util.logEOrThrow
|
import org.oxycblt.auxio.util.logEOrThrow
|
||||||
|
|
||||||
|
/** A path to a file. [name] is the stripped file name, [parent] is the parent path. */
|
||||||
data class Path(val name: String, val parent: Directory)
|
data class Path(val name: String, val parent: Directory)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A path to a directory. [volume] is the volume the directory resides in, and [relativePath] is the
|
||||||
|
* path from the volume's root to the directory itself.
|
||||||
|
*/
|
||||||
data class Directory(val volume: StorageVolume, val relativePath: String) {
|
data class Directory(val volume: StorageVolume, val relativePath: String) {
|
||||||
init {
|
init {
|
||||||
if (relativePath.startsWith(File.separatorChar) ||
|
if (relativePath.startsWith(File.separatorChar) ||
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,8 @@ import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.music.audioUri
|
import org.oxycblt.auxio.music.audioUri
|
||||||
import org.oxycblt.auxio.music.id3GenreName
|
import org.oxycblt.auxio.music.id3GenreName
|
||||||
import org.oxycblt.auxio.music.iso8601year
|
import org.oxycblt.auxio.music.iso8601year
|
||||||
import org.oxycblt.auxio.music.no
|
import org.oxycblt.auxio.music.trackDiscNo
|
||||||
|
import org.oxycblt.auxio.music.trackNo
|
||||||
import org.oxycblt.auxio.music.year
|
import org.oxycblt.auxio.music.year
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.util.logW
|
import org.oxycblt.auxio.util.logW
|
||||||
|
|
@ -153,7 +154,9 @@ class Task(context: Context, private val audio: MediaStoreBackend.Audio) {
|
||||||
return audio.toSong()
|
return audio.toSong()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Populate the format mime type if we have one.
|
||||||
format.sampleMimeType?.let { audio.formatMimeType = it }
|
format.sampleMimeType?.let { audio.formatMimeType = it }
|
||||||
|
|
||||||
val metadata = format.metadata
|
val metadata = format.metadata
|
||||||
if (metadata != null) {
|
if (metadata != null) {
|
||||||
completeAudio(metadata)
|
completeAudio(metadata)
|
||||||
|
|
@ -209,13 +212,13 @@ class Task(context: Context, private val audio: MediaStoreBackend.Audio) {
|
||||||
tags["TIT2"]?.let { audio.title = it }
|
tags["TIT2"]?.let { audio.title = it }
|
||||||
|
|
||||||
// Track, as NN/TT
|
// Track, as NN/TT
|
||||||
tags["TRCK"]?.no?.let { audio.track = it }
|
tags["TRCK"]?.trackDiscNo?.let { audio.track = it }
|
||||||
|
|
||||||
// Disc, as NN/TT
|
// Disc, as NN/TT
|
||||||
tags["TPOS"]?.no?.let { audio.disc = it }
|
tags["TPOS"]?.trackDiscNo?.let { audio.disc = it }
|
||||||
|
|
||||||
// Dates are somewhat complicated, as not only did their semantics change from a flat year
|
// Dates are somewhat complicated, as not only did their semantics change from a flat year
|
||||||
// value in ID3v2.3 to a full ISO-8601 date in ID3v2.4, but there are also a variety of
|
// value in ID3v2.3 to a full ISO-8601 date in ID3v2.4, but there are also a variety of
|
||||||
// date types.
|
// date types.
|
||||||
// Our hierarchy for dates is as such:
|
// Our hierarchy for dates is as such:
|
||||||
// 1. ID3v2.4 Original Date, as it resolves the "Released in X, Remastered in Y" issue
|
// 1. ID3v2.4 Original Date, as it resolves the "Released in X, Remastered in Y" issue
|
||||||
|
|
@ -223,11 +226,9 @@ class Task(context: Context, private val audio: MediaStoreBackend.Audio) {
|
||||||
// 3. ID3v2.4 Release Date, as it is the second most common date type
|
// 3. ID3v2.4 Release Date, as it is the second most common date type
|
||||||
// 4. ID3v2.3 Original Date, as it is like #1
|
// 4. ID3v2.3 Original Date, as it is like #1
|
||||||
// 5. ID3v2.3 Release Year, as it is the most common date type
|
// 5. ID3v2.3 Release Year, as it is the most common date type
|
||||||
tags["TYER"]?.year?.let { audio.year = it }
|
audio.year
|
||||||
tags["TORY"]?.year?.let { audio.year = it }
|
?: tags["TDOR"]?.iso8601year ?: tags["TDRC"]?.iso8601year ?: tags["TDRL"]?.iso8601year
|
||||||
tags["TDRL"]?.iso8601year?.let { audio.year = it }
|
?: tags["TORY"]?.year ?: tags["TYER"]?.year
|
||||||
tags["TDRC"]?.iso8601year?.let { audio.year = it }
|
|
||||||
tags["TDOR"]?.iso8601year?.let { audio.year = it }
|
|
||||||
|
|
||||||
// Album
|
// Album
|
||||||
tags["TALB"]?.let { audio.album = it }
|
tags["TALB"]?.let { audio.album = it }
|
||||||
|
|
@ -246,11 +247,11 @@ class Task(context: Context, private val audio: MediaStoreBackend.Audio) {
|
||||||
// Title
|
// Title
|
||||||
tags["TITLE"]?.let { audio.title = it }
|
tags["TITLE"]?.let { audio.title = it }
|
||||||
|
|
||||||
// Track, might be NN/TT, most often though TOTALTRACKS handles T.
|
// Track. Probably not NN/TT, as TOTALTRACKS handles totals.
|
||||||
tags["TRACKNUMBER"]?.no?.let { audio.track = it }
|
tags["TRACKNUMBER"]?.trackNo?.let { audio.track = it }
|
||||||
|
|
||||||
// Disc, might be NN/TT, most often though TOTALDISCS handles T.
|
// Disc. Probably not NN/TT, as TOTALDISCS handles totals.
|
||||||
tags["DISCNUMBER"]?.no?.let { audio.disc = it }
|
tags["DISCNUMBER"]?.trackNo?.let { audio.disc = it }
|
||||||
|
|
||||||
// Vorbis dates are less complicated, but there are still several types
|
// Vorbis dates are less complicated, but there are still several types
|
||||||
// Our hierarchy for dates is as such:
|
// Our hierarchy for dates is as such:
|
||||||
|
|
@ -258,9 +259,8 @@ class Task(context: Context, private val audio: MediaStoreBackend.Audio) {
|
||||||
// 2. Date, as it is the most common date type
|
// 2. Date, as it is the most common date type
|
||||||
// 3. Year, as old vorbis tags tended to use this (I know this because it's the only
|
// 3. Year, as old vorbis tags tended to use this (I know this because it's the only
|
||||||
// tag that android supports, so it must be 15 years old or more!)
|
// tag that android supports, so it must be 15 years old or more!)
|
||||||
tags["YEAR"]?.year?.let { audio.year = it }
|
audio.year =
|
||||||
tags["DATE"]?.iso8601year?.let { audio.year = it }
|
tags["ORIGINALDATE"]?.iso8601year ?: tags["DATE"]?.iso8601year ?: tags["YEAR"]?.year
|
||||||
tags["ORIGINALDATE"]?.iso8601year?.let { audio.year = it }
|
|
||||||
|
|
||||||
// Album
|
// Album
|
||||||
tags["ALBUM"]?.let { audio.album = it }
|
tags["ALBUM"]?.let { audio.album = it }
|
||||||
|
|
@ -271,8 +271,7 @@ class Task(context: Context, private val audio: MediaStoreBackend.Audio) {
|
||||||
// Album artist. This actually comes into two flavors:
|
// Album artist. This actually comes into two flavors:
|
||||||
// 1. ALBUMARTIST, which is the most common
|
// 1. ALBUMARTIST, which is the most common
|
||||||
// 2. ALBUM ARTIST, which is present on older vorbis tags
|
// 2. ALBUM ARTIST, which is present on older vorbis tags
|
||||||
tags["ALBUM ARTIST"]?.let { audio.albumArtist = it }
|
audio.albumArtist = tags["ALBUMARTIST"] ?: tags["ALBUM ARTIST"]
|
||||||
tags["ALBUMARTIST"]?.let { audio.albumArtist = it }
|
|
||||||
|
|
||||||
// Genre, no ID3 rules here
|
// Genre, no ID3 rules here
|
||||||
tags["GENRE"]?.let { audio.genre = it }
|
tags["GENRE"]?.let { audio.genre = it }
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,9 @@ import org.oxycblt.auxio.music.audioUri
|
||||||
import org.oxycblt.auxio.music.directoryCompat
|
import org.oxycblt.auxio.music.directoryCompat
|
||||||
import org.oxycblt.auxio.music.id3GenreName
|
import org.oxycblt.auxio.music.id3GenreName
|
||||||
import org.oxycblt.auxio.music.mediaStoreVolumeNameCompat
|
import org.oxycblt.auxio.music.mediaStoreVolumeNameCompat
|
||||||
import org.oxycblt.auxio.music.no
|
|
||||||
import org.oxycblt.auxio.music.queryCursor
|
import org.oxycblt.auxio.music.queryCursor
|
||||||
import org.oxycblt.auxio.music.storageVolumesCompat
|
import org.oxycblt.auxio.music.storageVolumesCompat
|
||||||
|
import org.oxycblt.auxio.music.trackDiscNo
|
||||||
import org.oxycblt.auxio.music.useQuery
|
import org.oxycblt.auxio.music.useQuery
|
||||||
import org.oxycblt.auxio.settings.Settings
|
import org.oxycblt.auxio.settings.Settings
|
||||||
import org.oxycblt.auxio.util.contentResolverSafe
|
import org.oxycblt.auxio.util.contentResolverSafe
|
||||||
|
|
@ -72,8 +72,8 @@ import org.oxycblt.auxio.util.logD
|
||||||
* the metadata parser has a brain aneurysm the moment it stumbles upon a dreaded TRDC or DATE tag.
|
* the metadata parser has a brain aneurysm the moment it stumbles upon a dreaded TRDC or DATE tag.
|
||||||
* Once again, this is because internally android uses an ancient in-house metadata parser to get
|
* Once again, this is because internally android uses an ancient in-house metadata parser to get
|
||||||
* everything indexed, and so far they have not bothered to modernize this parser or even switch it
|
* everything indexed, and so far they have not bothered to modernize this parser or even switch it
|
||||||
* to something more powerful like Taglib, not even in Android 12. ID3v2.4 has been around for *21
|
* to something that actually works, not even in Android 12. ID3v2.4 has been around for *21
|
||||||
* years.* *It can drink now.* All of my what.
|
* years.* *It can drink now.*
|
||||||
*
|
*
|
||||||
* Not to mention all the other infuriating quirks. Album artists can't be accessed from the albums
|
* Not to mention all the other infuriating quirks. Album artists can't be accessed from the albums
|
||||||
* table, so we have to go for the less efficient "make a big query on all the songs lol" method so
|
* table, so we have to go for the less efficient "make a big query on all the songs lol" method so
|
||||||
|
|
@ -489,8 +489,7 @@ open class VolumeAwareMediaStoreBackend : MediaStoreBackend() {
|
||||||
"AND ${MediaStore.Audio.AudioColumns.RELATIVE_PATH} LIKE ?)"
|
"AND ${MediaStore.Audio.AudioColumns.RELATIVE_PATH} LIKE ?)"
|
||||||
|
|
||||||
override fun addDirToSelectorArgs(dir: Directory, args: MutableList<String>): Boolean {
|
override fun addDirToSelectorArgs(dir: Directory, args: MutableList<String>): Boolean {
|
||||||
// Leverage the volume field when selecting our directories. It's a little too
|
// Leverage new the volume field when selecting our directories.
|
||||||
// expensive to include this alongside the data checks, so we assume that
|
|
||||||
args.add(dir.volume.mediaStoreVolumeNameCompat ?: return false)
|
args.add(dir.volume.mediaStoreVolumeNameCompat ?: return false)
|
||||||
args.add("${dir.relativePath}%")
|
args.add("${dir.relativePath}%")
|
||||||
return true
|
return true
|
||||||
|
|
@ -508,9 +507,8 @@ open class VolumeAwareMediaStoreBackend : MediaStoreBackend() {
|
||||||
val volumeName = cursor.getString(volumeIndex)
|
val volumeName = cursor.getString(volumeIndex)
|
||||||
val relativePath = cursor.getString(relativePathIndex)
|
val relativePath = cursor.getString(relativePathIndex)
|
||||||
|
|
||||||
// We now have access to the volume name, so we try to leverage it instead.
|
// Find the StorageVolume whose MediaStore name corresponds to this song.
|
||||||
// I have no idea how well this works in practice, but I assume that the fields
|
// This is what we use for the Directory.
|
||||||
// probably exist.
|
|
||||||
val volume = volumes.find { it.mediaStoreVolumeNameCompat == volumeName }
|
val volume = volumes.find { it.mediaStoreVolumeNameCompat == volumeName }
|
||||||
if (volume != null) {
|
if (volume != null) {
|
||||||
audio.dir = Directory(volume, relativePath.removeSuffix(File.separator))
|
audio.dir = Directory(volume, relativePath.removeSuffix(File.separator))
|
||||||
|
|
@ -581,8 +579,8 @@ class Api30MediaStoreBackend : VolumeAwareMediaStoreBackend() {
|
||||||
// N is the number and T is the total. Parse the number while leaving out the
|
// N is the number and T is the total. Parse the number while leaving out the
|
||||||
// total, as we have no use for it.
|
// total, as we have no use for it.
|
||||||
|
|
||||||
cursor.getStringOrNull(trackIndex)?.no?.let { audio.track = it }
|
cursor.getStringOrNull(trackIndex)?.trackDiscNo?.let { audio.track = it }
|
||||||
cursor.getStringOrNull(discIndex)?.no?.let { audio.disc = it }
|
cursor.getStringOrNull(discIndex)?.trackDiscNo?.let { audio.disc = it }
|
||||||
|
|
||||||
return audio
|
return audio
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ import android.widget.FrameLayout
|
||||||
* always be LTR. In Auxio, this applies to most of the playback components. This layout in
|
* always be LTR. In Auxio, this applies to most of the playback components. This layout in
|
||||||
* particular overrides the layout direction in a way that will not disrupt how other views are laid
|
* particular overrides the layout direction in a way that will not disrupt how other views are laid
|
||||||
* out.
|
* out.
|
||||||
|
*
|
||||||
|
* @author OxygenCobalt
|
||||||
*/
|
*/
|
||||||
open class NoRtlFrameLayout
|
open class NoRtlFrameLayout
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@ class IntListPreferenceDialog : PreferenceDialogFragmentCompat() {
|
||||||
builder.setTitle(listPreference.title)
|
builder.setTitle(listPreference.title)
|
||||||
builder.setPositiveButton(null, null)
|
builder.setPositiveButton(null, null)
|
||||||
builder.setNegativeButton(R.string.lbl_cancel, null)
|
builder.setNegativeButton(R.string.lbl_cancel, null)
|
||||||
// TODO: Replace this with an in-house view
|
|
||||||
builder.setSingleChoiceItems(listPreference.entries, listPreference.getValueIndex()) {
|
builder.setSingleChoiceItems(listPreference.entries, listPreference.getValueIndex()) {
|
||||||
_,
|
_,
|
||||||
index ->
|
index ->
|
||||||
|
|
@ -79,15 +79,15 @@ data class Sort(val mode: Mode, val isAscending: Boolean) {
|
||||||
songs.sortWith(mode.getSongComparator(isAscending))
|
songs.sortWith(mode.getSongComparator(isAscending))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun albumsInPlace(albums: MutableList<Album>) {
|
private fun albumsInPlace(albums: MutableList<Album>) {
|
||||||
albums.sortWith(mode.getAlbumComparator(isAscending))
|
albums.sortWith(mode.getAlbumComparator(isAscending))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun artistsInPlace(artists: MutableList<Artist>) {
|
private fun artistsInPlace(artists: MutableList<Artist>) {
|
||||||
artists.sortWith(mode.getArtistComparator(isAscending))
|
artists.sortWith(mode.getArtistComparator(isAscending))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun genresInPlace(genres: MutableList<Genre>) {
|
private fun genresInPlace(genres: MutableList<Genre>) {
|
||||||
genres.sortWith(mode.getGenreComparator(isAscending))
|
genres.sortWith(mode.getGenreComparator(isAscending))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorPrimary"
|
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24"
|
||||||
<path
|
android:tint="?attr/colorControlNormal">
|
||||||
android:fillColor="@android:color/white"
|
<path
|
||||||
android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9s9,-4.03 9,-9c0,-0.46 -0.04,-0.92 -0.1,-1.36c-0.98,1.37 -2.58,2.26 -4.4,2.26c-2.98,0 -5.4,-2.42 -5.4,-5.4c0,-1.81 0.89,-3.42 2.26,-4.4C12.92,3.04 12.46,3 12,3L12,3z" />
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
||||||
11
app/src/main/res/drawable/ic_more.xml
Normal file
11
app/src/main/res/drawable/ic_more.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
|
||||||
|
</vector>
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item android:drawable="@drawable/ui_scroll_thumb" />
|
|
||||||
</selector>
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item android:drawable="@android:color/transparent" />
|
|
||||||
</selector>
|
|
||||||
Binary file not shown.
BIN
app/src/main/res/font/inter_regular.otf
Normal file
BIN
app/src/main/res/font/inter_regular.otf
Normal file
Binary file not shown.
BIN
app/src/main/res/font/inter_semibold.otf
Normal file
BIN
app/src/main/res/font/inter_semibold.otf
Normal file
Binary file not shown.
Binary file not shown.
|
|
@ -41,7 +41,7 @@
|
||||||
android:layout_marginEnd="@dimen/spacing_mid_large"
|
android:layout_marginEnd="@dimen/spacing_mid_large"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:minWidth="@dimen/size_pre_amp_ticker"
|
android:minWidth="@dimen/size_pre_amp_ticker"
|
||||||
android:textAppearance="@style/TextAppearance.Auxio.BodyMedium"
|
android:textAppearance="@style/TextAppearance.Auxio.LabelMedium"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/with_tags_slider"
|
app:layout_constraintBottom_toBottomOf="@+id/with_tags_slider"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/with_tags_slider"
|
app:layout_constraintTop_toTopOf="@+id/with_tags_slider"
|
||||||
|
|
@ -78,7 +78,7 @@
|
||||||
android:layout_marginEnd="@dimen/spacing_mid_large"
|
android:layout_marginEnd="@dimen/spacing_mid_large"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:minWidth="@dimen/size_pre_amp_ticker"
|
android:minWidth="@dimen/size_pre_amp_ticker"
|
||||||
android:textAppearance="@style/TextAppearance.Auxio.BodyMedium"
|
android:textAppearance="@style/TextAppearance.Auxio.LabelMedium"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/without_tags_slider"
|
app:layout_constraintBottom_toBottomOf="@+id/without_tags_slider"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/without_tags_slider"
|
app:layout_constraintTop_toTopOf="@+id/without_tags_slider"
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
<dimen name="size_icon_small">24dp</dimen>
|
<dimen name="size_icon_small">24dp</dimen>
|
||||||
<dimen name="size_icon_large">32dp</dimen>
|
<dimen name="size_icon_large">32dp</dimen>
|
||||||
|
|
||||||
<dimen name="size_pre_amp_ticker">64dp</dimen>
|
<dimen name="size_pre_amp_ticker">56dp</dimen>
|
||||||
|
|
||||||
<dimen name="text_size_ext_label_larger">16sp</dimen>
|
<dimen name="text_size_ext_label_larger">16sp</dimen>
|
||||||
<dimen name="text_size_ext_title_mid_large">18sp</dimen>
|
<dimen name="text_size_ext_title_mid_large">18sp</dimen>
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@
|
||||||
<string name="set_replay_gain">ReplayGain</string>
|
<string name="set_replay_gain">ReplayGain</string>
|
||||||
<string name="set_replay_gain_track">Prefer track</string>
|
<string name="set_replay_gain_track">Prefer track</string>
|
||||||
<string name="set_replay_gain_album">Prefer album</string>
|
<string name="set_replay_gain_album">Prefer album</string>
|
||||||
<string name="set_replay_gain_dynamic">Dynamic</string>
|
<string name="set_replay_gain_dynamic">Prefer album if one is playing</string>
|
||||||
<string name="set_pre_amp">ReplayGain pre-amp</string>
|
<string name="set_pre_amp">ReplayGain pre-amp</string>
|
||||||
<string name="set_pre_amp_desc">The pre-amp is applied to the existing adjustment during playback</string>
|
<string name="set_pre_amp_desc">The pre-amp is applied to the existing adjustment during playback</string>
|
||||||
<string name="set_pre_amp_with">Adjustment with tags</string>
|
<string name="set_pre_amp_with">Adjustment with tags</string>
|
||||||
|
|
@ -114,8 +114,8 @@
|
||||||
<string name="set_pre_amp_warning">Warning: Changing the pre-amp to a high positive value may result in peaking on some audio tracks.</string>
|
<string name="set_pre_amp_warning">Warning: Changing the pre-amp to a high positive value may result in peaking on some audio tracks.</string>
|
||||||
|
|
||||||
<string name="set_behavior">Behavior</string>
|
<string name="set_behavior">Behavior</string>
|
||||||
<string name="set_library_song_playback_mode">Library playback mode</string>
|
<string name="set_library_song_playback_mode">When playing from the library</string>
|
||||||
<string name="set_detail_song_playback_mode">Detail playback mode</string>
|
<string name="set_detail_song_playback_mode">When playing from item details</string>
|
||||||
<string name="set_playback_mode_none">Play from shown item</string>
|
<string name="set_playback_mode_none">Play from shown item</string>
|
||||||
<string name="set_playback_mode_all">Play from all songs</string>
|
<string name="set_playback_mode_all">Play from all songs</string>
|
||||||
<string name="set_playback_mode_album">Play from album</string>
|
<string name="set_playback_mode_album">Play from album</string>
|
||||||
|
|
|
||||||
|
|
@ -17,16 +17,16 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.DisplayMedium" parent="TextAppearance.Material3.DisplayMedium">
|
<style name="TextAppearance.Auxio.DisplayMedium" parent="TextAppearance.Material3.DisplayMedium">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter_semibold</item>
|
<item name="android:fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">bold</item>
|
||||||
<item name="android:letterSpacing">-0.0192222222</item>
|
<item name="android:letterSpacing">-0.0192222222</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.DisplaySmall" parent="TextAppearance.Material3.DisplaySmall">
|
<style name="TextAppearance.Auxio.DisplaySmall" parent="TextAppearance.Material3.DisplaySmall">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter_semibold</item>
|
<item name="android:fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">bold</item>
|
||||||
<item name="android:letterSpacing">-0.0189444444</item>
|
<item name="android:letterSpacing">-0.0189444444</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
@ -43,14 +43,14 @@
|
||||||
<style name="TextAppearance.Auxio.HeadlineMedium" parent="TextAppearance.Material3.HeadlineMedium">
|
<style name="TextAppearance.Auxio.HeadlineMedium" parent="TextAppearance.Material3.HeadlineMedium">
|
||||||
<item name="fontFamily">@font/inter_semibold</item>
|
<item name="fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:fontFamily">@font/inter_semibold</item>
|
<item name="android:fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">bold</item>
|
||||||
<item name="android:letterSpacing">-0.0180714286</item>
|
<item name="android:letterSpacing">-0.0180714286</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.HeadlineSmall" parent="TextAppearance.Material3.HeadlineSmall">
|
<style name="TextAppearance.Auxio.HeadlineSmall" parent="TextAppearance.Material3.HeadlineSmall">
|
||||||
<item name="fontFamily">@font/inter_semibold</item>
|
<item name="fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:fontFamily">@font/inter_semibold</item>
|
<item name="android:fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">bold</item>
|
||||||
<item name="android:letterSpacing">-0.0165833333</item>
|
<item name="android:letterSpacing">-0.0165833333</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
@ -65,15 +65,15 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.TitleMedium" parent="TextAppearance.Material3.TitleMedium">
|
<style name="TextAppearance.Auxio.TitleMedium" parent="TextAppearance.Material3.TitleMedium">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter</item>
|
<item name="android:fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">normal</item>
|
||||||
<item name="android:letterSpacing">-0.01125</item>
|
<item name="android:letterSpacing">-0.01125</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.TitleSmall" parent="TextAppearance.Material3.TitleSmall">
|
<style name="TextAppearance.Auxio.TitleSmall" parent="TextAppearance.Material3.TitleSmall">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter</item>
|
<item name="android:fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">normal</item>
|
||||||
<item name="android:letterSpacing">0.01</item>
|
<item name="android:letterSpacing">0.01</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
@ -87,16 +87,16 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.LabelMedium" parent="TextAppearance.Material3.LabelMedium">
|
<style name="TextAppearance.Auxio.LabelMedium" parent="TextAppearance.Material3.LabelMedium">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter</item>
|
<item name="android:fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:textStyle">bold</item>
|
<item name="android:textStyle">normal</item>
|
||||||
<item name="android:letterSpacing">0.00</item>
|
<item name="android:letterSpacing">0.00</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.LabelSmall" parent="TextAppearance.Material3.LabelSmall">
|
<style name="TextAppearance.Auxio.LabelSmall" parent="TextAppearance.Material3.LabelSmall">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter</item>
|
<item name="android:fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:textStyle">bold</item>
|
<item name="android:textStyle">normal</item>
|
||||||
<item name="android:letterSpacing">0.0045454545</item>
|
<item name="android:letterSpacing">0.0045454545</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
@ -104,22 +104,22 @@
|
||||||
The body typeface is used for secondary and/or singular UI elements.
|
The body typeface is used for secondary and/or singular UI elements.
|
||||||
-->
|
-->
|
||||||
<style name="TextAppearance.Auxio.BodyLarge" parent="TextAppearance.Material3.BodyLarge">
|
<style name="TextAppearance.Auxio.BodyLarge" parent="TextAppearance.Material3.BodyLarge">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter</item>
|
<item name="android:fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">normal</item>
|
||||||
<item name="android:letterSpacing">-0.01125</item>
|
<item name="android:letterSpacing">-0.01125</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.BodyMedium" parent="TextAppearance.Material3.BodyMedium">
|
<style name="TextAppearance.Auxio.BodyMedium" parent="TextAppearance.Material3.BodyMedium">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter</item>
|
<item name="android:fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">normal</item>
|
||||||
<item name="android:letterSpacing">-0.0064285714</item>
|
<item name="android:letterSpacing">-0.0064285714</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Auxio.BodySmall" parent="TextAppearance.Material3.BodySmall">
|
<style name="TextAppearance.Auxio.BodySmall" parent="TextAppearance.Material3.BodySmall">
|
||||||
<item name="fontFamily">@font/inter</item>
|
<item name="fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:fontFamily">@font/inter</item>
|
<item name="android:fontFamily">@font/inter_regular</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">normal</item>
|
||||||
<item name="android:letterSpacing">0.0008333333</item>
|
<item name="android:letterSpacing">0.0008333333</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
@ -133,7 +133,7 @@
|
||||||
<style name="TextAppearance.Auxio.TitleMediumEmphasis" parent="TextAppearance.Material3.TitleMedium">
|
<style name="TextAppearance.Auxio.TitleMediumEmphasis" parent="TextAppearance.Material3.TitleMedium">
|
||||||
<item name="fontFamily">@font/inter_semibold</item>
|
<item name="fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:fontFamily">@font/inter_semibold</item>
|
<item name="android:fontFamily">@font/inter_semibold</item>
|
||||||
<item name="android:textStyle">normal</item>
|
<item name="android:textStyle">bold</item>
|
||||||
<item name="android:letterSpacing">-0.00825</item>
|
<item name="android:letterSpacing">-0.00825</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -73,10 +73,6 @@ ExoPlayer, while powerful, does add some overhead when playing exceptionally hig
|
||||||
This results in choppy, distorted playback in some cases as audio data cannot be delivered in time. Sadly, there is
|
This results in choppy, distorted playback in some cases as audio data cannot be delivered in time. Sadly, there is
|
||||||
not much I can do about this right now.
|
not much I can do about this right now.
|
||||||
|
|
||||||
#### What is dynamic ReplayGain?
|
|
||||||
Dynamic ReplayGain is a quirk setting based off the FooBar2000 plugin that dynamically switches from track gain to album
|
|
||||||
gain depending on if the current playback is from an album or not.
|
|
||||||
|
|
||||||
#### Why are accents lighter/less saturated in dark mode?
|
#### Why are accents lighter/less saturated in dark mode?
|
||||||
As per the [Material Design Guidelines](https://material.io/design/color/dark-theme.html), accents should be less
|
As per the [Material Design Guidelines](https://material.io/design/color/dark-theme.html), accents should be less
|
||||||
saturated on dark mode to reduce eye strain and to increase visual cohesion.
|
saturated on dark mode to reduce eye strain and to increase visual cohesion.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue