From 6d003c308b161de9b348418c499cc051f99683fc Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Thu, 3 Mar 2022 18:47:55 -0700 Subject: [PATCH] playback: fix headset focus autoplay issue Fix an issue where headset focus would result in unexpected playback whenever the service started. AudioManager.ACTION_HEADSET_PLUG seems to always fire when the initial BroadcastReceiver is set up, which results in a weird bug where if a wired headset is connected while PlaybackService is started, playback will start immediately, which was not user friendly. I fear that this may result in an edge case that results in headset focus not firing in an unrelated situation, which in that case I would be forced to remove headset autoplay entirely (or at least relegate it to a quirk option). --- CHANGELOG.md | 1 + app/src/main/java/org/oxycblt/auxio/AuxioApp.kt | 4 ++++ app/src/main/java/org/oxycblt/auxio/MainActivity.kt | 1 - .../java/org/oxycblt/auxio/home/HomeFragment.kt | 1 + app/src/main/java/org/oxycblt/auxio/music/Models.kt | 2 +- .../java/org/oxycblt/auxio/music/MusicLoader.kt | 1 + .../main/java/org/oxycblt/auxio/music/MusicStore.kt | 5 +++-- .../auxio/playback/system/PlaybackService.kt | 13 +++++++++---- 8 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e4f5c1c4..4fae24304 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ from the system theme was used [#80] - Fixed music loading failure that would occur when certain paths were parsed [#84] - Fixed incorrect track numbers when the tag was formatted as NN/TT [#88] - Fixed years deliberately set as "0" showing up as "No Date" +- Fixed headset management unexpectedly starting audio when the app initially opens #### What's Changed - All cover art is now cropped to a 1:1 aspect ratio diff --git a/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt b/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt index b38f175e8..1af01e292 100644 --- a/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt +++ b/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt @@ -29,6 +29,10 @@ import org.oxycblt.auxio.coil.GenreImageFetcher import org.oxycblt.auxio.coil.MusicKeyer import org.oxycblt.auxio.settings.SettingsManager +/** + * TODO: Phase out databinding + * TODO: Rework sealed classes to minimize whens and maximize overrides + */ @Suppress("UNUSED") class AuxioApp : Application(), ImageLoaderFactory { override fun onCreate() { diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index 4fe538b85..a0d47383b 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -43,7 +43,6 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat * TODO: Add a new view for crashes with a stack trace * TODO: Custom language support * TODO: Rework menus [perhaps add multi-select] - * TODO: Phase out databinding */ class MainActivity : AppCompatActivity() { private val playbackModel: PlaybackViewModel by viewModels() 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 9f79c787c..8a9d6af25 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -56,6 +56,7 @@ import org.oxycblt.auxio.util.logTraceOrThrow * views for each respective item. * @author OxygenCobalt * TODO: Make tabs invisible when there is only one + * TODO: Add duration and song count sorts */ class HomeFragment : Fragment() { private val playbackModel: PlaybackViewModel by activityViewModels() diff --git a/app/src/main/java/org/oxycblt/auxio/music/Models.kt b/app/src/main/java/org/oxycblt/auxio/music/Models.kt index 8156f8ca7..ad78d4379 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Models.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -149,7 +149,7 @@ data class Song( */ data class Album( override val name: String, - /** The latest year of the songs in this album. */ + /** The latest year of the songs in this album. Null if none of the songs had metadata. */ val year: Int?, /** The URI for the cover art corresponding to this album. */ val albumCoverUri: Uri, diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt index 0106376c2..41cf58e27 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt @@ -241,6 +241,7 @@ class MusicLoader { // Use the song with the latest year as our metadata song. // This allows us to replicate the LAST_YEAR field, which is useful as it means that // weird years like "0" wont show up if there are alternatives. + // TODO: Weigh songs with null years lower than songs with zero years val templateSong = requireNotNull( albumSongs.maxByOrNull { it.internalMediaStoreYear ?: 0 } ) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt index 5874bcd74..d98671708 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt @@ -69,7 +69,8 @@ class MusicStore private constructor() { val start = System.currentTimeMillis() val loader = MusicLoader() - val library = loader.load(context) ?: return Response.Err(ErrorKind.NO_MUSIC) + val library = loader.load(context) + ?: return Response.Err(ErrorKind.NO_MUSIC) mSongs = library.songs mAlbums = library.albums @@ -78,7 +79,7 @@ class MusicStore private constructor() { logD("Music load completed successfully in ${System.currentTimeMillis() - start}ms") } catch (e: Exception) { - logE("Something went horribly wrong") + logE("Music loading failed.") logE(e.stackTraceToString()) return Response.Err(ErrorKind.FAILED) } 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 d9842ffa9..9630d50e2 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 @@ -439,7 +439,6 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac private fun stopForegroundAndNotification() { stopForeground(true) notificationManager.cancel(PlaybackNotification.NOTIFICATION_ID) - isForeground = false } @@ -448,6 +447,8 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac * TODO: Don't fire when the service initially starts? */ private inner class PlaybackReceiver : BroadcastReceiver() { + private var handledInitialHeadsetPlug = false + override fun onReceive(context: Context, intent: Intent) { when (intent.action) { // --- SYSTEM EVENTS --- @@ -461,10 +462,14 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac AudioManager.ACTION_AUDIO_BECOMING_NOISY -> pauseFromPlug() AudioManager.ACTION_HEADSET_PLUG -> { - when (intent.getIntExtra("state", -1)) { - 0 -> pauseFromPlug() - 1 -> resumeFromPlug() + if (handledInitialHeadsetPlug) { + when (intent.getIntExtra("state", -1)) { + 0 -> pauseFromPlug() + 1 -> resumeFromPlug() + } } + + handledInitialHeadsetPlug = true } // --- AUXIO EVENTS ---