diff --git a/CHANGELOG.md b/CHANGELOG.md
index 49474667d..04987976c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,19 @@
# Changelog
-## dev
+## 3.3.1
+
+#### What's Improved
+- The OPUS base volume adjustment field is now parsed and used as a ReplayGain adjustment
+- Added ReplayGain adjustment values to Song Properties dialog
+
+#### What's Changed
+- Added donation links to the about page
+
+#### What's Fixed
+- Fixed a crash occuring if you navigated to the settings page from the playlist view
+and then back
+- Fixed music loading failing with an SQL error with certain music folder configurations
+- Fixed issue where song title on playback screen would not scroll
## 3.3.0
diff --git a/README.md b/README.md
index e57f93417..b78bca77d 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,8 @@
Auxio
A simple, rational music player for android.
-
-
+
+
@@ -13,10 +13,10 @@
-
+
-
+
## About
@@ -38,6 +38,7 @@ Auxio is a local music player with a fast, reliable UI/UX without the many usele
+
## Features
- Playback based on [Media3 ExoPlayer](https://developer.android.com/guide/topics/media/exoplayer)
@@ -65,6 +66,20 @@ precise/original dates, sort tags, and more
- Storage (`READ_MEDIA_AUDIO`, `READ_EXTERNAL_STORAGE`) to read and play your music files
- Services (`FOREGROUND_SERVICE`, `WAKE_LOCK`) to keep the music playing in the background
+## Donate
+
+You can support Auxio's development through [my Github Sponsors page](https://github.com/sponsors/OxygenCobalt). Get the ability to prioritize features and have your profile added to the README, Release Changelogs, and even App Itself!
+
+**$16/month supporters:**
+
+*Be the first to have their profile picture and username added here!*
+
+**$8/month supporters:**
+
+
+
+
+
## Building
Auxio relies on a custom version of Media3 that enables some extra features. This adds some caveats to the build process:
@@ -82,6 +97,8 @@ However, feature additions and major UI changes are less likely to be accepted.
[Why Are These Features Missing?](https://github.com/OxygenCobalt/Auxio/wiki/Why-Are-These-Features-Missing%3F)
for more information.
+
+
## License
[](http://www.gnu.org/licenses/gpl-3.0.en.html)
diff --git a/app/build.gradle b/app/build.gradle
index 999ea5e8c..c908a0094 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -21,8 +21,8 @@ android {
defaultConfig {
applicationId namespace
- versionName "3.3.0"
- versionCode 37
+ versionName "3.3.1"
+ versionCode 38
minSdk 24
targetSdk 34
diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt
index 742018420..3adfa6089 100644
--- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt
@@ -25,6 +25,7 @@ import android.view.WindowInsets
import androidx.activity.OnBackPressedCallback
import androidx.core.view.ViewCompat
import androidx.core.view.isInvisible
+import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.fragment.app.activityViewModels
import androidx.navigation.findNavController
@@ -33,7 +34,9 @@ import com.google.android.material.R as MR
import com.google.android.material.bottomsheet.BackportBottomSheetBehavior
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.transition.MaterialFadeThrough
+import com.leinardi.android.speeddial.SpeedDialOverlayLayout
import dagger.hilt.android.AndroidEntryPoint
+import java.lang.reflect.Field
import kotlin.math.max
import kotlin.math.min
import org.oxycblt.auxio.databinding.FragmentMainBinding
@@ -56,6 +59,7 @@ import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.coordinatorLayoutBehavior
import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getDimen
+import org.oxycblt.auxio.util.lazyReflectedField
import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.navigateSafe
import org.oxycblt.auxio.util.systemBarInsetsCompat
@@ -153,6 +157,9 @@ class MainFragment :
}
}
+ binding.mainScrim.setOnClickListener { homeModel.setSpeedDialOpen(false) }
+ binding.sheetScrim.setOnClickListener { homeModel.setSpeedDialOpen(false) }
+
// --- VIEWMODEL SETUP ---
// This has to be done here instead of the playback panel to make sure that it's prioritized
// by StateFlow over any detail fragment.
@@ -161,7 +168,7 @@ class MainFragment :
collect(detailModel.toShow.flow, ::handleShow)
collectImmediately(detailModel.editedPlaylist, detailBackCallback::invalidateEnabled)
collectImmediately(homeModel.showOuter.flow, ::handleShowOuter)
- collectImmediately(homeModel.speedDialOpen, speedDialBackCallback::invalidateEnabled)
+ collectImmediately(homeModel.speedDialOpen, ::handleSpeedDialState)
collectImmediately(listModel.selected, selectionBackCallback::invalidateEnabled)
collectImmediately(playbackModel.song, ::updateSong)
collectImmediately(playbackModel.openPanel.flow, ::handlePanel)
@@ -336,6 +343,13 @@ class MainFragment :
homeModel.showOuter.consume()
}
+ private fun handleSpeedDialState(open: Boolean) {
+ requireNotNull(speedDialBackCallback) { "SpeedDialBackPressedCallback was not available" }
+ .invalidateEnabled(open)
+ requireBinding().mainScrim.isVisible = open
+ requireBinding().sheetScrim.isVisible = open
+ }
+
private fun updateSong(song: Song?) {
if (song != null) {
tryShowSheets()
@@ -519,4 +533,9 @@ class MainFragment :
isEnabled = open
}
}
+
+ private companion object {
+ val SPEED_DIAL_OVERLAY_ANIMATION_DURATION_FIELD: Field by
+ lazyReflectedField(SpeedDialOverlayLayout::class, "mAnimationDuration")
+ }
}
diff --git a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
index d7c682ce6..9bad4e225 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
@@ -38,6 +38,7 @@ import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.metadata.AudioProperties
import org.oxycblt.auxio.music.resolveNames
import org.oxycblt.auxio.playback.formatDurationMs
+import org.oxycblt.auxio.playback.replaygain.formatDb
import org.oxycblt.auxio.ui.ViewBindingMaterialDialogFragment
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.concatLocalized
@@ -118,6 +119,12 @@ class SongDetailDialog : ViewBindingMaterialDialogFragment(R.id.main_scrim).setOnClickListener {
- homeModel.setSpeedDialOpen(false)
- }
-
- findViewById(R.id.main_scrim).setOnTouchListener { _, event ->
- handleSpeedDialBoundaryTouch(event)
- }
-
- findViewById(R.id.sheet_scrim).setOnClickListener {
- homeModel.setSpeedDialOpen(false)
- }
-
- findViewById(R.id.sheet_scrim).setOnTouchListener { _, event ->
- handleSpeedDialBoundaryTouch(event)
+ post {
+ findViewById(R.id.main_scrim).setOnTouchListener { _, event ->
+ handleSpeedDialBoundaryTouch(event)
+ }
+ findViewById(R.id.sheet_scrim).setOnTouchListener { _, event ->
+ handleSpeedDialBoundaryTouch(event)
+ }
}
}
@@ -616,13 +611,6 @@ class HomeFragment :
private fun updateSpeedDial(open: Boolean) {
val binding = requireBinding()
- binding.root.rootView.apply {
- // Stock bottom sheet overlay won't work with our nested UI setup, have to replicate
- // it ourselves.
- findViewById(R.id.main_scrim).isClickable = open
- findViewById(R.id.sheet_scrim).isClickable = open
- }
-
if (open) {
binding.homeNewPlaylistFab.open(true)
} else {
diff --git a/app/src/main/java/org/oxycblt/auxio/music/decision/ExportPlaylistDialog.kt b/app/src/main/java/org/oxycblt/auxio/music/decision/ExportPlaylistDialog.kt
index db9b8c22a..5fa78726f 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/decision/ExportPlaylistDialog.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/decision/ExportPlaylistDialog.kt
@@ -143,7 +143,13 @@ class ExportPlaylistDialog : ViewBindingMaterialDialogFragment= 18) {
+ val header = format.initializationData[0]
+ val gain = header[1].toInt() or ((header[0].toInt() shl 8) and 0xFF)
+ logD("Obtained opus base gain: ${gain / 256f} dB")
+ rawSong.replayGainTrackAdjustment =
+ rawSong.replayGainTrackAdjustment?.plus(gain / 256f)
+ rawSong.replayGainAlbumAdjustment =
+ rawSong.replayGainAlbumAdjustment?.plus(gain / 256f)
+ }
} else {
logD("No metadata could be extracted for ${rawSong.name}")
}
diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt
index d03e0cb1c..08befa950 100644
--- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt
@@ -104,7 +104,10 @@ class PlaybackPanelFragment :
}
binding.playbackCover.onSwipeListener = this
- binding.playbackSong.setOnClickListener { navigateToCurrentSong() }
+ binding.playbackSong.apply {
+ isSelected = true
+ setOnClickListener { navigateToCurrentSong() }
+ }
binding.playbackArtist.setOnClickListener { navigateToCurrentArtist() }
binding.playbackAlbum.setOnClickListener { navigateToCurrentAlbum() }
@@ -130,6 +133,7 @@ class PlaybackPanelFragment :
override fun onDestroyBinding(binding: FragmentPlaybackPanelBinding) {
equalizerLauncher = null
coverAdapter = null
+ binding.playbackSong.isSelected = false
binding.playbackToolbar.setOnMenuItemClickListener(null)
}
diff --git a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/PreAmpCustomizeDialog.kt b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/PreAmpCustomizeDialog.kt
index 6cc1cea54..8a98eb99a 100644
--- a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/PreAmpCustomizeDialog.kt
+++ b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/PreAmpCustomizeDialog.kt
@@ -24,7 +24,6 @@ import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
-import kotlin.math.abs
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.DialogPreAmpBinding
import org.oxycblt.auxio.playback.PlaybackSettings
@@ -85,11 +84,6 @@ class PreAmpCustomizeDialog : ViewBindingMaterialDialogFragment= 0) {
- getString(R.string.fmt_db_pos, valueDb)
- } else {
- getString(R.string.fmt_db_neg, abs(valueDb))
- }
+ ticker.text = valueDb.formatDb(requireContext())
}
}
diff --git a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt
index 1495fd6fb..5a19c7df3 100644
--- a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt
+++ b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt
@@ -18,7 +18,10 @@
package org.oxycblt.auxio.playback.replaygain
+import android.content.Context
+import kotlin.math.abs
import org.oxycblt.auxio.IntegerTable
+import org.oxycblt.auxio.R
/**
* The current ReplayGain configuration.
@@ -67,3 +70,16 @@ data class ReplayGainAdjustment(val track: Float?, val album: Float?)
* @author Alexander Capehart (OxygenCobalt)
*/
data class ReplayGainPreAmp(val with: Float, val without: Float)
+
+/**
+ * Format a decibel value in a human-readable format.
+ *
+ * @param context The context to resolve resources from.
+ * @return A formatted decibel value. Will be prefixed by a + or - sign.
+ */
+fun Float.formatDb(context: Context) =
+ if (this >= 0) {
+ context.getString(R.string.fmt_db_pos, this)
+ } else {
+ context.getString(R.string.fmt_db_neg, abs(this))
+ }
diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt
new file mode 100644
index 000000000..233e490c3
--- /dev/null
+++ b/app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2017 Auxio Project
+ * BetterShuffleOrder.kt is part of Auxio.
+ *
+ * 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.playback.system
+
+import androidx.media3.common.C
+import androidx.media3.exoplayer.source.ShuffleOrder
+import java.util.*
+
+/**
+ * A ShuffleOrder that fixes the poorly defined default implementation of cloneAndInsert. Whereas
+ * the default implementation will randomly spread out added media items, this implementation will
+ * insert them in the order they are added contiguously.
+ *
+ * @author media3 team, Alexander Capehart (OxygenCobalt)
+ */
+class BetterShuffleOrder
+private constructor(private val shuffled: IntArray, private val random: Random) : ShuffleOrder {
+ private val indexInShuffled: IntArray = IntArray(shuffled.size)
+
+ /**
+ * Creates an instance with a specified length.
+ *
+ * @param length The length of the shuffle order.
+ */
+ constructor(length: Int) : this(length, Random())
+
+ constructor(length: Int, random: Random) : this(createShuffledList(length, random), random)
+
+ init {
+ for (i in shuffled.indices) {
+ indexInShuffled[shuffled[i]] = i
+ }
+ }
+
+ override fun getLength(): Int {
+ return shuffled.size
+ }
+
+ override fun getNextIndex(index: Int): Int {
+ var shuffledIndex = indexInShuffled[index]
+ return if (++shuffledIndex < shuffled.size) shuffled[shuffledIndex] else C.INDEX_UNSET
+ }
+
+ override fun getPreviousIndex(index: Int): Int {
+ var shuffledIndex = indexInShuffled[index]
+ return if (--shuffledIndex >= 0) shuffled[shuffledIndex] else C.INDEX_UNSET
+ }
+
+ override fun getLastIndex(): Int {
+ return if (shuffled.isNotEmpty()) shuffled[shuffled.size - 1] else C.INDEX_UNSET
+ }
+
+ override fun getFirstIndex(): Int {
+ return if (shuffled.isNotEmpty()) shuffled[0] else C.INDEX_UNSET
+ }
+
+ override fun cloneAndInsert(insertionIndex: Int, insertionCount: Int): ShuffleOrder {
+ val newShuffled = IntArray(shuffled.size + insertionCount)
+ val pivot = indexInShuffled[insertionIndex]
+ for (i in shuffled.indices) {
+ var currentIndex = shuffled[i]
+ if (currentIndex > insertionIndex) {
+ currentIndex += insertionCount
+ }
+
+ if (i <= pivot) {
+ newShuffled[i] = currentIndex
+ } else if (i > pivot) {
+ newShuffled[i + insertionCount] = currentIndex
+ }
+ }
+ for (i in 0 until insertionCount) {
+ newShuffled[pivot + i + 1] = insertionIndex + i + 1
+ }
+ return BetterShuffleOrder(newShuffled, Random(random.nextLong()))
+ }
+
+ override fun cloneAndRemove(indexFrom: Int, indexToExclusive: Int): ShuffleOrder {
+ val numberOfElementsToRemove = indexToExclusive - indexFrom
+ val newShuffled = IntArray(shuffled.size - numberOfElementsToRemove)
+ var foundElementsCount = 0
+ for (i in shuffled.indices) {
+ if (shuffled[i] in indexFrom until indexToExclusive) {
+ foundElementsCount++
+ } else {
+ newShuffled[i - foundElementsCount] =
+ if (shuffled[i] >= indexFrom) shuffled[i] - numberOfElementsToRemove
+ else shuffled[i]
+ }
+ }
+ return BetterShuffleOrder(newShuffled, Random(random.nextLong()))
+ }
+
+ override fun cloneAndClear(): ShuffleOrder {
+ return BetterShuffleOrder(0, Random(random.nextLong()))
+ }
+
+ companion object {
+ private fun createShuffledList(length: Int, random: Random): IntArray {
+ val shuffled = IntArray(length)
+ for (i in 0 until length) {
+ val swapIndex = random.nextInt(i + 1)
+ shuffled[i] = shuffled[swapIndex]
+ shuffled[swapIndex] = i
+ }
+ return shuffled
+ }
+ }
+}
diff --git a/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt
index 3c3258ab9..a80bc446d 100644
--- a/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt
@@ -66,7 +66,11 @@ class AboutFragment : ViewBindingFragment() {
binding.aboutCode.setOnClickListener { requireContext().openInBrowser(LINK_SOURCE) }
binding.aboutWiki.setOnClickListener { requireContext().openInBrowser(LINK_WIKI) }
binding.aboutLicenses.setOnClickListener { requireContext().openInBrowser(LINK_LICENSES) }
- binding.aboutAuthor.setOnClickListener { requireContext().openInBrowser(LINK_AUTHOR) }
+ binding.aboutProfile.setOnClickListener { requireContext().openInBrowser(LINK_PROFILE) }
+ binding.aboutDonate.setOnClickListener { requireContext().openInBrowser(LINK_DONATE) }
+ binding.aboutSupportersPromo.setOnClickListener {
+ requireContext().openInBrowser(LINK_DONATE)
+ }
// VIEWMODEL SETUP
collectImmediately(musicModel.statistics, ::updateStatistics)
@@ -88,13 +92,10 @@ class AboutFragment : ViewBindingFragment() {
}
private companion object {
- /** The URL to the source code. */
const val LINK_SOURCE = "https://github.com/OxygenCobalt/Auxio"
- /** The URL to the app wiki. */
const val LINK_WIKI = "$LINK_SOURCE/wiki"
- /** The URL to the licenses wiki page. */
const val LINK_LICENSES = "$LINK_WIKI/Licenses"
- /** The URL to the app author. */
- const val LINK_AUTHOR = "https://github.com/OxygenCobalt"
+ const val LINK_PROFILE = "https://github.com/OxygenCobalt"
+ const val LINK_DONATE = "https://github.com/sponsors/OxygenCobalt"
}
}
diff --git a/app/src/main/res/drawable/ic_donate_24.xml b/app/src/main/res/drawable/ic_donate_24.xml
new file mode 100644
index 000000000..2e40a458e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_donate_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
index ae6eb64ba..1088aff21 100644
--- a/app/src/main/res/layout/fragment_about.xml
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -152,19 +152,92 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/about_wiki" />
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
الإصدار
عرض على الكود في Github
التراخيص
- تمت برمجة التطبيق من قبل الكساندر كابيهارت
+ تمت برمجة التطبيق من قبل الكساندر كابيهارت
الإعدادات
المظهر
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 28a0b7797..3a7d1044b 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -10,7 +10,7 @@
Персаналізаваць
Адсочванне змяненняў у вашай музычнай бібліятэцы…
Дададзены ў чаргу
- Распрацавана Аляксандрам Кейпхартам
+ Распрацавана Аляксандрам Кейпхартам
Карыстальніцкае дзеянне панэлі прайгравання
Прайграць з альбома
Коска (,)
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 57d8ea84a..c62df4253 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -49,7 +49,7 @@
Verze
Zdrojový kód
Licence
- Vytvořil Alexander Capehart
+ Vytvořil Alexander Capehart
Statistiky knihovny
Nastavení
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 32626f27c..2714faddd 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -32,7 +32,7 @@
Version
Quellcode
Lizenzen
- Entwickelt von Alexander Capehart
+ Entwickelt von Alexander Capehart
Einstellungen
Erscheinungsbild
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index fbf304499..08dfc0973 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -40,7 +40,7 @@
Versión
Código fuente
Licencias
- Desarrollado por Alexander Capehart
+ Desarrollado por Alexander Capehart
Ajustes
Aspecto y Comportamiento
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 0bbdde9ec..95271d9ff 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -155,7 +155,7 @@
Tarkkaillaan musiikkikirjastoa
Lähdekoodi
- Kehittänyt Alexander Capehart
+ Kehittänyt Alexander Capehart
Kesto yhteensä: %s
Live-albumi
Remix-albumi
diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml
index bc3ad9dc4..b65baaf8f 100644
--- a/app/src/main/res/values-fil/strings.xml
+++ b/app/src/main/res/values-fil/strings.xml
@@ -59,7 +59,7 @@
Ulat
Tignan sa GitHub
Mga Lisensya
- Binuo ni OxygenCobalt
+ Binuo ni OxygenCobalt
Istatistika ng library
Mga Setting
Hitsura
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index eaacbbc02..9fd021428 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -26,7 +26,7 @@
Version
Code source
Licences
- Développé par Alexandre Capehart
+ Développé par Alexandre Capehart
Paramètres
Apparence
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index d1a992526..50748355f 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -126,7 +126,7 @@
Frecuencia de mostraxe
Acerca de
Monitorizando cambios na túa biblioteca…
- Desenvolvido por Alexander Capehart
+ Desenvolvido por Alexander Capehart
Aspecto e sensación
Modo redondo
Habilita as esquinas redondeadas en elementos adicionais da interface de usuario (require que as portadas dos álbums estean redondeadas)
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index d29a3564e..87d236503 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -177,7 +177,7 @@
शफल करें
स्थिति बहाल
प्लेलिस्ट का नाम बदला गया
- अलेक्जेंडर कैपहार्ट द्वारा विकसित
+ अलेक्जेंडर कैपहार्ट द्वारा विकसित
एकाधिक टैग मानों को निरूपित करने वाले वर्ण कॉन्फ़िगर करें
अल्पविराम (,)
स्लैश (/)
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 0aa0251a7..cadb7a570 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -56,7 +56,7 @@
Inačica
Izvorni kod
Licencije
- Programer: Alexander Capehart
+ Programer: Alexander Capehart
Statistika zbirke
Izgled
Svjetla
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index ad272228a..a994adbda 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -170,7 +170,7 @@
Ment
Alaphelyzet
Állapot törölve
- Fejlesztő Alexander Capehart
+ Fejlesztő Alexander Capehart
Lejátszás az összes dalból
Lejátszás műfajból
Tartalom
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 05c65a556..707c86f24 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -79,7 +79,7 @@
Disk
Lihat properti
Format
- Dikembangkan oleh Alexander Capehart
+ Dikembangkan oleh Alexander Capehart
Statistik pustaka
Tindakan notifikasi khusus
Acak
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 68d67a9de..53fc707cd 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -40,7 +40,7 @@
Versione
Codice sorgente
Licenze
- Sviluppato da Alexander Capehart
+ Sviluppato da Alexander Capehart
Statistiche libreria
Opzioni
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index ecdb73c14..df16c74a2 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -66,7 +66,7 @@
ספריית המוזיקה שלך נטענת…
ספריית המוזיקה שלך נסרקת לאיתור שינויים…
התווסף לתור
- מפותח על ידי אלכסנדר קייפהארט
+ מפותח על ידי אלכסנדר קייפהארט
חיפוש בספרייה שלך…
מראה ותחושה
שינוי ערכת הנושא והצבעים של היישום
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index e3b8dc43c..fd4e11299 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -118,7 +118,7 @@
アルバムに移動
曲のプロパティ
再生待ちに追加
- 開発者 アレクサンダー・ケイプハート (Alexander Capehart)
+ 開発者 アレクサンダー・ケイプハート (Alexander Capehart)
%s のアーティスト画像
オムニバス
オムニバス
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 78848acd3..7efc46d01 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -47,7 +47,7 @@
버전
소스 코드
라이선스
- Alexander Capehart가 개발
+ Alexander Capehart가 개발
라이브러리 통계
설정
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index da150c3ea..3fa2e9b91 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -122,7 +122,7 @@
Gyvai
Visada pradėti groti, kai ausinės yra prijungtos (gali neveikti visuose įrenginiuose)
Ogg garsas
- Sukūrė Alexanderis Capehartas (angl. Alexander Capehart)
+ Sukūrė Alexanderis Capehartas (angl. Alexander Capehart)
Pageidauti takelį
Jokių aplankų
Šis aplankas nepalaikomas
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 230f1fe37..85c0607ee 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -202,7 +202,7 @@
Spor
Dato tillagt
Sorter
- Utviklet av Alexander Capehart
+ Utviklet av Alexander Capehart
Søk i biblioteket ditt …
Innstillinger
Spilleliste opprettet
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 8c760d532..7f3ea75d0 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -35,7 +35,7 @@
Versie
Broncode
Licenties
- Ontwikkeld door Alexander Capehart
+ Ontwikkeld door Alexander Capehart
Instellingen
Uiterlijk en gevoel
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index 6176826db..c720d353b 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -84,7 +84,7 @@
ਸੰਗੀਤ ਪਲੇਬੈਕ ਵੇਖੋ ਅਤੇ ਕੰਟਰੋਲ ਕਰੋ
ਤੁਹਾਡੀ ਸੰਗੀਤ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…
ਕਤਾਰ ਵਿੱਚ ਸ਼ਾਮਿਲ ਕੀਤਾ
- ਅਲੈਗਜ਼ੈਂਡਰ ਕੇਪਹਾਰਟ ਦੁਆਰਾ ਵਿਕਸਿਤ
+ ਅਲੈਗਜ਼ੈਂਡਰ ਕੇਪਹਾਰਟ ਦੁਆਰਾ ਵਿਕਸਿਤ
ਆਪਣੀ ਲਾਇਬ੍ਰੇਰੀ ਖੋਜੋ…
ਸੈਟਿੰਗਾਂ
ਦਿੱਖ ਅਤੇ ਛੋਹ
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index fa4993f8d..02c6dd410 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -147,7 +147,7 @@
DJ Mix
Przejdź do ostatniego utworu
Przejdź do następnego utworu
- Autorstwa Alexandra Capeharta
+ Autorstwa Alexandra Capeharta
Zaokrąglone krawędzie
Włącz zaokrąglone rogi na dodatkowych elementach interfejsu (wymaga zaokrąglenia okładek albumów)
Akcja na pasku odtwarzania
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 366aa1e2e..a0f817cae 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -25,7 +25,7 @@
Versão
Código-fonte
Licenças
- Desenvolvido por Alexander Capehart
+ Desenvolvido por Alexander Capehart
Configurações
Visualização e Aparência
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 2fa1582f3..1011bf65d 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -26,7 +26,7 @@
Versão
Código fonte
Licenças
- Desenvolvido por Alexander Capehart
+ Desenvolvido por Alexander Capehart
Definições
Aparência
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 3ad8ebd47..e55370394 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -26,7 +26,7 @@
Versiune
Cod sursă
Licențe
- Dezvoltat de Alexander Capehart
+ Dezvoltat de Alexander Capehart
Setări
Aspect și caracteristici
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index cb7dd1a08..e0a785ced 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -40,7 +40,7 @@
Версия
Исходный код
Лицензии
- Разработано Александром Кейпхартом
+ Разработано Александром Кейпхартом
Настройки
Внешний вид
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 1cbd74549..08fc56f5c 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -128,7 +128,7 @@
Glasba
Ta mapa ni podprta
Obnovi prej shranjeno stanje predvajanja (če obstaja)
- Razvil Alexander Capehart
+ Razvil Alexander Capehart
Odstrani mapo
Kopirano
Nalaganje glasbe ni uspelo
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 2c9a072cb..5485d4eb9 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -107,7 +107,7 @@
Statistik över beroende
Byt namn av spellista
Spellista tog bort
- Utvecklad av Alexander Capeheart
+ Utvecklad av Alexander Capeheart
Tema
Mörkt
Färgschema
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 68997f497..16eacfc8a 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -78,7 +78,7 @@
Yıl
Süre
Durum kaydedildi
- Alexander Capehart tarafından geliştirildi
+ Alexander Capehart tarafından geliştirildi
Siyah tema
Kitaplık istatistikleri
Kapkara koyu tema kullan
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 9d8b54c34..c14a92f56 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -130,7 +130,7 @@
Концертний мініальбом
Статистика бібліотеки
Завантаження музичної бібліотеки…
- Розроблено Олександром Кейпхартом
+ Розроблено Олександром Кейпхартом
Завантажено виконавців: %d
Автоматично
Кольоровий акцент
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index e0449d0bd..9991f91d0 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -40,7 +40,7 @@
版本
源代码
许可证
- 由 Alexander Capehart 开发
+ 由 Alexander Capehart 开发
设置
外观和感觉
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 045965a4d..241b71838 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -146,6 +146,8 @@
Size
Bit rate
Sample rate
+ ReplayGain Track Adjustment
+ ReplayGain Album Adjustment
Shuffle
@@ -189,6 +191,11 @@
Report
+ Author
+ Alexander Capehart
+ Donate
+ Supporters
+
@@ -202,7 +209,7 @@
Playlist exported
Playlist deleted
Added to playlist
- Developed by Alexander Capehart
+ Donate to the project to get your name added here!
Search your library…
diff --git a/fastlane/metadata/android/en-US/changelogs/38.txt b/fastlane/metadata/android/en-US/changelogs/38.txt
new file mode 100644
index 000000000..8c0701516
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/38.txt
@@ -0,0 +1,3 @@
+Auxio 3.3.1 adds the ability to import and export playlists, skip gestures, and fixes/improvements to the music loader.
+This release fixes a critical bug with the music loader, among other issues.
+For more information, see https://github.com/OxygenCobalt/Auxio/releases/tag/v3.3.1
\ No newline at end of file