react-native-audio-browser 0.2.0-next.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AudioBrowser.podspec +1 -1
- package/README.md +2 -180
- package/android/build.gradle +1 -17
- package/android/gradle.properties +1 -1
- package/android/src/main/AndroidManifest.xml +0 -15
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +148 -433
- package/android/src/main/java/com/audiobrowser/Callbacks.kt +6 -4
- package/android/src/main/java/com/audiobrowser/Service.kt +18 -67
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +178 -442
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +4 -41
- package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +4 -4
- package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +97 -109
- package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +10 -6
- package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +8 -40
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +46 -40
- package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +1 -4
- package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +1 -18
- package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +3 -15
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +134 -422
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +404 -248
- package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +59 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +5 -25
- package/android/src/main/java/com/audiobrowser/player/Player.kt +582 -469
- package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +67 -190
- package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +53 -118
- package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +3 -37
- package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +40 -85
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +0 -24
- package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +300 -23
- package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +23 -13
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +2 -2
- package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +3 -4
- package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +1 -2
- package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
- package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
- package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +111 -6
- package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +8 -22
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +80 -112
- package/android/src/main/res/values/strings.xml +0 -4
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +0 -4
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +2 -1
- package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +0 -72
- package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +146 -0
- package/ios/Browser/BrowserConfig.swift +11 -41
- package/ios/Browser/BrowserManager+URLResolution.swift +93 -213
- package/ios/Browser/BrowserManager.swift +110 -303
- package/ios/Browser/BrowserPathHelper.swift +3 -32
- package/ios/Browser/JsonModels.swift +66 -287
- package/ios/CarPlay/CarPlayArtworkResolver.swift +6 -6
- package/ios/CarPlay/CarPlayController.swift +149 -739
- package/ios/CarPlay/CarPlayImageLoader.swift +8 -57
- package/ios/CarPlay/CarPlayListItemFactory.swift +35 -44
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +36 -180
- package/ios/CarPlay/RNABAudioBrowser.h +10 -15
- package/ios/CarPlay/RNABAudioBrowser.m +14 -15
- package/ios/CarPlay/RNABCarPlaySceneDelegate.m +0 -2
- package/ios/CarPlay/RNABMediaIntentHandler.swift +43 -53
- package/ios/CarPlay/Track+CarPlay.swift +63 -0
- package/ios/Extension/Capability+RemoteCommand.swift +9 -7
- package/ios/Extension/ChapterMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/NavigationError+Conversion.swift +1 -8
- package/ios/Extension/ResolvedTrack+Copying.swift +4 -10
- package/ios/Extension/TimedMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/Track+AVPlayer.swift +4 -4
- package/ios/Extension/Track+Copying.swift +3 -9
- package/ios/Extension/TrackMetadata+AVFoundation.swift +1 -1
- package/ios/HybridAudioBrowser.swift +196 -804
- package/ios/Model/NitroTypeStubs.swift +224 -299
- package/ios/Model/PlayerUpdateOptions.swift +23 -23
- package/ios/Model/RemoteCommand.swift +6 -24
- package/ios/Model/TrackPlayerError.swift +18 -82
- package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
- package/ios/NowPlayingInfo/NowPlayingInfoController.swift +121 -99
- package/ios/Observer/PlayerItemNotificationObserver.swift +5 -45
- package/ios/Observer/PlayerItemPropertyObserver.swift +4 -27
- package/ios/Observer/PlayerTimeObserver.swift +53 -3
- package/ios/Option/SessionCategories.swift +11 -34
- package/ios/Player/LoadSeekCoordinator.swift +1 -16
- package/ios/Player/MediaLoader.swift +11 -31
- package/ios/Player/NowPlayingUpdater.swift +26 -119
- package/ios/Player/PlaybackCoordinator.swift +51 -285
- package/ios/Player/PlaybackCoordinatorCallbacks.swift +1 -6
- package/ios/Player/PlaybackEffectHandler.swift +9 -19
- package/ios/Player/PlaybackErrorHandler.swift +13 -97
- package/ios/Player/PlaybackProgressUpdateManager.swift +68 -0
- package/ios/Player/PlaybackStateMachine.swift +13 -18
- package/ios/Player/PlayingStateManager.swift +2 -3
- package/ios/Player/QueueManager.swift +61 -67
- package/ios/Player/RetryManager.swift +21 -98
- package/ios/Player/SleepTimerHandling.swift +0 -8
- package/ios/Player/SleepTimerManager.swift +11 -72
- package/ios/RemoteCommand/RemoteCommandController.swift +21 -40
- package/ios/Tests/BrowserPathHelperTests.swift +0 -28
- package/ios/Tests/CarPlayArtworkResolverTests.swift +39 -39
- package/ios/Tests/ChapterMetadataAVFoundationTests.swift +2 -2
- package/ios/Tests/LoadSeekCoordinatorTests.swift +7 -40
- package/ios/Tests/MediaLoaderTests.swift +20 -32
- package/ios/Tests/PlaybackCoordinatorTests.swift +13 -787
- package/ios/Tests/PlaybackErrorHandlerTests.swift +46 -380
- package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +166 -0
- package/ios/Tests/PlaybackStateMachineTests.swift +8 -33
- package/ios/Tests/QueueManagerTests.swift +18 -149
- package/ios/Tests/ResolvedTrackCopyingTests.swift +8 -15
- package/ios/Tests/Support/TestTypes.swift +20 -61
- package/ios/Tests/TrackSelectorTests.swift +15 -15
- package/ios/TrackPlayer.swift +58 -380
- package/ios/TrackPlayerCallbacks.swift +44 -5
- package/ios/TrackSelector.swift +5 -5
- package/ios/Util/ArtworkImageFetcher.swift +2 -4
- package/ios/Util/NetworkMonitor.swift +3 -7
- package/ios/Util/OnceValue.swift +0 -34
- package/lib/commonjs/AudioBrowser.js +11 -0
- package/lib/commonjs/AudioBrowser.js.map +1 -1
- package/lib/commonjs/features/browser.js +158 -59
- package/lib/commonjs/features/browser.js.map +1 -1
- package/lib/commonjs/features/equalizer.js +1 -1
- package/lib/commonjs/features/errors.js +5 -37
- package/lib/commonjs/features/errors.js.map +1 -1
- package/lib/commonjs/features/favorites.js +1 -1
- package/lib/commonjs/features/index.js +0 -22
- package/lib/commonjs/features/index.js.map +1 -1
- package/lib/commonjs/features/metadata.js +3 -3
- package/lib/commonjs/features/metadata.js.map +1 -1
- package/lib/commonjs/features/network.js +1 -1
- package/lib/commonjs/features/nowPlaying.js +1 -36
- package/lib/commonjs/features/nowPlaying.js.map +1 -1
- package/lib/commonjs/features/output.js +23 -37
- package/lib/commonjs/features/output.js.map +1 -1
- package/lib/commonjs/features/playback/controls.js +0 -9
- package/lib/commonjs/features/playback/controls.js.map +1 -1
- package/lib/commonjs/features/playback/index.js +0 -11
- package/lib/commonjs/features/playback/index.js.map +1 -1
- package/lib/commonjs/features/playback/playWhenReady.js +1 -1
- package/lib/commonjs/features/playback/playing.js +1 -1
- package/lib/commonjs/features/playback/progress.js +13 -29
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/state.js +1 -1
- package/lib/commonjs/features/playback/volume.js +2 -2
- package/lib/commonjs/features/player/options.js +29 -79
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +3 -256
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/queue/activeTrack.js +1 -1
- package/lib/commonjs/features/queue/queue.js +5 -12
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/features/queue/repeatMode.js +1 -1
- package/lib/commonjs/features/queue/shuffle.js +1 -1
- package/lib/commonjs/features/rating.js +2 -0
- package/lib/commonjs/features/rating.js.map +1 -0
- package/lib/commonjs/features/remoteControls.js +104 -14
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/features/sleepTimer.js +5 -10
- package/lib/commonjs/features/sleepTimer.js.map +1 -1
- package/lib/commonjs/native.js +0 -5
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/native.web.js +1 -4
- package/lib/commonjs/native.web.js.map +1 -1
- package/lib/commonjs/types/player.js +2 -0
- package/lib/commonjs/types/player.js.map +1 -0
- package/lib/commonjs/utils/LazyNativeEmitter.js +8 -8
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/commonjs/utils/NativeUpdatedValue.js +3 -0
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/commonjs/web/NativeAudioBrowser.js +124 -301
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/SimpleRouter.test.js +174 -0
- package/lib/commonjs/web/SimpleRouter.test.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Player.js +26 -90
- package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +293 -0
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js +1 -1
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js +3 -34
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/index.js +5 -13
- package/lib/commonjs/web/TrackPlayer/index.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +50 -176
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
- package/lib/commonjs/web/browser/NavigationErrorManager.js +1 -3
- package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/commonjs/web/browser/SearchManager.js +9 -11
- package/lib/commonjs/web/browser/SearchManager.js.map +1 -1
- package/lib/commonjs/web/http/HttpClient.js +23 -4
- package/lib/commonjs/web/http/HttpClient.js.map +1 -1
- package/lib/commonjs/web/http/RequestConfigBuilder.js +58 -107
- package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/commonjs/web/player/NowPlayingManager.js +5 -6
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
- package/lib/commonjs/web/player/OptionsManager.js +17 -9
- package/lib/commonjs/web/player/OptionsManager.js.map +1 -1
- package/lib/module/AudioBrowser.js +1 -4
- package/lib/module/AudioBrowser.js.map +1 -1
- package/lib/module/features/browser.js +156 -53
- package/lib/module/features/browser.js.map +1 -1
- package/lib/module/features/equalizer.js +1 -1
- package/lib/module/features/errors.js +5 -37
- package/lib/module/features/errors.js.map +1 -1
- package/lib/module/features/favorites.js +1 -1
- package/lib/module/features/index.js +0 -2
- package/lib/module/features/index.js.map +1 -1
- package/lib/module/features/metadata.js +3 -3
- package/lib/module/features/metadata.js.map +1 -1
- package/lib/module/features/network.js +1 -1
- package/lib/module/features/nowPlaying.js +1 -34
- package/lib/module/features/nowPlaying.js.map +1 -1
- package/lib/module/features/output.js +19 -32
- package/lib/module/features/output.js.map +1 -1
- package/lib/module/features/playback/controls.js +0 -8
- package/lib/module/features/playback/controls.js.map +1 -1
- package/lib/module/features/playback/index.js +0 -1
- package/lib/module/features/playback/index.js.map +1 -1
- package/lib/module/features/playback/playWhenReady.js +1 -1
- package/lib/module/features/playback/playing.js +1 -1
- package/lib/module/features/playback/progress.js +13 -29
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/state.js +1 -1
- package/lib/module/features/playback/volume.js +2 -2
- package/lib/module/features/player/options.js +29 -79
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +3 -256
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/queue/activeTrack.js +1 -1
- package/lib/module/features/queue/queue.js +5 -12
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/features/queue/repeatMode.js +1 -1
- package/lib/module/features/queue/shuffle.js +1 -1
- package/lib/module/features/rating.js +2 -0
- package/lib/module/features/rating.js.map +1 -0
- package/lib/module/features/remoteControls.js +103 -13
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/features/sleepTimer.js +5 -10
- package/lib/module/features/sleepTimer.js.map +1 -1
- package/lib/module/native.js +0 -5
- package/lib/module/native.js.map +1 -1
- package/lib/module/native.web.js +1 -4
- package/lib/module/native.web.js.map +1 -1
- package/lib/module/types/player.js +2 -0
- package/lib/module/types/player.js.map +1 -0
- package/lib/module/utils/LazyNativeEmitter.js +8 -8
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/module/utils/NativeUpdatedValue.js +3 -0
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/module/web/NativeAudioBrowser.js +125 -302
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/SimpleRouter.test.js +174 -0
- package/lib/module/web/SimpleRouter.test.js.map +1 -0
- package/lib/module/web/TrackPlayer/Player.js +26 -90
- package/lib/module/web/TrackPlayer/Player.js.map +1 -1
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js +288 -0
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
- package/lib/module/web/TrackPlayer/RepeatMode.js +1 -1
- package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -1
- package/lib/module/web/TrackPlayer/SleepTimer.js +3 -34
- package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/module/web/TrackPlayer/index.js +1 -2
- package/lib/module/web/TrackPlayer/index.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +50 -176
- package/lib/module/web/browser/BrowserManager.js.map +1 -1
- package/lib/module/web/browser/NavigationErrorManager.js +1 -3
- package/lib/module/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/module/web/browser/SearchManager.js +9 -11
- package/lib/module/web/browser/SearchManager.js.map +1 -1
- package/lib/module/web/http/HttpClient.js +23 -4
- package/lib/module/web/http/HttpClient.js.map +1 -1
- package/lib/module/web/http/RequestConfigBuilder.js +58 -107
- package/lib/module/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/module/web/player/NowPlayingManager.js +5 -7
- package/lib/module/web/player/NowPlayingManager.js.map +1 -1
- package/lib/module/web/player/OptionsManager.js +17 -9
- package/lib/module/web/player/OptionsManager.js.map +1 -1
- package/lib/typescript/src/AudioBrowser.d.ts +1 -0
- package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
- package/lib/typescript/src/features/browser.d.ts +1 -40
- package/lib/typescript/src/features/browser.d.ts.map +1 -1
- package/lib/typescript/src/features/equalizer.d.ts +1 -1
- package/lib/typescript/src/features/errors.d.ts +6 -61
- package/lib/typescript/src/features/errors.d.ts.map +1 -1
- package/lib/typescript/src/features/favorites.d.ts +1 -1
- package/lib/typescript/src/features/index.d.ts +0 -2
- package/lib/typescript/src/features/index.d.ts.map +1 -1
- package/lib/typescript/src/features/metadata.d.ts +7 -9
- package/lib/typescript/src/features/metadata.d.ts.map +1 -1
- package/lib/typescript/src/features/network.d.ts +1 -1
- package/lib/typescript/src/features/nowPlaying.d.ts +1 -28
- package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -1
- package/lib/typescript/src/features/output.d.ts +18 -28
- package/lib/typescript/src/features/output.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/controls.d.ts +0 -5
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/index.d.ts +0 -1
- package/lib/typescript/src/features/playback/index.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/playWhenReady.d.ts +1 -1
- package/lib/typescript/src/features/playback/playing.d.ts +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts +1 -4
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/state.d.ts +1 -1
- package/lib/typescript/src/features/playback/volume.d.ts +2 -2
- package/lib/typescript/src/features/player/options.d.ts +127 -176
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts +167 -213
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +4 -11
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/repeatMode.d.ts +1 -1
- package/lib/typescript/src/features/queue/shuffle.d.ts +1 -1
- package/lib/typescript/src/features/rating.d.ts +14 -0
- package/lib/typescript/src/features/rating.d.ts.map +1 -0
- package/lib/typescript/src/features/remoteControls.d.ts +35 -23
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/features/sleepTimer.d.ts +4 -19
- package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/native.d.ts +2 -1
- package/lib/typescript/src/native.d.ts.map +1 -1
- package/lib/typescript/src/native.web.d.ts +3 -0
- package/lib/typescript/src/native.web.d.ts.map +1 -0
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts +225 -17
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-native.d.ts +3 -9
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +13 -145
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +85 -349
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/types/player.d.ts +64 -0
- package/lib/typescript/src/types/player.d.ts.map +1 -0
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +6 -8
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +2 -0
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
- package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -1
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +188 -0
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -0
- package/lib/typescript/src/web/SimpleRouter.d.ts +40 -0
- package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -0
- package/lib/typescript/src/web/SimpleRouter.test.d.ts +2 -0
- package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts +11 -0
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts +59 -0
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +39 -0
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +6 -0
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +4 -0
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +34 -0
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/State.d.ts +13 -0
- package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/index.d.ts +5 -0
- package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/BrowserManager.d.ts +154 -0
- package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts +42 -0
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +40 -0
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/SearchManager.d.ts +22 -0
- package/lib/typescript/src/web/browser/SearchManager.d.ts.map +1 -0
- package/lib/typescript/src/web/http/HttpClient.d.ts +25 -0
- package/lib/typescript/src/web/http/HttpClient.d.ts.map +1 -0
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +98 -0
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +1 -0
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts +34 -0
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +1 -0
- package/lib/typescript/src/web/player/OptionsManager.d.ts +32 -0
- package/lib/typescript/src/web/player/OptionsManager.d.ts.map +1 -0
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +69 -0
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +1 -0
- package/lib/typescript/src/web/util/shuffle.d.ts +8 -0
- package/lib/typescript/src/web/util/shuffle.d.ts.map +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +2 -4
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +10 -24
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +6 -6
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +20 -10
- package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +1 -33
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +0 -5
- package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +3 -3
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +2 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +147 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +0 -8
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +10 -0
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +9 -14
- package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +0 -2
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +0 -2
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +10 -10
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +0 -6
- package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +221 -245
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +22 -25
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +3 -33
- package/nitrogen/generated/android/c++/{JOutput.hpp → JIosOutput.hpp} +15 -15
- package/nitrogen/generated/android/c++/JIosOutputType.hpp +85 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +1 -33
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +28 -61
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +9 -20
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +24 -21
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +0 -6
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +20 -10
- package/nitrogen/generated/android/c++/{JRemoteButton.hpp → JNotificationButton.hpp} +20 -20
- package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
- package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +17 -3
- package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +3 -7
- package/nitrogen/generated/android/c++/JOptions.hpp +14 -19
- package/nitrogen/generated/android/c++/{JNativeAndroidSetupOptions.hpp → JPartialAndroidSetupPlayerOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/{JNativeIOSSetupOptions.hpp → JPartialIOSSetupPlayerOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +96 -0
- package/nitrogen/generated/android/c++/JPercentageRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JPlayback.hpp +0 -2
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JPlaybackError.hpp +3 -18
- package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +0 -2
- package/nitrogen/generated/android/c++/JPlaybackState.hpp +3 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
- package/nitrogen/generated/android/c++/JRatingType.hpp +73 -0
- package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +5 -23
- package/nitrogen/generated/android/c++/JRetryConfig.hpp +7 -11
- package/nitrogen/generated/android/c++/JSearchMode.hpp +9 -27
- package/nitrogen/generated/android/c++/JSearchParams.hpp +3 -9
- package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
- package/nitrogen/generated/android/c++/{JGateEvent.hpp → JThumbsRating.hpp} +15 -16
- package/nitrogen/generated/android/c++/JTrack.hpp +5 -23
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +1 -14
- package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +34 -0
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +105 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +75 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +9 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +4 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.kt → Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt} +12 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_Output.kt → Func_void_IosOutput.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_GateEvent.kt → Func_void_RemoteSetRatingEvent.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Gate.kt → HeartRating.kt} +6 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +109 -103
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +3 -24
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Output.kt → IosOutput.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +32 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +4 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +6 -18
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +1 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +9 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoritesMatchMode.kt → NotificationButton.kt} +8 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +3 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NativeAndroidSetupOptions.kt → PartialAndroidSetupPlayerOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NativeIOSSetupOptions.kt → PartialIOSSetupPlayerOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateDecision.kt → PercentageRating.kt} +6 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +3 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateReason.kt → RatingType.kt} +10 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{ArtworkVariants.kt → RemoteSetRatingEvent.kt} +6 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +3 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +4 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +6 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +3 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateEvent.kt → StarRating.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → ThumbsRating.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +3 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +4 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +77 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Variant_NullType_RemoteButtonLayout.kt → Variant_NullType_NotificationButtonLayout.kt} +9 -9
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +28 -139
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +489 -1125
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +45 -66
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +118 -176
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +8 -8
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +22 -12
- package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +119 -0
- package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +1 -95
- package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +4 -4
- package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +4 -17
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +68 -0
- package/nitrogen/generated/ios/swift/{Func_void_Output.swift → Func_void_IosOutput.swift} +10 -10
- package/nitrogen/generated/ios/swift/{Func_void_GateEvent.swift → Func_void_RemoteSetRatingEvent.swift} +10 -10
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
- package/nitrogen/generated/ios/swift/{Func_void_std__shared_ptr_Promise_GateDecision__.swift → Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift} +17 -17
- package/nitrogen/generated/ios/swift/HeartRating.swift +29 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +14 -20
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +197 -230
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +2 -121
- package/nitrogen/generated/ios/swift/{Output.swift → IosOutput.swift} +7 -7
- package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
- package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +1 -107
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +22 -161
- package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +19 -19
- package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +25 -12
- package/nitrogen/generated/ios/swift/NavigationErrorType.swift +0 -8
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +41 -12
- package/nitrogen/generated/ios/swift/{RemoteButton.swift → NotificationButton.swift} +10 -10
- package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +92 -0
- package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +48 -1
- package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +1 -19
- package/nitrogen/generated/ios/swift/Options.swift +4 -10
- package/nitrogen/generated/ios/swift/{NativeAndroidSetupOptions.swift → PartialAndroidSetupPlayerOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/{NativeIOSSetupOptions.swift → PartialIOSSetupPlayerOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +101 -0
- package/nitrogen/generated/ios/swift/PercentageRating.swift +29 -0
- package/nitrogen/generated/ios/swift/PlaybackError.swift +2 -43
- package/nitrogen/generated/ios/swift/PlaybackState.swift +4 -4
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
- package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
- package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +58 -0
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +8 -74
- package/nitrogen/generated/ios/swift/RetryConfig.swift +4 -35
- package/nitrogen/generated/ios/swift/SearchMode.swift +12 -36
- package/nitrogen/generated/ios/swift/SearchParams.swift +2 -7
- package/nitrogen/generated/ios/swift/StarRating.swift +29 -0
- package/nitrogen/generated/ios/swift/ThumbsRating.swift +29 -0
- package/nitrogen/generated/ios/swift/Track.swift +8 -74
- package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +1 -60
- package/nitrogen/generated/ios/swift/UpdateOptions.swift +143 -0
- package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
- package/nitrogen/generated/ios/swift/{Variant_NullType_RemoteButtonLayout.swift → Variant_NullType_NotificationButtonLayout.swift} +3 -3
- package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +10 -10
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +19 -8
- package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +109 -0
- package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +2 -10
- package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +6 -6
- package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +2 -0
- package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +5 -6
- package/nitrogen/generated/shared/c++/{GateEvent.hpp → HeartRating.hpp} +17 -18
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +18 -21
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +35 -44
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +2 -33
- package/nitrogen/generated/shared/c++/{Output.hpp → IosOutput.hpp} +18 -18
- package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
- package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +2 -10
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +15 -31
- package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +5 -5
- package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +7 -9
- package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +0 -8
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +19 -8
- package/nitrogen/generated/shared/c++/{RemoteButton.hpp → NotificationButton.hpp} +25 -25
- package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +102 -0
- package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +19 -3
- package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +2 -6
- package/nitrogen/generated/shared/c++/Options.hpp +8 -8
- package/nitrogen/generated/shared/c++/{NativeAndroidSetupOptions.hpp → PartialAndroidSetupPlayerOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/{NativeIOSSetupOptions.hpp → PartialIOSSetupPlayerOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +104 -0
- package/nitrogen/generated/shared/c++/{FavoriteConfig.hpp → PercentageRating.hpp} +17 -18
- package/nitrogen/generated/shared/c++/PlaybackError.hpp +3 -18
- package/nitrogen/generated/shared/c++/PlaybackState.hpp +9 -9
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
- package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
- package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +94 -0
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +5 -24
- package/nitrogen/generated/shared/c++/RetryConfig.hpp +6 -10
- package/nitrogen/generated/shared/c++/SearchMode.hpp +15 -39
- package/nitrogen/generated/shared/c++/SearchParams.hpp +2 -9
- package/nitrogen/generated/shared/c++/{Gate.hpp → StarRating.hpp} +16 -21
- package/nitrogen/generated/shared/c++/{GateDecision.hpp → ThumbsRating.hpp} +17 -23
- package/nitrogen/generated/shared/c++/Track.hpp +5 -24
- package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +2 -6
- package/nitrogen/generated/shared/c++/UpdateOptions.hpp +111 -0
- package/package.json +5 -12
- package/src/AudioBrowser.ts +1 -4
- package/src/features/browser.ts +201 -58
- package/src/features/equalizer.ts +1 -1
- package/src/features/errors.ts +5 -71
- package/src/features/favorites.ts +1 -1
- package/src/features/index.ts +0 -2
- package/src/features/metadata.ts +15 -9
- package/src/features/network.ts +1 -1
- package/src/features/nowPlaying.ts +1 -37
- package/src/features/output.ts +22 -35
- package/src/features/playback/controls.ts +0 -8
- package/src/features/playback/index.ts +0 -1
- package/src/features/playback/playWhenReady.ts +1 -1
- package/src/features/playback/playing.ts +1 -1
- package/src/features/playback/progress.ts +13 -32
- package/src/features/playback/state.ts +1 -1
- package/src/features/playback/volume.ts +2 -2
- package/src/features/player/options.ts +110 -217
- package/src/features/player/setup.ts +175 -397
- package/src/features/queue/activeTrack.ts +1 -1
- package/src/features/queue/queue.ts +6 -17
- package/src/features/queue/repeatMode.ts +1 -1
- package/src/features/queue/shuffle.ts +1 -1
- package/src/features/rating.ts +17 -0
- package/src/features/remoteControls.ts +115 -13
- package/src/features/sleepTimer.ts +5 -24
- package/src/native.ts +0 -5
- package/src/native.web.ts +1 -4
- package/src/specs/audio-browser.nitro.ts +41 -131
- package/src/types/browser-native.ts +6 -19
- package/src/types/browser-nodes.ts +13 -160
- package/src/types/browser.ts +89 -377
- package/src/types/player.ts +69 -0
- package/src/utils/LazyNativeEmitter.ts +8 -9
- package/src/utils/NativeUpdatedValue.ts +2 -0
- package/src/web/NativeAudioBrowser.ts +158 -365
- package/src/web/TrackPlayer/Player.ts +39 -113
- package/src/web/TrackPlayer/PlaylistPlayer.ts +346 -0
- package/src/web/TrackPlayer/RepeatMode.ts +1 -1
- package/src/web/TrackPlayer/SleepTimer.ts +3 -38
- package/src/web/TrackPlayer/index.ts +1 -2
- package/src/web/browser/BrowserManager.ts +62 -231
- package/src/web/browser/NavigationErrorManager.ts +1 -3
- package/src/web/browser/SearchManager.ts +15 -11
- package/src/web/http/HttpClient.ts +35 -5
- package/src/web/http/RequestConfigBuilder.ts +63 -120
- package/src/web/player/NowPlayingManager.ts +5 -6
- package/src/web/player/OptionsManager.ts +18 -12
- package/android/src/main/java/com/audiobrowser/ServiceBinding.kt +0 -46
- package/android/src/main/java/com/audiobrowser/browser/ArtworkResolutionRegistry.kt +0 -37
- package/android/src/main/java/com/audiobrowser/browser/BrowseArtworkRegistry.kt +0 -34
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +0 -299
- package/android/src/main/java/com/audiobrowser/browser/JsonArtwork.kt +0 -79
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +0 -42
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +0 -35
- package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +0 -172
- package/android/src/main/java/com/audiobrowser/player/EqualizerController.kt +0 -153
- package/android/src/main/java/com/audiobrowser/player/InterceptingPlayer.kt +0 -141
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +0 -347
- package/android/src/main/java/com/audiobrowser/player/PlaybackErrorClassifier.kt +0 -129
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateMachine.kt +0 -85
- package/android/src/main/java/com/audiobrowser/player/PlaybackTimer.kt +0 -56
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +0 -20
- package/android/src/main/java/com/audiobrowser/player/PlayerEngineFactory.kt +0 -130
- package/android/src/main/java/com/audiobrowser/player/SleepTimerManager.kt +0 -80
- package/android/src/main/java/com/audiobrowser/player/StuckRecoveryPolicy.kt +0 -50
- package/android/src/main/java/com/audiobrowser/player/VolumeFader.kt +0 -81
- package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +0 -141
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +0 -37
- package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +0 -41
- package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +0 -209
- package/android/src/main/java/com/audiobrowser/util/ArtworkContentProvider.kt +0 -161
- package/android/src/main/java/com/audiobrowser/util/ArtworkUris.kt +0 -28
- package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +0 -24
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoader.kt +0 -49
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoaderHolder.kt +0 -36
- package/android/src/main/java/com/audiobrowser/util/OutputMonitor.kt +0 -211
- package/android/src/main/java/com/audiobrowser/util/OutputSwitcher.kt +0 -58
- package/android/src/main/java/com/audiobrowser/util/RatingFavorites.kt +0 -14
- package/android/src/test/java/com/audiobrowser/ServiceBindingTest.kt +0 -68
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +0 -165
- package/android/src/test/java/com/audiobrowser/browser/ArtworkResolutionRegistryTest.kt +0 -46
- package/android/src/test/java/com/audiobrowser/browser/BrowseArtworkRegistryTest.kt +0 -39
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerBuildApiRequestTest.kt +0 -114
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +0 -141
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +0 -177
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +0 -55
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +0 -94
- package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +0 -203
- package/android/src/test/java/com/audiobrowser/player/DynamicLoadControlTest.kt +0 -56
- package/android/src/test/java/com/audiobrowser/player/EqualizerControllerTest.kt +0 -216
- package/android/src/test/java/com/audiobrowser/player/MediaSessionSlotMappingTest.kt +0 -45
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +0 -442
- package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +0 -190
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateMachineTest.kt +0 -198
- package/android/src/test/java/com/audiobrowser/player/PlaybackTimerTest.kt +0 -137
- package/android/src/test/java/com/audiobrowser/player/PlayerEngineFactoryTest.kt +0 -36
- package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +0 -268
- package/android/src/test/java/com/audiobrowser/player/SessionErrorMaskTest.kt +0 -68
- package/android/src/test/java/com/audiobrowser/player/StuckRecoveryPolicyTest.kt +0 -40
- package/android/src/test/java/com/audiobrowser/player/TransformingDataSourceTest.kt +0 -193
- package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +0 -107
- package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +0 -73
- package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +0 -75
- package/android/src/test/java/com/audiobrowser/tls/CertFixtures.kt +0 -18
- package/android/src/test/java/com/audiobrowser/util/ArtworkContentProviderTest.kt +0 -163
- package/android/src/test/java/com/audiobrowser/util/ArtworkUrisTest.kt +0 -34
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +0 -28
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderHolderTest.kt +0 -53
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderTest.kt +0 -58
- package/android/src/test/java/com/audiobrowser/util/FakeImageLoader.kt +0 -57
- package/android/src/test/java/com/audiobrowser/util/PlayingStateFactoryTest.kt +0 -40
- package/android/src/test/java/com/audiobrowser/util/RatingFavoritesTest.kt +0 -34
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryBrowseTest.kt +0 -50
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +0 -63
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryRatingTest.kt +0 -35
- package/android/src/test/resources/certs/isrg-root-x1.pem +0 -31
- package/android/src/test/resources/certs/letsencrypt-r13.der +0 -0
- package/android/src/test/resources/certs/letsencrypt-r13.pem +0 -29
- package/android/src/test/resources/certs/stationplaylist-leaf.pem +0 -34
- package/ios/Browser/MediaResolveComposer.swift +0 -114
- package/ios/Browser/SearchDrillIn.swift +0 -44
- package/ios/Browser/SectionScope.swift +0 -35
- package/ios/Browser/TabBarEntries.swift +0 -15
- package/ios/CarPlay/CPInterfaceController+Safe.swift +0 -126
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
- package/ios/CarPlay/RNABMediaAddHandler.swift +0 -75
- package/ios/CarPlay/RNABMediaAffinityHandler.swift +0 -69
- package/ios/Extension/PlayerCapabilities+Favorite.swift +0 -20
- package/ios/Extension/RequestConfig+Copying.swift +0 -31
- package/ios/Extension/Variant+Artwork.swift +0 -49
- package/ios/NowPlayingInfo/SilentAudioPrimer.swift +0 -73
- package/ios/Player/AirPlayStallJudgement.swift +0 -25
- package/ios/Player/EndOfTrackJudgement.swift +0 -32
- package/ios/Player/MediaIntentCriteria.swift +0 -139
- package/ios/Player/PersistedPlaybackState.swift +0 -11
- package/ios/Player/PlaybackStateStore.swift +0 -27
- package/ios/Player/PlaybackTimer.swift +0 -61
- package/ios/Player/VolumeFader.swift +0 -77
- package/ios/RemoteCommand/RemoteCommandCallbacks.swift +0 -47
- package/ios/Tests/AirPlayStallJudgementTests.swift +0 -52
- package/ios/Tests/EndOfTrackJudgementTests.swift +0 -35
- package/ios/Tests/JsonModelsTests.swift +0 -58
- package/ios/Tests/MediaIntentCriteriaTests.swift +0 -170
- package/ios/Tests/MediaLoaderAssetOptionsTests.swift +0 -46
- package/ios/Tests/MediaResolveTests.swift +0 -126
- package/ios/Tests/OnceValueTests.swift +0 -79
- package/ios/Tests/PlaybackStateStoreTests.swift +0 -48
- package/ios/Tests/PlaybackTimerTests.swift +0 -55
- package/ios/Tests/PlayingStateManagerTests.swift +0 -57
- package/ios/Tests/RemoteCommandControllerTests.swift +0 -156
- package/ios/Tests/RemoteCommandTests.swift +0 -67
- package/ios/Tests/RetryManagerTests.swift +0 -89
- package/ios/Tests/SearchDrillInTests.swift +0 -63
- package/ios/Tests/SectionScopeTests.swift +0 -82
- package/ios/Tests/SleepTimerManagerTests.swift +0 -107
- package/ios/Tests/Support/ManualSleepTimerScheduler.swift +0 -47
- package/ios/Tests/TabBarEntriesTests.swift +0 -71
- package/lib/commonjs/features/browser-config.js +0 -227
- package/lib/commonjs/features/browser-config.js.map +0 -1
- package/lib/commonjs/features/carConnection.js +0 -42
- package/lib/commonjs/features/carConnection.js.map +0 -1
- package/lib/commonjs/features/gate.js +0 -149
- package/lib/commonjs/features/gate.js.map +0 -1
- package/lib/commonjs/features/playback/trackPlaybackTime.js +0 -86
- package/lib/commonjs/features/playback/trackPlaybackTime.js.map +0 -1
- package/lib/commonjs/features/player/validateOptions.js +0 -24
- package/lib/commonjs/features/player/validateOptions.js.map +0 -1
- package/lib/commonjs/utils/artwork.js +0 -31
- package/lib/commonjs/utils/artwork.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +0 -71
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js +0 -34
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js +0 -21
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +0 -273
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +0 -158
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js +0 -75
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js.map +0 -1
- package/lib/commonjs/web/browser/assertBrowsePageShape.js +0 -22
- package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +0 -1
- package/lib/commonjs/web/browser/classifyTrackNavigation.js +0 -41
- package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +0 -1
- package/lib/commonjs/web/browser/parseSearchResponse.js +0 -20
- package/lib/commonjs/web/browser/parseSearchResponse.js.map +0 -1
- package/lib/commonjs/web/playbackErrorKind.js +0 -57
- package/lib/commonjs/web/playbackErrorKind.js.map +0 -1
- package/lib/commonjs/web/player/MediaSessionManager.js +0 -121
- package/lib/commonjs/web/player/MediaSessionManager.js.map +0 -1
- package/lib/commonjs/web/player/RemoteCommandController.js +0 -96
- package/lib/commonjs/web/player/RemoteCommandController.js.map +0 -1
- package/lib/module/features/browser-config.js +0 -221
- package/lib/module/features/browser-config.js.map +0 -1
- package/lib/module/features/carConnection.js +0 -37
- package/lib/module/features/carConnection.js.map +0 -1
- package/lib/module/features/gate.js +0 -144
- package/lib/module/features/gate.js.map +0 -1
- package/lib/module/features/playback/trackPlaybackTime.js +0 -83
- package/lib/module/features/playback/trackPlaybackTime.js.map +0 -1
- package/lib/module/features/player/validateOptions.js +0 -20
- package/lib/module/features/player/validateOptions.js.map +0 -1
- package/lib/module/utils/artwork.js +0 -26
- package/lib/module/utils/artwork.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +0 -67
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlaybackTimer.js +0 -29
- package/lib/module/web/TrackPlayer/PlaybackTimer.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js +0 -17
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
- package/lib/module/web/TrackPlayer/QueueManager.js +0 -269
- package/lib/module/web/TrackPlayer/QueueManager.js.map +0 -1
- package/lib/module/web/TrackPlayer/QueuePlayer.js +0 -154
- package/lib/module/web/TrackPlayer/QueuePlayer.js.map +0 -1
- package/lib/module/web/TrackPlayer/VolumeFader.js +0 -70
- package/lib/module/web/TrackPlayer/VolumeFader.js.map +0 -1
- package/lib/module/web/browser/assertBrowsePageShape.js +0 -18
- package/lib/module/web/browser/assertBrowsePageShape.js.map +0 -1
- package/lib/module/web/browser/classifyTrackNavigation.js +0 -38
- package/lib/module/web/browser/classifyTrackNavigation.js.map +0 -1
- package/lib/module/web/browser/parseSearchResponse.js +0 -16
- package/lib/module/web/browser/parseSearchResponse.js.map +0 -1
- package/lib/module/web/playbackErrorKind.js +0 -52
- package/lib/module/web/playbackErrorKind.js.map +0 -1
- package/lib/module/web/player/MediaSessionManager.js +0 -116
- package/lib/module/web/player/MediaSessionManager.js.map +0 -1
- package/lib/module/web/player/RemoteCommandController.js +0 -92
- package/lib/module/web/player/RemoteCommandController.js.map +0 -1
- package/lib/typescript/src/features/browser-config.d.ts +0 -12
- package/lib/typescript/src/features/browser-config.d.ts.map +0 -1
- package/lib/typescript/src/features/carConnection.d.ts +0 -20
- package/lib/typescript/src/features/carConnection.d.ts.map +0 -1
- package/lib/typescript/src/features/gate.d.ts +0 -78
- package/lib/typescript/src/features/gate.d.ts.map +0 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +0 -34
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +0 -1
- package/lib/typescript/src/features/player/validateOptions.d.ts +0 -2
- package/lib/typescript/src/features/player/validateOptions.d.ts.map +0 -1
- package/lib/typescript/src/utils/artwork.d.ts +0 -19
- package/lib/typescript/src/utils/artwork.d.ts.map +0 -1
- package/nitrogen/generated/android/c++/JArtworkVariants.hpp +0 -61
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
- package/nitrogen/generated/android/c++/JFavoritesMatchMode.hpp +0 -58
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +0 -100
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.hpp +0 -112
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +0 -121
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +0 -123
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +0 -133
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +0 -121
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.hpp +0 -139
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.hpp +0 -134
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +0 -131
- package/nitrogen/generated/android/c++/JFunc_void_GateEvent.hpp +0 -79
- package/nitrogen/generated/android/c++/JFunc_void_Output.hpp +0 -80
- package/nitrogen/generated/android/c++/JGate.hpp +0 -62
- package/nitrogen/generated/android/c++/JGateDecision.hpp +0 -64
- package/nitrogen/generated/android/c++/JGateReason.hpp +0 -58
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +0 -95
- package/nitrogen/generated/android/c++/JMediaReference.hpp +0 -58
- package/nitrogen/generated/android/c++/JNativeGateRequest.hpp +0 -74
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +0 -182
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +0 -96
- package/nitrogen/generated/android/c++/JOutputType.hpp +0 -82
- package/nitrogen/generated/android/c++/JPlaybackErrorKind.hpp +0 -76
- package/nitrogen/generated/android/c++/JRemoteButtonLayout.hpp +0 -86
- package/nitrogen/generated/android/c++/JStallReason.hpp +0 -58
- package/nitrogen/generated/android/c++/JTrackRequest.hpp +0 -93
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +0 -71
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.hpp +0 -75
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.cpp +0 -41
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +0 -121
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.hpp +0 -70
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNowPlayingParams.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___Track.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_std__string____Track.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaReference.kt +0 -23
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeGateRequest.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeSetupPlayerOptions.kt +0 -66
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/OutputType.kt +0 -31
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorKind.kt +0 -29
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButton.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButtonLayout.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StallReason.kt +0 -23
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackRequest.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.kt +0 -65
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_String_ArtworkVariants.kt +0 -53
- package/nitrogen/generated/ios/swift/ArtworkVariants.swift +0 -34
- package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
- package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
- package/nitrogen/generated/ios/swift/FormatNowPlayingParams.swift +0 -67
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.swift +0 -54
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +0 -69
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___Track.swift +0 -54
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.swift +0 -60
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_std__string____Track.swift +0 -60
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.swift +0 -61
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.swift +0 -61
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.swift +0 -77
- package/nitrogen/generated/ios/swift/Func_void_GateDecision.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_TransformableRequestConfig.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NowPlayingUpdate_.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +0 -53
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_TransformableRequestConfig__.swift +0 -66
- package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError____.swift +0 -81
- package/nitrogen/generated/ios/swift/Gate.swift +0 -47
- package/nitrogen/generated/ios/swift/GateDecision.swift +0 -40
- package/nitrogen/generated/ios/swift/GateEvent.swift +0 -29
- package/nitrogen/generated/ios/swift/GateReason.swift +0 -40
- package/nitrogen/generated/ios/swift/IOSOptions.swift +0 -51
- package/nitrogen/generated/ios/swift/MediaReference.swift +0 -40
- package/nitrogen/generated/ios/swift/NativeGateRequest.swift +0 -58
- package/nitrogen/generated/ios/swift/NativeSetupPlayerOptions.swift +0 -206
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +0 -90
- package/nitrogen/generated/ios/swift/OutputType.swift +0 -72
- package/nitrogen/generated/ios/swift/PlaybackErrorKind.swift +0 -64
- package/nitrogen/generated/ios/swift/RemoteButtonLayout.swift +0 -57
- package/nitrogen/generated/ios/swift/StallReason.swift +0 -40
- package/nitrogen/generated/ios/swift/TrackRequest.swift +0 -106
- package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
- package/nitrogen/generated/ios/swift/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.swift +0 -19
- package/nitrogen/generated/ios/swift/Variant_String_ArtworkVariants.swift +0 -18
- package/nitrogen/generated/shared/c++/ArtworkVariants.hpp +0 -87
- package/nitrogen/generated/shared/c++/FavoritesMatchMode.hpp +0 -76
- package/nitrogen/generated/shared/c++/FormatNowPlayingParams.hpp +0 -110
- package/nitrogen/generated/shared/c++/GateReason.hpp +0 -76
- package/nitrogen/generated/shared/c++/IOSOptions.hpp +0 -91
- package/nitrogen/generated/shared/c++/MediaReference.hpp +0 -76
- package/nitrogen/generated/shared/c++/NativeGateRequest.hpp +0 -97
- package/nitrogen/generated/shared/c++/NativeSetupPlayerOptions.hpp +0 -138
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +0 -92
- package/nitrogen/generated/shared/c++/OutputType.hpp +0 -108
- package/nitrogen/generated/shared/c++/PlaybackErrorKind.hpp +0 -100
- package/nitrogen/generated/shared/c++/RemoteButtonLayout.hpp +0 -94
- package/nitrogen/generated/shared/c++/StallReason.hpp +0 -76
- package/nitrogen/generated/shared/c++/TrackRequest.hpp +0 -93
- package/src/codegen-no-config-variant.test.ts +0 -70
- package/src/features/browser-config.test.ts +0 -110
- package/src/features/browser-config.ts +0 -293
- package/src/features/browser.test.ts +0 -19
- package/src/features/carConnection.ts +0 -36
- package/src/features/gate.test.ts +0 -72
- package/src/features/gate.ts +0 -155
- package/src/features/playback/trackPlaybackTime.test.ts +0 -80
- package/src/features/playback/trackPlaybackTime.ts +0 -101
- package/src/features/player/options.test.ts +0 -38
- package/src/features/player/setup.test.ts +0 -125
- package/src/features/player/validateOptions.ts +0 -22
- package/src/features/queue/queue.test.ts +0 -36
- package/src/public-surface.test.ts +0 -123
- package/src/utils/artwork.ts +0 -30
- package/src/web/NativeAudioBrowser.playWhenReady.test.ts +0 -301
- package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +0 -139
- package/src/web/TrackPlayer/PlaybackStateMachine.ts +0 -82
- package/src/web/TrackPlayer/PlaybackTimer.test.ts +0 -67
- package/src/web/TrackPlayer/PlaybackTimer.ts +0 -33
- package/src/web/TrackPlayer/Player.dispatch.test.ts +0 -229
- package/src/web/TrackPlayer/Player.load.test.ts +0 -86
- package/src/web/TrackPlayer/PlayingStateFactory.test.ts +0 -51
- package/src/web/TrackPlayer/PlayingStateFactory.ts +0 -24
- package/src/web/TrackPlayer/QueueManager.test.ts +0 -289
- package/src/web/TrackPlayer/QueueManager.ts +0 -302
- package/src/web/TrackPlayer/QueuePlayer.ts +0 -188
- package/src/web/TrackPlayer/VolumeFader.ts +0 -74
- package/src/web/browser/__tests__/layer-resolver.test.ts +0 -69
- package/src/web/browser/assertBrowsePageShape.test.ts +0 -27
- package/src/web/browser/assertBrowsePageShape.ts +0 -27
- package/src/web/browser/classifyTrackNavigation.test.ts +0 -41
- package/src/web/browser/classifyTrackNavigation.ts +0 -35
- package/src/web/browser/parseSearchResponse.test.ts +0 -25
- package/src/web/browser/parseSearchResponse.ts +0 -15
- package/src/web/http/RequestConfigBuilder.test.ts +0 -59
- package/src/web/playbackErrorKind.test.ts +0 -55
- package/src/web/playbackErrorKind.ts +0 -56
- package/src/web/player/MediaSessionManager.test.ts +0 -220
- package/src/web/player/MediaSessionManager.ts +0 -151
- package/src/web/player/NowPlayingManager.test.ts +0 -46
- package/src/web/player/RemoteCommandController.test.ts +0 -171
- package/src/web/player/RemoteCommandController.ts +0 -166
|
@@ -4,50 +4,26 @@ import android.os.Bundle
|
|
|
4
4
|
import androidx.media3.common.Player as MediaPlayer
|
|
5
5
|
import androidx.media3.session.CommandButton
|
|
6
6
|
import androidx.media3.session.MediaSession
|
|
7
|
+
import androidx.media3.session.R
|
|
7
8
|
import androidx.media3.session.SessionCommand
|
|
8
9
|
import androidx.media3.session.SessionCommands
|
|
10
|
+
import com.margelo.nitro.audiobrowser.NotificationButton
|
|
11
|
+
import com.margelo.nitro.audiobrowser.NotificationButtonLayout
|
|
9
12
|
import com.margelo.nitro.audiobrowser.PlayerCapabilities
|
|
10
|
-
import com.margelo.nitro.audiobrowser.RemoteButton
|
|
11
|
-
import com.margelo.nitro.audiobrowser.RemoteButtonLayout
|
|
12
13
|
import timber.log.Timber
|
|
13
14
|
|
|
14
|
-
/**
|
|
15
|
-
* A slot's Media3 preference list: the requested slot, then OVERFLOW as a fallback.
|
|
16
|
-
*
|
|
17
|
-
* `slots` is a preference order, not a coordinate — Media3 places a button in the first slot in the
|
|
18
|
-
* list "that exists, isn't already occupied and that allows this type of button". Naming OVERFLOW
|
|
19
|
-
* second means a button whose primary position is unavailable on some surface demotes instead of
|
|
20
|
-
* disappearing, because every flattening
|
|
21
|
-
* (`CommandButton.getCustomLayoutFromMediaButtonPreferences`, run by both `MediaSessionLegacyStub`
|
|
22
|
-
* for Android Auto and the Android 13+ controls, and `DefaultMediaNotificationProvider` for the
|
|
23
|
-
* notification) keeps a button only if it won BACK, won FORWARD, or *contains* OVERFLOW.
|
|
24
|
-
*/
|
|
25
|
-
internal fun media3SlotsFor(slot: ButtonSlot): IntArray =
|
|
26
|
-
when (slot) {
|
|
27
|
-
ButtonSlot.BACK -> intArrayOf(CommandButton.SLOT_BACK, CommandButton.SLOT_OVERFLOW)
|
|
28
|
-
ButtonSlot.FORWARD -> intArrayOf(CommandButton.SLOT_FORWARD, CommandButton.SLOT_OVERFLOW)
|
|
29
|
-
ButtonSlot.OVERFLOW -> intArrayOf(CommandButton.SLOT_OVERFLOW)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
15
|
/**
|
|
33
16
|
* MediaSession manager that handles command configuration and execution.
|
|
34
17
|
*
|
|
35
18
|
* Responsibilities:
|
|
36
|
-
* - Maps player capabilities to MediaSession commands
|
|
37
|
-
* - Builds the single, slot-annotated button layout published to every surface
|
|
19
|
+
* - Maps player capabilities to MediaSession commands and notification layouts
|
|
38
20
|
* - Updates MediaSession configuration and applies changes immediately
|
|
39
21
|
* - Builds connection results for new MediaSession controllers
|
|
40
22
|
* - Handles execution of custom MediaSession commands (jump actions)
|
|
23
|
+
* - Maintains proper separation between global capabilities and notification-specific controls
|
|
41
24
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* Bluetooth remote or headset.
|
|
45
|
-
*
|
|
46
|
-
* There is ONE layout, published session-wide via `setMediaButtonPreferences`. Media3 fans it out:
|
|
47
|
-
* `MediaNotificationManager` renders it as the MediaStyle notification (Android 12 and below), and
|
|
48
|
-
* `MediaSessionLegacyStub` converts it into the platform PlaybackState plus the slot-reservation
|
|
49
|
-
* extras that Android Auto and the Android 13+ system media controls read. Publishing
|
|
50
|
-
* per-controller instead would reach neither, since Android Auto connects as a legacy controller.
|
|
25
|
+
* Initializes with sensible defaults: all global capabilities enabled, essential notification
|
|
26
|
+
* controls only.
|
|
51
27
|
*/
|
|
52
28
|
class MediaSessionCommandManager {
|
|
53
29
|
|
|
@@ -55,100 +31,59 @@ class MediaSessionCommandManager {
|
|
|
55
31
|
private const val CUSTOM_ACTION_JUMP_BACKWARD = "JUMP_BACKWARD"
|
|
56
32
|
private const val CUSTOM_ACTION_JUMP_FORWARD = "JUMP_FORWARD"
|
|
57
33
|
const val CUSTOM_ACTION_FAVORITE = "FAVORITE"
|
|
58
|
-
|
|
59
|
-
/** Matches PlayerUpdateOptions.forwardJumpInterval/backwardJumpInterval */
|
|
60
|
-
private const val DEFAULT_JUMP_INTERVAL = 15.0
|
|
61
34
|
}
|
|
62
35
|
|
|
63
|
-
/**
|
|
64
|
-
* Media3 ships numbered icons for 5, 10, 15 and 30 seconds; every other interval falls back to
|
|
65
|
-
* the unnumbered arrow.
|
|
66
|
-
*
|
|
67
|
-
* The match is exact, not rounded. A numbered icon is a claim about how far the button seeks, so
|
|
68
|
-
* a 14.6s interval must not draw "15" — it would promise a jump the player never makes. Better an
|
|
69
|
-
* honest arrow than a wrong number.
|
|
70
|
-
*
|
|
71
|
-
* The icon constant — not the drawable — is what a controller that renders its own UI reads, and
|
|
72
|
-
* it is carried through the legacy conversion Android Auto consumes. Building a button with only
|
|
73
|
-
* `setIconResId` leaves the constant at ICON_UNDEFINED, so the car has nothing to draw.
|
|
74
|
-
*/
|
|
75
|
-
private fun jumpForwardIcon(seconds: Double): Int =
|
|
76
|
-
when (seconds) {
|
|
77
|
-
5.0 -> CommandButton.ICON_SKIP_FORWARD_5
|
|
78
|
-
10.0 -> CommandButton.ICON_SKIP_FORWARD_10
|
|
79
|
-
15.0 -> CommandButton.ICON_SKIP_FORWARD_15
|
|
80
|
-
30.0 -> CommandButton.ICON_SKIP_FORWARD_30
|
|
81
|
-
else -> CommandButton.ICON_SKIP_FORWARD
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
private fun jumpBackwardIcon(seconds: Double): Int =
|
|
85
|
-
when (seconds) {
|
|
86
|
-
5.0 -> CommandButton.ICON_SKIP_BACK_5
|
|
87
|
-
10.0 -> CommandButton.ICON_SKIP_BACK_10
|
|
88
|
-
15.0 -> CommandButton.ICON_SKIP_BACK_15
|
|
89
|
-
30.0 -> CommandButton.ICON_SKIP_BACK_30
|
|
90
|
-
else -> CommandButton.ICON_SKIP_BACK
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** Player commands available to every controller, derived from capabilities alone */
|
|
36
|
+
/** Current player commands configuration for external controllers */
|
|
94
37
|
var playerCommands: MediaPlayer.Commands = MediaSession.ConnectionResult.DEFAULT_PLAYER_COMMANDS
|
|
95
38
|
private set
|
|
96
39
|
|
|
97
|
-
/**
|
|
40
|
+
/** Current player commands configuration for notification controller */
|
|
41
|
+
var notificationPlayerCommands: MediaPlayer.Commands =
|
|
42
|
+
MediaSession.ConnectionResult.DEFAULT_PLAYER_COMMANDS
|
|
43
|
+
private set
|
|
44
|
+
|
|
45
|
+
/** Current session commands configuration for external controllers */
|
|
98
46
|
lateinit var sessionCommands: SessionCommands
|
|
99
47
|
private set
|
|
100
48
|
|
|
101
|
-
/**
|
|
102
|
-
lateinit var
|
|
49
|
+
/** Current session commands configuration for notification */
|
|
50
|
+
lateinit var notificationSessionCommands: SessionCommands
|
|
51
|
+
private set
|
|
52
|
+
|
|
53
|
+
/** Current custom layout configuration for external controllers */
|
|
54
|
+
lateinit var customLayout: List<CommandButton>
|
|
55
|
+
private set
|
|
56
|
+
|
|
57
|
+
/** Current custom layout configuration for notification */
|
|
58
|
+
lateinit var notificationCustomLayout: List<CommandButton>
|
|
103
59
|
private set
|
|
104
60
|
|
|
105
61
|
/** Stored state for rebuilding layout */
|
|
106
|
-
private var currentCapabilities: PlayerCapabilities =
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
jumpBackward = null,
|
|
116
|
-
favorite = null,
|
|
117
|
-
shuffleMode = null,
|
|
118
|
-
repeatMode = null,
|
|
119
|
-
playbackRate = null,
|
|
120
|
-
)
|
|
121
|
-
private var currentRemoteButtonLayout: RemoteButtonLayout? = null
|
|
62
|
+
private var currentCapabilities: PlayerCapabilities = PlayerCapabilities(
|
|
63
|
+
play = null, pause = null, stop = null, seekTo = null,
|
|
64
|
+
skipToNext = null, skipToPrevious = null,
|
|
65
|
+
jumpForward = null, jumpBackward = null,
|
|
66
|
+
favorite = null,
|
|
67
|
+
shuffleMode = null, repeatMode = null, playbackRate = null
|
|
68
|
+
)
|
|
69
|
+
private var currentNotificationButtons: NotificationButtonLayout? = null
|
|
70
|
+
private var currentSearchAvailable: Boolean = false
|
|
122
71
|
private var currentFavorited: Boolean? = null
|
|
123
|
-
private var currentForwardJumpInterval: Double = DEFAULT_JUMP_INTERVAL
|
|
124
|
-
private var currentBackwardJumpInterval: Double = DEFAULT_JUMP_INTERVAL
|
|
125
|
-
|
|
126
|
-
/** The Media3 player command behind each Capability (FAVORITE is a session command). */
|
|
127
|
-
private val capabilityPlayerCommands: Map<Capability, @MediaPlayer.Command Int> =
|
|
128
|
-
mapOf(
|
|
129
|
-
Capability.PLAY_PAUSE to MediaPlayer.COMMAND_PLAY_PAUSE,
|
|
130
|
-
Capability.STOP to MediaPlayer.COMMAND_STOP,
|
|
131
|
-
Capability.SEEK_TO to MediaPlayer.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM,
|
|
132
|
-
Capability.SKIP_TO_NEXT to MediaPlayer.COMMAND_SEEK_TO_NEXT,
|
|
133
|
-
Capability.SKIP_TO_PREVIOUS to MediaPlayer.COMMAND_SEEK_TO_PREVIOUS,
|
|
134
|
-
Capability.JUMP_FORWARD to MediaPlayer.COMMAND_SEEK_FORWARD,
|
|
135
|
-
Capability.JUMP_BACKWARD to MediaPlayer.COMMAND_SEEK_BACK,
|
|
136
|
-
)
|
|
137
72
|
|
|
138
|
-
// Declared above `init` deliberately: `init` calls `buildPlayerCommands`, which reads
|
|
139
|
-
// `capabilityPlayerCommands`. Kotlin initializes properties in textual order, so this val must
|
|
140
|
-
// precede the init block or it would still be null when the constructor runs (NPE).
|
|
141
73
|
init {
|
|
142
74
|
// Initialize with defaults matching PlayerUpdateOptions (all capabilities enabled)
|
|
143
75
|
val defaultCapabilities = currentCapabilities
|
|
144
76
|
|
|
145
77
|
playerCommands = buildPlayerCommands(defaultCapabilities)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
78
|
+
notificationPlayerCommands = buildPlayerCommands(defaultCapabilities)
|
|
79
|
+
|
|
80
|
+
val (extSessionCommands, extCustomLayout) =
|
|
81
|
+
buildSessionCommandsAndLayout(defaultCapabilities, searchAvailable = false, favorited = null)
|
|
82
|
+
sessionCommands = extSessionCommands
|
|
83
|
+
customLayout = extCustomLayout
|
|
84
|
+
|
|
85
|
+
notificationSessionCommands = extSessionCommands
|
|
86
|
+
notificationCustomLayout = extCustomLayout
|
|
152
87
|
}
|
|
153
88
|
|
|
154
89
|
/**
|
|
@@ -156,74 +91,60 @@ class MediaSessionCommandManager {
|
|
|
156
91
|
*
|
|
157
92
|
* @param mediaSession The MediaSession to configure
|
|
158
93
|
* @param capabilities Global capabilities that enable commands for ALL MediaSession controllers
|
|
159
|
-
* (Bluetooth, Android Auto, lock screen, notification, etc.). All capabilities are enabled
|
|
160
|
-
* default - only false values disable them.
|
|
161
|
-
* @param
|
|
162
|
-
*
|
|
163
|
-
* capabilities using smart defaults.
|
|
94
|
+
* (Bluetooth, Android Auto, lock screen, notification, etc.). All capabilities are enabled
|
|
95
|
+
* by default - only false values disable them.
|
|
96
|
+
* @param notificationButtons Slot-based button layout for notifications. When null, button layout
|
|
97
|
+
* is derived from capabilities using smart defaults.
|
|
164
98
|
* @param searchAvailable Whether search functionality is configured and available
|
|
165
|
-
* @param forwardJumpInterval Seconds per forward jump; selects the button's icon constant
|
|
166
|
-
* @param backwardJumpInterval Seconds per backward jump; selects the button's icon constant
|
|
167
99
|
*
|
|
168
|
-
* Manager initializes with defaults: all capabilities
|
|
100
|
+
* Manager initializes with defaults: all global capabilities, limited notification capabilities.
|
|
169
101
|
*/
|
|
170
102
|
fun updateMediaSession(
|
|
171
103
|
mediaSession: MediaSession,
|
|
172
104
|
capabilities: PlayerCapabilities,
|
|
173
|
-
|
|
105
|
+
notificationButtons: NotificationButtonLayout?,
|
|
174
106
|
searchAvailable: Boolean,
|
|
175
|
-
|
|
176
|
-
backwardJumpInterval: Double = DEFAULT_JUMP_INTERVAL,
|
|
107
|
+
favorited: Boolean? = null,
|
|
177
108
|
) {
|
|
178
|
-
// Store state for future rebuilds
|
|
179
|
-
// and favorites change independently, and rebuilding the layout as un-favorited would blank the
|
|
180
|
-
// heart on every updateOptions() call until the next track change happened to refresh it.
|
|
109
|
+
// Store state for future rebuilds
|
|
181
110
|
currentCapabilities = capabilities
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
111
|
+
currentNotificationButtons = notificationButtons
|
|
112
|
+
currentSearchAvailable = searchAvailable
|
|
113
|
+
currentFavorited = favorited
|
|
185
114
|
|
|
186
|
-
//
|
|
187
|
-
// the layout still works from a Bluetooth remote or headset.
|
|
115
|
+
// Build commands for external controllers (global capabilities)
|
|
188
116
|
playerCommands = buildPlayerCommands(capabilities)
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
117
|
+
val (extSessionCommands, extCustomLayout) =
|
|
118
|
+
buildSessionCommandsAndLayout(capabilities, searchAvailable, favorited)
|
|
119
|
+
sessionCommands = extSessionCommands
|
|
120
|
+
customLayout = extCustomLayout
|
|
121
|
+
|
|
122
|
+
// Build notification button preferences with explicit slots
|
|
123
|
+
val (notifSessionCommands, notifButtonPrefs) =
|
|
124
|
+
buildNotificationButtonPreferences(
|
|
125
|
+
capabilities,
|
|
126
|
+
notificationButtons,
|
|
127
|
+
searchAvailable,
|
|
128
|
+
favorited,
|
|
129
|
+
)
|
|
130
|
+
notificationSessionCommands = notifSessionCommands
|
|
131
|
+
notificationCustomLayout = notifButtonPrefs
|
|
203
132
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
* and to the platform PlaybackState plus slot-reservation extras (Android Auto and the Android
|
|
207
|
-
* 13+ system media controls).
|
|
208
|
-
*
|
|
209
|
-
* Both calls are required. The session-wide call is the only one that reaches Android Auto, which
|
|
210
|
-
* connects as a legacy controller rather than a Media3 one. But it stops at
|
|
211
|
-
* `setPlatformMediaButtonPreferences`, which recomputes the legacy custom layout and only
|
|
212
|
-
* re-broadcasts when the reservation flags themselves change — it never refreshes the
|
|
213
|
-
* PlaybackState carrying the custom actions. Only the notification-controller overload calls
|
|
214
|
-
* `updateLegacySessionPlaybackState`, so without it a reordering that leaves the flags untouched
|
|
215
|
-
* sits invisible until some unrelated playback event republishes the state.
|
|
216
|
-
*/
|
|
217
|
-
private fun publishButtonPreferences(mediaSession: MediaSession) {
|
|
218
|
-
Timber.Forest.d(
|
|
219
|
-
"Publishing ${buttonPreferences.size} button preferences: " +
|
|
220
|
-
"${buttonPreferences.map { it.displayName }}"
|
|
221
|
-
)
|
|
222
|
-
mediaSession.setMediaButtonPreferences(buttonPreferences)
|
|
133
|
+
// Derive notification player commands from the buttons that will be shown
|
|
134
|
+
notificationPlayerCommands = buildNotificationPlayerCommands(capabilities, notificationButtons)
|
|
223
135
|
|
|
136
|
+
// Apply media button preferences to notification controller
|
|
224
137
|
mediaSession.mediaNotificationControllerInfo?.let { controllerInfo ->
|
|
225
|
-
mediaSession.setMediaButtonPreferences(controllerInfo,
|
|
138
|
+
mediaSession.setMediaButtonPreferences(controllerInfo, notifButtonPrefs)
|
|
139
|
+
mediaSession.setAvailableCommands(
|
|
140
|
+
controllerInfo,
|
|
141
|
+
notificationSessionCommands,
|
|
142
|
+
notificationPlayerCommands,
|
|
143
|
+
)
|
|
226
144
|
}
|
|
145
|
+
|
|
146
|
+
// Broadcast updated layout to all external controllers (Android Auto, etc.)
|
|
147
|
+
mediaSession.setCustomLayout(customLayout)
|
|
227
148
|
}
|
|
228
149
|
|
|
229
150
|
/**
|
|
@@ -241,16 +162,29 @@ class MediaSessionCommandManager {
|
|
|
241
162
|
|
|
242
163
|
currentFavorited = favorited
|
|
243
164
|
|
|
244
|
-
//
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
165
|
+
// Rebuild external controller layout with new favorite state
|
|
166
|
+
val (extSessionCommands, extCustomLayout) =
|
|
167
|
+
buildSessionCommandsAndLayout(currentCapabilities, currentSearchAvailable, favorited)
|
|
168
|
+
sessionCommands = extSessionCommands
|
|
169
|
+
customLayout = extCustomLayout
|
|
170
|
+
Timber.Forest.d("Built external customLayout with ${customLayout.size} buttons")
|
|
171
|
+
|
|
172
|
+
// Rebuild notification button preferences with new favorite state
|
|
173
|
+
val (notifSessionCommands, notifButtonPrefs) =
|
|
174
|
+
buildNotificationButtonPreferences(
|
|
175
|
+
currentCapabilities,
|
|
176
|
+
currentNotificationButtons,
|
|
177
|
+
currentSearchAvailable,
|
|
248
178
|
favorited,
|
|
249
179
|
)
|
|
180
|
+
notificationSessionCommands = notifSessionCommands
|
|
181
|
+
notificationCustomLayout = notifButtonPrefs
|
|
250
182
|
|
|
251
|
-
//
|
|
252
|
-
|
|
253
|
-
|
|
183
|
+
// Apply updated button preferences to notification controller
|
|
184
|
+
mediaSession.mediaNotificationControllerInfo?.let { controllerInfo ->
|
|
185
|
+
Timber.Forest.d("Updating notification controller button preferences")
|
|
186
|
+
mediaSession.setMediaButtonPreferences(controllerInfo, notificationCustomLayout)
|
|
187
|
+
}
|
|
254
188
|
}
|
|
255
189
|
|
|
256
190
|
/**
|
|
@@ -261,7 +195,7 @@ class MediaSessionCommandManager {
|
|
|
261
195
|
*/
|
|
262
196
|
fun buildConnectionResult(session: MediaSession): MediaSession.ConnectionResult {
|
|
263
197
|
return MediaSession.ConnectionResult.AcceptedResultBuilder(session)
|
|
264
|
-
.
|
|
198
|
+
.setCustomLayout(customLayout)
|
|
265
199
|
.setAvailableSessionCommands(sessionCommands)
|
|
266
200
|
.setAvailablePlayerCommands(playerCommands)
|
|
267
201
|
.build()
|
|
@@ -304,31 +238,60 @@ class MediaSessionCommandManager {
|
|
|
304
238
|
private fun buildPlayerCommands(capabilities: PlayerCapabilities): MediaPlayer.Commands {
|
|
305
239
|
val playerCommandsBuilder = MediaSession.ConnectionResult.DEFAULT_PLAYER_COMMANDS.buildUpon()
|
|
306
240
|
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
241
|
+
// Commands to remove - start with always-disabled commands
|
|
242
|
+
val disabledCommands =
|
|
243
|
+
mutableSetOf<@MediaPlayer.Command Int>(
|
|
244
|
+
// Always filter out direct media item commands to avoid dual-command confusion
|
|
245
|
+
// This forces MediaSession to only use the "smart" commands we can control via capabilities
|
|
246
|
+
MediaPlayer.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM,
|
|
247
|
+
MediaPlayer.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM,
|
|
248
|
+
)
|
|
311
249
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
250
|
+
// Only disable jump commands if capabilities are explicitly disabled (false)
|
|
251
|
+
if (capabilities.jumpForward == false) {
|
|
252
|
+
disabledCommands.add(MediaPlayer.COMMAND_SEEK_FORWARD)
|
|
253
|
+
}
|
|
254
|
+
if (capabilities.jumpBackward == false) {
|
|
255
|
+
disabledCommands.add(MediaPlayer.COMMAND_SEEK_BACK)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Check each capability and add commands to remove if explicitly disabled
|
|
259
|
+
// Both play and pause must be disabled to remove PLAY_PAUSE command
|
|
260
|
+
if (capabilities.play == false && capabilities.pause == false) {
|
|
261
|
+
disabledCommands.add(MediaPlayer.COMMAND_PLAY_PAUSE)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (capabilities.stop == false) {
|
|
265
|
+
disabledCommands.add(MediaPlayer.COMMAND_STOP)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (capabilities.seekTo == false) {
|
|
269
|
+
disabledCommands.add(MediaPlayer.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (capabilities.skipToNext == false) {
|
|
273
|
+
disabledCommands.add(MediaPlayer.COMMAND_SEEK_TO_NEXT)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (capabilities.skipToPrevious == false) {
|
|
277
|
+
disabledCommands.add(MediaPlayer.COMMAND_SEEK_TO_PREVIOUS)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Remove disabled commands from the builder
|
|
281
|
+
disabledCommands.forEach { command ->
|
|
282
|
+
playerCommandsBuilder.remove(command)
|
|
283
|
+
Timber.Forest.d("Removed command: $command")
|
|
317
284
|
}
|
|
318
285
|
|
|
319
286
|
return playerCommandsBuilder.build()
|
|
320
287
|
}
|
|
321
288
|
|
|
322
|
-
|
|
323
|
-
* Session commands for every controller. Registered for each capability-allowed custom button
|
|
324
|
-
* whether or not the layout places it — placement governs where a button appears, not whether its
|
|
325
|
-
* command exists. Media3 disables a button whose backing command is missing, so every button the
|
|
326
|
-
* layout can produce must have its command here.
|
|
327
|
-
*/
|
|
328
|
-
private fun buildSessionCommands(
|
|
289
|
+
private fun buildSessionCommandsAndLayout(
|
|
329
290
|
capabilities: PlayerCapabilities,
|
|
330
291
|
searchAvailable: Boolean,
|
|
331
|
-
|
|
292
|
+
favorited: Boolean?,
|
|
293
|
+
): Pair<SessionCommands, List<CommandButton>> {
|
|
294
|
+
val customLayoutButtons = mutableListOf<CommandButton>()
|
|
332
295
|
val sessionCommandsBuilder =
|
|
333
296
|
MediaSession.ConnectionResult.DEFAULT_SESSION_AND_LIBRARY_COMMANDS.buildUpon()
|
|
334
297
|
|
|
@@ -339,84 +302,277 @@ class MediaSessionCommandManager {
|
|
|
339
302
|
Timber.Forest.d("Removed search commands - search not configured")
|
|
340
303
|
}
|
|
341
304
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
305
|
+
// Create custom command buttons for jump commands (required for notification visibility)
|
|
306
|
+
// All capabilities enabled by default - only false disables
|
|
307
|
+
if (capabilities.jumpBackward != false) {
|
|
308
|
+
val jumpBackCommand = SessionCommand(CUSTOM_ACTION_JUMP_BACKWARD, Bundle())
|
|
309
|
+
customLayoutButtons.add(
|
|
310
|
+
CommandButton.Builder()
|
|
311
|
+
.setDisplayName("Jump Backward")
|
|
312
|
+
.setSessionCommand(jumpBackCommand)
|
|
313
|
+
.setIconResId(R.drawable.media3_icon_skip_back)
|
|
314
|
+
.build()
|
|
315
|
+
)
|
|
316
|
+
sessionCommandsBuilder.add(jumpBackCommand)
|
|
317
|
+
}
|
|
346
318
|
|
|
347
|
-
|
|
348
|
-
|
|
319
|
+
if (capabilities.jumpForward != false) {
|
|
320
|
+
val jumpForwardCommand = SessionCommand(CUSTOM_ACTION_JUMP_FORWARD, Bundle())
|
|
321
|
+
customLayoutButtons.add(
|
|
322
|
+
CommandButton.Builder()
|
|
323
|
+
.setDisplayName("Jump Forward")
|
|
324
|
+
.setSessionCommand(jumpForwardCommand)
|
|
325
|
+
.setIconResId(R.drawable.media3_icon_skip_forward)
|
|
326
|
+
.build()
|
|
327
|
+
)
|
|
328
|
+
sessionCommandsBuilder.add(jumpForwardCommand)
|
|
329
|
+
}
|
|
349
330
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
331
|
+
// Add favorite button when FAVORITE capability is not disabled
|
|
332
|
+
if (capabilities.favorite != false) {
|
|
333
|
+
val heartIcon =
|
|
334
|
+
if (favorited == true) {
|
|
335
|
+
CommandButton.ICON_HEART_FILLED
|
|
336
|
+
} else {
|
|
337
|
+
CommandButton.ICON_HEART_UNFILLED
|
|
338
|
+
}
|
|
339
|
+
val displayName = if (favorited == true) "Remove from favorites" else "Add to favorites"
|
|
340
|
+
val favoriteCommand = SessionCommand(CUSTOM_ACTION_FAVORITE, Bundle())
|
|
341
|
+
|
|
342
|
+
customLayoutButtons.add(
|
|
343
|
+
CommandButton.Builder(heartIcon)
|
|
344
|
+
.setDisplayName(displayName)
|
|
345
|
+
.setSessionCommand(favoriteCommand)
|
|
346
|
+
.build()
|
|
347
|
+
)
|
|
348
|
+
sessionCommandsBuilder.add(favoriteCommand)
|
|
349
|
+
Timber.Forest.d("Added favorite button - favorited=$favorited")
|
|
363
350
|
}
|
|
364
351
|
|
|
352
|
+
return Pair(sessionCommandsBuilder.build(), customLayoutButtons)
|
|
353
|
+
}
|
|
354
|
+
|
|
365
355
|
/**
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
* fails the build until it has been given an action on both sides.
|
|
356
|
+
* Builds notification button preferences with explicit slot assignments. If notificationButtons
|
|
357
|
+
* is null, derives button layout from capabilities.
|
|
369
358
|
*/
|
|
370
|
-
private fun
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
359
|
+
private fun buildNotificationButtonPreferences(
|
|
360
|
+
capabilities: PlayerCapabilities,
|
|
361
|
+
notificationButtons: NotificationButtonLayout?,
|
|
362
|
+
searchAvailable: Boolean,
|
|
363
|
+
favorited: Boolean?,
|
|
364
|
+
): Pair<SessionCommands, List<CommandButton>> {
|
|
365
|
+
val buttons = mutableListOf<CommandButton>()
|
|
366
|
+
val sessionCommandsBuilder =
|
|
367
|
+
MediaSession.ConnectionResult.DEFAULT_SESSION_AND_LIBRARY_COMMANDS.buildUpon()
|
|
368
|
+
|
|
369
|
+
// Remove search commands if search is not configured
|
|
370
|
+
if (!searchAvailable) {
|
|
371
|
+
sessionCommandsBuilder.remove(SessionCommand.COMMAND_CODE_LIBRARY_SEARCH)
|
|
372
|
+
sessionCommandsBuilder.remove(SessionCommand.COMMAND_CODE_LIBRARY_GET_SEARCH_RESULT)
|
|
377
373
|
}
|
|
378
374
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
when (button) {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
375
|
+
// Helper to create a CommandButton for a NotificationButton with specific slot
|
|
376
|
+
// Only creates button if the corresponding capability is not disabled
|
|
377
|
+
fun createButton(button: NotificationButton, slot: Int): CommandButton? {
|
|
378
|
+
return when (button) {
|
|
379
|
+
NotificationButton.SKIP_TO_PREVIOUS -> {
|
|
380
|
+
if (capabilities.skipToPrevious != false) {
|
|
381
|
+
CommandButton.Builder(CommandButton.ICON_PREVIOUS)
|
|
382
|
+
.setDisplayName("Previous")
|
|
383
|
+
.setPlayerCommand(MediaPlayer.COMMAND_SEEK_TO_PREVIOUS)
|
|
384
|
+
.setSlots(slot)
|
|
385
|
+
.build()
|
|
386
|
+
} else null
|
|
387
|
+
}
|
|
388
|
+
NotificationButton.SKIP_TO_NEXT -> {
|
|
389
|
+
if (capabilities.skipToNext != false) {
|
|
390
|
+
CommandButton.Builder(CommandButton.ICON_NEXT)
|
|
391
|
+
.setDisplayName("Next")
|
|
392
|
+
.setPlayerCommand(MediaPlayer.COMMAND_SEEK_TO_NEXT)
|
|
393
|
+
.setSlots(slot)
|
|
394
|
+
.build()
|
|
395
|
+
} else null
|
|
396
|
+
}
|
|
397
|
+
NotificationButton.JUMP_BACKWARD -> {
|
|
398
|
+
if (capabilities.jumpBackward != false) {
|
|
399
|
+
val command = SessionCommand(CUSTOM_ACTION_JUMP_BACKWARD, Bundle())
|
|
400
|
+
sessionCommandsBuilder.add(command)
|
|
401
|
+
CommandButton.Builder()
|
|
402
|
+
.setDisplayName("Jump Backward")
|
|
403
|
+
.setSessionCommand(command)
|
|
404
|
+
.setIconResId(R.drawable.media3_icon_skip_back)
|
|
405
|
+
.setSlots(slot)
|
|
406
|
+
.build()
|
|
407
|
+
} else null
|
|
408
|
+
}
|
|
409
|
+
NotificationButton.JUMP_FORWARD -> {
|
|
410
|
+
if (capabilities.jumpForward != false) {
|
|
411
|
+
val command = SessionCommand(CUSTOM_ACTION_JUMP_FORWARD, Bundle())
|
|
412
|
+
sessionCommandsBuilder.add(command)
|
|
413
|
+
CommandButton.Builder()
|
|
414
|
+
.setDisplayName("Jump Forward")
|
|
415
|
+
.setSessionCommand(command)
|
|
416
|
+
.setIconResId(R.drawable.media3_icon_skip_forward)
|
|
417
|
+
.setSlots(slot)
|
|
418
|
+
.build()
|
|
419
|
+
} else null
|
|
420
|
+
}
|
|
421
|
+
NotificationButton.FAVORITE -> {
|
|
422
|
+
if (capabilities.favorite != false) {
|
|
423
|
+
val heartIcon =
|
|
395
424
|
if (favorited == true) CommandButton.ICON_HEART_FILLED
|
|
396
425
|
else CommandButton.ICON_HEART_UNFILLED
|
|
397
|
-
)
|
|
398
|
-
|
|
426
|
+
val displayName = if (favorited == true) "Remove from favorites" else "Add to favorites"
|
|
427
|
+
val command = SessionCommand(CUSTOM_ACTION_FAVORITE, Bundle())
|
|
428
|
+
sessionCommandsBuilder.add(command)
|
|
429
|
+
CommandButton.Builder(heartIcon)
|
|
430
|
+
.setDisplayName(displayName)
|
|
431
|
+
.setSessionCommand(command)
|
|
432
|
+
.setSlots(slot)
|
|
433
|
+
.build()
|
|
434
|
+
} else null
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
if (notificationButtons != null) {
|
|
440
|
+
// Use explicit slot configuration
|
|
441
|
+
notificationButtons.back?.let { btn ->
|
|
442
|
+
createButton(btn, CommandButton.SLOT_BACK)?.let { buttons.add(it) }
|
|
443
|
+
}
|
|
444
|
+
notificationButtons.forward?.let { btn ->
|
|
445
|
+
createButton(btn, CommandButton.SLOT_FORWARD)?.let { buttons.add(it) }
|
|
446
|
+
}
|
|
447
|
+
notificationButtons.backSecondary?.let { btn ->
|
|
448
|
+
createButton(btn, CommandButton.SLOT_BACK_SECONDARY)?.let { buttons.add(it) }
|
|
449
|
+
}
|
|
450
|
+
notificationButtons.forwardSecondary?.let { btn ->
|
|
451
|
+
createButton(btn, CommandButton.SLOT_FORWARD_SECONDARY)?.let { buttons.add(it) }
|
|
452
|
+
}
|
|
453
|
+
notificationButtons.overflow?.forEach { btn ->
|
|
454
|
+
createButton(btn, CommandButton.SLOT_OVERFLOW)?.let { buttons.add(it) }
|
|
455
|
+
}
|
|
456
|
+
} else {
|
|
457
|
+
// Derive from capabilities with default slot mapping
|
|
458
|
+
// All capabilities enabled by default - only false disables
|
|
459
|
+
val hasSkipPrevious = capabilities.skipToPrevious != false
|
|
460
|
+
val hasSkipNext = capabilities.skipToNext != false
|
|
461
|
+
|
|
462
|
+
// Back slot: skip-to-previous, or jump-backward if no skip
|
|
463
|
+
if (hasSkipPrevious) {
|
|
464
|
+
createButton(NotificationButton.SKIP_TO_PREVIOUS, CommandButton.SLOT_BACK)?.let {
|
|
465
|
+
buttons.add(it)
|
|
466
|
+
}
|
|
467
|
+
} else if (capabilities.jumpBackward != false) {
|
|
468
|
+
createButton(NotificationButton.JUMP_BACKWARD, CommandButton.SLOT_BACK)?.let {
|
|
469
|
+
buttons.add(it)
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Forward slot: skip-to-next, or jump-forward if no skip
|
|
474
|
+
if (hasSkipNext) {
|
|
475
|
+
createButton(NotificationButton.SKIP_TO_NEXT, CommandButton.SLOT_FORWARD)?.let {
|
|
476
|
+
buttons.add(it)
|
|
477
|
+
}
|
|
478
|
+
} else if (capabilities.jumpForward != false) {
|
|
479
|
+
createButton(NotificationButton.JUMP_FORWARD, CommandButton.SLOT_FORWARD)?.let {
|
|
480
|
+
buttons.add(it)
|
|
481
|
+
}
|
|
399
482
|
}
|
|
400
483
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
484
|
+
// Secondary slots for jump buttons if skip buttons are present
|
|
485
|
+
if (hasSkipPrevious && capabilities.jumpBackward != false) {
|
|
486
|
+
createButton(NotificationButton.JUMP_BACKWARD, CommandButton.SLOT_BACK_SECONDARY)?.let {
|
|
487
|
+
buttons.add(it)
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
if (hasSkipNext && capabilities.jumpForward != false) {
|
|
491
|
+
createButton(NotificationButton.JUMP_FORWARD, CommandButton.SLOT_FORWARD_SECONDARY)?.let {
|
|
492
|
+
buttons.add(it)
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Overflow: favorite
|
|
497
|
+
if (capabilities.favorite != false) {
|
|
498
|
+
createButton(NotificationButton.FAVORITE, CommandButton.SLOT_OVERFLOW)?.let {
|
|
499
|
+
buttons.add(it)
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
Timber.Forest.d("Built notification button preferences: ${buttons.map { it.displayName }}")
|
|
505
|
+
return Pair(sessionCommandsBuilder.build(), buttons)
|
|
404
506
|
}
|
|
405
507
|
|
|
406
508
|
/**
|
|
407
|
-
*
|
|
408
|
-
*
|
|
409
|
-
*
|
|
410
|
-
* Each button gets its requested slot followed by OVERFLOW as a fallback. `slots` is an ordered
|
|
411
|
-
* preference list, and every surface caps how many buttons it renders — a head unit, the
|
|
412
|
-
* collapsed notification, the Android 13+ media controls all truncate differently. Without a
|
|
413
|
-
* fallback a button that loses its preferred slot disappears entirely instead of demoting.
|
|
509
|
+
* Builds player commands for the notification controller based on the button layout. This enables
|
|
510
|
+
* the commands needed for the buttons that will be shown.
|
|
414
511
|
*/
|
|
415
|
-
private fun
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
):
|
|
419
|
-
|
|
420
|
-
|
|
512
|
+
private fun buildNotificationPlayerCommands(
|
|
513
|
+
capabilities: PlayerCapabilities,
|
|
514
|
+
notificationButtons: NotificationButtonLayout?,
|
|
515
|
+
): MediaPlayer.Commands {
|
|
516
|
+
val builder = MediaSession.ConnectionResult.DEFAULT_PLAYER_COMMANDS.buildUpon()
|
|
517
|
+
|
|
518
|
+
// Always remove direct media item commands to avoid dual-command confusion
|
|
519
|
+
builder.remove(MediaPlayer.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)
|
|
520
|
+
builder.remove(MediaPlayer.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)
|
|
521
|
+
|
|
522
|
+
// Determine which buttons will be shown
|
|
523
|
+
val showSkipPrevious: Boolean
|
|
524
|
+
val showSkipNext: Boolean
|
|
525
|
+
val showJumpBackward: Boolean
|
|
526
|
+
val showJumpForward: Boolean
|
|
527
|
+
|
|
528
|
+
if (notificationButtons != null) {
|
|
529
|
+
showSkipPrevious =
|
|
530
|
+
notificationButtons.back == NotificationButton.SKIP_TO_PREVIOUS ||
|
|
531
|
+
notificationButtons.backSecondary == NotificationButton.SKIP_TO_PREVIOUS
|
|
532
|
+
showSkipNext =
|
|
533
|
+
notificationButtons.forward == NotificationButton.SKIP_TO_NEXT ||
|
|
534
|
+
notificationButtons.forwardSecondary == NotificationButton.SKIP_TO_NEXT
|
|
535
|
+
showJumpBackward =
|
|
536
|
+
notificationButtons.back == NotificationButton.JUMP_BACKWARD ||
|
|
537
|
+
notificationButtons.backSecondary == NotificationButton.JUMP_BACKWARD
|
|
538
|
+
showJumpForward =
|
|
539
|
+
notificationButtons.forward == NotificationButton.JUMP_FORWARD ||
|
|
540
|
+
notificationButtons.forwardSecondary == NotificationButton.JUMP_FORWARD
|
|
541
|
+
} else {
|
|
542
|
+
// Default derivation from capabilities
|
|
543
|
+
// All capabilities enabled by default - only false disables
|
|
544
|
+
showSkipPrevious = capabilities.skipToPrevious != false
|
|
545
|
+
showSkipNext = capabilities.skipToNext != false
|
|
546
|
+
showJumpBackward = capabilities.jumpBackward != false
|
|
547
|
+
showJumpForward = capabilities.jumpForward != false
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Enable/disable commands based on what buttons are shown and capabilities
|
|
551
|
+
if (!showSkipPrevious || capabilities.skipToPrevious == false) {
|
|
552
|
+
builder.remove(MediaPlayer.COMMAND_SEEK_TO_PREVIOUS)
|
|
553
|
+
}
|
|
554
|
+
if (!showSkipNext || capabilities.skipToNext == false) {
|
|
555
|
+
builder.remove(MediaPlayer.COMMAND_SEEK_TO_NEXT)
|
|
556
|
+
}
|
|
557
|
+
if (!showJumpBackward || capabilities.jumpBackward == false) {
|
|
558
|
+
builder.remove(MediaPlayer.COMMAND_SEEK_BACK)
|
|
559
|
+
}
|
|
560
|
+
if (!showJumpForward || capabilities.jumpForward == false) {
|
|
561
|
+
builder.remove(MediaPlayer.COMMAND_SEEK_FORWARD)
|
|
421
562
|
}
|
|
563
|
+
|
|
564
|
+
// Other commands based on global capabilities
|
|
565
|
+
// Both play and pause must be disabled to remove PLAY_PAUSE
|
|
566
|
+
if (capabilities.play == false && capabilities.pause == false) {
|
|
567
|
+
builder.remove(MediaPlayer.COMMAND_PLAY_PAUSE)
|
|
568
|
+
}
|
|
569
|
+
if (capabilities.stop == false) {
|
|
570
|
+
builder.remove(MediaPlayer.COMMAND_STOP)
|
|
571
|
+
}
|
|
572
|
+
if (capabilities.seekTo == false) {
|
|
573
|
+
builder.remove(MediaPlayer.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
return builder.build()
|
|
577
|
+
}
|
|
422
578
|
}
|