From 9341e4f21e77f5a7762f8edea2ae76bf7a57acbe Mon Sep 17 00:00:00 2001 From: David Date: Sat, 14 Feb 2026 11:34:25 -0600 Subject: [PATCH 1/5] Deactivate media session when playback stops --- .../PlaybackNotificationBroadcaster.kt | 2 +- .../remote/MediaSessionBroadcaster.kt | 30 ++++- .../MediaSession/ControlMediaSession.kt | 4 + .../MediaSession/MediaSessionController.kt | 15 +++ .../MediaSession/MediaSessionService.kt | 30 +++-- ...er.kt => FakeSelectedLibraryIdProvider.kt} | 6 +- .../WhenATrackIsSwitchedTwice.kt | 4 +- .../WhenObservingPlayback.kt | 4 +- .../WhenChangingToThePreviousTrack.kt | 4 +- .../WhenChangingTracks.kt | 4 +- .../WhenMovingThePlayingTrack.kt | 4 +- ...vingTracksFromBeforeToAfterPlayingTrack.kt | 4 +- ...ingTracksFromBeforeToBeforePlayingTrack.kt | 4 +- ...TracksFromBeforeToJustAfterPlayingTrack.kt | 4 +- .../WhenSettingEngineToComplete.kt | 4 +- .../WhenSettingEngineToRepeat.kt | 4 +- ...RestoringEngineStateAndResumingPlayback.kt | 4 +- ...ring Engine State And Resuming Playback.kt | 4 +- .../WhenPlaybackCompletes.kt | 4 +- .../WhenObservingPlayback.kt | 4 +- .../AndAnErrorOccurs/WhenObservingPlayback.kt | 4 +- .../When Playback is Resumed.kt | 4 +- .../When Playback Is Resumed.kt | 4 +- .../When Playback Is Resumed.kt | 4 +- .../When Playback Is Resumed.kt | 4 +- .../When Playback Is Resumed.kt | 4 +- .../WhenResumingPlayback.kt | 4 +- ...ing the track back to the skipped track.kt | 4 +- .../When changing tracks many times.kt | 4 +- .../WhenChangingTracks.kt | 4 +- ...vingTracksFromAfterToBeforePlayingTrack.kt | 4 +- .../WhenNotObservingPlayback.kt | 4 +- .../WhenObservingPlayback.kt | 4 +- .../WhenPlaybackCompletes.kt | 4 +- .../WhenPlaybackIsPaused.kt | 4 +- .../WhenPlaybackIsPausedAndRestarted.kt | 4 +- ...ovingFilesBeforeTheCurrentlyPlayingFile.kt | 4 +- .../WhenRemovingTheCurrentlyPlayingFile.kt | 4 +- ...nStateIsRestoredWithADifferentLibraryId.kt | 4 +- ...WhenStateIsRestoredWithTheSameLibraryId.kt | 4 +- .../AndStartedAgain/WhenTheFileChanges.kt | 124 ++++++++++++++++++ .../WhenTheFileChanges.kt | 14 +- .../ThenStartedAgain/WhenTheFileChanges.kt | 4 +- .../WhenTheFileChanges.kt | 4 +- .../ThenStartedAgain/WhenTheFileChanges.kt | 4 +- .../AndPlaybackIsPaused/WhenTheFileChanges.kt | 2 + .../WhenTheFileChanges.kt | 25 +++- .../WhenPlaybackIsInterrupted.kt | 2 + .../WhenPlaybackIsPaused.kt | 33 ++++- .../WhenTheFileChanges.kt | 4 +- .../WhenPlaybackStarts.kt | 2 + .../WhenPlaybackIsPaused.kt | 2 + .../WhenPlaybackIsStarting.kt | 2 + .../WhenPlaybackStarts.kt | 7 + .../WhenTheFileChanges.kt | 2 + 55 files changed, 357 insertions(+), 97 deletions(-) rename projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/selected/GivenANullConnection/AndTheSelectedLibraryChanges/{FakeSelectedLibraryProvider.kt => FakeSelectedLibraryIdProvider.kt} (80%) create mode 100644 projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndPlaybackIsStopped/AndStartedAgain/WhenTheFileChanges.kt diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/notification/PlaybackNotificationBroadcaster.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/notification/PlaybackNotificationBroadcaster.kt index 1517065f72..ec5ccf569f 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/notification/PlaybackNotificationBroadcaster.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/notification/PlaybackNotificationBroadcaster.kt @@ -21,7 +21,7 @@ class PlaybackNotificationBroadcaster( notificationsConfiguration: NotificationsConfiguration, private val nowPlayingNotificationContentBuilder: BuildNowPlayingNotificationContent, private val playbackStartingNotification: BuildPlaybackStartingNotification, -) : PlaybackNotificationRouter(registerApplicationMessages), AutoCloseable { +) : PlaybackNotificationRouter(registerApplicationMessages) { private val notificationId = notificationsConfiguration.notificationId private val notificationSync = Any() diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt index 1c9288f768..5c9c54b664 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt @@ -6,9 +6,11 @@ import android.media.session.PlaybackState import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.RatingCompat import android.support.v4.media.session.PlaybackStateCompat +import com.lasthopesoftware.bluewater.android.intents.BuildIntents import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile import com.lasthopesoftware.bluewater.client.browsing.files.properties.FilePropertyHelpers.durationInMs import com.lasthopesoftware.bluewater.client.browsing.files.properties.ProvideLibraryFileProperties +import com.lasthopesoftware.bluewater.client.browsing.library.access.session.ProvideSelectedLibraryId import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId import com.lasthopesoftware.bluewater.client.playback.nowplaying.broadcasters.PlaybackNotificationRouter import com.lasthopesoftware.bluewater.client.playback.nowplaying.storage.GetNowPlayingState @@ -18,7 +20,9 @@ import com.lasthopesoftware.bluewater.shared.images.bytes.GetImageBytes import com.lasthopesoftware.bluewater.shared.lazyLogger import com.lasthopesoftware.bluewater.shared.messages.application.RegisterForApplicationMessages import com.lasthopesoftware.bluewater.shared.messages.registerReceiver +import com.lasthopesoftware.promises.extensions.toPromise import com.lasthopesoftware.resources.bitmaps.ProduceBitmaps +import com.lasthopesoftware.resources.closables.PromisingCloseable import com.namehillsoftware.handoff.promises.Promise import java.util.concurrent.atomic.AtomicLong @@ -38,8 +42,10 @@ class MediaSessionBroadcaster( private val imageProvider: GetImageBytes, private val bitmapProducer: ProduceBitmaps, private val mediaSession: ControlMediaSession, + private val selectedLibraryIdProvider: ProvideSelectedLibraryId, + private val intentBuilder: BuildIntents, applicationMessages: RegisterForApplicationMessages, -) : PlaybackNotificationRouter(applicationMessages) { +) : PlaybackNotificationRouter(applicationMessages), PromisingCloseable { private val trackPositionUpdatesSubscription = applicationMessages.registerReceiver { m: TrackPositionUpdate -> updateTrackPosition(m.filePosition.millis) @@ -61,13 +67,32 @@ class MediaSessionBroadcaster( @Volatile private var isPlaying = false + init { + mediaSession.activate() + } + override fun close() { trackPositionUpdatesSubscription.close() clearClientBitmap() super.close() } - override fun notifyStarting() = notifyPlaying() + override fun promiseClose(): Promise { + close() + return if (playbackState == PlaybackStateCompat.STATE_STOPPED) Unit.toPromise() + else selectedLibraryIdProvider + .promiseSelectedLibraryId() + .then { + if (it != null) + mediaSession.setSessionActivity(intentBuilder.buildPendingNowPlayingIntent(it)) + } + .must { _ -> mediaSession.deactivate() } + } + + override fun notifyStarting() { + mediaSession.activate() + notifyPlaying() + } override fun notifyPlaying() { isPlaying = true @@ -101,6 +126,7 @@ class MediaSessionBroadcaster( playbackSpeed ) mediaSession.setPlaybackState(builder.build()) + mediaSession.deactivate() } override fun notifyInterrupted() { diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt index adfeec6d2b..03f83e6911 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt @@ -1,9 +1,13 @@ package com.lasthopesoftware.bluewater.shared.android.MediaSession +import android.app.PendingIntent import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.PlaybackStateCompat interface ControlMediaSession { + fun activate() + fun deactivate() fun setPlaybackState(playbackStateCompat: PlaybackStateCompat) fun setMetadata(metadata: MediaMetadataCompat) + fun setSessionActivity(pendingIntent: PendingIntent) } diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt index 446fc33b1a..1c419250a7 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt @@ -1,10 +1,21 @@ package com.lasthopesoftware.bluewater.shared.android.MediaSession +import android.app.PendingIntent import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat class MediaSessionController(private val mediaSessionCompat: MediaSessionCompat) : ControlMediaSession { + override fun activate() { + if (!mediaSessionCompat.isActive) + mediaSessionCompat.isActive = true + } + + override fun deactivate() { + if (mediaSessionCompat.isActive) + mediaSessionCompat.isActive = false + } + override fun setPlaybackState(playbackStateCompat: PlaybackStateCompat) { mediaSessionCompat.setPlaybackState(playbackStateCompat) } @@ -12,4 +23,8 @@ class MediaSessionController(private val mediaSessionCompat: MediaSessionCompat) override fun setMetadata(metadata: MediaMetadataCompat) { mediaSessionCompat.setMetadata(metadata) } + + override fun setSessionActivity(pendingIntent: PendingIntent) { + mediaSessionCompat.setSessionActivity(pendingIntent) + } } diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt index 21df925faa..a869cc1a03 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt @@ -10,10 +10,16 @@ import com.lasthopesoftware.bluewater.client.browsing.files.properties.LibraryFi import com.lasthopesoftware.bluewater.client.connection.libraries.LibraryConnectionRegistry import com.lasthopesoftware.bluewater.client.playback.nowplaying.broadcasters.remote.MediaSessionBroadcaster import com.lasthopesoftware.bluewater.client.playback.service.receivers.MediaSessionCallbackReceiver +import com.lasthopesoftware.bluewater.shared.lazyLogger import com.lasthopesoftware.promises.extensions.toFuture import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException @UnstableApi class MediaSessionService : Service() { + companion object { + private val logger by lazyLogger() + } + private val binder by lazy { GenericBinder(this) } private val lazyMediaSession = lazy { @@ -40,6 +46,8 @@ import java.util.concurrent.TimeUnit libraryFilePropertiesDependents.imageBytesProvider, applicationDependencies.bitmapProducer, MediaSessionController(newMediaSession), + applicationDependencies.selectedLibraryIdProvider, + applicationDependencies.intentBuilder, registerForApplicationMessages, ) @@ -53,24 +61,24 @@ import java.util.concurrent.TimeUnit override fun onBind(intent: Intent) = binder override fun onCreate() { - lazyMediaSession.value.second.isActive = true + mediaSession.isActive = true } override fun onDestroy() { if (lazyMediaSession.isInitialized()) { val (broadcaster, mediaSession) = lazyMediaSession.value - val futureLibraryId = applicationDependencies.selectedLibraryIdProvider.promiseSelectedLibraryId().toFuture() - - broadcaster.close() - with (mediaSession) { - isActive = false - futureLibraryId + try { + mediaSession.isActive = false + broadcaster + .promiseClose() + .toFuture() .get(30, TimeUnit.SECONDS) - ?.also { - setSessionActivity(applicationDependencies.intentBuilder.buildPendingNowPlayingIntent(it)) - } - release() + mediaSession.release() + } catch (e: TimeoutException) { + logger.warn("Timed out closing the broadcaster.", e) + } catch (e: Exception) { + logger.error("An unexpected error occurred destroying the MediaSessionService.", e) } } super.onDestroy() diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/selected/GivenANullConnection/AndTheSelectedLibraryChanges/FakeSelectedLibraryProvider.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/selected/GivenANullConnection/AndTheSelectedLibraryChanges/FakeSelectedLibraryIdProvider.kt similarity index 80% rename from projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/selected/GivenANullConnection/AndTheSelectedLibraryChanges/FakeSelectedLibraryProvider.kt rename to projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/selected/GivenANullConnection/AndTheSelectedLibraryChanges/FakeSelectedLibraryIdProvider.kt index 5c482671cb..713af6cf0b 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/selected/GivenANullConnection/AndTheSelectedLibraryChanges/FakeSelectedLibraryProvider.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/selected/GivenANullConnection/AndTheSelectedLibraryChanges/FakeSelectedLibraryIdProvider.kt @@ -4,8 +4,8 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.session.Pro import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId import com.namehillsoftware.handoff.promises.Promise -class FakeSelectedLibraryProvider : ProvideSelectedLibraryId { - var libraryId = LibraryId(0) - +class FakeSelectedLibraryIdProvider( + var libraryId: LibraryId = LibraryId(0) +) : ProvideSelectedLibraryId { override fun promiseSelectedLibraryId(): Promise = Promise(libraryId) } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndAPlaylistIsPreparing/WhenATrackIsSwitchedTwice.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndAPlaylistIsPreparing/WhenATrackIsSwitchedTwice.kt index 2666d5e575..ad5de18fcf 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndAPlaylistIsPreparing/WhenATrackIsSwitchedTwice.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndAPlaylistIsPreparing/WhenATrackIsSwitchedTwice.kt @@ -4,7 +4,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -42,7 +42,7 @@ class WhenATrackIsSwitchedTwice { } ) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndPlaybackPlaysThroughCompletion/WhenObservingPlayback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndPlaybackPlaysThroughCompletion/WhenObservingPlayback.kt index 7584b40714..1071a38e6c 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndPlaybackPlaysThroughCompletion/WhenObservingPlayback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/AndPlaybackPlaysThroughCompletion/WhenObservingPlayback.kt @@ -4,7 +4,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -36,7 +36,7 @@ class WhenObservingPlayback { } ) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingToThePreviousTrack.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingToThePreviousTrack.kt index 0ddaedcf95..4d5c483aa0 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingToThePreviousTrack.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingToThePreviousTrack.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.access.stringlist.Fi import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -53,7 +53,7 @@ class WhenChangingToThePreviousTrack { } ) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingTracks.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingTracks.kt index cb1f66cfd9..68b227c4ec 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingTracks.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenChangingTracks.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryNowPlayingValues -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -69,7 +69,7 @@ class WhenChangingTracks { } ) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), savedLibrary.libraryStorage, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingThePlayingTrack.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingThePlayingTrack.kt index c16b44f7ae..0cf876bb00 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingThePlayingTrack.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingThePlayingTrack.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.access.stringlist.Fi import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.libraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -47,7 +47,7 @@ class WhenMovingThePlayingTrack { } ) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToAfterPlayingTrack.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToAfterPlayingTrack.kt index 8885fe577f..d4fa5d4405 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToAfterPlayingTrack.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToAfterPlayingTrack.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.libraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -42,7 +42,7 @@ class WhenMovingTracksFromBeforeToAfterPlayingTrack { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToBeforePlayingTrack.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToBeforePlayingTrack.kt index df2f5b4343..6ba8a4718d 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToBeforePlayingTrack.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToBeforePlayingTrack.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -48,7 +48,7 @@ class WhenMovingTracksFromBeforeToBeforePlayingTrack { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToJustAfterPlayingTrack.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToJustAfterPlayingTrack.kt index 403b63fa4c..046b10ff78 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToJustAfterPlayingTrack.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenMovingTracksFromBeforeToJustAfterPlayingTrack.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.libraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -42,7 +42,7 @@ class WhenMovingTracksFromBeforeToJustAfterPlayingTrack { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToComplete.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToComplete.kt index b76bbb724d..0ff48bcf2c 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToComplete.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToComplete.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.libraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -42,7 +42,7 @@ class WhenSettingEngineToComplete { val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToRepeat.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToRepeat.kt index 14a2120208..5dc7b4ca0f 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToRepeat.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAHaltedPlaybackEngine/WhenSettingEngineToRepeat.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.libraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -39,7 +39,7 @@ class WhenSettingEngineToRepeat { val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/AndANewLibrary/WhenRestoringEngineStateAndResumingPlayback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/AndANewLibrary/WhenRestoringEngineStateAndResumingPlayback.kt index 15a5a6b388..946121f799 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/AndANewLibrary/WhenRestoringEngineStateAndResumingPlayback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/AndANewLibrary/WhenRestoringEngineStateAndResumingPlayback.kt @@ -4,7 +4,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -30,7 +30,7 @@ class WhenRestoringEngineStateAndResumingPlayback { val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/When Restoring Engine State And Resuming Playback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/When Restoring Engine State And Resuming Playback.kt index 3241edda60..7d376c22b9 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/When Restoring Engine State And Resuming Playback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenANewPlaybackEngine/When Restoring Engine State And Resuming Playback.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -57,7 +57,7 @@ class `When Restoring Engine State And Resuming Playback` { val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPositionedFileIsAddedAfterThePlayingTrack/WhenPlaybackCompletes.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPositionedFileIsAddedAfterThePlayingTrack/WhenPlaybackCompletes.kt index f79df66d5b..5a2756c2e7 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPositionedFileIsAddedAfterThePlayingTrack/WhenPlaybackCompletes.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPositionedFileIsAddedAfterThePlayingTrack/WhenPlaybackCompletes.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -41,7 +41,7 @@ class WhenPlaybackCompletes { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPreparationErrorOccurs/WhenObservingPlayback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPreparationErrorOccurs/WhenObservingPlayback.kt index 8cc5b44c4f..231daf9e1b 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPreparationErrorOccurs/WhenObservingPlayback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAPreparationErrorOccurs/WhenObservingPlayback.kt @@ -4,7 +4,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.IPlayableFilePreparationSourceProvider @@ -47,7 +47,7 @@ class WhenObservingPlayback { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAnErrorOccurs/WhenObservingPlayback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAnErrorOccurs/WhenObservingPlayback.kt index a455dbd8f4..dbf3dc5346 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAnErrorOccurs/WhenObservingPlayback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndAnErrorOccurs/WhenObservingPlayback.kt @@ -4,7 +4,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.IPlayableFilePreparationSourceProvider @@ -41,7 +41,7 @@ class WhenObservingPlayback { fakePlaybackPreparerProvider ) val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackErrors/When Playback is Resumed.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackErrors/When Playback is Resumed.kt index f7575bda6c..933b8dccfb 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackErrors/When Playback is Resumed.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackErrors/When Playback is Resumed.kt @@ -4,7 +4,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.IPlayableFilePreparationSourceProvider @@ -71,7 +71,7 @@ class `When Playback is Resumed` { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsInterrupted/When Playback Is Resumed.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsInterrupted/When Playback Is Resumed.kt index 200801b0ee..b239343d57 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsInterrupted/When Playback Is Resumed.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsInterrupted/When Playback Is Resumed.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -41,7 +41,7 @@ class `When Playback Is Resumed` { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/AndTheTrackIsChanged/When Playback Is Resumed.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/AndTheTrackIsChanged/When Playback Is Resumed.kt index 53ac89491f..dd4211260c 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/AndTheTrackIsChanged/When Playback Is Resumed.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/AndTheTrackIsChanged/When Playback Is Resumed.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -42,7 +42,7 @@ class `When Playback Is Resumed` { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/When Playback Is Resumed.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/When Playback Is Resumed.kt index 0f5fe942dd..5c6b6b692b 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/When Playback Is Resumed.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndPlaybackFinishes/When Playback Is Resumed.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -43,7 +43,7 @@ class `When Playback Is Resumed` { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndTheTrackIsChanged/When Playback Is Resumed.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndTheTrackIsChanged/When Playback Is Resumed.kt index ee4c15bf5c..6c4d12d6c7 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndTheTrackIsChanged/When Playback Is Resumed.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndPlaybackIsPaused/AndTheTrackIsChanged/When Playback Is Resumed.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -47,7 +47,7 @@ class `When Playback Is Resumed` { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndThePlaylistIsCleared/AndANewFileIsAdded/WhenResumingPlayback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndThePlaylistIsCleared/AndANewFileIsAdded/WhenResumingPlayback.kt index b5810178c2..4ae6dcdd67 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndThePlaylistIsCleared/AndANewFileIsAdded/WhenResumingPlayback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndThePlaylistIsCleared/AndANewFileIsAdded/WhenResumingPlayback.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.access.stringlist.Fi import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibraryRepository import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -55,7 +55,7 @@ class WhenResumingPlayback { fakePlaybackPreparerProvider ) val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndTheTrackIsSkipped/When changing the track back to the skipped track.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndTheTrackIsSkipped/When changing the track back to the skipped track.kt index 2e7b19be21..118968522a 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndTheTrackIsSkipped/When changing the track back to the skipped track.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/AndTheTrackIsSkipped/When changing the track back to the skipped track.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -40,7 +40,7 @@ class `When changing the track back to the skipped track` { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/When changing tracks many times.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/When changing tracks many times.kt index c40111f1e6..4ac38a4566 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/When changing tracks many times.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/When changing tracks many times.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.LinkedOnPlayingFileChangedListener import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer @@ -66,7 +66,7 @@ class `When changing tracks many times` { ) val repository = LockingNowPlayingRepository( NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenChangingTracks.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenChangingTracks.kt index 0c8251af8a..4dbb8c795b 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenChangingTracks.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenChangingTracks.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.LinkedOnPlayingFileChangedListener import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer @@ -48,7 +48,7 @@ class WhenChangingTracks { PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val repository = LoggingNowPlayingRepository( NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenMovingTracksFromAfterToBeforePlayingTrack.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenMovingTracksFromAfterToBeforePlayingTrack.kt index aa1ed3ff25..d0f52be5e3 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenMovingTracksFromAfterToBeforePlayingTrack.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenMovingTracksFromAfterToBeforePlayingTrack.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -60,7 +60,7 @@ class WhenMovingTracksFromAfterToBeforePlayingTrack { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenNotObservingPlayback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenNotObservingPlayback.kt index 0268b95745..6a8246dca2 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenNotObservingPlayback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenNotObservingPlayback.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybac import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryNowPlayingValues import com.lasthopesoftware.bluewater.client.browsing.library.repository.libraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -56,7 +56,7 @@ class WhenNotObservingPlayback { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), promisedLibraryStorageUpdate.storage ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenObservingPlayback.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenObservingPlayback.kt index e7f31214cd..62c059d0d6 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenObservingPlayback.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenObservingPlayback.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -39,7 +39,7 @@ class WhenObservingPlayback { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackCompletes.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackCompletes.kt index 3420f2e15f..8b81ff778f 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackCompletes.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackCompletes.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -42,7 +42,7 @@ class WhenPlaybackCompletes { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPaused.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPaused.kt index ac1d145e2c..27f30b8270 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPaused.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPaused.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -42,7 +42,7 @@ class WhenPlaybackIsPaused { val nowPlayingRepository = AlwaysOpenNowPlayingRepository( LockingNowPlayingRepository( NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPausedAndRestarted.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPausedAndRestarted.kt index 3f7c41d666..06177f265d 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPausedAndRestarted.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenPlaybackIsPausedAndRestarted.kt @@ -5,7 +5,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -40,7 +40,7 @@ class WhenPlaybackIsPausedAndRestarted { val libraryProvider = FakeLibraryRepository(library) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingFilesBeforeTheCurrentlyPlayingFile.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingFilesBeforeTheCurrentlyPlayingFile.kt index 859fc16b9d..b4160c5dd8 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingFilesBeforeTheCurrentlyPlayingFile.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingFilesBeforeTheCurrentlyPlayingFile.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -40,7 +40,7 @@ class WhenRemovingFilesBeforeTheCurrentlyPlayingFile { val repository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingTheCurrentlyPlayingFile.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingTheCurrentlyPlayingFile.kt index 937220f822..d2ac67455a 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingTheCurrentlyPlayingFile.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenRemovingTheCurrentlyPlayingFile.kt @@ -7,7 +7,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybac import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryNowPlayingValues -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -78,7 +78,7 @@ class WhenRemovingTheCurrentlyPlayingFile { val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement(fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration()) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), savedLibrary.libraryStorage, ) val playbackBootstrapper = ManagedPlaylistPlayer( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithADifferentLibraryId.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithADifferentLibraryId.kt index 0d1c4876f8..f2fc20dc87 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithADifferentLibraryId.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithADifferentLibraryId.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -58,7 +58,7 @@ class WhenStateIsRestoredWithADifferentLibraryId { val nowPlayingRepository = AlwaysOpenNowPlayingRepository( LockingNowPlayingRepository( NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithTheSameLibraryId.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithTheSameLibraryId.kt index 1b1b54f05f..6492286e30 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithTheSameLibraryId.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/engine/GivenAPlayingPlaybackEngine/WhenStateIsRestoredWithTheSameLibraryId.kt @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.library.access.FakeLibrary import com.lasthopesoftware.bluewater.client.browsing.library.access.FakePlaybackQueueConfiguration import com.lasthopesoftware.bluewater.client.browsing.library.repository.Library import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId -import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryProvider +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.engine.PlaybackEngine import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPlaylistPlayer import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement @@ -55,7 +55,7 @@ class WhenStateIsRestoredWithTheSameLibraryId { val libraryProvider = FakeLibraryRepository(library, restoringLibrary) val nowPlayingRepository = NowPlayingRepository( - FakeSelectedLibraryProvider(), + FakeSelectedLibraryIdProvider(), libraryProvider, ) val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement( diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndPlaybackIsStopped/AndStartedAgain/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndPlaybackIsStopped/AndStartedAgain/WhenTheFileChanges.kt new file mode 100644 index 0000000000..57f2978f0b --- /dev/null +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndPlaybackIsStopped/AndStartedAgain/WhenTheFileChanges.kt @@ -0,0 +1,124 @@ +package com.lasthopesoftware.bluewater.client.playback.nowplaying.broadcasters.remote.GivenAStandardNotificationManager.AndPlaybackHasStarted.AndPlaybackIsStopped.AndStartedAgain + +import android.support.v4.media.session.PlaybackStateCompat +import com.lasthopesoftware.AndroidContext +import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile +import com.lasthopesoftware.bluewater.client.browsing.files.properties.MappedFilePropertiesLookup +import com.lasthopesoftware.bluewater.client.browsing.files.properties.NormalizedFileProperties +import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider +import com.lasthopesoftware.bluewater.client.playback.nowplaying.FakeNowPlayingRepository +import com.lasthopesoftware.bluewater.client.playback.nowplaying.broadcasters.remote.MediaSessionBroadcaster +import com.lasthopesoftware.bluewater.client.playback.nowplaying.singleNowPlaying +import com.lasthopesoftware.bluewater.client.playback.service.broadcasters.messages.PlaybackMessage +import com.lasthopesoftware.promises.extensions.toPromise +import com.lasthopesoftware.resources.RecordingApplicationMessageBus +import com.lasthopesoftware.resources.bitmaps.ImmediateBitmapProducer +import io.mockk.every +import io.mockk.mockk +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test + +class WhenTheFileChanges : AndroidContext() { + companion object { + private const val libraryId = 201 + private const val serviceFileId = "DCReKcHj2c" + + private var isActivatedInitially = false + private var isActivatedAgainAfterStarting = false + private var isDeactivatedAfterBeingActivated = false + private var isActivatedAfterBeingDeactivated = false + private var playbackStates = ArrayList() + } + + override fun before() { + val messageBus = RecordingApplicationMessageBus() + val nowPlaying = singleNowPlaying(LibraryId(libraryId), ServiceFile(serviceFileId)) + var isStarting = false + MediaSessionBroadcaster( + FakeNowPlayingRepository(nowPlaying), + mockk { + every { + promiseFileProperties( + LibraryId(libraryId), + ServiceFile(serviceFileId) + ) + } returns MappedFilePropertiesLookup( + mapOf( + Pair(NormalizedFileProperties.Name, "Nequerutrum"), + Pair(NormalizedFileProperties.Rating, "146"), + Pair(NormalizedFileProperties.Artist, "Pharetraorci"), + Pair(NormalizedFileProperties.Album, "Auctorporta"), + Pair(NormalizedFileProperties.Duration, "8017338"), + Pair(NormalizedFileProperties.Track, "216"), + ) + ).toPromise() + }, + mockk { + every { + promiseImageBytes( + LibraryId(libraryId), + ServiceFile(serviceFileId) + ) + } returns byteArrayOf((923).toByte(), (368).toByte(), (395).toByte()).toPromise() + }, + ImmediateBitmapProducer, + mockk(relaxUnitFun = true) { + every { activate() } answers { + isActivatedInitially = true + isActivatedAgainAfterStarting = isStarting + isActivatedAfterBeingDeactivated = isDeactivatedAfterBeingActivated + } + + every { deactivate() } answers { + isDeactivatedAfterBeingActivated = isActivatedAgainAfterStarting + } + + every { setPlaybackState(any()) } answers { + playbackStates.add(firstArg()) + } + }, + FakeSelectedLibraryIdProvider(LibraryId(libraryId)), + mockk(), + messageBus, + ) + + with(messageBus) { + isStarting = true + sendMessage(PlaybackMessage.PlaybackStarting) + sendMessage(PlaybackMessage.PlaybackStopped) + sendMessage(PlaybackMessage.PlaybackStarting) + } + } + + @Test + fun `then the playback states are correct`() { + assertThat(playbackStates.map { it.state }).isEqualTo( + listOf( + PlaybackStateCompat.STATE_PLAYING, + PlaybackStateCompat.STATE_STOPPED, + PlaybackStateCompat.STATE_PLAYING + ) + ) + } + + @Test + fun `then the session is initially activated`() { + assertThat(isActivatedInitially).isTrue + } + + @Test + fun `then the session is activated again after starting`() { + assertThat(isActivatedAgainAfterStarting).isTrue + } + + @Test + fun `then the session is deactivated after starting`() { + assertThat(isDeactivatedAfterBeingActivated).isTrue + } + + @Test + fun `then the session is activated again after being deactivated`() { + assertThat(isActivatedAfterBeingDeactivated).isTrue + } +} diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AfterPlaybackHasStopped/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AfterPlaybackHasStopped/WhenTheFileChanges.kt index 5ea8b05914..38f143a0d7 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AfterPlaybackHasStopped/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AfterPlaybackHasStopped/WhenTheFileChanges.kt @@ -30,6 +30,7 @@ class WhenTheFileChanges : AndroidContext() { private var playbackStates: MutableList? = ArrayList() private var mediaMetadata: MutableList? = ArrayList() + private var isDeactivated = false @AfterClass @JvmStatic @@ -65,7 +66,7 @@ class WhenTheFileChanges : AndroidContext() { every { promiseImageBytes(LibraryId(libraryId), ServiceFile(serviceFileId)) } returns byteArrayOf((912).toByte(), (368).toByte(), (395).toByte()).toPromise() }, ImmediateBitmapProducer, - mockk { + mockk(relaxUnitFun = true) { every { setPlaybackState(any()) } answers { playbackStates?.add(firstArg()) } @@ -73,7 +74,13 @@ class WhenTheFileChanges : AndroidContext() { every { setMetadata(any()) } answers { mediaMetadata?.add(firstArg()) } + + every { deactivate() } answers { + isDeactivated = true + } }, + mockk(), + mockk(), messageBus ) @@ -116,4 +123,9 @@ class WhenTheFileChanges : AndroidContext() { m.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART) != null } } + + @Test + fun `then the session is deactivated`() { + assertThat(isDeactivated).isTrue + } } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/ThenStartedAgain/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/ThenStartedAgain/WhenTheFileChanges.kt index 97ad99ef04..7ef183dbf9 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/ThenStartedAgain/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/ThenStartedAgain/WhenTheFileChanges.kt @@ -58,7 +58,7 @@ class WhenTheFileChanges : AndroidContext() { every { promiseImageBytes(LibraryId(libraryId), ServiceFile(serviceFileId)) } returns byteArrayOf((912).toByte(), (368).toByte(), (395).toByte()).toPromise() }, ImmediateBitmapProducer, - mockk { + mockk(relaxUnitFun = true) { every { setPlaybackState(any()) } answers { playbackStates?.add(firstArg()) } @@ -67,6 +67,8 @@ class WhenTheFileChanges : AndroidContext() { mediaMetadata?.add(firstArg()) } }, + mockk(), + mockk(), messageBus, ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/WhenTheFileChanges.kt index 8256e6f660..225c1568db 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsInterrupted/WhenTheFileChanges.kt @@ -65,7 +65,7 @@ class WhenTheFileChanges : AndroidContext() { every { promiseImageBytes(LibraryId(libraryId), ServiceFile(serviceFileId)) } returns byteArrayOf((912).toByte(), (368).toByte(), (395).toByte()).toPromise() }, ImmediateBitmapProducer, - mockk { + mockk(relaxUnitFun = true) { every { setPlaybackState(any()) } answers { playbackStates?.add(firstArg()) } @@ -74,6 +74,8 @@ class WhenTheFileChanges : AndroidContext() { mediaMetadata?.add(firstArg()) } }, + mockk(), + mockk(), messageBus, ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/ThenStartedAgain/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/ThenStartedAgain/WhenTheFileChanges.kt index 54dabdec87..3d2c858412 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/ThenStartedAgain/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/ThenStartedAgain/WhenTheFileChanges.kt @@ -58,7 +58,7 @@ class WhenTheFileChanges : AndroidContext() { every { promiseImageBytes(LibraryId(libraryId), ServiceFile(serviceFileId)) } returns byteArrayOf((912).toByte(), (368).toByte(), (395).toByte()).toPromise() }, ImmediateBitmapProducer, - mockk { + mockk(relaxUnitFun = true) { every { setPlaybackState(any()) } answers { playbackStates?.add(firstArg()) } @@ -67,6 +67,8 @@ class WhenTheFileChanges : AndroidContext() { mediaMetadata?.add(firstArg()) } }, + mockk(), + mockk(), messageBus ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/WhenTheFileChanges.kt index 00b0a0a88b..6db0aa9068 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsPaused/WhenTheFileChanges.kt @@ -57,6 +57,8 @@ class WhenTheFileChanges : AndroidContext() { }, ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), messageBus, ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt index 32fe900bae..f08dcdeab4 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt @@ -13,9 +13,11 @@ import com.lasthopesoftware.bluewater.client.playback.nowplaying.singleNowPlayin import com.lasthopesoftware.bluewater.client.playback.service.broadcasters.messages.LibraryPlaybackMessage import com.lasthopesoftware.bluewater.client.playback.service.broadcasters.messages.PlaybackMessage import com.lasthopesoftware.bluewater.shared.android.MediaSession.ControlMediaSession +import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture import com.lasthopesoftware.promises.extensions.toPromise import com.lasthopesoftware.resources.RecordingApplicationMessageBus import com.lasthopesoftware.resources.bitmaps.ImmediateBitmapProducer +import com.lasthopesoftware.resources.closables.thenUse import io.mockk.every import io.mockk.mockk import io.mockk.verify @@ -49,15 +51,17 @@ class WhenTheFileChanges : AndroidContext() { }, ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), messageBus, - ).use { + ).thenUse { with(messageBus) { sendMessage(PlaybackMessage.PlaybackStarted) sendMessage(LibraryPlaybackMessage.TrackChanged(LibraryId(libraryId), nowPlaying.playingFile!!)) sendMessage(PlaybackMessage.PlaybackStopped) sendMessage(LibraryPlaybackMessage.TrackChanged(LibraryId(libraryId), nowPlaying.playingFile!!)) } - } + }.toExpiringFuture().get() } @Test @@ -97,4 +101,21 @@ class WhenTheFileChanges : AndroidContext() { }) } } + + @Test + fun `then the session is activated`() { + verify { mediaSessionCompat.activate() } + } + + @Test + fun `then the session is deactivated`() { + verify { mediaSessionCompat.deactivate() } + } + + @Test + fun `then the session activity is correctly set up`() { + verify(exactly = 0) { + mediaSessionCompat.setSessionActivity(any()) + } + } } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsInterrupted.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsInterrupted.kt index 72aeaf3119..c6aaaab099 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsInterrupted.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsInterrupted.kt @@ -49,6 +49,8 @@ class WhenPlaybackIsInterrupted : AndroidContext() { }, ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), messageBus ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt index 4ac1c38810..cc3dfb9366 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt @@ -1,5 +1,6 @@ package com.lasthopesoftware.bluewater.client.playback.nowplaying.broadcasters.remote.GivenAStandardNotificationManager.AndPlaybackHasStarted.AndTheFileHasChanged +import android.app.PendingIntent import android.media.MediaMetadata import android.support.v4.media.session.PlaybackStateCompat import com.lasthopesoftware.AndroidContext @@ -7,15 +8,18 @@ import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile import com.lasthopesoftware.bluewater.client.browsing.files.properties.MappedFilePropertiesLookup import com.lasthopesoftware.bluewater.client.browsing.files.properties.NormalizedFileProperties import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId +import com.lasthopesoftware.bluewater.client.connection.selected.GivenANullConnection.AndTheSelectedLibraryChanges.FakeSelectedLibraryIdProvider import com.lasthopesoftware.bluewater.client.playback.nowplaying.FakeNowPlayingRepository import com.lasthopesoftware.bluewater.client.playback.nowplaying.broadcasters.remote.MediaSessionBroadcaster import com.lasthopesoftware.bluewater.client.playback.nowplaying.singleNowPlaying import com.lasthopesoftware.bluewater.client.playback.service.broadcasters.messages.LibraryPlaybackMessage import com.lasthopesoftware.bluewater.client.playback.service.broadcasters.messages.PlaybackMessage import com.lasthopesoftware.bluewater.shared.android.MediaSession.ControlMediaSession +import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture import com.lasthopesoftware.promises.extensions.toPromise import com.lasthopesoftware.resources.RecordingApplicationMessageBus import com.lasthopesoftware.resources.bitmaps.ImmediateBitmapProducer +import com.lasthopesoftware.resources.closables.thenUse import io.mockk.every import io.mockk.mockk import io.mockk.verify @@ -28,6 +32,7 @@ class WhenPlaybackIsPaused : AndroidContext() { private const val serviceFileId = "654" private val mediaSessionCompat = mockk(relaxUnitFun = true) + private val expectedIntent = mockk() } override fun before() { @@ -50,12 +55,16 @@ class WhenPlaybackIsPaused : AndroidContext() { }, ImmediateBitmapProducer, mediaSessionCompat, + FakeSelectedLibraryIdProvider(LibraryId(libraryId)), + mockk { + every { buildPendingNowPlayingIntent(LibraryId(libraryId)) } returns expectedIntent + }, messageBus - ) - - messageBus.sendMessage(PlaybackMessage.PlaybackStarted) - messageBus.sendMessage(LibraryPlaybackMessage.TrackChanged(LibraryId(libraryId), nowPlaying.playingFile!!)) - messageBus.sendMessage(PlaybackMessage.PlaybackPaused) + ).thenUse { + messageBus.sendMessage(PlaybackMessage.PlaybackStarted) + messageBus.sendMessage(LibraryPlaybackMessage.TrackChanged(LibraryId(libraryId), nowPlaying.playingFile!!)) + messageBus.sendMessage(PlaybackMessage.PlaybackPaused) + }.toExpiringFuture().get() } @Test @@ -80,4 +89,18 @@ class WhenPlaybackIsPaused : AndroidContext() { }) } } + + @Test + fun `then the session activity is correctly set up`() { + verify { + mediaSessionCompat.setSessionActivity(expectedIntent) + } + } + + @Test + fun `then the session activity is deactivated`() { + verify { + mediaSessionCompat.deactivate() + } + } } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/WhenTheFileChanges.kt index 8d0e8c4642..5c774d837b 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/WhenTheFileChanges.kt @@ -59,11 +59,13 @@ class WhenTheFileChanges : AndroidContext() { every { promiseImageBytes(LibraryId(libraryId), ServiceFile(serviceFileId)) } returns byteArrayOf((912).toByte(), (368).toByte(), (395).toByte()).toPromise() }, ImmediateBitmapProducer, - mockk { + mockk(relaxUnitFun = true) { every { setPlaybackState(any()) } answers { playbackStates?.add(firstArg()) } every { setMetadata(any()) } answers { mediaMetadata?.add(firstArg()) } }, + mockk(), + mockk(), recordingApplicationMessageBus ) recordingApplicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarted) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndTheFileHasChanged/WhenPlaybackStarts.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndTheFileHasChanged/WhenPlaybackStarts.kt index 45d4c245c1..72b7a5cdc6 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndTheFileHasChanged/WhenPlaybackStarts.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndTheFileHasChanged/WhenPlaybackStarts.kt @@ -49,6 +49,8 @@ class WhenPlaybackStarts : AndroidContext() { }, ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), recordingApplicationMessageBus, ) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsPaused.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsPaused.kt index 7b91f61087..91c079e28d 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsPaused.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsPaused.kt @@ -24,6 +24,8 @@ class WhenPlaybackIsPaused : AndroidContext() { mockk(), ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), messageBus, ) messageBus.sendMessage(PlaybackMessage.PlaybackPaused) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt index 027c73ceab..6730ddfcac 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt @@ -25,6 +25,8 @@ class WhenPlaybackIsStarting : AndroidContext() { mockk(), ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), recordingApplicationMessageBus, ) recordingApplicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarting) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt index ee14271dc7..33cbfbc772 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt @@ -25,11 +25,18 @@ class WhenPlaybackStarts : AndroidContext() { mockk(), ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), recordingApplicationMessageBus, ) recordingApplicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarted) } + @Test + fun `then the session is activated`() { + verify { mediaSessionCompat.activate() } + } + @Test fun `then the state is set to playing`() { verify { mediaSessionCompat.setPlaybackState(match { c -> c.state == PlaybackStateCompat.STATE_PLAYING }) } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenTheFileChanges.kt index d7d6c89827..545c40bafb 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenTheFileChanges.kt @@ -47,6 +47,8 @@ class WhenTheFileChanges : AndroidContext() { }, ImmediateBitmapProducer, mediaSessionCompat, + mockk(), + mockk(), messageBus, ) messageBus.sendMessage( From 89b87737473f603af6e923eca9a3ee60ce2d7787 Mon Sep 17 00:00:00 2001 From: David Date: Sun, 15 Feb 2026 07:08:14 -0600 Subject: [PATCH 2/5] Improved media session resource management --- .../remote/MediaSessionBroadcaster.kt | 5 -- .../MediaSession/MediaSessionController.kt | 8 +- .../MediaSession/MediaSessionService.kt | 75 +++++++++---------- .../closables/PromisingCloseableManager.kt | 9 +-- .../WhenTheFileChanges.kt | 7 +- .../WhenPlaybackIsPaused.kt | 9 +-- .../WhenPlaybackIsStarting.kt | 5 ++ .../WhenPlaybackStarts.kt | 5 -- 8 files changed, 52 insertions(+), 71 deletions(-) diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt index 5c9c54b664..d79f785235 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt @@ -67,10 +67,6 @@ class MediaSessionBroadcaster( @Volatile private var isPlaying = false - init { - mediaSession.activate() - } - override fun close() { trackPositionUpdatesSubscription.close() clearClientBitmap() @@ -86,7 +82,6 @@ class MediaSessionBroadcaster( if (it != null) mediaSession.setSessionActivity(intentBuilder.buildPendingNowPlayingIntent(it)) } - .must { _ -> mediaSession.deactivate() } } override fun notifyStarting() { diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt index 1c419250a7..2fd65740a1 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt @@ -4,8 +4,9 @@ import android.app.PendingIntent import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat +import java.lang.AutoCloseable -class MediaSessionController(private val mediaSessionCompat: MediaSessionCompat) : ControlMediaSession { +class MediaSessionController(private val mediaSessionCompat: MediaSessionCompat) : ControlMediaSession, AutoCloseable { override fun activate() { if (!mediaSessionCompat.isActive) mediaSessionCompat.isActive = true @@ -27,4 +28,9 @@ class MediaSessionController(private val mediaSessionCompat: MediaSessionCompat) override fun setSessionActivity(pendingIntent: PendingIntent) { mediaSessionCompat.setSessionActivity(pendingIntent) } + + override fun close() { + deactivate() + mediaSessionCompat.release() + } } diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt index a869cc1a03..00561723b7 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt @@ -11,8 +11,10 @@ import com.lasthopesoftware.bluewater.client.connection.libraries.LibraryConnect import com.lasthopesoftware.bluewater.client.playback.nowplaying.broadcasters.remote.MediaSessionBroadcaster import com.lasthopesoftware.bluewater.client.playback.service.receivers.MediaSessionCallbackReceiver import com.lasthopesoftware.bluewater.shared.lazyLogger +import com.lasthopesoftware.promises.extensions.getSafely import com.lasthopesoftware.promises.extensions.toFuture -import java.util.concurrent.TimeUnit +import com.lasthopesoftware.resources.closables.PromisingCloseable +import com.lasthopesoftware.resources.closables.PromisingCloseableManager import java.util.concurrent.TimeoutException @UnstableApi class MediaSessionService : Service() { @@ -22,15 +24,12 @@ import java.util.concurrent.TimeoutException private val binder by lazy { GenericBinder(this) } - private val lazyMediaSession = lazy { - val libraryConnectionDependencies = LibraryConnectionRegistry(applicationDependencies) - val libraryFilePropertiesDependents = LibraryFilePropertiesDependentsRegistry( - applicationDependencies, - libraryConnectionDependencies - ) + private val promisingCloseableManager = PromisingCloseableManager() - val newMediaSession = MediaSessionCompat(this, MediaSessionConstants.mediaSessionTag) + private val libraryConnectionDependencies by lazy { LibraryConnectionRegistry(applicationDependencies) } + val mediaSession by lazy { + val newMediaSession = MediaSessionCompat(this, MediaSessionConstants.mediaSessionTag) with (applicationDependencies) { newMediaSession.setCallback( MediaSessionCallbackReceiver( @@ -40,46 +39,40 @@ import java.util.concurrent.TimeoutException ) ) - val broadcaster = MediaSessionBroadcaster( - nowPlayingState, - libraryConnectionDependencies.libraryFilePropertiesProvider, - libraryFilePropertiesDependents.imageBytesProvider, - applicationDependencies.bitmapProducer, - MediaSessionController(newMediaSession), - applicationDependencies.selectedLibraryIdProvider, - applicationDependencies.intentBuilder, - registerForApplicationMessages, + val libraryFilePropertiesDependents = LibraryFilePropertiesDependentsRegistry( + applicationDependencies, + libraryConnectionDependencies + ) + val mediaSessionController = promisingCloseableManager.manage(MediaSessionController(newMediaSession)) + promisingCloseableManager.manage( + MediaSessionBroadcaster( + nowPlayingState, + libraryConnectionDependencies.libraryFilePropertiesProvider, + libraryFilePropertiesDependents.imageBytesProvider, + bitmapProducer, + mediaSessionController, + selectedLibraryIdProvider, + intentBuilder, + registerForApplicationMessages, + ) as PromisingCloseable ) - - Pair(broadcaster, newMediaSession) } - } - val mediaSession - get() = lazyMediaSession.value.second + newMediaSession + } override fun onBind(intent: Intent) = binder - override fun onCreate() { - mediaSession.isActive = true - } - override fun onDestroy() { - if (lazyMediaSession.isInitialized()) { - val (broadcaster, mediaSession) = lazyMediaSession.value - - try { - mediaSession.isActive = false - broadcaster - .promiseClose() - .toFuture() - .get(30, TimeUnit.SECONDS) - mediaSession.release() - } catch (e: TimeoutException) { - logger.warn("Timed out closing the broadcaster.", e) - } catch (e: Exception) { - logger.error("An unexpected error occurred destroying the MediaSessionService.", e) - } + try { + promisingCloseableManager + .promiseClose() + .toFuture() + .getSafely() + } catch (e: TimeoutException) { + logger.warn("Timed out closing the resources.", e) + } catch (e: Exception) { + logger.error("An unexpected error occurred closing resources.", e) } super.onDestroy() } diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/resources/closables/PromisingCloseableManager.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/resources/closables/PromisingCloseableManager.kt index b4574f7b7b..676e4c5d48 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/resources/closables/PromisingCloseableManager.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/resources/closables/PromisingCloseableManager.kt @@ -3,8 +3,7 @@ package com.lasthopesoftware.resources.closables import com.lasthopesoftware.bluewater.shared.lazyLogger import com.lasthopesoftware.compilation.DebugFlag import com.lasthopesoftware.promises.ForwardedResponse.Companion.forward -import com.lasthopesoftware.promises.extensions.keepPromise -import com.lasthopesoftware.promises.extensions.regardless +import com.lasthopesoftware.promises.PromiseMachines import com.lasthopesoftware.promises.extensions.toPromise import com.namehillsoftware.handoff.promises.Promise import com.namehillsoftware.handoff.promises.response.ImmediateResponse @@ -33,7 +32,7 @@ open class PromisingCloseableManager : ManagePromisingCloseables, ImmediateRespo override fun createNestedManager(): ManagePromisingCloseables = NestedPromisingCloseableManager(this) - override fun promiseClose(): Promise = + override fun promiseClose(): Promise = PromiseMachines.loop { _, cancellable -> (nestedContainerStack .pop() ?.promiseClose() @@ -49,8 +48,8 @@ open class PromisingCloseableManager : ManagePromisingCloseables, ImmediateRespo logger.debug(closedMessage, resource) }, this) }) - ?.regardless { promiseClose() } - .keepPromise(Unit) + ?: cancellable.cancel().toPromise() + } override fun respond(resolution: Throwable?) { logger.warn("There was an error closing a resource", resolution) diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt index f08dcdeab4..a4b5e92eed 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/AndPlaybackIsStopped/WhenTheFileChanges.kt @@ -103,12 +103,7 @@ class WhenTheFileChanges : AndroidContext() { } @Test - fun `then the session is activated`() { - verify { mediaSessionCompat.activate() } - } - - @Test - fun `then the session is deactivated`() { + fun `then the session is deactivated on stop`() { verify { mediaSessionCompat.deactivate() } } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt index cc3dfb9366..0d1a1a7bb4 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/AndPlaybackHasStarted/AndTheFileHasChanged/WhenPlaybackIsPaused.kt @@ -91,16 +91,9 @@ class WhenPlaybackIsPaused : AndroidContext() { } @Test - fun `then the session activity is correctly set up`() { + fun `then the session activity is correctly set up on resource clean-up`() { verify { mediaSessionCompat.setSessionActivity(expectedIntent) } } - - @Test - fun `then the session activity is deactivated`() { - verify { - mediaSessionCompat.deactivate() - } - } } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt index 6730ddfcac..ef9dc36c57 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackIsStarting.kt @@ -32,6 +32,11 @@ class WhenPlaybackIsStarting : AndroidContext() { recordingApplicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarting) } + @Test + fun `then the session is activated`() { + verify { mediaSessionCompat.activate() } + } + @Test fun `then the state is set to playing`() { verify { mediaSessionCompat.setPlaybackState(match { c -> c.state == PlaybackStateCompat.STATE_PLAYING }) } diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt index 33cbfbc772..d087b6ae60 100644 --- a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/GivenAStandardNotificationManager/WhenPlaybackStarts.kt @@ -32,11 +32,6 @@ class WhenPlaybackStarts : AndroidContext() { recordingApplicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarted) } - @Test - fun `then the session is activated`() { - verify { mediaSessionCompat.activate() } - } - @Test fun `then the state is set to playing`() { verify { mediaSessionCompat.setPlaybackState(match { c -> c.state == PlaybackStateCompat.STATE_PLAYING }) } From e61f1ba0200da1f704bff9ba6b640547ddf657d8 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 16 Feb 2026 07:37:01 -0600 Subject: [PATCH 3/5] Ensure `Promise.toState` updates are reactive - Add promise instance to DisposableEffect keys to ensure state updates are reactive --- .../promises/extensions/ValuePromiseExtension.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/promises/extensions/ValuePromiseExtension.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/promises/extensions/ValuePromiseExtension.kt index 52aef7a301..b88702dce4 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/promises/extensions/ValuePromiseExtension.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/promises/extensions/ValuePromiseExtension.kt @@ -55,7 +55,7 @@ fun Promise.toState(initialValue: T): State = toState(initialValue, Un @Composable fun Promise.toState(initialValue: T, key1: Any?): State { val result = remember { mutableStateOf(initialValue) } - DisposableEffect(key1) { + DisposableEffect(this, key1) { val promisedSet = then { it, cs -> if (!cs.isCancelled) result.value = it From f3a6fb596565ca0daf88e079b6b8dd0ef966ebd8 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 16 Feb 2026 17:49:39 -0600 Subject: [PATCH 4/5] Notify playback is starting after services are created --- .../bluewater/client/playback/service/PlaybackService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt index 4b24f58c04..310b04c9f6 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt @@ -835,11 +835,11 @@ import java.util.concurrent.TimeoutException val playbackState = promisedPlaybackServices.value isMarkedForPlay = true - applicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarting) if (!areListenersRegistered) registerListeners() return playbackState.eventually { + applicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarting) it.playbackState .startPlaylist( libraryId, @@ -879,10 +879,10 @@ import java.util.concurrent.TimeoutException private fun resumePlayback(libraryId: LibraryId): Promise { isMarkedForPlay = true - applicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarting) if (!areListenersRegistered) registerListeners() return restorePlaybackServices(libraryId).eventually { + applicationMessageBus.sendMessage(PlaybackMessage.PlaybackStarting) it.playbackState.resume().then(forward()) { e -> it.errorHandler.onError(e) } } } From cc33fad46648c85efec6476ff47f62ec2aa23a57 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 18 Feb 2026 22:49:37 -0600 Subject: [PATCH 5/5] Improved media session initialization --- .../remote/MediaSessionBroadcaster.kt | 14 ++--- .../playback/service/PlaybackService.kt | 2 +- .../MediaSession/ControlMediaSession.kt | 2 + .../MediaSession/MediaSessionController.kt | 17 +++++- .../MediaSession/MediaSessionService.kt | 28 ++++++++-- ...enInitializingTheMediaSessionController.kt | 56 +++++++++++++++++++ ...enInitializingTheMediaSessionController.kt | 56 +++++++++++++++++++ 7 files changed, 162 insertions(+), 13 deletions(-) create mode 100644 projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenANotStartedPlaylist/WhenInitializingTheMediaSessionController.kt create mode 100644 projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenAPartiallyPlayedPlaylist/WhenInitializingTheMediaSessionController.kt diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt index d79f785235..3d72d63a87 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/broadcasters/remote/MediaSessionBroadcaster.kt @@ -20,11 +20,13 @@ import com.lasthopesoftware.bluewater.shared.images.bytes.GetImageBytes import com.lasthopesoftware.bluewater.shared.lazyLogger import com.lasthopesoftware.bluewater.shared.messages.application.RegisterForApplicationMessages import com.lasthopesoftware.bluewater.shared.messages.registerReceiver +import com.lasthopesoftware.bluewater.shared.updateIfDifferent import com.lasthopesoftware.promises.extensions.toPromise import com.lasthopesoftware.resources.bitmaps.ProduceBitmaps import com.lasthopesoftware.resources.closables.PromisingCloseable import com.namehillsoftware.handoff.promises.Promise import java.util.concurrent.atomic.AtomicLong +import java.util.concurrent.atomic.AtomicReference private val logger by lazyLogger() private const val playbackSpeed = 1.0f @@ -54,15 +56,15 @@ class MediaSessionBroadcaster( @Volatile private var playbackState = PlaybackStateCompat.STATE_STOPPED - @Volatile - private var trackPosition = AtomicLong(0) + private val trackPosition = AtomicLong(0) @Volatile private var mediaMetadata = MediaMetadataCompat.Builder().build() @Volatile private var capabilities = standardCapabilities - private var remoteClientBitmap: Bitmap? = null + + private val remoteClientBitmap = AtomicReference(null) @Volatile private var isPlaying = false @@ -155,13 +157,12 @@ class MediaSessionBroadcaster( @Synchronized private fun clearClientBitmap() { - if (remoteClientBitmap == null) return + if (remoteClientBitmap.getAndSet(null) == null) return val metadataBuilder = MediaMetadataCompat.Builder(mediaMetadata) metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, null) metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ART, null) metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_DISPLAY_ICON, null) mediaSession.setMetadata(metadataBuilder.build().also { mediaMetadata = it }) - remoteClientBitmap = null } private fun updateNowPlaying(libraryId: LibraryId, serviceFile: ServiceFile): Promise<*> { @@ -196,11 +197,10 @@ class MediaSessionBroadcaster( ) promisedBitmap.then { bitmap -> - if (remoteClientBitmap !== bitmap) { + if (remoteClientBitmap.updateIfDifferent(bitmap)) { metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bitmap) metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ART, bitmap) metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_DISPLAY_ICON, bitmap) - remoteClientBitmap = bitmap } mediaSession.setMetadata(metadataBuilder.build().also { mediaMetadata = it }) } diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt index 310b04c9f6..2126dd9571 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/service/PlaybackService.kt @@ -697,7 +697,7 @@ import java.util.concurrent.TimeoutException val timeoutResponse = promisedTimeout.then( { throw PlaybackStartingTimeoutException(playbackStartTimeout) }, - { it -> + { // avoid logging cancellation exceptions if (it !is CancellationException) throw it diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt index 03f83e6911..0eaea12cb6 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/ControlMediaSession.kt @@ -3,6 +3,7 @@ package com.lasthopesoftware.bluewater.shared.android.MediaSession import android.app.PendingIntent import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.PlaybackStateCompat +import com.namehillsoftware.handoff.promises.Promise interface ControlMediaSession { fun activate() @@ -10,4 +11,5 @@ interface ControlMediaSession { fun setPlaybackState(playbackStateCompat: PlaybackStateCompat) fun setMetadata(metadata: MediaMetadataCompat) fun setSessionActivity(pendingIntent: PendingIntent) + fun promiseInitialization(): Promise } diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt index 2fd65740a1..fb2d17d1ad 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionController.kt @@ -4,9 +4,24 @@ import android.app.PendingIntent import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat +import com.lasthopesoftware.bluewater.client.playback.nowplaying.storage.GetNowPlayingState +import com.namehillsoftware.handoff.promises.Promise import java.lang.AutoCloseable -class MediaSessionController(private val mediaSessionCompat: MediaSessionCompat) : ControlMediaSession, AutoCloseable { +class MediaSessionController( + private val mediaSessionCompat: MediaSessionCompat, + private val nowPlayingState: GetNowPlayingState, +) : ControlMediaSession, AutoCloseable { + override fun promiseInitialization(): Promise { + return nowPlayingState + .promiseActiveNowPlaying() + .then { np -> + np?.apply { + if (playlistPosition > 0 && filePosition > 0) activate() + } + } + } + override fun activate() { if (!mediaSessionCompat.isActive) mediaSessionCompat.isActive = true diff --git a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt index 00561723b7..ccb395f421 100644 --- a/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt +++ b/projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/shared/android/MediaSession/MediaSessionService.kt @@ -28,7 +28,7 @@ import java.util.concurrent.TimeoutException private val libraryConnectionDependencies by lazy { LibraryConnectionRegistry(applicationDependencies) } - val mediaSession by lazy { + private val mediaSessionServices by lazy { val newMediaSession = MediaSessionCompat(this, MediaSessionConstants.mediaSessionTag) with (applicationDependencies) { newMediaSession.setCallback( @@ -43,7 +43,7 @@ import java.util.concurrent.TimeoutException applicationDependencies, libraryConnectionDependencies ) - val mediaSessionController = promisingCloseableManager.manage(MediaSessionController(newMediaSession)) + val mediaSessionController = promisingCloseableManager.manage(MediaSessionController(newMediaSession, nowPlayingState)) promisingCloseableManager.manage( MediaSessionBroadcaster( nowPlayingState, @@ -56,13 +56,33 @@ import java.util.concurrent.TimeoutException registerForApplicationMessages, ) as PromisingCloseable ) + Pair(newMediaSession, mediaSessionController) } - - newMediaSession } + val mediaSession: MediaSessionCompat + get() = mediaSessionServices.first + + val mediaSessionController: ControlMediaSession + get() = mediaSessionServices.second + override fun onBind(intent: Intent) = binder + override fun onCreate() { + super.onCreate() + + try { + mediaSessionController + .promiseInitialization() + .toFuture() + .getSafely() + } catch (e: TimeoutException) { + logger.warn("Timed out initializing the media session controller.", e) + } catch (e: Exception) { + logger.error("An unexpected error occurred initializing the media session controller.", e) + } + } + override fun onDestroy() { try { promisingCloseableManager diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenANotStartedPlaylist/WhenInitializingTheMediaSessionController.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenANotStartedPlaylist/WhenInitializingTheMediaSessionController.kt new file mode 100644 index 0000000000..2bd1670283 --- /dev/null +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenANotStartedPlaylist/WhenInitializingTheMediaSessionController.kt @@ -0,0 +1,56 @@ +package com.lasthopesoftware.bluewater.shared.android.mediasession.GivenANotStartedPlaylist + +import com.lasthopesoftware.AndroidContext +import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile +import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId +import com.lasthopesoftware.bluewater.client.playback.nowplaying.FakeNowPlayingRepository +import com.lasthopesoftware.bluewater.client.playback.nowplaying.storage.NowPlaying +import com.lasthopesoftware.bluewater.shared.android.MediaSession.MediaSessionController +import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture +import io.mockk.every +import io.mockk.mockk +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test + +class WhenInitializingTheMediaSessionController : AndroidContext() { + companion object { + private const val libraryId = 129 + private const val serviceFileId = "868" + private var isActivated = false + private var isDeactivatedAfterActivating = false + } + + override fun before() { + MediaSessionController( + mockk(relaxUnitFun = true) { + every { isActive } answers { + isActivated + } + + every { isActive = any() } propertyType Boolean::class answers { + if (value) isActivated = true + else isDeactivatedAfterActivating = isActivated + } + }, + FakeNowPlayingRepository(NowPlaying( + LibraryId(libraryId), + listOf(ServiceFile(serviceFileId)), + 0, + 0L, + false, + )) + ).use { + it.promiseInitialization().toExpiringFuture().get() + } + } + + @Test + fun `then the session is NOT activated`() { + assertThat(isActivated).isFalse + } + + @Test + fun `then the session is NOT deactivated`() { + assertThat(isDeactivatedAfterActivating).isFalse + } +} diff --git a/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenAPartiallyPlayedPlaylist/WhenInitializingTheMediaSessionController.kt b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenAPartiallyPlayedPlaylist/WhenInitializingTheMediaSessionController.kt new file mode 100644 index 0000000000..4858770948 --- /dev/null +++ b/projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/shared/android/mediasession/GivenAPartiallyPlayedPlaylist/WhenInitializingTheMediaSessionController.kt @@ -0,0 +1,56 @@ +package com.lasthopesoftware.bluewater.shared.android.mediasession.GivenAPartiallyPlayedPlaylist + +import com.lasthopesoftware.AndroidContext +import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile +import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId +import com.lasthopesoftware.bluewater.client.playback.nowplaying.FakeNowPlayingRepository +import com.lasthopesoftware.bluewater.client.playback.nowplaying.storage.NowPlaying +import com.lasthopesoftware.bluewater.shared.android.MediaSession.MediaSessionController +import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture +import io.mockk.every +import io.mockk.mockk +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test + +class WhenInitializingTheMediaSessionController : AndroidContext() { + companion object { + private const val libraryId = 40 + private const val serviceFileId = "407" + private var isActivated = false + private var isDeactivatedAfterActivating = false + } + + override fun before() { + MediaSessionController( + mockk(relaxUnitFun = true) { + every { isActive } answers { + isActivated + } + + every { isActive = any() } propertyType Boolean::class answers { + if (value) isActivated = true + else isDeactivatedAfterActivating = isActivated + } + }, + FakeNowPlayingRepository(NowPlaying( + LibraryId(libraryId), + listOf(ServiceFile(serviceFileId)), + 1, + 1L, + false, + )) + ).use { + it.promiseInitialization().toExpiringFuture().get() + } + } + + @Test + fun `then the session is activated`() { + assertThat(isActivated).isTrue + } + + @Test + fun `then the session is deactivated after activating`() { + assertThat(isDeactivatedAfterActivating).isTrue + } +}