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 @@ Minimum SDK Version

-

Changelog | Wiki

+

Changelog | Wiki | Donate

- Translation status + Translation status

## 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 [![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](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

+ Private sponsor

+\* 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

- Private sponsor

\* 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.

- - Latest Version + + Latest Version Releases 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