From 4917330633e5b2a4c87db2ba2bc56afbd57894d4 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 18 Sep 2024 14:50:29 -0600 Subject: [PATCH] service: re-add attach pattern Turns out I can't actually couple creation/attach without creating a huge amount of variable issues. --- .../java/org/oxycblt/auxio/AuxioService.kt | 3 +- .../oxycblt/auxio/detail/DetailGenerator.kt | 4 +- .../oxycblt/auxio/detail/DetailViewModel.kt | 4 +- .../org/oxycblt/auxio/home/HomeGenerator.kt | 64 +++++++++---------- .../org/oxycblt/auxio/home/HomeViewModel.kt | 4 +- .../oxycblt/auxio/music/service/Indexer.kt | 2 +- .../auxio/music/service/MusicBrowser.kt | 5 ++ .../music/service/MusicServiceFragment.kt | 5 ++ .../replaygain/ReplayGainAudioProcessor.kt | 14 +--- .../service/ExoPlaybackStateHolder.kt | 7 +- .../playback/service/MediaSessionHolder.kt | 2 +- .../service/PlaybackServiceFragment.kt | 10 +-- .../service/SystemPlaybackReceiver.kt | 19 ++++-- .../oxycblt/auxio/widgets/WidgetComponent.kt | 2 +- 14 files changed, 77 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/AuxioService.kt b/app/src/main/java/org/oxycblt/auxio/AuxioService.kt index aeb0e6db7..ecfc404fe 100644 --- a/app/src/main/java/org/oxycblt/auxio/AuxioService.kt +++ b/app/src/main/java/org/oxycblt/auxio/AuxioService.kt @@ -49,8 +49,9 @@ class AuxioService : override fun onCreate() { super.onCreate() playbackFragment = playbackFragmentFactory.create(this, this) - sessionToken = playbackFragment.token + sessionToken = playbackFragment.attach() musicFragment = musicFragmentFactory.create(this, this, this) + musicFragment.attach() } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt index 0b48b060c..5e8cc4ed8 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt @@ -47,6 +47,8 @@ interface DetailGenerator { fun playlist(uid: Music.UID): Detail? + fun attach() + fun release() interface Factory { @@ -71,7 +73,7 @@ private class DetailGeneratorImpl( private val listSettings: ListSettings, private val musicRepository: MusicRepository ) : DetailGenerator, MusicRepository.UpdateListener, ListSettings.Listener { - init { + override fun attach() { listSettings.registerListener(this) musicRepository.addUpdateListener(this) } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index d5fbc9806..1ca0a7008 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -72,8 +72,6 @@ constructor( private val playbackSettings: PlaybackSettings, detailGeneratorFactory: DetailGenerator.Factory ) : ViewModel(), DetailGenerator.Invalidator { - private val detailGenerator = detailGeneratorFactory.create(this) - private val _toShow = MutableEvent() /** * A [Show] command that is awaiting a view capable of responding to it. Null if none currently. @@ -197,6 +195,8 @@ constructor( playbackSettings.inParentPlaybackMode ?: PlaySong.FromPlaylist(unlikelyToBeNull(currentPlaylist.value)) + private val detailGenerator = detailGeneratorFactory.create(this) + override fun onCleared() { detailGenerator.release() } diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt index 5c551db0e..6b8706cbf 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt @@ -32,6 +32,10 @@ import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.util.logD interface HomeGenerator { + fun attach() + + fun release() + fun songs(): List fun albums(): List @@ -44,8 +48,6 @@ interface HomeGenerator { fun tabs(): List - fun release() - interface Invalidator { fun invalidateMusic(type: MusicType, instructions: UpdateInstructions) @@ -74,41 +76,14 @@ private class HomeGeneratorImpl( private val listSettings: ListSettings, private val musicRepository: MusicRepository, ) : HomeGenerator, HomeSettings.Listener, ListSettings.Listener, MusicRepository.UpdateListener { - override fun songs() = - musicRepository.deviceLibrary?.let { listSettings.songSort.songs(it.songs) } ?: emptyList() - - override fun albums() = - musicRepository.deviceLibrary?.let { listSettings.albumSort.albums(it.albums) } - ?: emptyList() - - override fun artists() = - musicRepository.deviceLibrary?.let { listSettings.artistSort.artists(it.artists) } - ?: emptyList() - - override fun genres() = - musicRepository.deviceLibrary?.let { listSettings.genreSort.genres(it.genres) } - ?: emptyList() - - override fun playlists() = - musicRepository.userLibrary?.let { listSettings.playlistSort.playlists(it.playlists) } - ?: emptyList() - - override fun tabs() = homeSettings.homeTabs.filterIsInstance().map { it.type } - - override fun onTabsChanged() { - invalidator.invalidateTabs() - } - - init { + override fun attach() { homeSettings.registerListener(this) listSettings.registerListener(this) musicRepository.addUpdateListener(this) } - override fun release() { - musicRepository.removeUpdateListener(this) - listSettings.unregisterListener(this) - homeSettings.unregisterListener(this) + override fun onTabsChanged() { + invalidator.invalidateTabs() } override fun onHideCollaboratorsChanged() { @@ -161,4 +136,29 @@ private class HomeGeneratorImpl( invalidator.invalidateMusic(MusicType.PLAYLISTS, UpdateInstructions.Diff) } } + override fun release() { + musicRepository.removeUpdateListener(this) + listSettings.unregisterListener(this) + homeSettings.unregisterListener(this) + } + override fun songs() = + musicRepository.deviceLibrary?.let { listSettings.songSort.songs(it.songs) } ?: emptyList() + + override fun albums() = + musicRepository.deviceLibrary?.let { listSettings.albumSort.albums(it.albums) } + ?: emptyList() + + override fun artists() = + musicRepository.deviceLibrary?.let { listSettings.artistSort.artists(it.artists) } + ?: emptyList() + + override fun genres() = + musicRepository.deviceLibrary?.let { listSettings.genreSort.genres(it.genres) } + ?: emptyList() + + override fun playlists() = + musicRepository.userLibrary?.let { listSettings.playlistSort.playlists(it.playlists) } + ?: emptyList() + + override fun tabs() = homeSettings.homeTabs.filterIsInstance().map { it.type } } diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt index 206b4bd0a..eec145be1 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt @@ -52,8 +52,6 @@ constructor( private val playbackSettings: PlaybackSettings, homeGeneratorFactory: HomeGenerator.Factory ) : ViewModel(), HomeGenerator.Invalidator { - private val homeGenerator = homeGeneratorFactory.create(this) - private val _songList = MutableStateFlow(listOf()) /** A list of [Song]s, sorted by the preferred [Sort], to be shown in the home view. */ val songList: StateFlow> @@ -131,6 +129,8 @@ constructor( val playlistSort: Sort get() = listSettings.playlistSort + private val homeGenerator = homeGeneratorFactory.create(this) + /** * A list of [MusicType] corresponding to the current [Tab] configuration, excluding invisible * [Tab]s. diff --git a/app/src/main/java/org/oxycblt/auxio/music/service/Indexer.kt b/app/src/main/java/org/oxycblt/auxio/music/service/Indexer.kt index de5969216..6b3dfb29f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/service/Indexer.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/service/Indexer.kt @@ -80,7 +80,7 @@ private constructor( .newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID + ":IndexingComponent") - init { + fun attach() { musicSettings.registerListener(this) musicRepository.addUpdateListener(this) musicRepository.addIndexingListener(this) diff --git a/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt b/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt index 0e82b5d86..2fadb2dff 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt @@ -71,6 +71,11 @@ private constructor( private val homeGenerator = homeGeneratorFactory.create(this) private val detailGenerator = detailGeneratorFactory.create(this) + fun attach() { + homeGenerator.attach() + detailGenerator.attach() + } + fun release() { homeGenerator.release() detailGenerator.release() diff --git a/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt b/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt index 2d425e793..ebf91c001 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt @@ -74,6 +74,11 @@ constructor( fun invalidateMusic(mediaId: String) } + fun attach() { + indexer.attach() + musicBrowser.attach() + } + fun release() { dispatchJob.cancel() musicBrowser.release() 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 1a1770736..5f2848508 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 @@ -44,20 +44,10 @@ import org.oxycblt.auxio.util.logD * * @author Alexander Capehart (OxygenCobalt) */ -class ReplayGainAudioProcessor -private constructor( +class ReplayGainAudioProcessor @Inject constructor( private val playbackManager: PlaybackStateManager, private val playbackSettings: PlaybackSettings ) : BaseAudioProcessor(), PlaybackStateManager.Listener, PlaybackSettings.Listener { - class Factory - @Inject - constructor( - private val playbackManager: PlaybackStateManager, - private val playbackSettings: PlaybackSettings - ) { - fun create() = ReplayGainAudioProcessor(playbackManager, playbackSettings) - } - private var volume = 1f set(value) { field = value @@ -65,7 +55,7 @@ private constructor( flush() } - init { + fun attach() { playbackManager.addListener(this) playbackSettings.registerListener(this) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt index b705cf1ab..4e95e54d4 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/ExoPlaybackStateHolder.kt @@ -86,7 +86,7 @@ class ExoPlaybackStateHolder( var sessionOngoing = false private set - init { + fun attach() { imageSettings.registerListener(this) player.addListener(this) playbackManager.registerStateHolder(this) @@ -581,14 +581,13 @@ class ExoPlaybackStateHolder( private val playbackSettings: PlaybackSettings, private val commandFactory: PlaybackCommand.Factory, private val mediaSourceFactory: MediaSource.Factory, - private val replayGainProcessorFactory: ReplayGainAudioProcessor.Factory, + private val replayGainProcessor: ReplayGainAudioProcessor, private val musicRepository: MusicRepository, private val imageSettings: ImageSettings, ) { fun create(): ExoPlaybackStateHolder { // Since Auxio is a music player, only specify an audio renderer to save - // battery/apk size/cache size - val replayGainProcessor = replayGainProcessorFactory.create() + // battery/apk size/cache size] val audioRenderer = RenderersFactory { handler, _, audioListener, _, _ -> arrayOf( FfmpegAudioRenderer(handler, audioListener, replayGainProcessor), diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionHolder.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionHolder.kt index f683876d2..9d3af9bab 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionHolder.kt @@ -96,7 +96,7 @@ private constructor( val notification: ForegroundServiceNotification get() = _notification - init { + fun attach() { playbackManager.addListener(this) playbackSettings.registerListener(this) imageSettings.registerListener(this) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt index 9f77f714e..04af2a40f 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/PlaybackServiceFragment.kt @@ -66,13 +66,15 @@ private constructor( private val widgetComponent = widgetComponentFactory.create(context) private val systemReceiver = systemReceiverFactory.create(context, widgetComponent) - val token: MediaSessionCompat.Token - get() = sessionHolder.token - // --- MEDIASESSION CALLBACKS --- - init { + fun attach(): MediaSessionCompat.Token { + exoHolder.attach() + sessionHolder.attach() + widgetComponent.attach() + systemReceiver.attach() playbackManager.addListener(this) + return sessionHolder.token } fun handleTaskRemoved() { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/SystemPlaybackReceiver.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/SystemPlaybackReceiver.kt index 4a846cdfe..4e7c214e0 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/SystemPlaybackReceiver.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/SystemPlaybackReceiver.kt @@ -37,6 +37,7 @@ import org.oxycblt.auxio.widgets.WidgetProvider */ class SystemPlaybackReceiver private constructor( + private val context: Context, private val playbackManager: PlaybackStateManager, private val playbackSettings: PlaybackSettings, private val widgetComponent: WidgetComponent @@ -49,13 +50,17 @@ private constructor( private val playbackManager: PlaybackStateManager, private val playbackSettings: PlaybackSettings ) { - fun create(context: Context, widgetComponent: WidgetComponent): SystemPlaybackReceiver { - val receiver = - SystemPlaybackReceiver(playbackManager, playbackSettings, widgetComponent) - ContextCompat.registerReceiver( - context, receiver, INTENT_FILTER, ContextCompat.RECEIVER_EXPORTED) - return receiver - } + fun create(context: Context, widgetComponent: WidgetComponent) = + SystemPlaybackReceiver(context, playbackManager, playbackSettings, widgetComponent) + } + + fun attach() { + ContextCompat.registerReceiver( + context, this, INTENT_FILTER, ContextCompat.RECEIVER_EXPORTED) + } + + fun release() { + context.unregisterReceiver(this) } override fun onReceive(context: Context, intent: Intent) { diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt index 367b44f42..909ff7e45 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt @@ -67,7 +67,7 @@ private constructor( private val widgetProvider = WidgetProvider() - init { + fun attach() { playbackManager.addListener(this) uiSettings.registerListener(this) imageSettings.registerListener(this)