react-native-audio-browser 0.2.0-next.11 → 0.2.0-next.13
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/README.md +14 -4
- package/android/build.gradle +20 -1
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +115 -26
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +262 -188
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +23 -3
- package/android/src/main/java/com/audiobrowser/browser/InertStyleDiagnostic.kt +267 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +95 -58
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +68 -26
- package/android/src/main/java/com/audiobrowser/browser/StyleResolver.kt +60 -0
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +19 -7
- package/android/src/main/java/com/audiobrowser/extension/TappedTrack.kt +20 -0
- package/android/src/main/java/com/audiobrowser/extension/TrackIdentity.kt +15 -0
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +1 -1
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +120 -67
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +21 -24
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +109 -74
- package/android/src/main/java/com/audiobrowser/player/Player.kt +51 -30
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +2 -15
- package/android/src/main/java/com/audiobrowser/player/ShuffleOrderLedBy.kt +30 -0
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +44 -40
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +28 -23
- package/android/src/main/java/com/audiobrowser/util/StyleWire.kt +108 -0
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +52 -53
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +74 -41
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerFavoritesTest.kt +153 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +229 -50
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +38 -0
- package/android/src/test/java/com/audiobrowser/browser/InertStyleDiagnosticTest.kt +277 -0
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +1 -1
- package/android/src/test/java/com/audiobrowser/browser/JsonStyleTest.kt +147 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +128 -53
- package/android/src/test/java/com/audiobrowser/browser/StyleResolverTest.kt +154 -0
- package/android/src/test/java/com/audiobrowser/extension/TappedTrackTest.kt +43 -0
- package/android/src/test/java/com/audiobrowser/extension/TrackIdentityTest.kt +41 -0
- package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +1 -2
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +42 -2
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateStoreTrackJsonTest.kt +55 -0
- package/android/src/test/java/com/audiobrowser/player/ShuffleOrderLedByTest.kt +79 -0
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +41 -16
- package/android/src/test/java/com/audiobrowser/util/MediaExtrasBuilderTest.kt +161 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +7 -7
- package/ios/Browser/BrowserConfig.swift +102 -5
- package/ios/Browser/BrowserManager+URLResolution.swift +18 -14
- package/ios/Browser/BrowserManager.swift +229 -180
- package/ios/Browser/BrowserPathHelper.swift +44 -44
- package/ios/Browser/InertStyleDiagnostic.swift +279 -0
- package/ios/Browser/JsonModels.swift +258 -106
- package/ios/Browser/SearchDrillIn.swift +6 -6
- package/ios/Browser/SectionPresentation.swift +64 -0
- package/ios/Browser/SectionScope.swift +58 -24
- package/ios/Browser/StyleResolver.swift +58 -0
- package/ios/Browser/TabBarEntries.swift +9 -3
- package/ios/Browser/TrackIdTemplate.swift +37 -0
- package/ios/CarPlay/CarPlayArtworkResolver.swift +8 -7
- package/ios/CarPlay/CarPlayController.swift +227 -85
- package/ios/CarPlay/CarPlayImageLoader.swift +38 -18
- package/ios/CarPlay/CarPlayListItemFactory.swift +289 -84
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +15 -12
- package/ios/Extension/Capability+RemoteCommand.swift +1 -1
- package/ios/Extension/PlayerCapabilities+Favorite.swift +1 -15
- package/ios/Extension/ResolvedTrack+Copying.swift +11 -15
- package/ios/Extension/Section+Copying.swift +31 -0
- package/ios/Extension/Track+Copying.swift +6 -12
- package/ios/Extension/Track+Identity.swift +18 -0
- package/ios/Extension/UIApplication+ActiveScene.swift +27 -0
- package/ios/Http/HttpClient.swift +8 -2
- package/ios/HybridAudioBrowser.swift +166 -45
- package/ios/Model/NitroTypeStubs.swift +106 -21
- package/ios/Model/PlayerUpdateOptions.swift +7 -0
- package/ios/Player/MediaIntentCriteria.swift +13 -5
- package/ios/Player/MediaLoader.swift +33 -9
- package/ios/Player/NowPlayingUpdater.swift +54 -6
- package/ios/Player/PlaybackCoordinator.swift +13 -6
- package/ios/Player/PlaybackTimer.swift +8 -2
- package/ios/Player/QueueManager.swift +36 -10
- package/ios/Player/RetryManager.swift +4 -3
- package/ios/Player/ShuffleOrder.swift +23 -0
- package/ios/Player/SleepTimerHandling.swift +13 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +53 -18
- package/ios/Tests/BrowserPathHelperTests.swift +50 -20
- package/ios/Tests/CarPlayArtworkResolverTests.swift +24 -41
- package/ios/Tests/InertStyleDiagnosticTests.swift +200 -0
- package/ios/Tests/JsonModelsTests.swift +150 -1
- package/ios/Tests/PlaybackStateStoreTests.swift +4 -3
- package/ios/Tests/QueueManagerTests.swift +72 -6
- package/ios/Tests/RemoteCommandControllerTests.swift +16 -0
- package/ios/Tests/ResolvedTrackCopyingTests.swift +37 -35
- package/ios/Tests/SearchDrillInTests.swift +16 -16
- package/ios/Tests/SectionPresentationTests.swift +90 -0
- package/ios/Tests/SectionScopeTests.swift +87 -55
- package/ios/Tests/StyleResolverTests.swift +127 -0
- package/ios/Tests/Support/TestTypes.swift +7 -0
- package/ios/Tests/TabBarEntriesTests.swift +18 -18
- package/ios/Tests/TrackIdTemplateTests.swift +67 -0
- package/ios/Tests/TrackIdentityTests.swift +20 -0
- package/ios/Tests/TrackSelectorTests.swift +168 -33
- package/ios/TrackPlayer.swift +57 -34
- package/ios/TrackSelector.swift +45 -30
- package/ios/Util/ArtworkImageFetcher.swift +16 -1
- package/ios/Util/NetworkMonitor.swift +43 -26
- package/ios/Util/SFSymbolRenderer.swift +24 -2
- package/ios/Util/SVGProcessor.swift +9 -2
- package/lib/commonjs/AudioBrowser.js +11 -0
- package/lib/commonjs/AudioBrowser.js.map +1 -1
- package/lib/commonjs/features/browser-config.js +11 -8
- package/lib/commonjs/features/browser-config.js.map +1 -1
- package/lib/commonjs/features/browser.js +2 -2
- package/lib/commonjs/features/favorites.js +13 -10
- package/lib/commonjs/features/favorites.js.map +1 -1
- package/lib/commonjs/features/playback/controls.js +4 -2
- package/lib/commonjs/features/playback/controls.js.map +1 -1
- package/lib/commonjs/features/playback/progress.js +2 -1
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/rate.js +8 -1
- package/lib/commonjs/features/playback/rate.js.map +1 -1
- package/lib/commonjs/features/playback/state.js +2 -3
- package/lib/commonjs/features/playback/state.js.map +1 -1
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +3 -1
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/player/validateOptions.js +2 -0
- package/lib/commonjs/features/player/validateOptions.js.map +1 -1
- package/lib/commonjs/features/queue/activeTrack.js +14 -3
- package/lib/commonjs/features/queue/activeTrack.js.map +1 -1
- package/lib/commonjs/features/queue/queue.js +11 -4
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/utils/LazyNativeEmitter.js +21 -10
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/commonjs/utils/NativeUpdatedValue.js +31 -13
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/commonjs/utils/getTrackIdentity.js +24 -0
- package/lib/commonjs/utils/getTrackIdentity.js.map +1 -0
- package/lib/commonjs/utils/useNativeValueRefreshedBy.js +33 -0
- package/lib/commonjs/utils/useNativeValueRefreshedBy.js.map +1 -0
- package/lib/commonjs/web/NativeAudioBrowser.js +32 -24
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +144 -87
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
- package/lib/commonjs/web/browser/FavoriteManager.js +30 -21
- package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -1
- package/lib/commonjs/web/browser/assertBrowsePageShape.js +2 -2
- package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +1 -1
- package/lib/commonjs/web/browser/classifyTrackNavigation.js +9 -9
- package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +1 -1
- package/lib/commonjs/web/browser/sections.js +89 -0
- package/lib/commonjs/web/browser/sections.js.map +1 -0
- package/lib/commonjs/web/player/NowPlayingManager.js +4 -3
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
- package/lib/commonjs/web/util/BrowserPathHelper.js +56 -11
- package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -1
- package/lib/module/AudioBrowser.js +1 -0
- package/lib/module/AudioBrowser.js.map +1 -1
- package/lib/module/features/browser-config.js +11 -8
- package/lib/module/features/browser-config.js.map +1 -1
- package/lib/module/features/browser.js +2 -2
- package/lib/module/features/favorites.js +13 -10
- package/lib/module/features/favorites.js.map +1 -1
- package/lib/module/features/playback/controls.js +4 -2
- package/lib/module/features/playback/controls.js.map +1 -1
- package/lib/module/features/playback/progress.js +2 -1
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/rate.js +8 -1
- package/lib/module/features/playback/rate.js.map +1 -1
- package/lib/module/features/playback/state.js +2 -3
- package/lib/module/features/playback/state.js.map +1 -1
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +3 -1
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/player/validateOptions.js +2 -0
- package/lib/module/features/player/validateOptions.js.map +1 -1
- package/lib/module/features/queue/activeTrack.js +14 -3
- package/lib/module/features/queue/activeTrack.js.map +1 -1
- package/lib/module/features/queue/queue.js +11 -4
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/utils/LazyNativeEmitter.js +21 -10
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/module/utils/NativeUpdatedValue.js +31 -13
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/module/utils/getTrackIdentity.js +20 -0
- package/lib/module/utils/getTrackIdentity.js.map +1 -0
- package/lib/module/utils/useNativeValueRefreshedBy.js +29 -0
- package/lib/module/utils/useNativeValueRefreshedBy.js.map +1 -0
- package/lib/module/web/NativeAudioBrowser.js +32 -24
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/module/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +144 -87
- package/lib/module/web/browser/BrowserManager.js.map +1 -1
- package/lib/module/web/browser/FavoriteManager.js +31 -21
- package/lib/module/web/browser/FavoriteManager.js.map +1 -1
- package/lib/module/web/browser/assertBrowsePageShape.js +2 -2
- package/lib/module/web/browser/assertBrowsePageShape.js.map +1 -1
- package/lib/module/web/browser/classifyTrackNavigation.js +9 -9
- package/lib/module/web/browser/classifyTrackNavigation.js.map +1 -1
- package/lib/module/web/browser/sections.js +83 -0
- package/lib/module/web/browser/sections.js.map +1 -0
- package/lib/module/web/player/NowPlayingManager.js +4 -3
- package/lib/module/web/player/NowPlayingManager.js.map +1 -1
- package/lib/module/web/util/BrowserPathHelper.js +56 -11
- package/lib/module/web/util/BrowserPathHelper.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-config.d.ts.map +1 -1
- package/lib/typescript/src/features/browser.d.ts +2 -2
- package/lib/typescript/src/features/favorites.d.ts +13 -10
- package/lib/typescript/src/features/favorites.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/controls.d.ts +4 -2
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/rate.d.ts +8 -1
- package/lib/typescript/src/features/playback/rate.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/state.d.ts +2 -3
- package/lib/typescript/src/features/playback/state.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +1 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +1 -1
- package/lib/typescript/src/features/player/options.d.ts +21 -19
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/player/validateOptions.d.ts +1 -8
- package/lib/typescript/src/features/player/validateOptions.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts +8 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +5 -2
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-native.d.ts +2 -2
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +361 -126
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +33 -53
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +16 -17
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +24 -19
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
- package/lib/typescript/src/utils/getTrackIdentity.d.ts +18 -0
- package/lib/typescript/src/utils/getTrackIdentity.d.ts.map +1 -0
- package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts +21 -0
- package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts.map +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +0 -1
- package/nitrogen/generated/android/c++/{JFavoritesMatchMode.hpp → JArtworkRendering.hpp} +15 -15
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +8 -3
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +16 -4
- package/nitrogen/generated/android/c++/JCarPlayPlayingIndicatorLocation.hpp +58 -0
- package/nitrogen/generated/android/c++/JCardImage.hpp +58 -0
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +8 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +8 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +16 -4
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +2 -5
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +15 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +8 -2
- package/nitrogen/generated/android/c++/JGridTile.hpp +61 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +33 -14
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JImageShape.hpp +58 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +8 -3
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +22 -10
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +14 -2
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +10 -7
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +2 -5
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JOptions.hpp +2 -5
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +55 -51
- package/nitrogen/generated/android/c++/JSection.hpp +120 -0
- package/nitrogen/generated/android/c++/JSectionStyle.hpp +96 -0
- package/nitrogen/generated/android/c++/JStyleDisplay.hpp +58 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +23 -48
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +8 -2
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +46 -18
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +16 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoritesMatchMode.kt → ArtworkRendering.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayPlayingIndicatorLocation.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CardImage.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/GridTile.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageShape.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +12 -18
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → Section.kt} +18 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SectionStyle.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StyleDisplay.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +6 -15
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +35 -5
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +158 -82
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +25 -10
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +25 -10
- package/nitrogen/generated/ios/swift/ArtworkRendering.swift +40 -0
- package/nitrogen/generated/ios/swift/CarPlayPlayingIndicatorLocation.swift +40 -0
- package/nitrogen/generated/ios/swift/CardImage.swift +40 -0
- package/nitrogen/generated/ios/swift/GridTile.swift +44 -0
- package/nitrogen/generated/ios/swift/IOSOptions.swift +7 -2
- package/nitrogen/generated/ios/swift/ImageShape.swift +40 -0
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +5 -5
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +12 -1
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +54 -83
- package/nitrogen/generated/ios/swift/Section.swift +100 -0
- package/nitrogen/generated/ios/swift/SectionStyle.swift +133 -0
- package/nitrogen/generated/ios/swift/StyleDisplay.swift +40 -0
- package/nitrogen/generated/ios/swift/Track.swift +20 -73
- package/nitrogen/generated/ios/swift/TrackStyle.swift +86 -22
- package/nitrogen/generated/shared/c++/{FavoritesMatchMode.hpp → ArtworkRendering.hpp} +17 -17
- package/nitrogen/generated/shared/c++/CarPlayPlayingIndicatorLocation.hpp +76 -0
- package/nitrogen/generated/shared/c++/CardImage.hpp +76 -0
- package/nitrogen/generated/shared/c++/GridTile.hpp +80 -0
- package/nitrogen/generated/shared/c++/IOSOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/ImageShape.hpp +76 -0
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +6 -6
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +30 -38
- package/nitrogen/generated/shared/c++/Section.hpp +106 -0
- package/nitrogen/generated/shared/c++/SectionStyle.hpp +126 -0
- package/nitrogen/generated/shared/c++/StyleDisplay.hpp +76 -0
- package/nitrogen/generated/shared/c++/Track.hpp +15 -31
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +73 -34
- package/package.json +7 -2
- package/src/AudioBrowser.ts +1 -0
- package/src/features/browser-config.test.ts +21 -6
- package/src/features/browser-config.ts +11 -8
- package/src/features/browser.test.ts +1 -1
- package/src/features/browser.ts +2 -2
- package/src/features/favorites.ts +13 -10
- package/src/features/hook-wiring.test.ts +63 -15
- package/src/features/playback/controls.ts +4 -2
- package/src/features/playback/progress.ts +2 -1
- package/src/features/playback/rate.ts +8 -1
- package/src/features/playback/state.ts +2 -3
- package/src/features/playback/trackPlaybackTime.ts +1 -1
- package/src/features/player/options.ts +27 -19
- package/src/features/player/setup.test.ts +12 -3
- package/src/features/player/setup.ts +3 -1
- package/src/features/player/validateOptions.ts +2 -0
- package/src/features/queue/activeTrack.ts +14 -3
- package/src/features/queue/queue.ts +11 -4
- package/src/nitro-stub-drift.test.ts +40 -0
- package/src/public-surface.test.ts +40 -0
- package/src/specs/audio-browser.nitro.ts +4 -3
- package/src/style-resolution.test.ts +210 -0
- package/src/types/browser-native.ts +2 -2
- package/src/types/browser-nodes.ts +377 -135
- package/src/types/browser.ts +34 -55
- package/src/utils/LazyNativeEmitter.ts +20 -10
- package/src/utils/NativeUpdatedValue.ts +29 -13
- package/src/utils/getTrackIdentity.ts +20 -0
- package/src/utils/useNativeValueRefreshedBy.ts +38 -0
- package/src/web/NativeAudioBrowser.ts +37 -22
- package/src/web/TrackPlayer/QueueManager.test.ts +29 -0
- package/src/web/TrackPlayer/QueueManager.ts +14 -0
- package/src/web/browser/BrowserManager.ts +176 -95
- package/src/web/browser/FavoriteManager.test.ts +84 -0
- package/src/web/browser/FavoriteManager.ts +28 -23
- package/src/web/browser/assertBrowsePageShape.test.ts +1 -1
- package/src/web/browser/assertBrowsePageShape.ts +5 -3
- package/src/web/browser/classifyTrackNavigation.test.ts +10 -8
- package/src/web/browser/classifyTrackNavigation.ts +9 -9
- package/src/web/browser/parseSearchResponse.test.ts +8 -2
- package/src/web/browser/sections.test.ts +91 -0
- package/src/web/browser/sections.ts +72 -0
- package/src/web/player/NowPlayingManager.ts +4 -3
- package/src/web/util/BrowserPathHelper.test.ts +52 -0
- package/src/web/util/BrowserPathHelper.ts +61 -13
- package/website/guide/android-auto.md +114 -0
- package/website/guide/android-certificates.md +409 -0
- package/website/guide/artwork.md +255 -0
- package/website/guide/audio-output.md +135 -0
- package/website/guide/automotive.md +86 -0
- package/website/guide/basic-usage.md +151 -0
- package/website/guide/battery.md +115 -0
- package/website/guide/browser.md +581 -0
- package/website/guide/carplay.md +620 -0
- package/website/guide/configuration.md +173 -0
- package/website/guide/equalizer.md +231 -0
- package/website/guide/errors.md +310 -0
- package/website/guide/favorites.md +154 -0
- package/website/guide/gate.md +143 -0
- package/website/guide/getting-started.md +46 -0
- package/website/guide/hooks.md +238 -0
- package/website/guide/live-streams.md +125 -0
- package/website/guide/metadata.md +239 -0
- package/website/guide/migrating-from-track-player.md +244 -0
- package/website/guide/native-callback-fetch.md +127 -0
- package/website/guide/network.md +86 -0
- package/website/guide/now-playing.md +175 -0
- package/website/guide/playback.md +328 -0
- package/website/guide/queue.md +300 -0
- package/website/guide/remote-controls.md +256 -0
- package/website/guide/search.md +255 -0
- package/website/guide/sleep-timer.md +268 -0
- package/website/guide/track.md +246 -0
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +0 -105
- 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/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +0 -68
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
- package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
- package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +0 -195
- package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
- package/nitrogen/generated/shared/c++/FavoriteConfig.hpp +0 -84
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +0 -129
|
@@ -16,8 +16,8 @@ final class CarPlayNowPlayingManager {
|
|
|
16
16
|
|
|
17
17
|
private let interfaceController: CPInterfaceController
|
|
18
18
|
var listItemFactory: (Track, ((CPSelectableListItem, @escaping () -> Void) -> Void)?) -> CPListItem
|
|
19
|
-
/// Pushes a browse destination (wired to the controller's
|
|
20
|
-
var
|
|
19
|
+
/// Pushes a browse destination (wired to the controller's navigateToPath).
|
|
20
|
+
var navigateToPath: ((_ path: String, _ title: String) -> Void)?
|
|
21
21
|
|
|
22
22
|
private weak var audioBrowser: HybridAudioBrowser?
|
|
23
23
|
private var nowPlayingObserver: NowPlayingObserver?
|
|
@@ -46,11 +46,11 @@ final class CarPlayNowPlayingManager {
|
|
|
46
46
|
private var builtRow: BuiltButtonRow?
|
|
47
47
|
|
|
48
48
|
/// Browse path the album line navigates to for the active track —
|
|
49
|
-
/// `track.
|
|
49
|
+
/// `track.albumPath`, or the pre-resolved `resolveAlbumPath` result. Resolved
|
|
50
50
|
/// at track-change time (not at tap) so the album line only surfaces when a
|
|
51
51
|
/// destination actually exists.
|
|
52
52
|
private var albumArtistDestination: String?
|
|
53
|
-
/// Drops a stale async `
|
|
53
|
+
/// Drops a stale async `resolveAlbumPath` result when the track changed while
|
|
54
54
|
/// the resolver was in flight (latest-update-wins).
|
|
55
55
|
private var albumArtistGeneration: UInt = 0
|
|
56
56
|
/// The just-tapped track whose load is still in flight. CarPlay reads
|
|
@@ -214,7 +214,7 @@ final class CarPlayNowPlayingManager {
|
|
|
214
214
|
|
|
215
215
|
/// Re-resolves the album line's destination for the active track and
|
|
216
216
|
/// enables the (tappable) album/artist button only when one exists:
|
|
217
|
-
/// `track.
|
|
217
|
+
/// `track.albumPath`, or the app's `resolveAlbumPath` result.
|
|
218
218
|
/// Marks `track` as the just-tapped (still loading) track and derives the
|
|
219
219
|
/// album line's destination from it. Must run before the Now Playing
|
|
220
220
|
/// template is pushed — CarPlay reads `isAlbumArtistButtonEnabled` at display
|
|
@@ -242,12 +242,12 @@ final class CarPlayNowPlayingManager {
|
|
|
242
242
|
setAlbumArtistDestination(nil)
|
|
243
243
|
return
|
|
244
244
|
}
|
|
245
|
-
logger.info("AlbumArtist: track=\(track.title)
|
|
246
|
-
if let
|
|
247
|
-
setAlbumArtistDestination(
|
|
245
|
+
logger.info("AlbumArtist: track=\(track.title) albumPath=\(track.albumPath ?? "nil") resolver=\(self.config.resolveAlbumPath != nil)")
|
|
246
|
+
if let albumPath = track.albumPath {
|
|
247
|
+
setAlbumArtistDestination(albumPath)
|
|
248
248
|
return
|
|
249
249
|
}
|
|
250
|
-
guard let resolver = config.
|
|
250
|
+
guard let resolver = config.resolveAlbumPath else {
|
|
251
251
|
setAlbumArtistDestination(nil)
|
|
252
252
|
return
|
|
253
253
|
}
|
|
@@ -256,7 +256,7 @@ final class CarPlayNowPlayingManager {
|
|
|
256
256
|
do {
|
|
257
257
|
path = try await resolver(track).await()
|
|
258
258
|
} catch {
|
|
259
|
-
self?.logger.error("
|
|
259
|
+
self?.logger.error("resolveAlbumPath failed: \(error.localizedDescription)")
|
|
260
260
|
path = nil
|
|
261
261
|
}
|
|
262
262
|
guard let self, self.albumArtistGeneration == generation else { return }
|
|
@@ -295,7 +295,10 @@ final class CarPlayNowPlayingManager {
|
|
|
295
295
|
/// Returns the appropriate image for the favorite button based on state
|
|
296
296
|
private func favoriteButtonImage(isFavorited: Bool) -> UIImage {
|
|
297
297
|
let symbolName = isFavorited ? "heart.fill" : "heart"
|
|
298
|
-
guard let image = UIImage(systemName: symbolName)?.resized(
|
|
298
|
+
guard let image = UIImage(systemName: symbolName)?.resized(
|
|
299
|
+
to: CPNowPlayingButtonMaximumImageSize,
|
|
300
|
+
scale: interfaceController.carTraitCollection.displayScale,
|
|
301
|
+
) else {
|
|
299
302
|
return UIImage()
|
|
300
303
|
}
|
|
301
304
|
return image
|
|
@@ -360,7 +363,7 @@ final class CarPlayNowPlayingManager {
|
|
|
360
363
|
// the pushed destination (artist may be unset, or the live song).
|
|
361
364
|
let title = track?.album ?? track?.artist ?? track?.title ?? ""
|
|
362
365
|
logger.info("Album/Artist button tapped, navigating to \(destination)")
|
|
363
|
-
|
|
366
|
+
navigateToPath?(destination, title)
|
|
364
367
|
}
|
|
365
368
|
|
|
366
369
|
private func updateNowPlayingUpNextButton() {
|
|
@@ -54,7 +54,7 @@ extension PlayerCapabilities {
|
|
|
54
54
|
// Apple silently removed. On the iOS 16+ target it can never be invoked: CarPlay
|
|
55
55
|
// uses its own CPNowPlayingButton heart, and Siri "I like this" routes through
|
|
56
56
|
// INUpdateMediaAffinityIntent. The `favorite` capability still drives the
|
|
57
|
-
//
|
|
57
|
+
// favorite row indicators via setFavoriteEnabled. See issues #67 / #71.
|
|
58
58
|
|
|
59
59
|
// Mode controls
|
|
60
60
|
if shuffleMode != false {
|
|
@@ -1,20 +1,6 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
|
|
3
3
|
extension PlayerCapabilities {
|
|
4
|
-
/// Resolved favorite match mode, or `nil` when favoriting is disabled.
|
|
5
|
-
///
|
|
6
|
-
/// `false`/unset → `nil`; `true` → `.exact`; `{ match }` → that match.
|
|
7
|
-
var favoriteMatch: FavoritesMatchMode? {
|
|
8
|
-
switch favorite {
|
|
9
|
-
case .none:
|
|
10
|
-
nil
|
|
11
|
-
case let .some(.first(enabled)):
|
|
12
|
-
enabled ? .exact : nil
|
|
13
|
-
case let .some(.second(config)):
|
|
14
|
-
config.match
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
4
|
/// Whether the favorite/like control is enabled.
|
|
19
|
-
var favoriteEnabled: Bool {
|
|
5
|
+
var favoriteEnabled: Bool { favorite ?? false }
|
|
20
6
|
}
|
|
@@ -10,9 +10,11 @@ extension ResolvedTrack {
|
|
|
10
10
|
/// - `.some(nil)` → set field to nil
|
|
11
11
|
/// - `.some(value)` → set field to value
|
|
12
12
|
///
|
|
13
|
-
/// `
|
|
13
|
+
/// `path` and `title` use single-optional since they are non-optional on ResolvedTrack.
|
|
14
14
|
func copying(
|
|
15
|
-
|
|
15
|
+
path: String? = nil,
|
|
16
|
+
style: SectionStyle?? = nil,
|
|
17
|
+
sections: [Section]?? = nil,
|
|
16
18
|
children: [Track]?? = nil,
|
|
17
19
|
carPlaySiriListButton: CarPlaySiriListButtonPosition?? = nil,
|
|
18
20
|
id: String?? = nil,
|
|
@@ -20,24 +22,22 @@ extension ResolvedTrack {
|
|
|
20
22
|
artwork: Variant_String_ArtworkVariants?? = nil,
|
|
21
23
|
artworkSource: ImageSource?? = nil,
|
|
22
24
|
request: TrackRequest?? = nil,
|
|
23
|
-
artworkCarPlayTinted: Bool?? = nil,
|
|
24
25
|
title: String? = nil,
|
|
25
26
|
subtitle: String?? = nil,
|
|
26
27
|
artist: String?? = nil,
|
|
27
|
-
|
|
28
|
+
albumPath: String?? = nil,
|
|
28
29
|
album: String?? = nil,
|
|
29
30
|
description: String?? = nil,
|
|
30
31
|
genre: String?? = nil,
|
|
31
32
|
duration: Double?? = nil,
|
|
32
|
-
|
|
33
|
-
childrenStyle: TrackStyle?? = nil,
|
|
33
|
+
disabled: Bool?? = nil,
|
|
34
34
|
favorited: Bool?? = nil,
|
|
35
|
-
groupTitle: String?? = nil,
|
|
36
35
|
live: Bool?? = nil,
|
|
37
|
-
imageRow: [ImageRowItem]?? = nil,
|
|
38
36
|
) -> ResolvedTrack {
|
|
39
37
|
ResolvedTrack(
|
|
40
|
-
|
|
38
|
+
path: path ?? self.path,
|
|
39
|
+
style: style ?? self.style,
|
|
40
|
+
sections: sections ?? self.sections,
|
|
41
41
|
children: children ?? self.children,
|
|
42
42
|
carPlaySiriListButton: carPlaySiriListButton ?? self.carPlaySiriListButton,
|
|
43
43
|
id: id ?? self.id,
|
|
@@ -45,21 +45,17 @@ extension ResolvedTrack {
|
|
|
45
45
|
artwork: artwork ?? self.artwork,
|
|
46
46
|
artworkSource: artworkSource ?? self.artworkSource,
|
|
47
47
|
request: request ?? self.request,
|
|
48
|
-
artworkCarPlayTinted: artworkCarPlayTinted ?? self.artworkCarPlayTinted,
|
|
49
48
|
title: title ?? self.title,
|
|
50
49
|
subtitle: subtitle ?? self.subtitle,
|
|
51
50
|
artist: artist ?? self.artist,
|
|
52
|
-
|
|
51
|
+
albumPath: albumPath ?? self.albumPath,
|
|
53
52
|
album: album ?? self.album,
|
|
54
53
|
description: description ?? self.description,
|
|
55
54
|
genre: genre ?? self.genre,
|
|
56
55
|
duration: duration ?? self.duration,
|
|
57
|
-
|
|
58
|
-
childrenStyle: childrenStyle ?? self.childrenStyle,
|
|
56
|
+
disabled: disabled ?? self.disabled,
|
|
59
57
|
favorited: favorited ?? self.favorited,
|
|
60
|
-
groupTitle: groupTitle ?? self.groupTitle,
|
|
61
58
|
live: live ?? self.live,
|
|
62
|
-
imageRow: imageRow ?? self.imageRow,
|
|
63
59
|
)
|
|
64
60
|
}
|
|
65
61
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#if canImport(NitroModules)
|
|
2
|
+
import NitroModules
|
|
3
|
+
#endif
|
|
4
|
+
|
|
5
|
+
extension Section {
|
|
6
|
+
/// Returns a copy of this Section with only the specified fields changed.
|
|
7
|
+
///
|
|
8
|
+
/// Same double-optional (`T??`) convention as the other copying helpers;
|
|
9
|
+
/// `children` is single-optional since it is non-optional on Section.
|
|
10
|
+
func copying(
|
|
11
|
+
title: String?? = nil,
|
|
12
|
+
subtitle: String?? = nil,
|
|
13
|
+
style: SectionStyle?? = nil,
|
|
14
|
+
path: String?? = nil,
|
|
15
|
+
children: [Track]? = nil,
|
|
16
|
+
) -> Section {
|
|
17
|
+
Section(
|
|
18
|
+
title: title ?? self.title,
|
|
19
|
+
subtitle: subtitle ?? self.subtitle,
|
|
20
|
+
style: style ?? self.style,
|
|
21
|
+
path: path ?? self.path,
|
|
22
|
+
children: children ?? self.children,
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/// One untitled section — the canonical wrap of a flat track list
|
|
27
|
+
/// (`children` authoring sugar, search results — ADR 0010).
|
|
28
|
+
static func untitled(_ children: [Track]) -> Section {
|
|
29
|
+
Section(title: nil, subtitle: nil, style: nil, path: nil, children: children)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -11,49 +11,43 @@ extension Track {
|
|
|
11
11
|
/// `title` uses single-optional (`String?`) since it is non-optional on Track.
|
|
12
12
|
func copying(
|
|
13
13
|
id: String?? = nil,
|
|
14
|
-
|
|
14
|
+
path: String?? = nil,
|
|
15
15
|
src: String?? = nil,
|
|
16
16
|
artwork: Variant_String_ArtworkVariants?? = nil,
|
|
17
17
|
artworkSource: ImageSource?? = nil,
|
|
18
18
|
request: TrackRequest?? = nil,
|
|
19
|
-
artworkCarPlayTinted: Bool?? = nil,
|
|
20
19
|
title: String? = nil,
|
|
21
20
|
subtitle: String?? = nil,
|
|
22
21
|
artist: String?? = nil,
|
|
23
|
-
|
|
22
|
+
albumPath: String?? = nil,
|
|
24
23
|
album: String?? = nil,
|
|
25
24
|
description: String?? = nil,
|
|
26
25
|
genre: String?? = nil,
|
|
27
26
|
duration: Double?? = nil,
|
|
28
27
|
style: TrackStyle?? = nil,
|
|
29
|
-
|
|
28
|
+
disabled: Bool?? = nil,
|
|
30
29
|
favorited: Bool?? = nil,
|
|
31
|
-
groupTitle: String?? = nil,
|
|
32
30
|
live: Bool?? = nil,
|
|
33
|
-
imageRow: [ImageRowItem]?? = nil,
|
|
34
31
|
) -> Track {
|
|
35
32
|
Track(
|
|
36
33
|
id: id ?? self.id,
|
|
37
|
-
|
|
34
|
+
path: path ?? self.path,
|
|
38
35
|
src: src ?? self.src,
|
|
39
36
|
artwork: artwork ?? self.artwork,
|
|
40
37
|
artworkSource: artworkSource ?? self.artworkSource,
|
|
41
38
|
request: request ?? self.request,
|
|
42
|
-
artworkCarPlayTinted: artworkCarPlayTinted ?? self.artworkCarPlayTinted,
|
|
43
39
|
title: title ?? self.title,
|
|
44
40
|
subtitle: subtitle ?? self.subtitle,
|
|
45
41
|
artist: artist ?? self.artist,
|
|
46
|
-
|
|
42
|
+
albumPath: albumPath ?? self.albumPath,
|
|
47
43
|
album: album ?? self.album,
|
|
48
44
|
description: description ?? self.description,
|
|
49
45
|
genre: genre ?? self.genre,
|
|
50
46
|
duration: duration ?? self.duration,
|
|
51
47
|
style: style ?? self.style,
|
|
52
|
-
|
|
48
|
+
disabled: disabled ?? self.disabled,
|
|
53
49
|
favorited: favorited ?? self.favorited,
|
|
54
|
-
groupTitle: groupTitle ?? self.groupTitle,
|
|
55
50
|
live: live ?? self.live,
|
|
56
|
-
imageRow: imageRow ?? self.imageRow,
|
|
57
51
|
)
|
|
58
52
|
}
|
|
59
53
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#if canImport(NitroModules)
|
|
2
|
+
import NitroModules
|
|
3
|
+
#endif
|
|
4
|
+
|
|
5
|
+
/// A track's identity: the opaque `id` when present (non-blank), else the
|
|
6
|
+
/// playable `src`. Two tracks refer to the same item iff their identities are
|
|
7
|
+
/// equal. Browsable-only tracks (neither `id` nor `src`) have no identity —
|
|
8
|
+
/// they are addressed by `path` instead.
|
|
9
|
+
///
|
|
10
|
+
/// This is THE comparison rule for favorites matching, section scoping,
|
|
11
|
+
/// skip-in-place, the car now-playing row indicator, and the contextual
|
|
12
|
+
/// `__trackId` — see ADR 0008. Mirrors `trackIdentity` on the TS side.
|
|
13
|
+
extension Track {
|
|
14
|
+
var identity: String? {
|
|
15
|
+
if let id, !id.isEmpty { return id }
|
|
16
|
+
return src
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import UIKit
|
|
2
|
+
|
|
3
|
+
extension UIApplication {
|
|
4
|
+
/// The scene showing the app's own UI: the foreground-active one, else any
|
|
5
|
+
/// connected window scene. Nil when the app has no UI scene at all (running
|
|
6
|
+
/// headless for CarPlay), which callers must handle rather than assume.
|
|
7
|
+
///
|
|
8
|
+
/// Replaces the deprecated `UIScreen.main` / `keyWindow` idioms — and exists
|
|
9
|
+
/// once because the walk was previously written out at each use, so the two
|
|
10
|
+
/// copies had already drifted apart.
|
|
11
|
+
var activeWindowScene: UIWindowScene? {
|
|
12
|
+
let scenes = connectedScenes.compactMap { $0 as? UIWindowScene }
|
|
13
|
+
return scenes.first { $0.activationState == .foregroundActive } ?? scenes.first
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/// The scale to rasterise at for the app's own screen.
|
|
18
|
+
///
|
|
19
|
+
/// `UITraitCollection.current` rather than the deprecated `UIScreen.main.scale`
|
|
20
|
+
/// (also unavailable on visionOS, which the podspec targets): on the main actor
|
|
21
|
+
/// it already reflects the environment being rendered for. CarPlay surfaces do
|
|
22
|
+
/// NOT use this — they rasterise at `carTraitCollection.displayScale`, the car
|
|
23
|
+
/// screen's own scale.
|
|
24
|
+
@MainActor
|
|
25
|
+
var appDisplayScale: CGFloat {
|
|
26
|
+
UITraitCollection.current.displayScale
|
|
27
|
+
}
|
|
@@ -92,8 +92,14 @@ final class HttpClient: @unchecked Sendable {
|
|
|
92
92
|
httpRequest.headers?.forEach { name, value in
|
|
93
93
|
urlRequest.setValue(value, forHTTPHeaderField: name)
|
|
94
94
|
}
|
|
95
|
-
//
|
|
96
|
-
|
|
95
|
+
// An explicit `User-Agent` in `headers` wins, matching the two sibling paths
|
|
96
|
+
// (MediaLoader.buildAssetOptions and the artwork path in
|
|
97
|
+
// BrowserManager+URLResolution). `userAgent` carries a non-nil default, so
|
|
98
|
+
// overwriting unconditionally would replace a consumer's header with
|
|
99
|
+
// "react-native-audio-browser" whenever they set only the header.
|
|
100
|
+
if httpRequest.headers?["User-Agent"] == nil {
|
|
101
|
+
urlRequest.setValue(httpRequest.userAgent, forHTTPHeaderField: "User-Agent")
|
|
102
|
+
}
|
|
97
103
|
|
|
98
104
|
// Add body for non-GET requests
|
|
99
105
|
switch httpRequest.method.uppercased() {
|