From 44b7a435d17fb33f715a0147d8b67ae06a569aa3 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 26 Feb 2024 15:26:23 -0700 Subject: [PATCH 01/18] music: fix crash on playlist add Caused by the new state restoration code being bugged and applying on playlist changes, then combined with the playlist code not properly switching to the main context when dispatching a library update. --- .../java/org/oxycblt/auxio/music/MusicRepository.kt | 10 +++++----- .../auxio/playback/state/PlaybackStateManager.kt | 7 +------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt index 459c8fcbb..6ec2c5c09 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt @@ -305,35 +305,35 @@ constructor( val userLibrary = synchronized(this) { userLibrary ?: return } logD("Creating playlist $name with ${songs.size} songs") userLibrary.createPlaylist(name, songs) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun renamePlaylist(playlist: Playlist, name: String) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Renaming $playlist to $name") userLibrary.renamePlaylist(playlist, name) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun deletePlaylist(playlist: Playlist) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Deleting $playlist") userLibrary.deletePlaylist(playlist) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun addToPlaylist(songs: List, playlist: Playlist) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Adding ${songs.size} songs to $playlist") userLibrary.addToPlaylist(playlist, songs) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun rewritePlaylist(playlist: Playlist, songs: List) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Rewriting $playlist with ${songs.size} songs") userLibrary.rewritePlaylist(playlist, songs) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } @Synchronized diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 7498c8e0b..315642fd0 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -780,14 +780,9 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { val oldStateMirror = stateMirror if (oldStateMirror.rawQueue != rawQueue) { logD("Queue changed, must reload player") + stateHolder?.playing(false) stateHolder?.applySavedState(parent, rawQueue, StateAck.NewPlayback) - stateHolder?.playing(false) - } - - if (oldStateMirror.progression.calculateElapsedPositionMs() != savedState.positionMs) { - logD("Seeking to saved position ${savedState.positionMs}ms") stateHolder?.seekTo(savedState.positionMs) - stateHolder?.playing(false) } } From 691ed202e504c0c34b13f17b9bd4e4867fdadc38 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 26 Feb 2024 16:08:44 -0700 Subject: [PATCH 02/18] playback: fix crash w/add to queue Again, a two-fold problem: - Was not properly giving the right StateAck to the state holder - ShuffleOrder not properly handling the index given when adding to queue internally Resolves #727. --- .../oxycblt/auxio/playback/state/PlaybackStateManager.kt | 2 +- .../org/oxycblt/auxio/playback/system/BetterShuffleOrder.kt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 315642fd0..6e98c36e3 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -492,7 +492,7 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { } else { val stateHolder = stateHolder ?: return logD("Adding ${songs.size} songs to end of queue") - stateHolder.addToQueue(songs, StateAck.AddToQueue(stateMirror.index + 1, songs.size)) + stateHolder.addToQueue(songs, StateAck.AddToQueue(queue.size, songs.size)) } } 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 e09d9ba2a..d85f82a9b 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 @@ -69,7 +69,11 @@ class BetterShuffleOrder(private val shuffled: IntArray) : ShuffleOrder { } val newShuffled = IntArray(shuffled.size + insertionCount) - val pivot = indexInShuffled[insertionIndex] + val pivot: Int = if (insertionIndex < shuffled.size) { + indexInShuffled[insertionIndex] + } else { + indexInShuffled.size + } for (i in shuffled.indices) { var currentIndex = shuffled[i] if (currentIndex > insertionIndex) { From 489ecfafb3d6da9d5ae6a13b1844308e76628455 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 26 Feb 2024 16:41:31 -0700 Subject: [PATCH 03/18] playback: fix broken state restore That didn't properly handle when the index was invalid and kept stale song entries. Resolves #723. --- .../playback/state/PlaybackStateHolder.kt | 3 +++ .../playback/state/PlaybackStateManager.kt | 27 +++++++++++-------- .../auxio/playback/system/PlaybackService.kt | 4 +++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt index 2374a421f..3cf5f44da 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt @@ -153,6 +153,9 @@ interface PlaybackStateHolder { * ack. */ fun applySavedState(parent: MusicParent?, rawQueue: RawQueue, ack: StateAck.NewPlayback?) + + /** Reset this instance to an empty state. */ + fun reset() } /** diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 6e98c36e3..4dd7bb690 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -717,6 +717,8 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { return } + val stateHolder = stateHolder ?: return + // The heap may not be the same if the song composition changed between state saves/reloads. // This also means that we must modify the shuffled mapping as well, in what it points to // and it's general composition. @@ -763,27 +765,30 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { "Queue inconsistency detected: Shuffled mapping indices out of heap bounds" } + if (index < 0) { + stateHolder.reset() + return + } + val rawQueue = RawQueue( heap = heap, shuffledMapping = shuffledMapping, heapIndex = if (shuffledMapping.isNotEmpty()) { - shuffledMapping[savedState.index] + shuffledMapping[index] } else { index }) - if (index > -1) { - // Valid state where something needs to be played, direct the stateholder to apply - // this new state. - val oldStateMirror = stateMirror - if (oldStateMirror.rawQueue != rawQueue) { - logD("Queue changed, must reload player") - stateHolder?.playing(false) - stateHolder?.applySavedState(parent, rawQueue, StateAck.NewPlayback) - stateHolder?.seekTo(savedState.positionMs) - } + // Valid state where something needs to be played, direct the stateholder to apply + // this new state. + val oldStateMirror = stateMirror + if (oldStateMirror.rawQueue != rawQueue) { + logD("Queue changed, must reload player") + stateHolder.playing(false) + stateHolder.applySavedState(parent, rawQueue, StateAck.NewPlayback) + stateHolder.seekTo(savedState.positionMs) } isInitialized = true diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index ba54a1f18..3e29274a0 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -485,6 +485,10 @@ class PlaybackService : ack?.let { playbackManager.ack(this, it) } } + override fun reset() { + player.setMediaItems(emptyList()) + } + // --- PLAYER OVERRIDES --- override fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) { From 31a91064651bc14d91758a1d63c3b16bc2150924 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 28 Feb 2024 21:50:59 -0700 Subject: [PATCH 04/18] widget: fix wafer cover setup Apparently: 1. Some OEMs don't actually autocrop to rounded corners 2. I was not correctly using the right corner radius attributes in the first place, making it inconsistent. Let's fix that. Closes #730 --- .../oxycblt/auxio/widgets/WidgetProvider.kt | 22 ++++++++++++++++--- ..._bar_system.xml => ui_widget_bg_round.xml} | 2 +- .../main/res/drawable/ui_widget_bar_round.xml | 6 ----- ..._bar_system.xml => ui_widget_bg_sharp.xml} | 0 .../main/res/drawable/ui_widget_bg_system.xml | 5 ----- .../main/res/layout/widget_docked_thin.xml | 2 +- .../main/res/layout/widget_docked_wide.xml | 2 +- app/src/main/res/layout/widget_pane_thin.xml | 2 +- app/src/main/res/layout/widget_pane_wide.xml | 2 +- app/src/main/res/layout/widget_wafer_thin.xml | 4 +++- app/src/main/res/layout/widget_wafer_wide.xml | 9 ++++---- 11 files changed, 32 insertions(+), 24 deletions(-) rename app/src/main/res/drawable-v31/{ui_widget_bar_system.xml => ui_widget_bg_round.xml} (100%) delete mode 100644 app/src/main/res/drawable/ui_widget_bar_round.xml rename app/src/main/res/drawable/{ui_widget_bar_system.xml => ui_widget_bg_sharp.xml} (100%) delete mode 100644 app/src/main/res/drawable/ui_widget_bg_system.xml diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt index 7a3bc6c40..3fb28172d 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt @@ -158,6 +158,7 @@ class WidgetProvider : AppWidgetProvider() { uiSettings, ) .setupCover(context, state.takeIf { canDisplayWaferCover(uiSettings) }) + .setupFillingCover(uiSettings) .setupTimelineControls(context, state) private fun newWideWaferLayout( @@ -170,6 +171,7 @@ class WidgetProvider : AppWidgetProvider() { uiSettings, ) .setupCover(context, state.takeIf { canDisplayWaferCover(uiSettings) }) + .setupFillingCover(uiSettings) .setupFullControls(context, state) private fun newThinDockedLayout( @@ -231,9 +233,9 @@ class WidgetProvider : AppWidgetProvider() { // On API 31+, the bar should always be round in order to fit in with other widgets. val background = if (useRoundedRemoteViews(uiSettings)) { - R.drawable.ui_widget_bar_round + R.drawable.ui_widget_bg_round } else { - R.drawable.ui_widget_bar_system + R.drawable.ui_widget_bg_sharp } setBackgroundResource(R.id.widget_controls, background) return this @@ -253,7 +255,7 @@ class WidgetProvider : AppWidgetProvider() { if (useRoundedRemoteViews(uiSettings)) { R.drawable.ui_widget_bg_round } else { - R.drawable.ui_widget_bg_system + R.drawable.ui_widget_bg_sharp } setBackgroundResource(android.R.id.background, background) return this @@ -292,6 +294,20 @@ class WidgetProvider : AppWidgetProvider() { return this } + private fun RemoteViews.setupFillingCover(uiSettings: UISettings): RemoteViews { + // Below API 31, enable a rounded background only if round mode is enabled. + // On API 31+, the background should always be round in order to fit in with other + // widgets. + val background = + if (useRoundedRemoteViews(uiSettings)) { + R.drawable.ui_widget_bg_round + } else { + R.drawable.ui_widget_bg_sharp + } + setBackgroundResource(R.id.widget_cover, background) + return this + } + /** * Set up the album cover, song title, and artist name in a [RemoteViews] layout that contains * them. diff --git a/app/src/main/res/drawable-v31/ui_widget_bar_system.xml b/app/src/main/res/drawable-v31/ui_widget_bg_round.xml similarity index 100% rename from app/src/main/res/drawable-v31/ui_widget_bar_system.xml rename to app/src/main/res/drawable-v31/ui_widget_bg_round.xml index b6144dd5f..893bae085 100644 --- a/app/src/main/res/drawable-v31/ui_widget_bar_system.xml +++ b/app/src/main/res/drawable-v31/ui_widget_bg_round.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/drawable/ui_widget_bar_round.xml b/app/src/main/res/drawable/ui_widget_bar_round.xml deleted file mode 100644 index 9fcd8308b..000000000 --- a/app/src/main/res/drawable/ui_widget_bar_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ui_widget_bar_system.xml b/app/src/main/res/drawable/ui_widget_bg_sharp.xml similarity index 100% rename from app/src/main/res/drawable/ui_widget_bar_system.xml rename to app/src/main/res/drawable/ui_widget_bg_sharp.xml diff --git a/app/src/main/res/drawable/ui_widget_bg_system.xml b/app/src/main/res/drawable/ui_widget_bg_system.xml deleted file mode 100644 index 9d33d5912..000000000 --- a/app/src/main/res/drawable/ui_widget_bg_system.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/layout/widget_docked_thin.xml b/app/src/main/res/layout/widget_docked_thin.xml index 2b2566812..086013dcc 100644 --- a/app/src/main/res/layout/widget_docked_thin.xml +++ b/app/src/main/res/layout/widget_docked_thin.xml @@ -61,7 +61,7 @@ android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_gravity="center" - android:background="@drawable/ui_widget_bar_system" + android:background="@drawable/ui_widget_bg_round" android:backgroundTint="?attr/colorSurface" android:orientation="horizontal" android:padding="@dimen/spacing_mid_medium"> diff --git a/app/src/main/res/layout/widget_docked_wide.xml b/app/src/main/res/layout/widget_docked_wide.xml index f0b129ae5..d344799f4 100644 --- a/app/src/main/res/layout/widget_docked_wide.xml +++ b/app/src/main/res/layout/widget_docked_wide.xml @@ -48,7 +48,7 @@ android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_gravity="center" - android:background="@drawable/ui_widget_bar_system" + android:background="@drawable/ui_widget_bg_round" android:backgroundTint="?attr/colorSurface" android:orientation="horizontal" android:padding="@dimen/spacing_mid_medium"> diff --git a/app/src/main/res/layout/widget_pane_thin.xml b/app/src/main/res/layout/widget_pane_thin.xml index 4dc4c394c..2b2361971 100644 --- a/app/src/main/res/layout/widget_pane_thin.xml +++ b/app/src/main/res/layout/widget_pane_thin.xml @@ -4,7 +4,7 @@ android:id="@android:id/background" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/ui_widget_bg_system" + android:background="@drawable/ui_widget_bg_sharp" android:backgroundTint="?attr/colorSurface" android:theme="@style/Theme.Auxio.Widget"> diff --git a/app/src/main/res/layout/widget_pane_wide.xml b/app/src/main/res/layout/widget_pane_wide.xml index 2ef525fa3..07c693564 100644 --- a/app/src/main/res/layout/widget_pane_wide.xml +++ b/app/src/main/res/layout/widget_pane_wide.xml @@ -4,7 +4,7 @@ android:id="@android:id/background" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/ui_widget_bg_system" + android:background="@drawable/ui_widget_bg_sharp" android:backgroundTint="?attr/colorSurface" android:theme="@style/Theme.Auxio.Widget"> diff --git a/app/src/main/res/layout/widget_wafer_thin.xml b/app/src/main/res/layout/widget_wafer_thin.xml index fe7ec01dc..db12288cf 100644 --- a/app/src/main/res/layout/widget_wafer_thin.xml +++ b/app/src/main/res/layout/widget_wafer_thin.xml @@ -4,7 +4,7 @@ android:id="@android:id/background" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/ui_widget_bg_system" + android:background="@drawable/ui_widget_bg_sharp" android:backgroundTint="?attr/colorSurface" android:baselineAligned="false" android:orientation="horizontal" @@ -20,6 +20,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" + android:background="@drawable/ui_widget_bg_round" + android:clipToOutline="true" tools:ignore="ContentDescription" /> - Date: Wed, 28 Feb 2024 22:27:04 -0700 Subject: [PATCH 05/18] deps: update to agp 8.2.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fdb033f43..eae63966b 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ buildscript { } plugins { - id "com.android.application" version '8.2.0' apply false + id "com.android.application" version '8.2.1' apply false id "androidx.navigation.safeargs.kotlin" version "$navigation_version" apply false id "org.jetbrains.kotlin.android" version "$kotlin_version" apply false id "com.google.devtools.ksp" version '1.9.10-1.0.13' apply false From 73e6697477a383db3a24ea77bd7f8db6ded2d5ca Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 28 Feb 2024 22:27:25 -0700 Subject: [PATCH 06/18] all: reformat --- .../auxio/playback/system/BetterShuffleOrder.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 d85f82a9b..c9d77cf37 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 @@ -69,11 +69,12 @@ class BetterShuffleOrder(private val shuffled: IntArray) : ShuffleOrder { } val newShuffled = IntArray(shuffled.size + insertionCount) - val pivot: Int = if (insertionIndex < shuffled.size) { - indexInShuffled[insertionIndex] - } else { - indexInShuffled.size - } + val pivot: Int = + if (insertionIndex < shuffled.size) { + indexInShuffled[insertionIndex] + } else { + indexInShuffled.size + } for (i in shuffled.indices) { var currentIndex = shuffled[i] if (currentIndex > insertionIndex) { From d83c1c5596428a6b72b3d4b64598e0bc0a291d77 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 28 Feb 2024 22:46:43 -0700 Subject: [PATCH 07/18] build: bump to 3.4.2 Bump to version 3.4.2. --- CHANGELOG.md | 7 +++++++ README.md | 4 ++-- app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/43.txt | 3 +++ 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/43.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 186558c62..987d7b716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 3.4.2 + +#### What's Fixed +- Fixed "Add to queue" incorrectly changing the queue and crashing the app +- Fixed 1x4 and 1x3 widgets having square edges +- Fixed crash when music library updates in such a way to change music information + ## 3.4.1 #### What's Fixed diff --git a/README.md b/README.md index 85006d016..03010bdbe 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 d17211886..868e7d8f3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { defaultConfig { applicationId namespace - versionName "3.4.1" - versionCode 42 + versionName "3.4.2" + versionCode 43 minSdk 24 targetSdk 34 diff --git a/fastlane/metadata/android/en-US/changelogs/43.txt b/fastlane/metadata/android/en-US/changelogs/43.txt new file mode 100644 index 000000000..c57d2b2b2 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/43.txt @@ -0,0 +1,3 @@ +Auxio 3.4.0 adds gapless playback and new widget designs, alongside a variety of fixes. +This release fixes critical issues identified in the previous version. +For more information, see https://github.com/OxygenCobalt/Auxio/releases/tag/v3.4.2 \ No newline at end of file From 399e181e39e14c55f94623d319943eeee1ce5644 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 28 Feb 2024 22:58:35 -0700 Subject: [PATCH 08/18] playback: fix more state restore issues They just keep coming. I hate how complicated this system is. --- .../auxio/playback/state/PlaybackStateHolder.kt | 2 +- .../auxio/playback/state/PlaybackStateManager.kt | 11 ++++++----- .../oxycblt/auxio/playback/system/PlaybackService.kt | 3 ++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt index 3cf5f44da..259d5ab97 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateHolder.kt @@ -155,7 +155,7 @@ interface PlaybackStateHolder { fun applySavedState(parent: MusicParent?, rawQueue: RawQueue, ack: StateAck.NewPlayback?) /** Reset this instance to an empty state. */ - fun reset() + fun reset(ack: StateAck.NewPlayback) } /** diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 4dd7bb690..fceb344a5 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -743,19 +743,20 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { } // Make sure we re-align the index to point to the previously playing song. - fun pointingAtSong(): Boolean { + fun pointingAtSong(index: Int): Boolean { val currentSong = if (shuffledMapping.isNotEmpty()) { - shuffledMapping.getOrNull(savedState.index)?.let { heap.getOrNull(it) } + shuffledMapping.getOrNull(index)?.let { heap.getOrNull(it) } } else { - heap.getOrNull(savedState.index) + heap.getOrNull(index) } + logD(currentSong) return currentSong?.uid == savedState.songUid } var index = savedState.index - while (!pointingAtSong() && index > -1) { + while (!pointingAtSong(index) && index > -1) { index-- } @@ -766,7 +767,7 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { } if (index < 0) { - stateHolder.reset() + stateHolder.reset(StateAck.NewPlayback) return } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 3e29274a0..0250a6a85 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -485,8 +485,9 @@ class PlaybackService : ack?.let { playbackManager.ack(this, it) } } - override fun reset() { + override fun reset(ack: StateAck.NewPlayback) { player.setMediaItems(emptyList()) + playbackManager.ack(this, ack) } // --- PLAYER OVERRIDES --- From b43586c1ea0bd4cbd1cfe98cf424bf3d28917c28 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 28 Feb 2024 22:59:51 -0700 Subject: [PATCH 09/18] home: fix crash on music updates --- CHANGELOG.md | 1 + .../main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt | 2 +- .../main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt | 2 +- .../main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt | 2 +- .../java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt | 2 +- .../main/java/org/oxycblt/auxio/home/list/SongListFragment.kt | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 987d7b716..cb8325662 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Fixed "Add to queue" incorrectly changing the queue and crashing the app - Fixed 1x4 and 1x3 widgets having square edges - Fixed crash when music library updates in such a way to change music information +- Fixed crash when music library updates while scrolled in a list ## 3.4.1 diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt index 74c942dae..a3ad98835 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt @@ -95,7 +95,7 @@ class AlbumListFragment : } override fun getPopup(pos: Int): String? { - val album = homeModel.albumList.value[pos] + val album = homeModel.albumList.value.getOrNull(pos) ?: return null // Change how we display the popup depending on the current sort mode. return when (homeModel.albumSort.mode) { // By Name -> Use Name diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt index 7dc885308..0f99cdb48 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt @@ -90,7 +90,7 @@ class ArtistListFragment : } override fun getPopup(pos: Int): String? { - val artist = homeModel.artistList.value[pos] + val artist = homeModel.artistList.value.getOrNull(pos) ?: return null // Change how we display the popup depending on the current sort mode. return when (homeModel.artistSort.mode) { // By Name -> Use Name diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt index 3307fa721..ef001d36e 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt @@ -89,7 +89,7 @@ class GenreListFragment : } override fun getPopup(pos: Int): String? { - val genre = homeModel.genreList.value[pos] + val genre = homeModel.genreList.value.getOrNull(pos) ?: return null // Change how we display the popup depending on the current sort mode. return when (homeModel.genreSort.mode) { // By Name -> Use Name diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt index 4228c872a..e0fe15bec 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt @@ -87,7 +87,7 @@ class PlaylistListFragment : } override fun getPopup(pos: Int): String? { - val playlist = homeModel.playlistList.value[pos] + val playlist = homeModel.playlistList.value.getOrNull(pos) ?: return null // Change how we display the popup depending on the current sort mode. return when (homeModel.playlistSort.mode) { // By Name -> Use Name diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt index 04f9847f1..6a5d91bcf 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt @@ -92,7 +92,7 @@ class SongListFragment : } override fun getPopup(pos: Int): String? { - val song = homeModel.songList.value[pos] + val song = homeModel.songList.value.getOrNull(pos) ?: return null // Change how we display the popup depending on the current sort mode. // Note: We don't use the more correct individual artist name here, as sorts are largely // based off the names of the parent objects and not the child objects. From c42da2240cf9e707641d25fa4de06a90f40fa857 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 28 Feb 2024 23:08:09 -0700 Subject: [PATCH 10/18] playback: fix add to queue again --- .../auxio/playback/system/BetterShuffleOrder.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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 c9d77cf37..b3b067fa4 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 @@ -68,6 +68,9 @@ class BetterShuffleOrder(private val shuffled: IntArray) : ShuffleOrder { return BetterShuffleOrder(insertionCount, -1) } + // TODO: Fix this scuffed hacky logic + // TODO: Play next ordering needs to persist in unshuffle + val newShuffled = IntArray(shuffled.size + insertionCount) val pivot: Int = if (insertionIndex < shuffled.size) { @@ -87,8 +90,14 @@ class BetterShuffleOrder(private val shuffled: IntArray) : ShuffleOrder { newShuffled[i + insertionCount] = currentIndex } } - for (i in 0 until insertionCount) { - newShuffled[pivot + i + 1] = insertionIndex + i + 1 + if (insertionIndex < shuffled.size) { + for (i in 0 until insertionCount) { + newShuffled[pivot + i + 1] = insertionIndex + i + 1 + } + } else { + for (i in 0 until insertionCount) { + newShuffled[pivot + i] = insertionIndex + i + } } return BetterShuffleOrder(newShuffled) } From 24faeef8f3da4421909cdb91bf106a2081be5e93 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 28 Feb 2024 23:11:44 -0700 Subject: [PATCH 11/18] info: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb8325662..74f7b60b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Fixed 1x4 and 1x3 widgets having square edges - Fixed crash when music library updates in such a way to change music information - Fixed crash when music library updates while scrolled in a list +- Fixed inconsistent corner radius in wafer widgets ## 3.4.1 From c6b960466b767c2d80a41d892b4c958a9dc71e55 Mon Sep 17 00:00:00 2001 From: unrenowned <163776820+unrenowned@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:27:18 +0000 Subject: [PATCH 12/18] playback: fix playNext crash on last song of queue Fixes OxygenCobalt/Auxio#735. ExoPlayer method for fetching next media item returns C.INDEX_UNSET (-1) when used on the last song of a queue, which is not a valid index for ExoPlayer.addMediaItems(). New code just adds songs to the end of the queue if there isn't a next song. --- .../org/oxycblt/auxio/playback/system/PlaybackService.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 0250a6a85..997e355a9 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -377,7 +377,14 @@ class PlaybackService : } override fun playNext(songs: List, ack: StateAck.PlayNext) { - player.addMediaItems(player.nextMediaItemIndex, songs.map { it.toMediaItem() }) + val nextIndex = player.nextMediaItemIndex + + if (nextIndex == C.INDEX_UNSET) { + player.addMediaItems(songs.map { it.toMediaItem() }) + } else { + player.addMediaItems(nextIndex, songs.map { it.toMediaItem() }) + } + playbackManager.ack(this, ack) deferSave() } From 1d9dc345494c59e82eb77894631c979726e856de Mon Sep 17 00:00:00 2001 From: unrenowned <163776820+unrenowned@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:40:42 +0000 Subject: [PATCH 13/18] playback: fix playNext wraparound with Repeat All ExoPlayer method for fetching next media item respects Repeat All, which on the last song of a queue causes playNext to wrap around and insert the songs at the start of the queue. New code fetches next song as if repeat were turned off, so the songs will always be added to the end of the queue. --- .../oxycblt/auxio/playback/system/PlaybackService.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 997e355a9..19b7136a8 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -377,7 +377,17 @@ class PlaybackService : } override fun playNext(songs: List, ack: StateAck.PlayNext) { - val nextIndex = player.nextMediaItemIndex + val currTimeline = player.currentTimeline + val nextIndex = + if (currTimeline.isEmpty) { + C.INDEX_UNSET + } else { + currTimeline.getNextWindowIndex( + player.currentMediaItemIndex, + Player.REPEAT_MODE_OFF, + player.shuffleModeEnabled + ) + } if (nextIndex == C.INDEX_UNSET) { player.addMediaItems(songs.map { it.toMediaItem() }) From 13a3a57365b877263c3f56f763d7c6dffa495c88 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 11:33:40 -0600 Subject: [PATCH 14/18] build: bump media --- media | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media b/media index 2cfefb8f3..f9a17d51d 160000 --- a/media +++ b/media @@ -1 +1 @@ -Subproject commit 2cfefb8f39d84412920d17be4ba76ebaabf2d6a6 +Subproject commit f9a17d51d6b711cf29823fe543091e647d9f83fc From 6e05ef371cba8f59905c18bb225514849116cf80 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 12:11:23 -0600 Subject: [PATCH 15/18] home: handle playback decision event Forgot to add this. Resolves #734. --- CHANGELOG.md | 7 ++++++ .../org/oxycblt/auxio/home/HomeFragment.kt | 22 ++++++++++++++++--- .../playback/decision/PlayFromArtistDialog.kt | 2 +- .../playback/decision/PlayFromGenreDialog.kt | 2 +- .../auxio/playback/system/PlaybackService.kt | 5 +---- app/src/main/res/navigation/inner.xml | 4 ++-- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74f7b60b9..a9a877142 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## dev + +#### What's Fixed +- Fixed crash when using play next on the end of a queue or with a single-song queue +- Fixed weird behavior if using play next on the end of a queue with repeat all enabled +- Fixed artist choice dialog not showing up on home screen if playing from artist/genre was enabled + ## 3.4.2 #### What's Fixed 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 41a1055a7..5744a389e 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -75,6 +75,7 @@ import org.oxycblt.auxio.music.PlaylistDecision import org.oxycblt.auxio.music.PlaylistMessage import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.external.M3U +import org.oxycblt.auxio.playback.PlaybackDecision import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collectImmediately @@ -214,12 +215,13 @@ class HomeFragment : collectImmediately(homeModel.currentTabType, ::updateCurrentTab) collectImmediately(homeModel.songList, homeModel.isFastScrolling, ::updateFab) collect(homeModel.speedDialOpen, ::updateSpeedDial) + collect(detailModel.toShow.flow, ::handleShow) collect(listModel.menu.flow, ::handleMenu) collectImmediately(listModel.selected, ::updateSelection) collectImmediately(musicModel.indexingState, ::updateIndexerState) - collect(musicModel.playlistDecision.flow, ::handleDecision) + collect(musicModel.playlistDecision.flow, ::handlePlaylistDecision) collectImmediately(musicModel.playlistMessage.flow, ::handlePlaylistMessage) - collect(detailModel.toShow.flow, ::handleShow) + collect(playbackModel.playbackDecision.flow, ::handlePlaybackDecision) } override fun onResume() { @@ -487,7 +489,7 @@ class HomeFragment : } } - private fun handleDecision(decision: PlaylistDecision?) { + private fun handlePlaylistDecision(decision: PlaylistDecision?) { if (decision == null) return val directions = when (decision) { @@ -539,6 +541,20 @@ class HomeFragment : musicModel.playlistMessage.consume() } + private fun handlePlaybackDecision(decision: PlaybackDecision?) { + when (decision) { + is PlaybackDecision.PlayFromArtist -> { + findNavController() + .navigateSafe(HomeFragmentDirections.playFromArtist(decision.song.uid)) + } + is PlaybackDecision.PlayFromGenre -> { + findNavController() + .navigateSafe(HomeFragmentDirections.playFromGenre(decision.song.uid)) + } + null -> {} + } + } + private fun updateFab(songs: List, isFastScrolling: Boolean) { updateFabVisibility(songs, isFastScrolling, homeModel.currentTabType.value) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt index 8e318ab3c..67f295466 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromArtistDialog.kt @@ -70,7 +70,7 @@ class PlayFromArtistDialog : } playbackModel.playbackDecision.consume() - pickerModel.setPickerSongUid(args.artistUid) + pickerModel.setPickerSongUid(args.songUid) collectImmediately(pickerModel.currentPickerSong, ::updateSong) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt index 831e5c6e0..dfc522d3c 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/decision/PlayFromGenreDialog.kt @@ -70,7 +70,7 @@ class PlayFromGenreDialog : } playbackModel.playbackDecision.consume() - pickerModel.setPickerSongUid(args.genreUid) + pickerModel.setPickerSongUid(args.songUid) collectImmediately(pickerModel.currentPickerSong, ::updateSong) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 19b7136a8..3fc93a7f8 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -383,10 +383,7 @@ class PlaybackService : C.INDEX_UNSET } else { currTimeline.getNextWindowIndex( - player.currentMediaItemIndex, - Player.REPEAT_MODE_OFF, - player.shuffleModeEnabled - ) + player.currentMediaItemIndex, Player.REPEAT_MODE_OFF, player.shuffleModeEnabled) } if (nextIndex == C.INDEX_UNSET) { diff --git a/app/src/main/res/navigation/inner.xml b/app/src/main/res/navigation/inner.xml index c688464cb..ff6f18d10 100644 --- a/app/src/main/res/navigation/inner.xml +++ b/app/src/main/res/navigation/inner.xml @@ -491,7 +491,7 @@ android:label="play_from_artist_dialog" tools:layout="@layout/dialog_music_choices"> @@ -501,7 +501,7 @@ android:label="play_from_genre_dialog" tools:layout="@layout/dialog_music_choices"> From 124fe18850887787e0573395e90a2d74ab1201ca Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 12:31:02 -0600 Subject: [PATCH 16/18] playback: re-add replaygain off mode It was honestly foolish for me to recommend retagging. Resolves #746. --- app/src/main/java/org/oxycblt/auxio/IntegerTable.kt | 2 +- .../java/org/oxycblt/auxio/playback/replaygain/ReplayGain.kt | 3 +++ .../auxio/playback/replaygain/ReplayGainAudioProcessor.kt | 5 +++++ app/src/main/res/values/settings.xml | 3 +++ app/src/main/res/values/strings.xml | 3 ++- 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt index 54d59eb50..271de0969 100644 --- a/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt +++ b/app/src/main/java/org/oxycblt/auxio/IntegerTable.kt @@ -102,7 +102,7 @@ object IntegerTable { /** Sort.Mode.ByDateAdded */ const val SORT_BY_DATE_ADDED = 0xA118 /** ReplayGainMode.Off (No longer used but still reserved) */ - // const val REPLAY_GAIN_MODE_OFF = 0xA110 + const val REPLAY_GAIN_MODE_OFF = 0xA110 /** ReplayGainMode.Track */ const val REPLAY_GAIN_MODE_TRACK = 0xA111 /** ReplayGainMode.Album */ 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 5a19c7df3..012bdfce3 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 @@ -29,6 +29,8 @@ import org.oxycblt.auxio.R * @author Alexander Capehart (OxygenCobalt) */ enum class ReplayGainMode { + /** Do not apply any ReplayGain adjustments. */ + OFF, /** Apply the track gain, falling back to the album gain if the track gain is not found. */ TRACK, /** Apply the album gain, falling back to the track gain if the album gain is not found. */ @@ -45,6 +47,7 @@ enum class ReplayGainMode { */ fun fromIntCode(intCode: Int) = when (intCode) { + IntegerTable.REPLAY_GAIN_MODE_OFF -> OFF IntegerTable.REPLAY_GAIN_MODE_TRACK -> TRACK IntegerTable.REPLAY_GAIN_MODE_ALBUM -> ALBUM IntegerTable.REPLAY_GAIN_MODE_DYNAMIC -> DYNAMIC diff --git a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt index c94f32ae5..09168842d 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt @@ -119,6 +119,11 @@ constructor( // ReplayGain is configurable, so determine what to do based off of the mode. val resolvedAdjustment = when (playbackSettings.replayGainMode) { + // User wants no adjustment. + ReplayGainMode.OFF -> { + logD("ReplayGain is off") + null + } // User wants track gain to be preferred. Default to album gain only if // there is no track gain. ReplayGainMode.TRACK -> { diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index f5c45132a..49dbceebd 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -139,12 +139,14 @@ + @string/set_replay_gain_mode_off @string/set_replay_gain_mode_track @string/set_replay_gain_mode_album @string/set_replay_gain_mode_dynamic + @integer/replay_gain_off @integer/replay_gain_track @integer/replay_gain_album @integer/replay_gain_dynamic @@ -161,6 +163,7 @@ 0xA122 0xA124 + 0xA110 0xA111 0xA112 0xA113 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a465a49c..e4431dacd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -290,8 +290,9 @@ Pause when a song repeats Remember pause Remain playing/paused when skipping or editing queue - ReplayGain + Volume normalization ReplayGain strategy + Off Prefer track Prefer album Prefer album if one is playing From d7ea08cccd133c6150cebef882fb62e0180da1c6 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 14:47:04 -0600 Subject: [PATCH 17/18] build: bump to 3.4.3 Bump to version 3.4.3 (44). --- CHANGELOG.md | 3 +++ README.md | 4 ++-- app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/44.txt | 3 +++ 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/44.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index a9a877142..da465569a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## dev +#### What's Improved +- Added back option disable ReplayGain for poorly tagged libraries + #### What's Fixed - Fixed crash when using play next on the end of a queue or with a single-song queue - Fixed weird behavior if using play next on the end of a queue with repeat all enabled diff --git a/README.md b/README.md index 03010bdbe..168184c01 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 868e7d8f3..147514045 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { defaultConfig { applicationId namespace - versionName "3.4.2" - versionCode 43 + versionName "3.4.3" + versionCode 44 minSdk 24 targetSdk 34 diff --git a/fastlane/metadata/android/en-US/changelogs/44.txt b/fastlane/metadata/android/en-US/changelogs/44.txt new file mode 100644 index 000000000..005811807 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/44.txt @@ -0,0 +1,3 @@ +Auxio 3.4.0 adds gapless playback and new widget designs, alongside a variety of fixes. +This release fixes issues identified in the previous version. +For more information, see https://github.com/OxygenCobalt/Auxio/releases/tag/v3.4.3 \ No newline at end of file From c35ede67b055f25c57431e456c70c0fe54f33786 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 4 Apr 2024 14:47:30 -0600 Subject: [PATCH 18/18] build: bump media --- media | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media b/media index f9a17d51d..e585deaa9 160000 --- a/media +++ b/media @@ -1 +1 @@ -Subproject commit f9a17d51d6b711cf29823fe543091e647d9f83fc +Subproject commit e585deaa94cc679ab4fd0a653cc1bf67abb54b7e