From 32026604499b662caed96d6d7713e5c9d9e79051 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Wed, 3 Jan 2024 18:51:29 -0700
Subject: [PATCH 01/18] music: add check to playlist export dialog
---
.../oxycblt/auxio/music/decision/ExportPlaylistDialog.kt | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
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
Date: Thu, 4 Jan 2024 18:51:17 +0000
Subject: [PATCH 02/18] Add sponsor info to README
---
README.md | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index e57f93417..88225d198 100644
--- a/README.md
+++ b/README.md
@@ -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)
From 55ee0cab91763347ed11ffcd46708d1c20f7514b Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Thu, 4 Jan 2024 18:51:55 +0000
Subject: [PATCH 03/18] Add alanorth link
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 88225d198..cac2abd16 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ You can support Auxio's development through [my Github Sponsors page](https://gi
**$8/month supporters:**
-
+
## Building
From 25d7a8cf076473e1e15bb2103700862921d02af1 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Fri, 5 Jan 2024 00:04:59 +0000
Subject: [PATCH 04/18] Update README.md
---
README.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.md b/README.md
index cac2abd16..a4653737c 100644
--- a/README.md
+++ b/README.md
@@ -78,8 +78,11 @@ You can support Auxio's development through [my Github Sponsors page](https://gi
+
+\* Auxio Icons are private supporters
+
## Building
Auxio relies on a custom version of Media3 that enables some extra features. This adds some caveats to the build process:
From ccee1e87ce1c46413b2349ae613e0f6fceee9f07 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Fri, 5 Jan 2024 00:06:01 +0000
Subject: [PATCH 05/18] Update README.md
---
README.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.md b/README.md
index a4653737c..c5cea2c80 100644
--- a/README.md
+++ b/README.md
@@ -78,7 +78,6 @@ You can support Auxio's development through [my Github Sponsors page](https://gi
-
\* Auxio Icons are private supporters
From 19bfd758a6e51bd7ffcc134ddef6deb44aca95f3 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Fri, 5 Jan 2024 00:06:12 +0000
Subject: [PATCH 06/18] Update README.md
---
README.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.md b/README.md
index c5cea2c80..cac2abd16 100644
--- a/README.md
+++ b/README.md
@@ -80,8 +80,6 @@ You can support Auxio's development through [my Github Sponsors page](https://gi
-\* Auxio Icons are private supporters
-
## Building
Auxio relies on a custom version of Media3 that enables some extra features. This adds some caveats to the build process:
From c4143e7d95df60551fdeacb9d384970a99c251d7 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Fri, 5 Jan 2024 12:35:36 -0700
Subject: [PATCH 07/18] music: log when volume cannot be found
Mostly for debugging purposes.
---
.../oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt b/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
index 1f821aaf4..3a0e8b138 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
@@ -21,6 +21,7 @@ package org.oxycblt.auxio.music.fs
import android.database.Cursor
import android.os.Build
import android.provider.MediaStore
+import org.oxycblt.auxio.util.logE
/**
* Wrapper around a [Cursor] that interprets path information on a per-API/manufacturer basis.
@@ -111,6 +112,8 @@ private constructor(private val cursor: Cursor, volumeManager: VolumeManager) :
}
}
+ logE("Could not find volume for $data [tried: ${volumes.map { it.components }}]")
+
return null
}
@@ -172,11 +175,15 @@ private constructor(private val cursor: Cursor, volumeManager: VolumeManager) :
override fun extract(): Path? {
// Find the StorageVolume whose MediaStore name corresponds to it.
val volumeName = cursor.getString(volumeIndex)
- val volume = volumes.find { it.mediaStoreName == volumeName } ?: return null
// Relative path does not include file name, must use DISPLAY_NAME and add it
// in manually.
val relativePath = cursor.getString(relativePathIndex)
val displayName = cursor.getString(displayNameIndex)
+ val volume = volumes.find { it.mediaStoreName == volumeName }
+ if (volume == null) {
+ logE("Could not find volume for $volumeName:$relativePath/$displayName [tried: ${volumes.map { it.mediaStoreName }}]")
+ return null
+ }
val components = Components.parseUnix(relativePath).child(displayName)
return Path(volume, components)
}
From cdd08e7f99a0f05a154060e41edc5a5aa7603576 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Fri, 5 Jan 2024 13:09:24 -0700
Subject: [PATCH 08/18] home: clean up hacky overlay impl
Should have a lesser likelihood of crashing outright, hopefully.
---
.../java/org/oxycblt/auxio/MainFragment.kt | 21 +++++++++++-
.../org/oxycblt/auxio/home/HomeFragment.kt | 34 ++++++-------------
2 files changed, 31 insertions(+), 24 deletions(-)
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/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
index be9d83007..f5c4c5bd0 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
@@ -18,6 +18,7 @@
package org.oxycblt.auxio.home
+import android.annotation.SuppressLint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem
@@ -124,6 +125,7 @@ class HomeFragment :
override fun getSelectionToolbar(binding: FragmentHomeBinding) = binding.homeSelectionToolbar
+ @SuppressLint("ClickableViewAccessibility")
override fun onBindingCreated(binding: FragmentHomeBinding, savedInstanceState: Bundle?) {
super.onBindingCreated(binding, savedInstanceState)
@@ -146,23 +148,16 @@ class HomeFragment :
// --- UI SETUP ---
+ // Stock bottom sheet overlay won't work with our nested UI setup, have to replicate
+ // it ourselves.
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).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 {
From 5c85001b0c0d6f378992a9fe1bae445718e239b8 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 6 Jan 2024 18:24:48 -0700
Subject: [PATCH 09/18] music: add opus base gain support
OPUS has another volume adjustment field on top of the existing R128
adjustments. I was under the impression this was handled by the android
system, but apparently not. This commit applies the base gain to files
by just adding them onto the existing ReplayGain values.
Resolves #521.
---
CHANGELOG.md | 3 +++
.../oxycblt/auxio/music/metadata/TagWorker.kt | 16 ++++++++++++++++
2 files changed, 19 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 49474667d..67e0d8866 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@
## dev
+#### What's Improved
+- The OPUS base volume adjustment field is now parsed and used in as a ReplayGain adjustment
+
## 3.3.0
#### What's New
diff --git a/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt b/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt
index 196c7c0dc..5b3d8fa51 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt
@@ -20,6 +20,7 @@ package org.oxycblt.auxio.music.metadata
import androidx.core.text.isDigitsOnly
import androidx.media3.common.MediaItem
+import androidx.media3.common.MimeTypes
import androidx.media3.exoplayer.MetadataRetriever
import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.TrackGroupArray
@@ -97,6 +98,21 @@ private class TagWorkerImpl(
val textTags = TextTags(metadata)
populateWithId3v2(textTags.id3v2)
populateWithVorbis(textTags.vorbis)
+
+ // If this metadata is of a vorbis file, we actually need to extract it's base gain
+ // and divide it by 256 to get the gain in decibels.
+ if (format.sampleMimeType == MimeTypes.AUDIO_OPUS
+ && format.initializationData.isNotEmpty()
+ && format.initializationData[0].size >= 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}")
}
From 2af90c24277390ca0345e031e1d634c2ea30fcab Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 6 Jan 2024 18:46:13 -0700
Subject: [PATCH 10/18] detail: add replaygain values to song properties
This should allow for clearer debugging.
---
.../org/oxycblt/auxio/detail/SongDetailDialog.kt | 7 +++++++
.../playback/replaygain/PreAmpCustomizeDialog.kt | 8 +-------
.../auxio/playback/replaygain/ReplayGain.kt | 16 ++++++++++++++++
app/src/main/res/values/strings.xml | 2 ++
4 files changed, 26 insertions(+), 7 deletions(-)
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= 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/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 045965a4d..ec7bb6010 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
From 82952a204f34507674e6c1a037227a06f39e363e Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 6 Jan 2024 19:06:59 -0700
Subject: [PATCH 11/18] about: add donation link
Add donation link to the about page.
---
.../oxycblt/auxio/settings/AboutFragment.kt | 13 ++--
app/src/main/res/drawable/ic_donate_24.xml | 10 +++
app/src/main/res/layout/fragment_about.xml | 77 ++++++++++++++++++-
app/src/main/res/values-ar-rIQ/strings.xml | 2 +-
app/src/main/res/values-be/strings.xml | 2 +-
app/src/main/res/values-cs/strings.xml | 2 +-
app/src/main/res/values-de/strings.xml | 2 +-
app/src/main/res/values-es/strings.xml | 2 +-
app/src/main/res/values-fi/strings.xml | 2 +-
app/src/main/res/values-fil/strings.xml | 2 +-
app/src/main/res/values-fr/strings.xml | 2 +-
app/src/main/res/values-gl/strings.xml | 2 +-
app/src/main/res/values-hi/strings.xml | 2 +-
app/src/main/res/values-hr/strings.xml | 2 +-
app/src/main/res/values-hu/strings.xml | 2 +-
app/src/main/res/values-in/strings.xml | 2 +-
app/src/main/res/values-it/strings.xml | 2 +-
app/src/main/res/values-iw/strings.xml | 2 +-
app/src/main/res/values-ja/strings.xml | 2 +-
app/src/main/res/values-ko/strings.xml | 2 +-
app/src/main/res/values-lt/strings.xml | 2 +-
app/src/main/res/values-nb-rNO/strings.xml | 2 +-
app/src/main/res/values-nl/strings.xml | 2 +-
app/src/main/res/values-pa/strings.xml | 2 +-
app/src/main/res/values-pl/strings.xml | 2 +-
app/src/main/res/values-pt-rBR/strings.xml | 2 +-
app/src/main/res/values-pt-rPT/strings.xml | 2 +-
app/src/main/res/values-ro/strings.xml | 2 +-
app/src/main/res/values-ru/strings.xml | 2 +-
app/src/main/res/values-sl/strings.xml | 2 +-
app/src/main/res/values-sv/strings.xml | 2 +-
app/src/main/res/values-tr/strings.xml | 2 +-
app/src/main/res/values-uk/strings.xml | 2 +-
app/src/main/res/values-zh-rCN/strings.xml | 2 +-
app/src/main/res/values/strings.xml | 7 +-
35 files changed, 129 insertions(+), 40 deletions(-)
create mode 100644 app/src/main/res/drawable/ic_donate_24.xml
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..1723aafe3 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 ec7bb6010..241b71838 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -191,6 +191,11 @@
Report
+ Author
+ Alexander Capehart
+ Donate
+ Supporters
+
@@ -204,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…
From 319eeb07b8df3b6114ab3274f4cb42775147cbb0 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 6 Jan 2024 20:49:30 -0700
Subject: [PATCH 12/18] playback: add shuffle order impl
Add a currently-unused ShuffleOrder implementation with fixes for media
item insertion.
This will be used as the basis of the new gapless playback system,
assuming all else goes well.
---
.../playback/system/BetterShuffleOrder.kt | 125 ++++++++++++++++++
1 file changed, 125 insertions(+)
create mode 100644 app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt
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..058524522
--- /dev/null
+++ b/app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2017 Auxio Project
+ * SaneShuffleOrder.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
+ }
+ }
+}
From b6703a178ef58dfdd6a7d5127e29e0d3fc97d319 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 6 Jan 2024 20:56:38 -0700
Subject: [PATCH 13/18] info: update changelog
---
CHANGELOG.md | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 67e0d8866..99a01e2ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,15 @@
## dev
#### What's Improved
-- The OPUS base volume adjustment field is now parsed and used in as a ReplayGain adjustment
+- 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
## 3.3.0
From 5d5356e46e4c30fb2ffecabf59017d4b624358d3 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 6 Jan 2024 21:02:40 -0700
Subject: [PATCH 14/18] all: cleanup
---
.../oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt | 3 ++-
.../java/org/oxycblt/auxio/music/metadata/TagWorker.kt | 7 +++----
.../oxycblt/auxio/playback/system/BetterShuffleOrder.kt | 2 +-
app/src/main/res/layout/fragment_about.xml | 2 +-
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt b/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
index 3a0e8b138..23e58c80d 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
@@ -181,7 +181,8 @@ private constructor(private val cursor: Cursor, volumeManager: VolumeManager) :
val displayName = cursor.getString(displayNameIndex)
val volume = volumes.find { it.mediaStoreName == volumeName }
if (volume == null) {
- logE("Could not find volume for $volumeName:$relativePath/$displayName [tried: ${volumes.map { it.mediaStoreName }}]")
+ logE(
+ "Could not find volume for $volumeName:$relativePath/$displayName [tried: ${volumes.map { it.mediaStoreName }}]")
return null
}
val components = Components.parseUnix(relativePath).child(displayName)
diff --git a/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt b/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt
index 5b3d8fa51..6a5880f7d 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt
@@ -101,9 +101,9 @@ private class TagWorkerImpl(
// If this metadata is of a vorbis file, we actually need to extract it's base gain
// and divide it by 256 to get the gain in decibels.
- if (format.sampleMimeType == MimeTypes.AUDIO_OPUS
- && format.initializationData.isNotEmpty()
- && format.initializationData[0].size >= 18) {
+ if (format.sampleMimeType == MimeTypes.AUDIO_OPUS &&
+ format.initializationData.isNotEmpty() &&
+ format.initializationData[0].size >= 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")
@@ -112,7 +112,6 @@ private class TagWorkerImpl(
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/system/BetterShuffleOrder.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt
index 058524522..233e490c3 100644
--- a/app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt
+++ b/app/src/main/java/org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2017 Auxio Project
- * SaneShuffleOrder.kt is part of Auxio.
+ * 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
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
index 1723aafe3..1088aff21 100644
--- a/app/src/main/res/layout/fragment_about.xml
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -172,7 +172,7 @@
style="@style/Widget.Auxio.TextView.Header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/lbl_author_name"
+ android:text="@string/lbl_author"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
From 6a0fd766362529f9b9f0bea674dd6f716d308da4 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Tue, 9 Jan 2024 13:50:02 -0700
Subject: [PATCH 15/18] music: fix selector error with malformed folders
Forgot that i is not a good indicator of if we need to begin a selector
or not since we may discard certain music folders.
---
.../org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt b/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
index 23e58c80d..8a9a4e1df 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/fs/MediaStorePathInterpreter.kt
@@ -137,7 +137,7 @@ private constructor(private val cursor: Cursor, volumeManager: VolumeManager) :
val path = paths[i]
val volume = path.volume.components ?: continue
template +=
- if (i == 0) {
+ if (args.isEmpty()) {
"${MediaStore.Audio.AudioColumns.DATA} LIKE ?"
} else {
" OR ${MediaStore.Audio.AudioColumns.DATA} LIKE ?"
@@ -217,7 +217,7 @@ private constructor(private val cursor: Cursor, volumeManager: VolumeManager) :
for (i in paths.indices) {
val path = paths[i]
template =
- if (i == 0) {
+ if (args.isEmpty()) {
"(${MediaStore.Audio.AudioColumns.VOLUME_NAME} LIKE ? " +
"AND ${MediaStore.Audio.AudioColumns.RELATIVE_PATH} LIKE ?)"
} else {
From f525abdba3fc055c9662351465f6240a5f3c85a9 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 13 Jan 2024 20:28:34 -0700
Subject: [PATCH 16/18] playback: fix marquee on playback screen
---
.../org/oxycblt/auxio/playback/PlaybackPanelFragment.kt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
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)
}
From 9652fb0221f82d7b26dc41d1c092694137e803cf Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 13 Jan 2024 20:28:46 -0700
Subject: [PATCH 17/18] info: update changelog
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 99a01e2ec..767114f8a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,8 @@
#### 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
From dea0ee1432b3ca9ac659137bd3798c8dba2b4053 Mon Sep 17 00:00:00 2001
From: Alexander Capehart
Date: Sat, 13 Jan 2024 21:14:26 -0700
Subject: [PATCH 18/18] info: bump to 3.3.1
Bump to version 3.3.1 (38).
---
CHANGELOG.md | 2 +-
README.md | 4 ++--
app/build.gradle | 4 ++--
fastlane/metadata/android/en-US/changelogs/38.txt | 3 +++
4 files changed, 8 insertions(+), 5 deletions(-)
create mode 100644 fastlane/metadata/android/en-US/changelogs/38.txt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 767114f8a..04987976c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
# Changelog
-## dev
+## 3.3.1
#### What's Improved
- The OPUS base volume adjustment field is now parsed and used as a ReplayGain adjustment
diff --git a/README.md b/README.md
index cac2abd16..b78bca77d 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,8 @@
Auxio
A simple, rational music player for android.
-
-
+
+
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/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