@5stones/react-native-audio-browser 0.1.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 +43 -0
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/android/CMakeLists.txt +32 -0
- package/android/build.gradle +210 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +36 -0
- package/android/src/main/cpp/cpp-adapter.cpp +6 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +1191 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowserPackage.kt +21 -0
- package/android/src/main/java/com/audiobrowser/Callbacks.kt +92 -0
- package/android/src/main/java/com/audiobrowser/HeadlessTaskService.kt +59 -0
- package/android/src/main/java/com/audiobrowser/Service.kt +336 -0
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +1169 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +103 -0
- package/android/src/main/java/com/audiobrowser/browser/RouteMatch.kt +9 -0
- package/android/src/main/java/com/audiobrowser/browser/SimpleRouter.kt +150 -0
- package/android/src/main/java/com/audiobrowser/extension/EnumExtensions.kt +5 -0
- package/android/src/main/java/com/audiobrowser/extension/NumberExt.kt +13 -0
- package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +171 -0
- package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +251 -0
- package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +80 -0
- package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +101 -0
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +125 -0
- package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +256 -0
- package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +163 -0
- package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +177 -0
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +580 -0
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +578 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +58 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +245 -0
- package/android/src/main/java/com/audiobrowser/player/Player.kt +1509 -0
- package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +230 -0
- package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +191 -0
- package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +80 -0
- package/android/src/main/java/com/audiobrowser/util/AndroidAudioContentTypeFactory.kt +17 -0
- package/android/src/main/java/com/audiobrowser/util/BatteryOptimizationHelper.kt +95 -0
- package/android/src/main/java/com/audiobrowser/util/BatteryWarningStore.kt +38 -0
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +155 -0
- package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +390 -0
- package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +197 -0
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +75 -0
- package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +97 -0
- package/android/src/main/java/com/audiobrowser/util/NetworkConnectivityMonitor.kt +121 -0
- package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +25 -0
- package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
- package/android/src/main/java/com/audiobrowser/util/RepeatModeFactory.kt +22 -0
- package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
- package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +130 -0
- package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +50 -0
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +125 -0
- package/android/src/main/res/values/strings.xml +6 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +273 -0
- package/android/src/test/java/com/audiobrowser/browser/SimpleBrowserTest.kt +33 -0
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +156 -0
- package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +240 -0
- package/ios/Bridge.h +8 -0
- package/ios/Browser/BrowserConfig.swift +85 -0
- package/ios/Browser/BrowserManager.swift +985 -0
- package/ios/Browser/BrowserPathHelper.swift +156 -0
- package/ios/Browser/JsonModels.swift +165 -0
- package/ios/Browser/SimpleRouter.swift +184 -0
- package/ios/CarPlay/CarPlayController.swift +1342 -0
- package/ios/CarPlay/RNABCarPlaySceneDelegate.h +15 -0
- package/ios/CarPlay/RNABCarPlaySceneDelegate.m +59 -0
- package/ios/CarPlay/Track+CarPlay.swift +49 -0
- package/ios/Extension/Capability+RemoteCommand.swift +76 -0
- package/ios/Extension/ChapterMetadata+AVFoundation.swift +37 -0
- package/ios/Extension/TimedMetadata+AVFoundation.swift +126 -0
- package/ios/Extension/Track+AVPlayer.swift +68 -0
- package/ios/Extension/TrackMetadata+AVFoundation.swift +128 -0
- package/ios/Http/HttpClient.swift +237 -0
- package/ios/HybridAudioBrowser.swift +1309 -0
- package/ios/Model/MediaURL.swift +66 -0
- package/ios/Model/PlayerUpdateOptions.swift +116 -0
- package/ios/Model/RemoteCommand.swift +71 -0
- package/ios/Model/SourceType.swift +6 -0
- package/ios/Model/TrackPlayerError.swift +69 -0
- package/ios/NowPlayingInfo/MediaItemProperty.swift +78 -0
- package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
- package/ios/NowPlayingInfo/NowPlayingInfoController.swift +283 -0
- package/ios/NowPlayingInfo/NowPlayingInfoKeyValue.swift +6 -0
- package/ios/NowPlayingInfo/NowPlayingInfoProperty.swift +220 -0
- package/ios/Observer/PlayerItemNotificationObserver.swift +83 -0
- package/ios/Observer/PlayerItemPropertyObserver.swift +110 -0
- package/ios/Observer/PlayerStateObserver.swift +52 -0
- package/ios/Observer/PlayerTimeObserver.swift +109 -0
- package/ios/Option/PitchAlgorithms.swift +17 -0
- package/ios/Option/SessionCategories.swift +100 -0
- package/ios/Option/TimeEventFrequency.swift +18 -0
- package/ios/Player/PlaybackProgressUpdateManager.swift +60 -0
- package/ios/Player/PlayingStateManager.swift +29 -0
- package/ios/Player/RetryManager.swift +281 -0
- package/ios/Player/ShuffleOrder.swift +191 -0
- package/ios/Player/SleepTimerManager.swift +137 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +400 -0
- package/ios/Support/RNTrackPlayer-Bridging-Header.h +7 -0
- package/ios/TrackPlayer.swift +1590 -0
- package/ios/TrackPlayerCallbacks.swift +121 -0
- package/ios/Util/Emitter.swift +46 -0
- package/ios/Util/LRUCache.swift +182 -0
- package/ios/Util/MetadataAdapter.swift +131 -0
- package/ios/Util/NetworkMonitor.swift +68 -0
- package/ios/Util/OnceValue.swift +70 -0
- package/ios/Util/SVGProcessor.swift +56 -0
- package/lib/commonjs/AudioBrowser.js +50 -0
- package/lib/commonjs/AudioBrowser.js.map +1 -0
- package/lib/commonjs/features/battery.js +154 -0
- package/lib/commonjs/features/battery.js.map +1 -0
- package/lib/commonjs/features/browser.js +271 -0
- package/lib/commonjs/features/browser.js.map +1 -0
- package/lib/commonjs/features/equalizer.js +69 -0
- package/lib/commonjs/features/equalizer.js.map +1 -0
- package/lib/commonjs/features/errors.js +165 -0
- package/lib/commonjs/features/errors.js.map +1 -0
- package/lib/commonjs/features/favorites.js +101 -0
- package/lib/commonjs/features/favorites.js.map +1 -0
- package/lib/commonjs/features/index.js +160 -0
- package/lib/commonjs/features/index.js.map +1 -0
- package/lib/commonjs/features/metadata.js +54 -0
- package/lib/commonjs/features/metadata.js.map +1 -0
- package/lib/commonjs/features/network.js +40 -0
- package/lib/commonjs/features/network.js.map +1 -0
- package/lib/commonjs/features/nowPlaying.js +61 -0
- package/lib/commonjs/features/nowPlaying.js.map +1 -0
- package/lib/commonjs/features/output.js +54 -0
- package/lib/commonjs/features/output.js.map +1 -0
- package/lib/commonjs/features/playback/controls.js +79 -0
- package/lib/commonjs/features/playback/controls.js.map +1 -0
- package/lib/commonjs/features/playback/index.js +83 -0
- package/lib/commonjs/features/playback/index.js.map +1 -0
- package/lib/commonjs/features/playback/playWhenReady.js +55 -0
- package/lib/commonjs/features/playback/playWhenReady.js.map +1 -0
- package/lib/commonjs/features/playback/playing.js +41 -0
- package/lib/commonjs/features/playback/playing.js.map +1 -0
- package/lib/commonjs/features/playback/progress.js +104 -0
- package/lib/commonjs/features/playback/progress.js.map +1 -0
- package/lib/commonjs/features/playback/rate.js +29 -0
- package/lib/commonjs/features/playback/rate.js.map +1 -0
- package/lib/commonjs/features/playback/state.js +62 -0
- package/lib/commonjs/features/playback/state.js.map +1 -0
- package/lib/commonjs/features/playback/volume.js +68 -0
- package/lib/commonjs/features/playback/volume.js.map +1 -0
- package/lib/commonjs/features/player/index.js +28 -0
- package/lib/commonjs/features/player/index.js.map +1 -0
- package/lib/commonjs/features/player/options.js +182 -0
- package/lib/commonjs/features/player/options.js.map +1 -0
- package/lib/commonjs/features/player/setup.js +143 -0
- package/lib/commonjs/features/player/setup.js.map +1 -0
- package/lib/commonjs/features/queue/activeTrack.js +52 -0
- package/lib/commonjs/features/queue/activeTrack.js.map +1 -0
- package/lib/commonjs/features/queue/index.js +50 -0
- package/lib/commonjs/features/queue/index.js.map +1 -0
- package/lib/commonjs/features/queue/queue.js +177 -0
- package/lib/commonjs/features/queue/queue.js.map +1 -0
- package/lib/commonjs/features/queue/repeatMode.js +58 -0
- package/lib/commonjs/features/queue/repeatMode.js.map +1 -0
- package/lib/commonjs/features/queue/shuffle.js +57 -0
- package/lib/commonjs/features/queue/shuffle.js.map +1 -0
- package/lib/commonjs/features/rating.js +2 -0
- package/lib/commonjs/features/rating.js.map +1 -0
- package/lib/commonjs/features/remoteControls.js +286 -0
- package/lib/commonjs/features/remoteControls.js.map +1 -0
- package/lib/commonjs/features/sleepTimer.js +164 -0
- package/lib/commonjs/features/sleepTimer.js.map +1 -0
- package/lib/commonjs/index.js +22 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/native.js +9 -0
- package/lib/commonjs/native.js.map +1 -0
- package/lib/commonjs/native.web.js +10 -0
- package/lib/commonjs/native.web.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/specs/audio-browser.nitro.js +6 -0
- package/lib/commonjs/specs/audio-browser.nitro.js.map +1 -0
- package/lib/commonjs/types/browser-native.js +6 -0
- package/lib/commonjs/types/browser-native.js.map +1 -0
- package/lib/commonjs/types/browser-nodes.js +6 -0
- package/lib/commonjs/types/browser-nodes.js.map +1 -0
- package/lib/commonjs/types/browser.js +6 -0
- package/lib/commonjs/types/browser.js.map +1 -0
- package/lib/commonjs/types/index.js +28 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/commonjs/types/player.js +2 -0
- package/lib/commonjs/types/player.js.map +1 -0
- package/lib/commonjs/utils/LazyNativeEmitter.js +58 -0
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -0
- package/lib/commonjs/utils/NativeUpdatedValue.js +59 -0
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -0
- package/lib/commonjs/utils/resolveAssetSource.js +11 -0
- package/lib/commonjs/utils/resolveAssetSource.js.map +1 -0
- package/lib/commonjs/utils/useDebug.js +221 -0
- package/lib/commonjs/utils/useDebug.js.map +1 -0
- package/lib/commonjs/utils/useNativeUpdatedValue.js +44 -0
- package/lib/commonjs/utils/useNativeUpdatedValue.js.map +1 -0
- package/lib/commonjs/web/NativeAudioBrowser.js +668 -0
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -0
- package/lib/commonjs/web/SimpleRouter.js +144 -0
- package/lib/commonjs/web/SimpleRouter.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Event.js +19 -0
- package/lib/commonjs/web/TrackPlayer/Event.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Player.js +276 -0
- package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +284 -0
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js +12 -0
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js +13 -0
- package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js +75 -0
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/State.js +18 -0
- package/lib/commonjs/web/TrackPlayer/State.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/index.js +52 -0
- package/lib/commonjs/web/TrackPlayer/index.js.map +1 -0
- package/lib/commonjs/web/browser/BrowserManager.js +594 -0
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -0
- package/lib/commonjs/web/browser/FavoriteManager.js +80 -0
- package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -0
- package/lib/commonjs/web/browser/NavigationErrorManager.js +106 -0
- package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -0
- package/lib/commonjs/web/browser/SearchManager.js +80 -0
- package/lib/commonjs/web/browser/SearchManager.js.map +1 -0
- package/lib/commonjs/web/http/HttpClient.js +81 -0
- package/lib/commonjs/web/http/HttpClient.js.map +1 -0
- package/lib/commonjs/web/http/RequestConfigBuilder.js +294 -0
- package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -0
- package/lib/commonjs/web/player/NowPlayingManager.js +70 -0
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -0
- package/lib/commonjs/web/player/OptionsManager.js +88 -0
- package/lib/commonjs/web/player/OptionsManager.js.map +1 -0
- package/lib/commonjs/web/util/BrowserPathHelper.js +138 -0
- package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -0
- package/lib/commonjs/web/util/shuffle.js +21 -0
- package/lib/commonjs/web/util/shuffle.js.map +1 -0
- package/lib/module/AudioBrowser.js +7 -0
- package/lib/module/AudioBrowser.js.map +1 -0
- package/lib/module/features/battery.js +144 -0
- package/lib/module/features/battery.js.map +1 -0
- package/lib/module/features/browser.js +257 -0
- package/lib/module/features/browser.js.map +1 -0
- package/lib/module/features/equalizer.js +60 -0
- package/lib/module/features/equalizer.js.map +1 -0
- package/lib/module/features/errors.js +156 -0
- package/lib/module/features/errors.js.map +1 -0
- package/lib/module/features/favorites.js +95 -0
- package/lib/module/features/favorites.js.map +1 -0
- package/lib/module/features/index.js +26 -0
- package/lib/module/features/index.js.map +1 -0
- package/lib/module/features/metadata.js +51 -0
- package/lib/module/features/metadata.js.map +1 -0
- package/lib/module/features/network.js +35 -0
- package/lib/module/features/network.js.map +1 -0
- package/lib/module/features/nowPlaying.js +54 -0
- package/lib/module/features/nowPlaying.js.map +1 -0
- package/lib/module/features/output.js +47 -0
- package/lib/module/features/output.js.map +1 -0
- package/lib/module/features/playback/controls.js +69 -0
- package/lib/module/features/playback/controls.js.map +1 -0
- package/lib/module/features/playback/index.js +10 -0
- package/lib/module/features/playback/index.js.map +1 -0
- package/lib/module/features/playback/playWhenReady.js +49 -0
- package/lib/module/features/playback/playWhenReady.js.map +1 -0
- package/lib/module/features/playback/playing.js +36 -0
- package/lib/module/features/playback/playing.js.map +1 -0
- package/lib/module/features/playback/progress.js +98 -0
- package/lib/module/features/playback/progress.js.map +1 -0
- package/lib/module/features/playback/rate.js +25 -0
- package/lib/module/features/playback/rate.js.map +1 -0
- package/lib/module/features/playback/state.js +57 -0
- package/lib/module/features/playback/state.js.map +1 -0
- package/lib/module/features/playback/volume.js +60 -0
- package/lib/module/features/playback/volume.js.map +1 -0
- package/lib/module/features/player/index.js +5 -0
- package/lib/module/features/player/index.js.map +1 -0
- package/lib/module/features/player/options.js +176 -0
- package/lib/module/features/player/options.js.map +1 -0
- package/lib/module/features/player/setup.js +140 -0
- package/lib/module/features/player/setup.js.map +1 -0
- package/lib/module/features/queue/activeTrack.js +46 -0
- package/lib/module/features/queue/activeTrack.js.map +1 -0
- package/lib/module/features/queue/index.js +7 -0
- package/lib/module/features/queue/index.js.map +1 -0
- package/lib/module/features/queue/queue.js +162 -0
- package/lib/module/features/queue/queue.js.map +1 -0
- package/lib/module/features/queue/repeatMode.js +52 -0
- package/lib/module/features/queue/repeatMode.js.map +1 -0
- package/lib/module/features/queue/shuffle.js +50 -0
- package/lib/module/features/queue/shuffle.js.map +1 -0
- package/lib/module/features/rating.js +2 -0
- package/lib/module/features/rating.js.map +1 -0
- package/lib/module/features/remoteControls.js +275 -0
- package/lib/module/features/remoteControls.js.map +1 -0
- package/lib/module/features/sleepTimer.js +155 -0
- package/lib/module/features/sleepTimer.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native.js +5 -0
- package/lib/module/native.js.map +1 -0
- package/lib/module/native.web.js +7 -0
- package/lib/module/native.web.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/specs/audio-browser.nitro.js +4 -0
- package/lib/module/specs/audio-browser.nitro.js.map +1 -0
- package/lib/module/types/browser-native.js +4 -0
- package/lib/module/types/browser-native.js.map +1 -0
- package/lib/module/types/browser-nodes.js +4 -0
- package/lib/module/types/browser-nodes.js.map +1 -0
- package/lib/module/types/browser.js +4 -0
- package/lib/module/types/browser.js.map +1 -0
- package/lib/module/types/index.js +5 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/types/player.js +2 -0
- package/lib/module/types/player.js.map +1 -0
- package/lib/module/utils/LazyNativeEmitter.js +53 -0
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -0
- package/lib/module/utils/NativeUpdatedValue.js +54 -0
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -0
- package/lib/module/utils/resolveAssetSource.js +7 -0
- package/lib/module/utils/resolveAssetSource.js.map +1 -0
- package/lib/module/utils/useDebug.js +218 -0
- package/lib/module/utils/useDebug.js.map +1 -0
- package/lib/module/utils/useNativeUpdatedValue.js +40 -0
- package/lib/module/utils/useNativeUpdatedValue.js.map +1 -0
- package/lib/module/web/NativeAudioBrowser.js +664 -0
- package/lib/module/web/NativeAudioBrowser.js.map +1 -0
- package/lib/module/web/SimpleRouter.js +139 -0
- package/lib/module/web/SimpleRouter.js.map +1 -0
- package/lib/module/web/TrackPlayer/Event.js +15 -0
- package/lib/module/web/TrackPlayer/Event.js.map +1 -0
- package/lib/module/web/TrackPlayer/Player.js +271 -0
- package/lib/module/web/TrackPlayer/Player.js.map +1 -0
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js +279 -0
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
- package/lib/module/web/TrackPlayer/RepeatMode.js +8 -0
- package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -0
- package/lib/module/web/TrackPlayer/SetupNotCalledError.js +8 -0
- package/lib/module/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
- package/lib/module/web/TrackPlayer/SleepTimer.js +70 -0
- package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -0
- package/lib/module/web/TrackPlayer/State.js +14 -0
- package/lib/module/web/TrackPlayer/State.js.map +1 -0
- package/lib/module/web/TrackPlayer/index.js +7 -0
- package/lib/module/web/TrackPlayer/index.js.map +1 -0
- package/lib/module/web/browser/BrowserManager.js +590 -0
- package/lib/module/web/browser/BrowserManager.js.map +1 -0
- package/lib/module/web/browser/FavoriteManager.js +75 -0
- package/lib/module/web/browser/FavoriteManager.js.map +1 -0
- package/lib/module/web/browser/NavigationErrorManager.js +101 -0
- package/lib/module/web/browser/NavigationErrorManager.js.map +1 -0
- package/lib/module/web/browser/SearchManager.js +76 -0
- package/lib/module/web/browser/SearchManager.js.map +1 -0
- package/lib/module/web/http/HttpClient.js +76 -0
- package/lib/module/web/http/HttpClient.js.map +1 -0
- package/lib/module/web/http/RequestConfigBuilder.js +291 -0
- package/lib/module/web/http/RequestConfigBuilder.js.map +1 -0
- package/lib/module/web/player/NowPlayingManager.js +65 -0
- package/lib/module/web/player/NowPlayingManager.js.map +1 -0
- package/lib/module/web/player/OptionsManager.js +83 -0
- package/lib/module/web/player/OptionsManager.js.map +1 -0
- package/lib/module/web/util/BrowserPathHelper.js +134 -0
- package/lib/module/web/util/BrowserPathHelper.js.map +1 -0
- package/lib/module/web/util/shuffle.js +17 -0
- package/lib/module/web/util/shuffle.js.map +1 -0
- package/lib/typescript/src/AudioBrowser.d.ts +5 -0
- package/lib/typescript/src/AudioBrowser.d.ts.map +1 -0
- package/lib/typescript/src/features/battery.d.ts +112 -0
- package/lib/typescript/src/features/battery.d.ts.map +1 -0
- package/lib/typescript/src/features/browser.d.ts +68 -0
- package/lib/typescript/src/features/browser.d.ts.map +1 -0
- package/lib/typescript/src/features/equalizer.d.ts +35 -0
- package/lib/typescript/src/features/equalizer.d.ts.map +1 -0
- package/lib/typescript/src/features/errors.d.ts +136 -0
- package/lib/typescript/src/features/errors.d.ts.map +1 -0
- package/lib/typescript/src/features/favorites.d.ts +84 -0
- package/lib/typescript/src/features/favorites.d.ts.map +1 -0
- package/lib/typescript/src/features/index.d.ts +23 -0
- package/lib/typescript/src/features/index.d.ts.map +1 -0
- package/lib/typescript/src/features/metadata.d.ts +103 -0
- package/lib/typescript/src/features/metadata.d.ts.map +1 -0
- package/lib/typescript/src/features/network.d.ts +18 -0
- package/lib/typescript/src/features/network.d.ts.map +1 -0
- package/lib/typescript/src/features/nowPlaying.d.ts +36 -0
- package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -0
- package/lib/typescript/src/features/output.d.ts +28 -0
- package/lib/typescript/src/features/output.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/controls.d.ts +40 -0
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/index.d.ts +8 -0
- package/lib/typescript/src/features/playback/index.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/playWhenReady.d.ts +30 -0
- package/lib/typescript/src/features/playback/playWhenReady.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/playing.d.ts +21 -0
- package/lib/typescript/src/features/playback/playing.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/progress.d.ts +51 -0
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/rate.d.ts +12 -0
- package/lib/typescript/src/features/playback/rate.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/state.d.ts +43 -0
- package/lib/typescript/src/features/playback/state.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/volume.d.ts +32 -0
- package/lib/typescript/src/features/playback/volume.d.ts.map +1 -0
- package/lib/typescript/src/features/player/index.d.ts +3 -0
- package/lib/typescript/src/features/player/index.d.ts.map +1 -0
- package/lib/typescript/src/features/player/options.d.ts +413 -0
- package/lib/typescript/src/features/player/options.d.ts.map +1 -0
- package/lib/typescript/src/features/player/setup.d.ts +471 -0
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/activeTrack.d.ts +38 -0
- package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/index.d.ts +5 -0
- package/lib/typescript/src/features/queue/index.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/queue.d.ts +111 -0
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/repeatMode.d.ts +34 -0
- package/lib/typescript/src/features/queue/repeatMode.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/shuffle.d.ts +27 -0
- package/lib/typescript/src/features/queue/shuffle.d.ts.map +1 -0
- 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 +164 -0
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -0
- package/lib/typescript/src/features/sleepTimer.d.ts +80 -0
- package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/native.d.ts +3 -0
- package/lib/typescript/src/native.d.ts.map +1 -0
- 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 +242 -0
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -0
- package/lib/typescript/src/types/browser-native.d.ts +39 -0
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -0
- package/lib/typescript/src/types/browser-nodes.d.ts +153 -0
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -0
- package/lib/typescript/src/types/browser.d.ts +710 -0
- package/lib/typescript/src/types/browser.d.ts.map +1 -0
- package/lib/typescript/src/types/index.d.ts +3 -0
- package/lib/typescript/src/types/index.d.ts.map +1 -0
- 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 +35 -0
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -0
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +39 -0
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -0
- package/lib/typescript/src/utils/resolveAssetSource.d.ts +4 -0
- package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -0
- package/lib/typescript/src/utils/useDebug.d.ts +65 -0
- package/lib/typescript/src/utils/useDebug.d.ts.map +1 -0
- package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts +14 -0
- package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts.map +1 -0
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +176 -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/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 +71 -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/nitro.json +24 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +88 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.gradle +27 -0
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +124 -0
- package/nitrogen/generated/android/AudioBrowserOnLoad.hpp +25 -0
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +68 -0
- package/nitrogen/generated/android/c++/JAndroidAudioOffloadSettings.hpp +61 -0
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JAndroidPlayerWakeMode.hpp +62 -0
- package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JAppKilledPlaybackBehavior.hpp +62 -0
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +163 -0
- package/nitrogen/generated/android/c++/JBatteryOptimizationStatus.hpp +62 -0
- package/nitrogen/generated/android/c++/JBatteryOptimizationStatusChangedEvent.hpp +58 -0
- package/nitrogen/generated/android/c++/JBatteryWarningPendingChangedEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JBrowseError.hpp +57 -0
- package/nitrogen/generated/android/c++/JBrowseResult.cpp +26 -0
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +83 -0
- package/nitrogen/generated/android/c++/JBrowserSourceCallbackParam.hpp +76 -0
- package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +65 -0
- package/nitrogen/generated/android/c++/JChapterMetadata.hpp +70 -0
- package/nitrogen/generated/android/c++/JEqualizerSettings.hpp +125 -0
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +71 -0
- package/nitrogen/generated/android/c++/JFormatNavigationErrorParams.hpp +72 -0
- package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +61 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.hpp +111 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.hpp +134 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +143 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +136 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +143 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +157 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_BatteryOptimizationStatusChangedEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_BatteryWarningPendingChangedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_EqualizerSettings.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +88 -0
- package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_NavigationErrorEvent.hpp +83 -0
- package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +89 -0
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +98 -0
- package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +83 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +88 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackPlayWhenReadyChangedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackProgressUpdatedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackQueueEndedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlayingState.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpBackwardEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpForwardEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemotePlayIdEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemotePlaySearchEvent.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSeekEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSkipEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RepeatModeChangedEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_TrackMetadata.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_double.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_FormattedNavigationError_.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +89 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.hpp +84 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_ChapterMetadata_.hpp +98 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +105 -0
- package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JHttpMethod.hpp +74 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +1811 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +250 -0
- package/nitrogen/generated/android/c++/JIOSCategory.hpp +71 -0
- package/nitrogen/generated/android/c++/JIOSCategoryMode.hpp +80 -0
- package/nitrogen/generated/android/c++/JIOSCategoryOptions.hpp +74 -0
- package/nitrogen/generated/android/c++/JIOSCategoryPolicy.hpp +62 -0
- package/nitrogen/generated/android/c++/JImageContext.hpp +61 -0
- package/nitrogen/generated/android/c++/JImageQueryParams.hpp +62 -0
- package/nitrogen/generated/android/c++/JImageSource.hpp +86 -0
- package/nitrogen/generated/android/c++/JIosOutput.hpp +67 -0
- package/nitrogen/generated/android/c++/JIosOutputType.hpp +86 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +153 -0
- package/nitrogen/generated/android/c++/JMediaTransformParams.hpp +69 -0
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +196 -0
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +147 -0
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +105 -0
- package/nitrogen/generated/android/c++/JNavigationError.hpp +72 -0
- package/nitrogen/generated/android/c++/JNavigationErrorEvent.hpp +62 -0
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +68 -0
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JNotificationButton.hpp +68 -0
- package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
- package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +104 -0
- package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +62 -0
- package/nitrogen/generated/android/c++/JOptions.hpp +97 -0
- package/nitrogen/generated/android/c++/JPartialAndroidSetupPlayerOptions.hpp +104 -0
- package/nitrogen/generated/android/c++/JPartialIOSSetupPlayerOptions.hpp +100 -0
- 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 +66 -0
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +83 -0
- package/nitrogen/generated/android/c++/JPlaybackError.hpp +61 -0
- package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +60 -0
- package/nitrogen/generated/android/c++/JPlaybackPlayWhenReadyChangedEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JPlaybackProgressUpdatedEvent.hpp +69 -0
- package/nitrogen/generated/android/c++/JPlaybackQueueEndedEvent.hpp +61 -0
- package/nitrogen/generated/android/c++/JPlaybackState.hpp +80 -0
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +101 -0
- package/nitrogen/generated/android/c++/JPlayingState.hpp +61 -0
- package/nitrogen/generated/android/c++/JProgress.hpp +65 -0
- package/nitrogen/generated/android/c++/JRatingType.hpp +74 -0
- package/nitrogen/generated/android/c++/JRemoteJumpBackwardEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemoteJumpForwardEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemotePlayIdEvent.hpp +62 -0
- package/nitrogen/generated/android/c++/JRemotePlaySearchEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemoteSeekEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
- package/nitrogen/generated/android/c++/JRemoteSkipEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRepeatMode.hpp +62 -0
- package/nitrogen/generated/android/c++/JRepeatModeChangedEvent.hpp +58 -0
- package/nitrogen/generated/android/c++/JRequestConfig.hpp +115 -0
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +154 -0
- package/nitrogen/generated/android/c++/JRetryConfig.hpp +61 -0
- package/nitrogen/generated/android/c++/JSearchMode.hpp +71 -0
- package/nitrogen/generated/android/c++/JSearchParams.hpp +84 -0
- package/nitrogen/generated/android/c++/JSleepTimer.cpp +30 -0
- package/nitrogen/generated/android/c++/JSleepTimer.hpp +88 -0
- package/nitrogen/generated/android/c++/JSleepTimerEndOfTrack.hpp +57 -0
- package/nitrogen/generated/android/c++/JSleepTimerTime.hpp +57 -0
- package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JThumbsRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JTimedMetadata.hpp +74 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +129 -0
- package/nitrogen/generated/android/c++/JTrackMetadata.hpp +118 -0
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +59 -0
- package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +134 -0
- package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.hpp +70 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.hpp +70 -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_Double.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -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 +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioOffloadSettings.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidPlayerWakeMode.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AppKilledPlaybackBehavior.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +72 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AudioBrowserOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatus.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatusChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryWarningPendingChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseError.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseResult.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowserSourceCallbackParam.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ChapterMetadata.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/EqualizerSettings.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FavoriteChangedEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNavigationErrorParams.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryOptimizationStatusChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryWarningPendingChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_EqualizerSettings.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_FavoriteChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_IosOutput.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NavigationErrorEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NowPlayingMetadata.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Options.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Playback.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackActiveTrackChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackErrorEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackPlayWhenReadyChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackProgressUpdatedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackQueueEndedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlayingState.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpBackwardEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpForwardEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlayIdEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlaySearchEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSeekEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSetRatingEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSkipEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RepeatModeChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TimedMetadata.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TrackMetadata.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_double.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_FormattedNavigationError_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_ResolvedTrack_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__string.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_ChapterMetadata_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_Track_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HeartRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HttpMethod.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +1137 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategory.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryMode.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryOptions.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryPolicy.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageContext.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageQueryParams.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageSource.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutput.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +30 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +69 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaTransformParams.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +69 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +63 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationError.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialAndroidSetupPlayerOptions.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialIOSSetupPlayerOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PercentageRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Playback.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackActiveTrackChangedEvent.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackPlayWhenReadyChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackProgressUpdatedEvent.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackQueueEndedEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +71 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayingState.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Progress.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RatingType.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpBackwardEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpForwardEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlayIdEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlaySearchEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSeekEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSetRatingEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSkipEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatMode.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatModeChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RequestConfig.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +89 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimer.kt +72 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerEndOfTrack.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerTime.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StarRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ThumbsRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TimedMetadata.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +86 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackMetadata.kt +83 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_AndroidAudioOffloadSettings.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_RetryConfig.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +85 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_Double.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_NotificationButtonLayout.kt +59 -0
- package/nitrogen/generated/ios/AudioBrowser+autolinking.rb +60 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +407 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +2822 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +300 -0
- package/nitrogen/generated/ios/AudioBrowserAutolinking.mm +33 -0
- package/nitrogen/generated/ios/AudioBrowserAutolinking.swift +25 -0
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +1190 -0
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +52 -0
- package/nitrogen/generated/ios/swift/AndroidAudioOffloadSettings.swift +85 -0
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +125 -0
- package/nitrogen/generated/ios/swift/AndroidPlayerWakeMode.swift +44 -0
- package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +187 -0
- package/nitrogen/generated/ios/swift/AppKilledPlaybackBehavior.swift +44 -0
- package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +445 -0
- package/nitrogen/generated/ios/swift/BatteryOptimizationStatus.swift +44 -0
- package/nitrogen/generated/ios/swift/BatteryOptimizationStatusChangedEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/BatteryWarningPendingChangedEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/BrowseError.swift +36 -0
- package/nitrogen/generated/ios/swift/BrowseResult.swift +18 -0
- package/nitrogen/generated/ios/swift/BrowserSourceCallbackParam.swift +86 -0
- package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +48 -0
- package/nitrogen/generated/ios/swift/ChapterMetadata.swift +107 -0
- package/nitrogen/generated/ios/swift/EqualizerSettings.swift +168 -0
- package/nitrogen/generated/ios/swift/FavoriteChangedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/FormatNavigationErrorParams.swift +58 -0
- package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.swift +62 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +77 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.swift +62 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +69 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.swift +68 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_BatteryOptimizationStatusChangedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_BatteryWarningPendingChangedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_EqualizerSettings.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_FavoriteChangedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_IosOutput.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_NavigationErrorEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_NowPlayingMetadata.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_Options.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_Playback.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackActiveTrackChangedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackErrorEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackPlayWhenReadyChangedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackProgressUpdatedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackQueueEndedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlayingState.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteJumpBackwardEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteJumpForwardEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RemotePlayIdEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RemotePlaySearchEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteSeekEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteSetRatingEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteSkipEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RepeatModeChangedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RequestConfig.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_TrackMetadata.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_double.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_FormattedNavigationError_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_ResolvedTrack_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.swift +69 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_RequestConfig__.swift +67 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift +67 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_Track___.swift +67 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError_.swift +59 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_ChapterMetadata_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_Track_.swift +47 -0
- package/nitrogen/generated/ios/swift/HeartRating.swift +36 -0
- package/nitrogen/generated/ios/swift/HttpMethod.swift +60 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +181 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +2352 -0
- package/nitrogen/generated/ios/swift/IOSCategory.swift +56 -0
- package/nitrogen/generated/ios/swift/IOSCategoryMode.swift +68 -0
- package/nitrogen/generated/ios/swift/IOSCategoryOptions.swift +60 -0
- package/nitrogen/generated/ios/swift/IOSCategoryPolicy.swift +44 -0
- package/nitrogen/generated/ios/swift/ImageContext.swift +71 -0
- package/nitrogen/generated/ios/swift/ImageQueryParams.swift +85 -0
- package/nitrogen/generated/ios/swift/ImageSource.swift +139 -0
- package/nitrogen/generated/ios/swift/IosOutput.swift +58 -0
- package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
- package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +434 -0
- package/nitrogen/generated/ios/swift/MediaTransformParams.swift +59 -0
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +360 -0
- package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +275 -0
- package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +215 -0
- package/nitrogen/generated/ios/swift/NavigationError.swift +100 -0
- package/nitrogen/generated/ios/swift/NavigationErrorEvent.swift +48 -0
- package/nitrogen/generated/ios/swift/NavigationErrorType.swift +52 -0
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +187 -0
- package/nitrogen/generated/ios/swift/NotificationButton.swift +52 -0
- package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +159 -0
- package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +351 -0
- package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +85 -0
- package/nitrogen/generated/ios/swift/Options.swift +148 -0
- package/nitrogen/generated/ios/swift/PartialAndroidSetupPlayerOptions.swift +328 -0
- package/nitrogen/generated/ios/swift/PartialIOSSetupPlayerOptions.swift +159 -0
- package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +157 -0
- package/nitrogen/generated/ios/swift/PercentageRating.swift +36 -0
- package/nitrogen/generated/ios/swift/Playback.swift +59 -0
- package/nitrogen/generated/ios/swift/PlaybackActiveTrackChangedEvent.swift +128 -0
- package/nitrogen/generated/ios/swift/PlaybackError.swift +47 -0
- package/nitrogen/generated/ios/swift/PlaybackErrorEvent.swift +48 -0
- package/nitrogen/generated/ios/swift/PlaybackPlayWhenReadyChangedEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/PlaybackProgressUpdatedEvent.swift +69 -0
- package/nitrogen/generated/ios/swift/PlaybackQueueEndedEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/PlaybackState.swift +68 -0
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +385 -0
- package/nitrogen/generated/ios/swift/PlayingState.swift +47 -0
- package/nitrogen/generated/ios/swift/Progress.swift +58 -0
- package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
- package/nitrogen/generated/ios/swift/RemoteJumpBackwardEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/RemoteJumpForwardEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/RemotePlayIdEvent.swift +59 -0
- package/nitrogen/generated/ios/swift/RemotePlaySearchEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/RemoteSeekEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +76 -0
- package/nitrogen/generated/ios/swift/RemoteSkipEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
- package/nitrogen/generated/ios/swift/RepeatModeChangedEvent.swift +36 -0
- package/nitrogen/generated/ios/swift/RequestConfig.swift +298 -0
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +511 -0
- package/nitrogen/generated/ios/swift/RetryConfig.swift +59 -0
- package/nitrogen/generated/ios/swift/SearchMode.swift +56 -0
- package/nitrogen/generated/ios/swift/SearchParams.swift +209 -0
- package/nitrogen/generated/ios/swift/SleepTimer.swift +19 -0
- package/nitrogen/generated/ios/swift/SleepTimerEndOfTrack.swift +36 -0
- package/nitrogen/generated/ios/swift/SleepTimerTime.swift +36 -0
- package/nitrogen/generated/ios/swift/StarRating.swift +36 -0
- package/nitrogen/generated/ios/swift/ThumbsRating.swift +36 -0
- package/nitrogen/generated/ios/swift/TimedMetadata.swift +175 -0
- package/nitrogen/generated/ios/swift/Track.swift +488 -0
- package/nitrogen/generated/ios/swift/TrackMetadata.swift +505 -0
- package/nitrogen/generated/ios/swift/TrackStyle.swift +40 -0
- package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +372 -0
- package/nitrogen/generated/ios/swift/UpdateOptions.swift +215 -0
- package/nitrogen/generated/ios/swift/Variant_Bool_AndroidAudioOffloadSettings.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_Bool_RetryConfig.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_NotificationButtonLayout.swift +18 -0
- package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +88 -0
- package/nitrogen/generated/shared/c++/AndroidAudioOffloadSettings.hpp +79 -0
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +101 -0
- package/nitrogen/generated/shared/c++/AndroidPlayerWakeMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +101 -0
- package/nitrogen/generated/shared/c++/AppKilledPlaybackBehavior.hpp +80 -0
- package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +133 -0
- package/nitrogen/generated/shared/c++/BatteryOptimizationStatus.hpp +80 -0
- package/nitrogen/generated/shared/c++/BatteryOptimizationStatusChangedEvent.hpp +76 -0
- package/nitrogen/generated/shared/c++/BatteryWarningPendingChangedEvent.hpp +75 -0
- package/nitrogen/generated/shared/c++/BrowseError.hpp +75 -0
- package/nitrogen/generated/shared/c++/BrowserSourceCallbackParam.hpp +81 -0
- package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +84 -0
- package/nitrogen/generated/shared/c++/ChapterMetadata.hpp +88 -0
- package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +105 -0
- package/nitrogen/generated/shared/c++/FavoriteChangedEvent.hpp +80 -0
- package/nitrogen/generated/shared/c++/FormatNavigationErrorParams.hpp +88 -0
- package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +79 -0
- package/nitrogen/generated/shared/c++/HeartRating.hpp +75 -0
- package/nitrogen/generated/shared/c++/HttpMethod.hpp +96 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +207 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +375 -0
- package/nitrogen/generated/shared/c++/IOSCategory.hpp +92 -0
- package/nitrogen/generated/shared/c++/IOSCategoryMode.hpp +104 -0
- package/nitrogen/generated/shared/c++/IOSCategoryOptions.hpp +96 -0
- package/nitrogen/generated/shared/c++/IOSCategoryPolicy.hpp +80 -0
- package/nitrogen/generated/shared/c++/ImageContext.hpp +79 -0
- package/nitrogen/generated/shared/c++/ImageQueryParams.hpp +80 -0
- package/nitrogen/generated/shared/c++/ImageSource.hpp +91 -0
- package/nitrogen/generated/shared/c++/IosOutput.hpp +85 -0
- package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
- package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +123 -0
- package/nitrogen/generated/shared/c++/MediaTransformParams.hpp +84 -0
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +135 -0
- package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +131 -0
- package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +103 -0
- package/nitrogen/generated/shared/c++/NavigationError.hpp +90 -0
- package/nitrogen/generated/shared/c++/NavigationErrorEvent.hpp +77 -0
- package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +88 -0
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +101 -0
- package/nitrogen/generated/shared/c++/NotificationButton.hpp +88 -0
- package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +94 -0
- package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +124 -0
- package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +80 -0
- package/nitrogen/generated/shared/c++/Options.hpp +105 -0
- package/nitrogen/generated/shared/c++/PartialAndroidSetupPlayerOptions.hpp +121 -0
- package/nitrogen/generated/shared/c++/PartialIOSSetupPlayerOptions.hpp +103 -0
- package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +96 -0
- package/nitrogen/generated/shared/c++/PercentageRating.hpp +75 -0
- package/nitrogen/generated/shared/c++/Playback.hpp +84 -0
- package/nitrogen/generated/shared/c++/PlaybackActiveTrackChangedEvent.hpp +93 -0
- package/nitrogen/generated/shared/c++/PlaybackError.hpp +79 -0
- package/nitrogen/generated/shared/c++/PlaybackErrorEvent.hpp +77 -0
- package/nitrogen/generated/shared/c++/PlaybackPlayWhenReadyChangedEvent.hpp +75 -0
- package/nitrogen/generated/shared/c++/PlaybackProgressUpdatedEvent.hpp +87 -0
- package/nitrogen/generated/shared/c++/PlaybackQueueEndedEvent.hpp +79 -0
- package/nitrogen/generated/shared/c++/PlaybackState.hpp +104 -0
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +119 -0
- package/nitrogen/generated/shared/c++/PlayingState.hpp +79 -0
- package/nitrogen/generated/shared/c++/Progress.hpp +83 -0
- package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
- package/nitrogen/generated/shared/c++/RemoteJumpBackwardEvent.hpp +75 -0
- package/nitrogen/generated/shared/c++/RemoteJumpForwardEvent.hpp +75 -0
- package/nitrogen/generated/shared/c++/RemotePlayIdEvent.hpp +80 -0
- package/nitrogen/generated/shared/c++/RemotePlaySearchEvent.hpp +75 -0
- package/nitrogen/generated/shared/c++/RemoteSeekEvent.hpp +75 -0
- package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +86 -0
- package/nitrogen/generated/shared/c++/RemoteSkipEvent.hpp +75 -0
- package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/RepeatModeChangedEvent.hpp +76 -0
- package/nitrogen/generated/shared/c++/RequestConfig.hpp +107 -0
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +153 -0
- package/nitrogen/generated/shared/c++/RetryConfig.hpp +79 -0
- package/nitrogen/generated/shared/c++/SearchMode.hpp +92 -0
- package/nitrogen/generated/shared/c++/SearchParams.hpp +102 -0
- package/nitrogen/generated/shared/c++/SleepTimerEndOfTrack.hpp +75 -0
- package/nitrogen/generated/shared/c++/SleepTimerTime.hpp +75 -0
- package/nitrogen/generated/shared/c++/StarRating.hpp +75 -0
- package/nitrogen/generated/shared/c++/ThumbsRating.hpp +75 -0
- package/nitrogen/generated/shared/c++/TimedMetadata.hpp +92 -0
- package/nitrogen/generated/shared/c++/Track.hpp +145 -0
- package/nitrogen/generated/shared/c++/TrackMetadata.hpp +136 -0
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +76 -0
- package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +116 -0
- package/nitrogen/generated/shared/c++/UpdateOptions.hpp +103 -0
- package/package.json +120 -0
- package/src/AudioBrowser.ts +4 -0
- package/src/features/battery.ts +176 -0
- package/src/features/browser.ts +315 -0
- package/src/features/equalizer.ts +64 -0
- package/src/features/errors.ts +196 -0
- package/src/features/favorites.ts +102 -0
- package/src/features/index.ts +23 -0
- package/src/features/metadata.ts +130 -0
- package/src/features/network.ts +34 -0
- package/src/features/nowPlaying.ts +56 -0
- package/src/features/output.ts +50 -0
- package/src/features/playback/controls.ts +66 -0
- package/src/features/playback/index.ts +7 -0
- package/src/features/playback/playWhenReady.ts +57 -0
- package/src/features/playback/playing.ts +40 -0
- package/src/features/playback/progress.ts +122 -0
- package/src/features/playback/rate.ts +22 -0
- package/src/features/playback/state.ts +72 -0
- package/src/features/playback/volume.ts +59 -0
- package/src/features/player/index.ts +2 -0
- package/src/features/player/options.ts +479 -0
- package/src/features/player/setup.ts +551 -0
- package/src/features/queue/activeTrack.ts +59 -0
- package/src/features/queue/index.ts +4 -0
- package/src/features/queue/queue.ts +173 -0
- package/src/features/queue/repeatMode.ts +58 -0
- package/src/features/queue/shuffle.ts +49 -0
- package/src/features/rating.ts +17 -0
- package/src/features/remoteControls.ts +341 -0
- package/src/features/sleepTimer.ts +186 -0
- package/src/index.ts +5 -0
- package/src/native.ts +5 -0
- package/src/native.web.ts +4 -0
- package/src/specs/audio-browser.nitro.ts +326 -0
- package/src/types/browser-native.ts +66 -0
- package/src/types/browser-nodes.ts +174 -0
- package/src/types/browser.ts +792 -0
- package/src/types/index.ts +2 -0
- package/src/types/player.ts +69 -0
- package/src/utils/LazyNativeEmitter.ts +58 -0
- package/src/utils/NativeUpdatedValue.ts +56 -0
- package/src/utils/resolveAssetSource.ts +4 -0
- package/src/utils/useDebug.ts +283 -0
- package/src/utils/useNativeUpdatedValue.ts +41 -0
- package/src/web/NativeAudioBrowser.ts +781 -0
- package/src/web/SimpleRouter.ts +177 -0
- package/src/web/TrackPlayer/Event.ts +11 -0
- package/src/web/TrackPlayer/Player.ts +323 -0
- package/src/web/TrackPlayer/PlaylistPlayer.ts +337 -0
- package/src/web/TrackPlayer/RepeatMode.ts +7 -0
- package/src/web/TrackPlayer/SetupNotCalledError.ts +5 -0
- package/src/web/TrackPlayer/SleepTimer.ts +71 -0
- package/src/web/TrackPlayer/State.ts +15 -0
- package/src/web/TrackPlayer/index.ts +4 -0
- package/src/web/browser/BrowserManager.ts +642 -0
- package/src/web/browser/FavoriteManager.ts +77 -0
- package/src/web/browser/NavigationErrorManager.ts +112 -0
- package/src/web/browser/SearchManager.ts +82 -0
- package/src/web/http/HttpClient.ts +107 -0
- package/src/web/http/RequestConfigBuilder.ts +347 -0
- package/src/web/player/NowPlayingManager.ts +83 -0
- package/src/web/player/OptionsManager.ts +101 -0
- package/src/web/util/BrowserPathHelper.ts +147 -0
- package/src/web/util/shuffle.ts +14 -0
|
@@ -0,0 +1,1191 @@
|
|
|
1
|
+
package com.audiobrowser
|
|
2
|
+
|
|
3
|
+
import android.content.ComponentName
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.content.Intent
|
|
6
|
+
import android.content.ServiceConnection
|
|
7
|
+
import android.os.Handler
|
|
8
|
+
import android.os.IBinder
|
|
9
|
+
import android.os.Looper
|
|
10
|
+
import androidx.annotation.Keep
|
|
11
|
+
import androidx.lifecycle.DefaultLifecycleObserver
|
|
12
|
+
import androidx.lifecycle.LifecycleOwner
|
|
13
|
+
import androidx.lifecycle.ProcessLifecycleOwner
|
|
14
|
+
import androidx.media3.session.MediaBrowser
|
|
15
|
+
import androidx.media3.session.SessionToken
|
|
16
|
+
import com.audiobrowser.browser.BrowserConfig
|
|
17
|
+
import com.audiobrowser.browser.BrowserManager
|
|
18
|
+
import com.audiobrowser.browser.CallbackException
|
|
19
|
+
import com.audiobrowser.browser.ContentNotFoundException
|
|
20
|
+
import com.audiobrowser.browser.HttpStatusException
|
|
21
|
+
import com.audiobrowser.browser.NetworkException
|
|
22
|
+
import com.audiobrowser.extension.NumberExt.Companion.toSeconds
|
|
23
|
+
import com.audiobrowser.http.RequestConfigBuilder
|
|
24
|
+
import com.audiobrowser.model.PlaybackMetadata
|
|
25
|
+
import com.audiobrowser.model.PlayerSetupOptions
|
|
26
|
+
import com.audiobrowser.model.PlayerUpdateOptions
|
|
27
|
+
import com.audiobrowser.util.BatteryOptimizationHelper
|
|
28
|
+
import com.audiobrowser.util.BatteryWarningStore
|
|
29
|
+
import com.audiobrowser.util.BrowserPathHelper
|
|
30
|
+
import com.audiobrowser.util.CoilBitmapLoader
|
|
31
|
+
import com.audiobrowser.util.SystemVolumeMonitor
|
|
32
|
+
import com.facebook.proguard.annotations.DoNotStrip
|
|
33
|
+
import com.google.common.util.concurrent.ListenableFuture
|
|
34
|
+
import com.margelo.nitro.NitroModules
|
|
35
|
+
import com.margelo.nitro.audiobrowser.ChapterMetadata
|
|
36
|
+
import com.margelo.nitro.audiobrowser.TimedMetadata
|
|
37
|
+
import com.margelo.nitro.audiobrowser.TrackMetadata
|
|
38
|
+
import com.margelo.nitro.audiobrowser.BatteryOptimizationStatus
|
|
39
|
+
import com.margelo.nitro.audiobrowser.BatteryOptimizationStatusChangedEvent
|
|
40
|
+
import com.margelo.nitro.audiobrowser.BatteryWarningPendingChangedEvent
|
|
41
|
+
import com.margelo.nitro.audiobrowser.EqualizerSettings
|
|
42
|
+
import com.margelo.nitro.audiobrowser.FavoriteChangedEvent
|
|
43
|
+
import com.margelo.nitro.audiobrowser.FormatNavigationErrorParams
|
|
44
|
+
import com.margelo.nitro.audiobrowser.FormattedNavigationError
|
|
45
|
+
import com.margelo.nitro.audiobrowser.HybridAudioBrowserSpec
|
|
46
|
+
import com.margelo.nitro.audiobrowser.IosOutput
|
|
47
|
+
import com.margelo.nitro.audiobrowser.MediaRequestConfig
|
|
48
|
+
import com.margelo.nitro.audiobrowser.NativeBrowserConfiguration
|
|
49
|
+
import com.margelo.nitro.audiobrowser.NativeUpdateOptions
|
|
50
|
+
import com.margelo.nitro.audiobrowser.NavigationError
|
|
51
|
+
import com.margelo.nitro.audiobrowser.NavigationErrorEvent
|
|
52
|
+
import com.margelo.nitro.audiobrowser.NavigationErrorType
|
|
53
|
+
import com.margelo.nitro.audiobrowser.NowPlayingMetadata
|
|
54
|
+
import com.margelo.nitro.audiobrowser.NowPlayingUpdate
|
|
55
|
+
import com.margelo.nitro.audiobrowser.Options
|
|
56
|
+
import com.margelo.nitro.audiobrowser.PartialSetupPlayerOptions
|
|
57
|
+
import com.margelo.nitro.audiobrowser.Playback
|
|
58
|
+
import com.margelo.nitro.audiobrowser.PlaybackActiveTrackChangedEvent
|
|
59
|
+
import com.margelo.nitro.audiobrowser.PlaybackError
|
|
60
|
+
import com.margelo.nitro.audiobrowser.PlaybackErrorEvent
|
|
61
|
+
import com.margelo.nitro.audiobrowser.PlaybackPlayWhenReadyChangedEvent
|
|
62
|
+
import com.margelo.nitro.audiobrowser.PlaybackProgressUpdatedEvent
|
|
63
|
+
import com.margelo.nitro.audiobrowser.PlaybackQueueEndedEvent
|
|
64
|
+
import com.margelo.nitro.audiobrowser.PlayingState
|
|
65
|
+
import com.margelo.nitro.audiobrowser.Progress
|
|
66
|
+
import com.margelo.nitro.audiobrowser.RemoteJumpBackwardEvent
|
|
67
|
+
import com.margelo.nitro.audiobrowser.RemoteJumpForwardEvent
|
|
68
|
+
import com.margelo.nitro.audiobrowser.RemotePlayIdEvent
|
|
69
|
+
import com.margelo.nitro.audiobrowser.RemotePlaySearchEvent
|
|
70
|
+
import com.margelo.nitro.audiobrowser.RemoteSeekEvent
|
|
71
|
+
import com.margelo.nitro.audiobrowser.RemoteSetRatingEvent
|
|
72
|
+
import com.margelo.nitro.audiobrowser.RemoteSkipEvent
|
|
73
|
+
import com.margelo.nitro.audiobrowser.RepeatMode
|
|
74
|
+
import com.margelo.nitro.audiobrowser.RepeatModeChangedEvent
|
|
75
|
+
import com.margelo.nitro.audiobrowser.RequestConfig
|
|
76
|
+
import com.margelo.nitro.audiobrowser.ResolvedTrack
|
|
77
|
+
import com.margelo.nitro.audiobrowser.SleepTimer
|
|
78
|
+
import com.margelo.nitro.audiobrowser.Track
|
|
79
|
+
import com.margelo.nitro.audiobrowser.UpdateOptions
|
|
80
|
+
import com.margelo.nitro.core.Promise
|
|
81
|
+
import java.util.concurrent.TimeUnit
|
|
82
|
+
import kotlin.coroutines.resume
|
|
83
|
+
import kotlin.coroutines.resumeWithException
|
|
84
|
+
import kotlin.coroutines.suspendCoroutine
|
|
85
|
+
import kotlinx.coroutines.CancellationException
|
|
86
|
+
import kotlinx.coroutines.Job
|
|
87
|
+
import kotlinx.coroutines.MainScope
|
|
88
|
+
import kotlinx.coroutines.cancelChildren
|
|
89
|
+
import kotlinx.coroutines.delay
|
|
90
|
+
import kotlinx.coroutines.launch
|
|
91
|
+
import kotlinx.coroutines.runBlocking
|
|
92
|
+
import timber.log.Timber
|
|
93
|
+
|
|
94
|
+
@Keep
|
|
95
|
+
@DoNotStrip
|
|
96
|
+
class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
97
|
+
private val mainScope = MainScope()
|
|
98
|
+
private var navigationJob: Job? = null
|
|
99
|
+
private val handler = Handler(Looper.getMainLooper())
|
|
100
|
+
private val context =
|
|
101
|
+
NitroModules.applicationContext
|
|
102
|
+
?: throw IllegalStateException("NitroModules.applicationContext is null")
|
|
103
|
+
|
|
104
|
+
// MARK: Browser state
|
|
105
|
+
private var _configuration =
|
|
106
|
+
NativeBrowserConfiguration(
|
|
107
|
+
path = null,
|
|
108
|
+
request = null,
|
|
109
|
+
media = null,
|
|
110
|
+
artwork = null,
|
|
111
|
+
routes = null,
|
|
112
|
+
singleTrack = null,
|
|
113
|
+
androidControllerOfflineError = null,
|
|
114
|
+
carPlayUpNextButton = null,
|
|
115
|
+
carPlayNowPlayingButtons = null,
|
|
116
|
+
formatNavigationError = null,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
internal val browserManager =
|
|
120
|
+
BrowserManager().apply {
|
|
121
|
+
setOnPathChanged { path -> onPathChanged(path) }
|
|
122
|
+
setOnContentChanged { content -> onContentChanged(content) }
|
|
123
|
+
setOnTabsChanged { tabs -> onTabsChanged(tabs) }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private val systemVolumeMonitor = SystemVolumeMonitor(context)
|
|
127
|
+
|
|
128
|
+
// MARK: Player state
|
|
129
|
+
private var updateOptions: PlayerUpdateOptions = PlayerUpdateOptions()
|
|
130
|
+
private var mediaBrowserFuture: ListenableFuture<MediaBrowser>? = null
|
|
131
|
+
private var setupOptions = PlayerSetupOptions()
|
|
132
|
+
private var connectedService: Service? = null
|
|
133
|
+
private var setupPromise: ((Unit) -> Unit)? = null
|
|
134
|
+
|
|
135
|
+
/** Post callback to main handler for consistent async delivery to JS - avoids deadlocks */
|
|
136
|
+
private fun post(block: () -> Unit) = handler.post(block)
|
|
137
|
+
|
|
138
|
+
// MARK: Browser callbacks
|
|
139
|
+
override var onPathChanged: (String) -> Unit = {}
|
|
140
|
+
override var onContentChanged: (ResolvedTrack?) -> Unit = {}
|
|
141
|
+
override var onTabsChanged: (Array<Track>) -> Unit = {}
|
|
142
|
+
override var onNavigationError: (NavigationErrorEvent) -> Unit = {}
|
|
143
|
+
override var onFormattedNavigationError: (FormattedNavigationError?) -> Unit = {}
|
|
144
|
+
|
|
145
|
+
// MARK: Player callbacks
|
|
146
|
+
override var onPlaybackChanged: (data: Playback) -> Unit = {}
|
|
147
|
+
override var onRemoteBookmark: () -> Unit = {}
|
|
148
|
+
override var onRemoteDislike: () -> Unit = {}
|
|
149
|
+
override var onRemoteJumpBackward: (RemoteJumpBackwardEvent) -> Unit = {}
|
|
150
|
+
override var onRemoteJumpForward: (RemoteJumpForwardEvent) -> Unit = {}
|
|
151
|
+
override var onRemoteLike: () -> Unit = {}
|
|
152
|
+
override var onRemoteNext: () -> Unit = {}
|
|
153
|
+
override var onRemotePause: () -> Unit = {}
|
|
154
|
+
override var onChapterMetadata: (chapters: Array<ChapterMetadata>) -> Unit = {}
|
|
155
|
+
override var onTrackMetadata: (metadata: TrackMetadata) -> Unit = {}
|
|
156
|
+
override var onTimedMetadata: (metadata: TimedMetadata) -> Unit = {}
|
|
157
|
+
override var onPlaybackActiveTrackChanged: (data: PlaybackActiveTrackChangedEvent) -> Unit = {}
|
|
158
|
+
override var onPlaybackError: (data: PlaybackErrorEvent) -> Unit = {}
|
|
159
|
+
override var onPlaybackPlayWhenReadyChanged: (data: PlaybackPlayWhenReadyChangedEvent) -> Unit =
|
|
160
|
+
{}
|
|
161
|
+
override var onPlaybackPlayingState: (data: PlayingState) -> Unit = {}
|
|
162
|
+
override var onPlaybackProgressUpdated: (data: PlaybackProgressUpdatedEvent) -> Unit = {}
|
|
163
|
+
override var onPlaybackQueueEnded: (data: PlaybackQueueEndedEvent) -> Unit = {}
|
|
164
|
+
override var onPlaybackQueueChanged: (queue: Array<Track>) -> Unit = {}
|
|
165
|
+
override var onPlaybackRepeatModeChanged: (data: RepeatModeChangedEvent) -> Unit = {}
|
|
166
|
+
override var onPlaybackShuffleModeChanged: (enabled: Boolean) -> Unit = {}
|
|
167
|
+
override var onRemotePlay: (() -> Unit) = {}
|
|
168
|
+
override var onRemotePlayId: (RemotePlayIdEvent) -> Unit = {}
|
|
169
|
+
override var onRemotePlaySearch: (RemotePlaySearchEvent) -> Unit = {}
|
|
170
|
+
override var onRemotePrevious: () -> Unit = {}
|
|
171
|
+
override var onRemoteSeek: (RemoteSeekEvent) -> Unit = {}
|
|
172
|
+
override var onRemoteSetRating: (RemoteSetRatingEvent) -> Unit = {}
|
|
173
|
+
override var onRemoteSkip: (RemoteSkipEvent) -> Unit = {}
|
|
174
|
+
override var onRemoteStop: () -> Unit = {}
|
|
175
|
+
override var onOptionsChanged: (Options) -> Unit = {}
|
|
176
|
+
override var onFavoriteChanged: (FavoriteChangedEvent) -> Unit = {}
|
|
177
|
+
override var onNowPlayingChanged: (NowPlayingMetadata) -> Unit = {}
|
|
178
|
+
override var onOnlineChanged: (Boolean) -> Unit = {}
|
|
179
|
+
override var onEqualizerChanged: (EqualizerSettings) -> Unit = {}
|
|
180
|
+
override var onSleepTimerChanged: (SleepTimer?) -> Unit = {}
|
|
181
|
+
override var onBatteryWarningPendingChanged: (BatteryWarningPendingChangedEvent) -> Unit = {}
|
|
182
|
+
override var onBatteryOptimizationStatusChanged: (BatteryOptimizationStatusChangedEvent) -> Unit =
|
|
183
|
+
{}
|
|
184
|
+
override var onSystemVolumeChanged: (Double) -> Unit = {}
|
|
185
|
+
override var onIosOutputChanged: (IosOutput) -> Unit = {}
|
|
186
|
+
|
|
187
|
+
// MARK: Remote handlers
|
|
188
|
+
override var handleRemoteBookmark: (() -> Unit)? = null
|
|
189
|
+
override var handleRemoteDislike: (() -> Unit)? = null
|
|
190
|
+
override var handleRemoteJumpBackward: ((RemoteJumpBackwardEvent) -> Unit)? = null
|
|
191
|
+
override var handleRemoteJumpForward: ((RemoteJumpForwardEvent) -> Unit)? = null
|
|
192
|
+
override var handleRemoteLike: (() -> Unit)? = null
|
|
193
|
+
override var handleRemoteNext: (() -> Unit)? = null
|
|
194
|
+
override var handleRemotePause: (() -> Unit)? = null
|
|
195
|
+
override var handleRemotePlay: (() -> Unit)? = null
|
|
196
|
+
override var handleRemotePlayId: ((RemotePlayIdEvent) -> Unit)? = null
|
|
197
|
+
override var handleRemotePlaySearch: ((RemotePlaySearchEvent) -> Unit)? = null
|
|
198
|
+
override var handleRemotePrevious: (() -> Unit)? = null
|
|
199
|
+
override var handleRemoteSeek: ((RemoteSeekEvent) -> Unit)? = null
|
|
200
|
+
override var handleRemoteSkip: (() -> Unit)? = null
|
|
201
|
+
override var handleRemoteStop: (() -> Unit)? = null
|
|
202
|
+
|
|
203
|
+
/** Lifecycle observer to check battery status when app comes to foreground */
|
|
204
|
+
private val lifecycleObserver =
|
|
205
|
+
object : DefaultLifecycleObserver {
|
|
206
|
+
override fun onStart(owner: LifecycleOwner) {
|
|
207
|
+
checkBatteryStatusChange()
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
init {
|
|
212
|
+
// Auto-bind to service if it's already running
|
|
213
|
+
launchInScope {
|
|
214
|
+
try {
|
|
215
|
+
Timber.d("Attempting to auto-bind to existing AudioBrowserService from AudioBrowser")
|
|
216
|
+
val intent = Intent(context, Service::class.java)
|
|
217
|
+
val bound = context.bindService(intent, this@AudioBrowser, Context.BIND_AUTO_CREATE)
|
|
218
|
+
Timber.d("Auto-bind result: $bound")
|
|
219
|
+
|
|
220
|
+
if (!bound) {
|
|
221
|
+
Timber.w("Failed to bind to AudioBrowserService - service may not be running")
|
|
222
|
+
}
|
|
223
|
+
} catch (e: Exception) {
|
|
224
|
+
Timber.e(e, "Failed to auto-bind to AudioBrowserService during initialization")
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Observe app lifecycle to check battery status on foreground
|
|
229
|
+
// Must run on main thread as required by LifecycleRegistry.addObserver
|
|
230
|
+
handler.post { ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleObserver) }
|
|
231
|
+
|
|
232
|
+
// Observe system volume changes
|
|
233
|
+
systemVolumeMonitor.setOnVolumeChanged { volume ->
|
|
234
|
+
post { onSystemVolumeChanged(volume) }
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ============================================================================
|
|
239
|
+
// MARK: Browser Configuration
|
|
240
|
+
// ============================================================================
|
|
241
|
+
|
|
242
|
+
internal fun buildConfig(): BrowserConfig {
|
|
243
|
+
return BrowserConfig(
|
|
244
|
+
request = _configuration.request,
|
|
245
|
+
media = _configuration.media,
|
|
246
|
+
artwork = _configuration.artwork,
|
|
247
|
+
routes = _configuration.routes,
|
|
248
|
+
singleTrack = _configuration.singleTrack ?: false,
|
|
249
|
+
androidControllerOfflineError = _configuration.androidControllerOfflineError ?: true,
|
|
250
|
+
)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Returns the artwork configuration for use by CoilBitmapLoader. This provides access to the base
|
|
255
|
+
* request config and artwork-specific config.
|
|
256
|
+
*/
|
|
257
|
+
fun getArtworkConfig(): CoilBitmapLoader.ArtworkConfig? {
|
|
258
|
+
val artworkConfig = _configuration.artwork ?: return null
|
|
259
|
+
val baseConfig =
|
|
260
|
+
_configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
|
|
261
|
+
?: RequestConfig(null, null, null, null, null, null, null, null)
|
|
262
|
+
return CoilBitmapLoader.ArtworkConfig(baseConfig, artworkConfig)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Creates a request config for media URL transformation by merging base and media configs.
|
|
267
|
+
* Returns null if no media configuration is set.
|
|
268
|
+
*/
|
|
269
|
+
fun getMediaRequestConfig(originalUrl: String): MediaRequestConfig? {
|
|
270
|
+
val mediaConfig = _configuration.media ?: return null
|
|
271
|
+
|
|
272
|
+
return try {
|
|
273
|
+
// Create base request config with the original URL as path
|
|
274
|
+
val baseConfig =
|
|
275
|
+
_configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
|
|
276
|
+
?: RequestConfig(null, null, null, null, null, null, null, null)
|
|
277
|
+
val urlRequestConfig = RequestConfig(null, originalUrl, null, null, null, null, null, null)
|
|
278
|
+
val mergedBaseConfig = RequestConfigBuilder.mergeConfig(baseConfig, urlRequestConfig)
|
|
279
|
+
|
|
280
|
+
// Apply media transformation
|
|
281
|
+
runBlocking { RequestConfigBuilder.mergeConfig(mergedBaseConfig, mediaConfig) }
|
|
282
|
+
} catch (e: Exception) {
|
|
283
|
+
Timber.e(e, "Failed to transform media URL: $originalUrl")
|
|
284
|
+
null
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
private fun hasValidConfiguration(): Boolean {
|
|
289
|
+
// Need at least one browsable route (not just search)
|
|
290
|
+
return _configuration.routes?.any { it.path != BrowserManager.SEARCH_ROUTE_PATH } == true
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private fun getDefaultPath(): String? {
|
|
294
|
+
return try {
|
|
295
|
+
browserManager.config = buildConfig()
|
|
296
|
+
val tabs = runBlocking { browserManager.queryTabs() }
|
|
297
|
+
if (tabs.isNotEmpty()) {
|
|
298
|
+
Timber.d("Using first tab as default path: ${tabs[0].url}")
|
|
299
|
+
tabs[0].url
|
|
300
|
+
} else {
|
|
301
|
+
Timber.d("Using root path as default: /")
|
|
302
|
+
"/"
|
|
303
|
+
}
|
|
304
|
+
} catch (e: Exception) {
|
|
305
|
+
Timber.e(e, "Failed to get default path, falling back to /")
|
|
306
|
+
"/"
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// ============================================================================
|
|
311
|
+
// MARK: Browser Properties
|
|
312
|
+
// ============================================================================
|
|
313
|
+
|
|
314
|
+
override var path: String?
|
|
315
|
+
get() = browserManager.getPath()
|
|
316
|
+
set(value) {
|
|
317
|
+
if (hasValidConfiguration()) {
|
|
318
|
+
browserManager.config = buildConfig()
|
|
319
|
+
(value ?: getDefaultPath())?.let { path ->
|
|
320
|
+
clearNavigationError()
|
|
321
|
+
|
|
322
|
+
// Cancel previous navigation to avoid race conditions
|
|
323
|
+
navigationJob?.cancel()
|
|
324
|
+
|
|
325
|
+
navigationJob =
|
|
326
|
+
mainScope.launch {
|
|
327
|
+
try {
|
|
328
|
+
browserManager.navigate(path)
|
|
329
|
+
} catch (e: CancellationException) {
|
|
330
|
+
throw e // Rethrow to properly cancel
|
|
331
|
+
} catch (e: Exception) {
|
|
332
|
+
handleBrowserException(e, path, "setting path: $path")
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
override var tabs: Array<Track>?
|
|
340
|
+
get() = browserManager.getTabs()
|
|
341
|
+
set(value) {}
|
|
342
|
+
|
|
343
|
+
override var configuration: NativeBrowserConfiguration
|
|
344
|
+
get() = _configuration
|
|
345
|
+
set(value) {
|
|
346
|
+
_configuration = value
|
|
347
|
+
browserManager.config = buildConfig()
|
|
348
|
+
|
|
349
|
+
// Notify player that browser configuration is ready (routes/tabs available)
|
|
350
|
+
// This allows Android Auto to start browsing content
|
|
351
|
+
connectedService?.player?.notifyBrowserConfigurationReady()
|
|
352
|
+
|
|
353
|
+
// Navigate to initial path or default to first tab
|
|
354
|
+
(value.path ?: getDefaultPath())?.let { path ->
|
|
355
|
+
clearNavigationError()
|
|
356
|
+
|
|
357
|
+
// Cancel previous navigation to avoid race conditions
|
|
358
|
+
navigationJob?.cancel()
|
|
359
|
+
|
|
360
|
+
navigationJob =
|
|
361
|
+
mainScope.launch {
|
|
362
|
+
try {
|
|
363
|
+
browserManager.navigate(path)
|
|
364
|
+
} catch (e: CancellationException) {
|
|
365
|
+
throw e // Rethrow to properly cancel
|
|
366
|
+
} catch (e: Exception) {
|
|
367
|
+
handleBrowserException(e, path, "setting configuration path: $path")
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private var navigationError: NavigationError? = null
|
|
374
|
+
private var formattedNavigationError: FormattedNavigationError? = null
|
|
375
|
+
|
|
376
|
+
override fun getNavigationError(): NavigationError? = navigationError
|
|
377
|
+
override fun getFormattedNavigationError(): FormattedNavigationError? = formattedNavigationError
|
|
378
|
+
|
|
379
|
+
/** Creates a default formatted error from a NavigationError */
|
|
380
|
+
private fun defaultFormattedError(error: NavigationError): FormattedNavigationError {
|
|
381
|
+
val title = when (error.code) {
|
|
382
|
+
NavigationErrorType.CONTENT_NOT_FOUND -> "Content Not Found"
|
|
383
|
+
NavigationErrorType.NETWORK_ERROR -> "Network Error"
|
|
384
|
+
NavigationErrorType.HTTP_ERROR -> {
|
|
385
|
+
// Use system-localized HTTP status text (e.g., "Not Found", "Service Unavailable")
|
|
386
|
+
error.statusCode?.let { httpStatusText(it.toInt()) } ?: "Server Error"
|
|
387
|
+
}
|
|
388
|
+
NavigationErrorType.CALLBACK_ERROR -> "Error"
|
|
389
|
+
NavigationErrorType.UNKNOWN_ERROR -> "Error"
|
|
390
|
+
}
|
|
391
|
+
return FormattedNavigationError(title, error.message)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/** Returns localized HTTP status text for the given status code */
|
|
395
|
+
private fun httpStatusText(statusCode: Int): String {
|
|
396
|
+
return when (statusCode) {
|
|
397
|
+
400 -> "Bad Request"
|
|
398
|
+
401 -> "Unauthorized"
|
|
399
|
+
403 -> "Forbidden"
|
|
400
|
+
404 -> "Not Found"
|
|
401
|
+
405 -> "Method Not Allowed"
|
|
402
|
+
408 -> "Request Timeout"
|
|
403
|
+
429 -> "Too Many Requests"
|
|
404
|
+
500 -> "Internal Server Error"
|
|
405
|
+
502 -> "Bad Gateway"
|
|
406
|
+
503 -> "Service Unavailable"
|
|
407
|
+
504 -> "Gateway Timeout"
|
|
408
|
+
else -> "Server Error"
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
private fun setNavigationError(
|
|
413
|
+
code: NavigationErrorType,
|
|
414
|
+
message: String,
|
|
415
|
+
path: String,
|
|
416
|
+
statusCode: Double? = null,
|
|
417
|
+
statusCodeSuccess: Boolean? = null,
|
|
418
|
+
) {
|
|
419
|
+
val navError = NavigationError(code, message, statusCode, statusCodeSuccess)
|
|
420
|
+
navigationError = navError
|
|
421
|
+
onNavigationError(NavigationErrorEvent(navigationError))
|
|
422
|
+
|
|
423
|
+
// Format the error (async if using JS callback, sync for defaults)
|
|
424
|
+
val defaultFormatted = defaultFormattedError(navError)
|
|
425
|
+
val formatter = _configuration.formatNavigationError
|
|
426
|
+
if (formatter != null) {
|
|
427
|
+
mainScope.launch {
|
|
428
|
+
try {
|
|
429
|
+
val params = FormatNavigationErrorParams(navError, defaultFormatted, path)
|
|
430
|
+
val customFormatted = formatter(params).await()
|
|
431
|
+
formattedNavigationError = customFormatted ?: defaultFormatted
|
|
432
|
+
} catch (e: Exception) {
|
|
433
|
+
formattedNavigationError = defaultFormatted
|
|
434
|
+
}
|
|
435
|
+
onFormattedNavigationError(formattedNavigationError)
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
formattedNavigationError = defaultFormatted
|
|
439
|
+
onFormattedNavigationError(formattedNavigationError)
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** Maps common browser exceptions to navigation errors */
|
|
444
|
+
private fun handleBrowserException(e: Exception, path: String, logContext: String) {
|
|
445
|
+
when (e) {
|
|
446
|
+
is HttpStatusException -> {
|
|
447
|
+
Timber.e(e, "HTTP error $logContext")
|
|
448
|
+
setNavigationError(
|
|
449
|
+
NavigationErrorType.HTTP_ERROR,
|
|
450
|
+
e.message ?: "Server error",
|
|
451
|
+
path,
|
|
452
|
+
e.statusCode.toDouble(),
|
|
453
|
+
e.statusCode in 200..299,
|
|
454
|
+
)
|
|
455
|
+
}
|
|
456
|
+
is NetworkException -> {
|
|
457
|
+
Timber.e(e, "Network error $logContext")
|
|
458
|
+
setNavigationError(NavigationErrorType.NETWORK_ERROR, e.message ?: "Network request failed", path)
|
|
459
|
+
}
|
|
460
|
+
is ContentNotFoundException -> {
|
|
461
|
+
Timber.e(e, "Content not found $logContext")
|
|
462
|
+
setNavigationError(NavigationErrorType.CONTENT_NOT_FOUND, e.message ?: "Content not found", path)
|
|
463
|
+
}
|
|
464
|
+
is CallbackException -> {
|
|
465
|
+
Timber.e(e, "Callback error $logContext")
|
|
466
|
+
setNavigationError(NavigationErrorType.CALLBACK_ERROR, e.message ?: "An error occurred", path)
|
|
467
|
+
}
|
|
468
|
+
else -> {
|
|
469
|
+
Timber.e(e, "Unexpected error $logContext")
|
|
470
|
+
setNavigationError(NavigationErrorType.UNKNOWN_ERROR, e.message ?: "An unexpected error occurred", path)
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
private fun clearNavigationError() {
|
|
476
|
+
if (navigationError != null || formattedNavigationError != null) {
|
|
477
|
+
navigationError = null
|
|
478
|
+
formattedNavigationError = null
|
|
479
|
+
onNavigationError(NavigationErrorEvent(null))
|
|
480
|
+
onFormattedNavigationError(null)
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// ============================================================================
|
|
485
|
+
// MARK: Browser Navigation Methods
|
|
486
|
+
// ============================================================================
|
|
487
|
+
|
|
488
|
+
override fun navigatePath(path: String) {
|
|
489
|
+
clearNavigationError()
|
|
490
|
+
|
|
491
|
+
// Cancel previous navigation to avoid race conditions
|
|
492
|
+
navigationJob?.cancel()
|
|
493
|
+
|
|
494
|
+
navigationJob =
|
|
495
|
+
mainScope.launch {
|
|
496
|
+
try {
|
|
497
|
+
Timber.d("Navigating to path: $path")
|
|
498
|
+
browserManager.navigate(path)
|
|
499
|
+
} catch (e: CancellationException) {
|
|
500
|
+
throw e // Rethrow to properly cancel
|
|
501
|
+
} catch (e: Exception) {
|
|
502
|
+
handleBrowserException(e, path, "navigating to path: $path")
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
override fun navigateTrack(track: Track) {
|
|
508
|
+
clearNavigationError()
|
|
509
|
+
|
|
510
|
+
// Cancel previous navigation to avoid race conditions
|
|
511
|
+
navigationJob?.cancel()
|
|
512
|
+
|
|
513
|
+
val url = track.url
|
|
514
|
+
navigationJob =
|
|
515
|
+
mainScope.launch {
|
|
516
|
+
try {
|
|
517
|
+
when {
|
|
518
|
+
// Check if this is a contextual URL (playable-only track with queue context)
|
|
519
|
+
url != null && BrowserPathHelper.isContextual(url) -> {
|
|
520
|
+
Timber.d("Navigating to contextual track URL: $url")
|
|
521
|
+
|
|
522
|
+
val parentPath = BrowserPathHelper.stripTrackId(url)
|
|
523
|
+
val trackId = BrowserPathHelper.extractTrackId(url)
|
|
524
|
+
|
|
525
|
+
// Check if queue already came from this parent path - just skip to the track
|
|
526
|
+
if (trackId != null && parentPath == player.queueSourcePath) {
|
|
527
|
+
val index = player.tracks.indexOfFirst { it.src == trackId }
|
|
528
|
+
if (index >= 0) {
|
|
529
|
+
Timber.d("Queue already from $parentPath, skipping to index $index")
|
|
530
|
+
player.skipTo(index)
|
|
531
|
+
player.play()
|
|
532
|
+
return@launch
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Expand the queue from the contextual URL
|
|
537
|
+
val expanded = browserManager.expandQueueFromContextualUrl(url)
|
|
538
|
+
|
|
539
|
+
if (expanded != null) {
|
|
540
|
+
val (tracks, startIndex) = expanded
|
|
541
|
+
Timber.d(
|
|
542
|
+
"Loading expanded queue: ${tracks.size} tracks, starting at index $startIndex"
|
|
543
|
+
)
|
|
544
|
+
|
|
545
|
+
// Replace queue and seek to selected track
|
|
546
|
+
// Use internal player methods directly to avoid blocking on main thread
|
|
547
|
+
player.setQueue(tracks, startIndex, sourcePath = parentPath)
|
|
548
|
+
player.play()
|
|
549
|
+
} else {
|
|
550
|
+
// Fallback: just load the single track
|
|
551
|
+
Timber.w("Queue expansion failed, loading single track")
|
|
552
|
+
player.load(track)
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
// Navigate to browsable track to show browsing UI
|
|
556
|
+
url != null -> {
|
|
557
|
+
Timber.d("Navigating to browsable track: $url")
|
|
558
|
+
browserManager.navigate(url)
|
|
559
|
+
}
|
|
560
|
+
// If track is playable (has src), load it into player
|
|
561
|
+
track.src != null -> {
|
|
562
|
+
Timber.d("Loading playable track into player: ${track.title}")
|
|
563
|
+
player.load(track)
|
|
564
|
+
}
|
|
565
|
+
else -> {
|
|
566
|
+
throw IllegalArgumentException("Track must have either an 'url' or an 'src' property")
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
} catch (e: CancellationException) {
|
|
570
|
+
throw e // Rethrow to properly cancel
|
|
571
|
+
} catch (e: Exception) {
|
|
572
|
+
handleBrowserException(e, url ?: track.src ?: "", "navigating to track: ${track.title}")
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
override fun onSearch(query: String): Promise<Array<Track>> {
|
|
578
|
+
return Promise.async(mainScope) {
|
|
579
|
+
Timber.d("Searching for: $query")
|
|
580
|
+
val searchResults = browserManager.search(query)
|
|
581
|
+
searchResults.children ?: emptyArray()
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
override fun getContent(): ResolvedTrack? {
|
|
586
|
+
return browserManager.getContent()
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
override fun notifyContentChanged(path: String) {
|
|
590
|
+
Timber.d("Notifying content changed for path: $path")
|
|
591
|
+
|
|
592
|
+
// Invalidate cached content so future navigations fetch fresh data
|
|
593
|
+
browserManager.invalidateContentCache(path)
|
|
594
|
+
|
|
595
|
+
// Notify external media controllers (Android Auto)
|
|
596
|
+
connectedService?.player?.notifyContentChanged(path)
|
|
597
|
+
|
|
598
|
+
// If we're currently viewing this path, refresh the content
|
|
599
|
+
if (browserManager.getPath() == path) {
|
|
600
|
+
mainScope.launch { browserManager.refresh() }
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
override fun setFavorites(favorites: Array<String>) {
|
|
605
|
+
browserManager.setFavorites(favorites.toList())
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// ============================================================================
|
|
609
|
+
// MARK: Player Setup and Options
|
|
610
|
+
// ============================================================================
|
|
611
|
+
|
|
612
|
+
override fun setupPlayer(options: PartialSetupPlayerOptions): Promise<Unit> {
|
|
613
|
+
return Promise.async(mainScope) {
|
|
614
|
+
setupOptions.update(options)
|
|
615
|
+
|
|
616
|
+
connectedService?.let {
|
|
617
|
+
it.player.setup(setupOptions)
|
|
618
|
+
return@async
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// Service not connected yet, bind to service
|
|
622
|
+
suspendCoroutine<Unit> { continuation ->
|
|
623
|
+
Timber.d("Binding to AudioBrowserService")
|
|
624
|
+
val bound =
|
|
625
|
+
context.bindService(
|
|
626
|
+
Intent(context, Service::class.java),
|
|
627
|
+
this@AudioBrowser,
|
|
628
|
+
Context.BIND_AUTO_CREATE,
|
|
629
|
+
)
|
|
630
|
+
|
|
631
|
+
if (!bound) {
|
|
632
|
+
continuation.resumeWithException(
|
|
633
|
+
RuntimeException("Failed to bind to AudioBrowserService")
|
|
634
|
+
)
|
|
635
|
+
} else {
|
|
636
|
+
// Service will resolve the promise in onServiceConnected
|
|
637
|
+
setupPromise = { continuation.resume(Unit) }
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
override fun updateOptions(options: NativeUpdateOptions) {
|
|
644
|
+
updateOptions.updateFromBridge(options)
|
|
645
|
+
// Only update the options if the service is around
|
|
646
|
+
connectedService?.let { player.applyOptions(updateOptions) }
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
override fun getOptions(): UpdateOptions {
|
|
650
|
+
return player.getOptions().toNitro()
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// ============================================================================
|
|
654
|
+
// MARK: Player Control Methods
|
|
655
|
+
// ============================================================================
|
|
656
|
+
|
|
657
|
+
override fun load(track: Track) {
|
|
658
|
+
launchInScope { player.load(track) }
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
override fun reset() = runBlockingOnMain {
|
|
662
|
+
player.stop()
|
|
663
|
+
delay(300) // Allow playback to stop
|
|
664
|
+
player.clear()
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
override fun play() = runBlockingOnMain { player.play() }
|
|
668
|
+
|
|
669
|
+
override fun pause() = runBlockingOnMain { player.pause() }
|
|
670
|
+
|
|
671
|
+
override fun togglePlayback() = runBlockingOnMain { player.togglePlayback() }
|
|
672
|
+
|
|
673
|
+
override fun stop() = runBlockingOnMain { player.stop() }
|
|
674
|
+
|
|
675
|
+
override fun setPlayWhenReady(playWhenReady: Boolean) = runBlockingOnMain {
|
|
676
|
+
player.playWhenReady = playWhenReady
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
override fun getPlayWhenReady(): Boolean = runBlockingOnMain { player.playWhenReady }
|
|
680
|
+
|
|
681
|
+
override fun seekTo(position: Double) = runBlockingOnMain {
|
|
682
|
+
player.seekTo((position * 1000).toLong(), TimeUnit.MILLISECONDS)
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
override fun seekBy(offset: Double) = runBlockingOnMain {
|
|
686
|
+
player.seekBy((offset * 1000).toLong(), TimeUnit.MILLISECONDS)
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
override fun setVolume(level: Double) = runBlockingOnMain { player.volume = level.toFloat() }
|
|
690
|
+
|
|
691
|
+
override fun getVolume(): Double = runBlockingOnMain { player.volume.toDouble() }
|
|
692
|
+
|
|
693
|
+
override fun setRate(rate: Double) = runBlockingOnMain { player.playbackSpeed = rate.toFloat() }
|
|
694
|
+
|
|
695
|
+
override fun getRate(): Double = runBlockingOnMain { player.playbackSpeed.toDouble() }
|
|
696
|
+
|
|
697
|
+
override fun getProgress(): Progress = runBlockingOnMain {
|
|
698
|
+
Progress(
|
|
699
|
+
duration = player.duration.toSeconds(),
|
|
700
|
+
position = player.position.toSeconds(),
|
|
701
|
+
buffered = player.bufferedPosition.toSeconds(),
|
|
702
|
+
)
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
override fun getPlayback(): Playback = runBlockingOnMain { player.getPlayback() }
|
|
706
|
+
|
|
707
|
+
override fun getPlayingState(): PlayingState = runBlockingOnMain { player.getPlayingState() }
|
|
708
|
+
|
|
709
|
+
override fun getRepeatMode(): RepeatMode = runBlockingOnMain { player.repeatMode }
|
|
710
|
+
|
|
711
|
+
override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain { player.repeatMode = mode }
|
|
712
|
+
|
|
713
|
+
override fun getShuffleEnabled(): Boolean = runBlockingOnMain { player.shuffleMode }
|
|
714
|
+
|
|
715
|
+
override fun setShuffleEnabled(enabled: Boolean) = runBlockingOnMain {
|
|
716
|
+
player.shuffleMode = enabled
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
override fun getPlaybackError(): PlaybackError? = runBlockingOnMain { player.playbackError }
|
|
720
|
+
|
|
721
|
+
override fun retry() = runBlockingOnMain { player.prepare() }
|
|
722
|
+
|
|
723
|
+
// ============================================================================
|
|
724
|
+
// MARK: Queue Management
|
|
725
|
+
// ============================================================================
|
|
726
|
+
|
|
727
|
+
override fun add(tracks: Array<Track>, insertBeforeIndex: Double?) = runBlockingOnMain {
|
|
728
|
+
val inputIndex = insertBeforeIndex?.toInt() ?: -1
|
|
729
|
+
player.add(tracks, inputIndex)
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
override fun move(fromIndex: Double, toIndex: Double) = runBlockingOnMain {
|
|
733
|
+
player.move(fromIndex.toInt(), toIndex.toInt())
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
override fun remove(indexes: DoubleArray) = runBlockingOnMain {
|
|
737
|
+
val indexList = indexes.map { it.toInt() }
|
|
738
|
+
player.remove(indexList)
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
override fun removeUpcomingTracks() = runBlockingOnMain { player.removeUpcomingTracks() }
|
|
742
|
+
|
|
743
|
+
override fun skip(index: Double, initialPosition: Double?) = runBlockingOnMain {
|
|
744
|
+
player.skipTo(index.toInt())
|
|
745
|
+
|
|
746
|
+
if (initialPosition != null && initialPosition >= 0) {
|
|
747
|
+
player.seekTo((initialPosition * 1000).toLong(), TimeUnit.MILLISECONDS)
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
override fun skipToNext(initialPosition: Double?) = runBlockingOnMain {
|
|
752
|
+
player.next()
|
|
753
|
+
|
|
754
|
+
if (initialPosition != null && initialPosition >= 0) {
|
|
755
|
+
player.seekTo((initialPosition * 1000).toLong(), TimeUnit.MILLISECONDS)
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
override fun skipToPrevious(initialPosition: Double?) = runBlockingOnMain {
|
|
760
|
+
player.previous()
|
|
761
|
+
|
|
762
|
+
if (initialPosition != null && initialPosition >= 0) {
|
|
763
|
+
player.seekTo((initialPosition * 1000).toLong(), TimeUnit.MILLISECONDS)
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
override fun setQueue(tracks: Array<Track>, startIndex: Double?, startPositionMs: Double?) =
|
|
768
|
+
runBlockingOnMain {
|
|
769
|
+
player.setQueue(tracks, startIndex?.toInt() ?: 0, startPositionMs?.toLong() ?: 0)
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
override fun setActiveTrackFavorited(favorited: Boolean) = runBlockingOnMain {
|
|
773
|
+
player.setActiveTrackFavorited(favorited)
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
override fun toggleActiveTrackFavorited() = runBlockingOnMain {
|
|
777
|
+
player.toggleActiveTrackFavorited()
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
override fun getQueue(): Array<Track> = runBlockingOnMain { player.tracks }
|
|
781
|
+
|
|
782
|
+
override fun getTrack(index: Double): Track? = runBlockingOnMain {
|
|
783
|
+
try {
|
|
784
|
+
player.getTrack(index.toInt())
|
|
785
|
+
} catch (e: IllegalArgumentException) {
|
|
786
|
+
null
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
override fun getActiveTrackIndex(): Double? = runBlockingOnMain {
|
|
791
|
+
player.currentIndex?.toDouble()
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
override fun getActiveTrack(): Track? = runBlockingOnMain { player.currentTrack }
|
|
795
|
+
|
|
796
|
+
// ============================================================================
|
|
797
|
+
// MARK: Now Playing Metadata
|
|
798
|
+
// ============================================================================
|
|
799
|
+
|
|
800
|
+
override fun updateNowPlaying(update: NowPlayingUpdate?) = runBlockingOnMain {
|
|
801
|
+
player.updateNowPlaying(update)
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain { player.getNowPlaying() }
|
|
805
|
+
|
|
806
|
+
// ============================================================================
|
|
807
|
+
// MARK: Network Connectivity
|
|
808
|
+
// ============================================================================
|
|
809
|
+
|
|
810
|
+
override fun getOnline(): Boolean = runBlockingOnMain { player.getOnline() }
|
|
811
|
+
|
|
812
|
+
// ============================================================================
|
|
813
|
+
// MARK: System Volume
|
|
814
|
+
// ============================================================================
|
|
815
|
+
|
|
816
|
+
override fun getSystemVolume(): Double = systemVolumeMonitor.getVolume()
|
|
817
|
+
|
|
818
|
+
override fun setSystemVolume(volume: Double) = systemVolumeMonitor.setVolume(volume)
|
|
819
|
+
|
|
820
|
+
// ============================================================================
|
|
821
|
+
// MARK: External Audio Output (iOS only, stub on Android)
|
|
822
|
+
// ============================================================================
|
|
823
|
+
|
|
824
|
+
override fun getIosOutput(): IosOutput? = null
|
|
825
|
+
|
|
826
|
+
override fun openIosOutputPicker() {
|
|
827
|
+
// No-op on Android
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// ============================================================================
|
|
831
|
+
// MARK: Equalizer (Android only)
|
|
832
|
+
// ============================================================================
|
|
833
|
+
|
|
834
|
+
override fun getEqualizerSettings(): EqualizerSettings? = runBlockingOnMain {
|
|
835
|
+
player.getEqualizerSettings()
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
override fun setEqualizerEnabled(enabled: Boolean) = runBlockingOnMain {
|
|
839
|
+
player.setEqualizerEnabled(enabled)
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
override fun setEqualizerPreset(preset: String) = runBlockingOnMain {
|
|
843
|
+
player.setEqualizerPreset(preset)
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
override fun setEqualizerLevels(levels: DoubleArray) = runBlockingOnMain {
|
|
847
|
+
player.setEqualizerLevels(levels)
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// ============================================================================
|
|
851
|
+
// MARK: Sleep Timer
|
|
852
|
+
// ============================================================================
|
|
853
|
+
|
|
854
|
+
override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.getSleepTimer() }
|
|
855
|
+
|
|
856
|
+
override fun setSleepTimer(seconds: Double) = runBlockingOnMain { player.setSleepTimer(seconds) }
|
|
857
|
+
|
|
858
|
+
override fun setSleepTimerToEndOfTrack() = runBlockingOnMain {
|
|
859
|
+
player.setSleepTimerToEndOfTrack()
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.clearSleepTimer() }
|
|
863
|
+
|
|
864
|
+
// ============================================================================
|
|
865
|
+
// MARK: Battery Optimization (Android only)
|
|
866
|
+
// ============================================================================
|
|
867
|
+
|
|
868
|
+
/** Track last known status for change detection */
|
|
869
|
+
private var lastKnownBatteryStatus: BatteryOptimizationHelper.Status? = null
|
|
870
|
+
|
|
871
|
+
override fun getBatteryWarningPending(): Boolean {
|
|
872
|
+
val rawPending = BatteryWarningStore.isWarningPending(context)
|
|
873
|
+
val status = BatteryOptimizationHelper.getStatus(context)
|
|
874
|
+
|
|
875
|
+
// Auto-clear if status is now unrestricted
|
|
876
|
+
return if (rawPending && status == BatteryOptimizationHelper.Status.UNRESTRICTED) {
|
|
877
|
+
BatteryWarningStore.clearWarning(context)
|
|
878
|
+
post { onBatteryWarningPendingChanged(BatteryWarningPendingChangedEvent(false)) }
|
|
879
|
+
false
|
|
880
|
+
} else {
|
|
881
|
+
rawPending
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
override fun getBatteryOptimizationStatus(): BatteryOptimizationStatus {
|
|
886
|
+
return BatteryOptimizationHelper.getStatus(context).toNitro()
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
override fun dismissBatteryWarning() {
|
|
890
|
+
BatteryWarningStore.clearWarning(context)
|
|
891
|
+
post { onBatteryWarningPendingChanged(BatteryWarningPendingChangedEvent(false)) }
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
override fun openBatterySettings() {
|
|
895
|
+
BatteryOptimizationHelper.openSettings(context)
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Check if battery status changed since last check and fire events if so. Called automatically
|
|
900
|
+
* when app comes to foreground via ProcessLifecycleOwner.
|
|
901
|
+
*/
|
|
902
|
+
private fun checkBatteryStatusChange() {
|
|
903
|
+
val currentStatus = BatteryOptimizationHelper.getStatus(context)
|
|
904
|
+
if (lastKnownBatteryStatus != null && lastKnownBatteryStatus != currentStatus) {
|
|
905
|
+
post {
|
|
906
|
+
onBatteryOptimizationStatusChanged(
|
|
907
|
+
BatteryOptimizationStatusChangedEvent(currentStatus.toNitro())
|
|
908
|
+
)
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
// Auto-clear warning if now unrestricted
|
|
912
|
+
if (
|
|
913
|
+
currentStatus == BatteryOptimizationHelper.Status.UNRESTRICTED &&
|
|
914
|
+
BatteryWarningStore.isWarningPending(context)
|
|
915
|
+
) {
|
|
916
|
+
BatteryWarningStore.clearWarning(context)
|
|
917
|
+
post { onBatteryWarningPendingChanged(BatteryWarningPendingChangedEvent(false)) }
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
lastKnownBatteryStatus = currentStatus
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
private fun BatteryOptimizationHelper.Status.toNitro(): BatteryOptimizationStatus {
|
|
924
|
+
return when (this) {
|
|
925
|
+
BatteryOptimizationHelper.Status.UNRESTRICTED -> BatteryOptimizationStatus.UNRESTRICTED
|
|
926
|
+
BatteryOptimizationHelper.Status.OPTIMIZED -> BatteryOptimizationStatus.OPTIMIZED
|
|
927
|
+
BatteryOptimizationHelper.Status.RESTRICTED -> BatteryOptimizationStatus.RESTRICTED
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
// ============================================================================
|
|
932
|
+
// MARK: Service Connection
|
|
933
|
+
// ============================================================================
|
|
934
|
+
|
|
935
|
+
override fun onServiceConnected(name: ComponentName, serviceBinder: IBinder) {
|
|
936
|
+
launchInScope {
|
|
937
|
+
connectedService =
|
|
938
|
+
(serviceBinder as Service.LocalBinder).service.apply {
|
|
939
|
+
player.setCallbacks(callbacks)
|
|
940
|
+
player.applyOptions(updateOptions)
|
|
941
|
+
player.setup(setupOptions)
|
|
942
|
+
// Start observing network connectivity changes
|
|
943
|
+
player.observeNetworkConnectivity(mainScope)
|
|
944
|
+
// Set browser reference for media URL transformation
|
|
945
|
+
player.browser = this@AudioBrowser
|
|
946
|
+
|
|
947
|
+
// If configuration was already set before service connected,
|
|
948
|
+
// notify player now so Android Auto can start browsing
|
|
949
|
+
if (_configuration.routes?.isNotEmpty() == true) {
|
|
950
|
+
player.notifyBrowserConfigurationReady()
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
// Wire up battery warning callback from service
|
|
955
|
+
connectedService?.onBatteryWarningPendingChanged = { pending ->
|
|
956
|
+
post {
|
|
957
|
+
this@AudioBrowser.onBatteryWarningPendingChanged(
|
|
958
|
+
BatteryWarningPendingChangedEvent(pending)
|
|
959
|
+
)
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
val sessionToken = SessionToken(context, ComponentName(context, Service::class.java))
|
|
964
|
+
mediaBrowserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
|
|
965
|
+
|
|
966
|
+
setupPromise?.invoke(Unit)
|
|
967
|
+
setupPromise = null
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
override fun onServiceDisconnected(name: ComponentName) {
|
|
972
|
+
mainScope.coroutineContext.cancelChildren()
|
|
973
|
+
mediaBrowserFuture = null
|
|
974
|
+
connectedService = null
|
|
975
|
+
Timber.d("AudioBrowser.onServiceDisconnected()")
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
// ============================================================================
|
|
979
|
+
// MARK: Internal Helpers
|
|
980
|
+
// ============================================================================
|
|
981
|
+
|
|
982
|
+
private fun launchInScope(block: suspend () -> Unit) {
|
|
983
|
+
mainScope.launch { block() }
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
private fun <T> runBlockingOnMain(block: suspend () -> T): T {
|
|
987
|
+
return runBlocking(mainScope.coroutineContext) { block() }
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
private val service: Service
|
|
991
|
+
get() = connectedService ?: throw Exception("Player not initialized")
|
|
992
|
+
|
|
993
|
+
internal val player
|
|
994
|
+
get() = service.player
|
|
995
|
+
|
|
996
|
+
// ============================================================================
|
|
997
|
+
// MARK: Player Callbacks
|
|
998
|
+
// ============================================================================
|
|
999
|
+
|
|
1000
|
+
val callbacks =
|
|
1001
|
+
object : Callbacks {
|
|
1002
|
+
override fun onPlaybackChanged(playback: Playback) {
|
|
1003
|
+
post { this@AudioBrowser.onPlaybackChanged(playback) }
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
override fun onPlaybackActiveTrackChanged(event: PlaybackActiveTrackChangedEvent) {
|
|
1007
|
+
post { this@AudioBrowser.onPlaybackActiveTrackChanged(event) }
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
override fun onPlaybackProgressUpdated(event: PlaybackProgressUpdatedEvent) {
|
|
1011
|
+
post { this@AudioBrowser.onPlaybackProgressUpdated(event) }
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
override fun onPlaybackPlayWhenReadyChanged(event: PlaybackPlayWhenReadyChangedEvent) {
|
|
1015
|
+
post { this@AudioBrowser.onPlaybackPlayWhenReadyChanged(event) }
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
override fun onPlaybackPlayingState(event: PlayingState) {
|
|
1019
|
+
post {
|
|
1020
|
+
Timber.d(
|
|
1021
|
+
"AudioBrowser forwarding PlayingState to JS: playing=${event.playing}, buffering=${event.buffering}"
|
|
1022
|
+
)
|
|
1023
|
+
this@AudioBrowser.onPlaybackPlayingState(event)
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
override fun onPlaybackQueueEnded(event: PlaybackQueueEndedEvent) {
|
|
1028
|
+
post { this@AudioBrowser.onPlaybackQueueEnded(event) }
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
override fun onPlaybackQueueChanged(queue: Array<Track>) {
|
|
1032
|
+
post { this@AudioBrowser.onPlaybackQueueChanged(queue) }
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
override fun onPlaybackRepeatModeChanged(event: RepeatMode) {
|
|
1036
|
+
post { this@AudioBrowser.onPlaybackRepeatModeChanged(RepeatModeChangedEvent(event)) }
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
override fun onPlaybackShuffleModeChanged(enabled: Boolean) {
|
|
1040
|
+
post { this@AudioBrowser.onPlaybackShuffleModeChanged(enabled) }
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
override fun onPlaybackError(error: PlaybackError?) {
|
|
1044
|
+
post { this@AudioBrowser.onPlaybackError(PlaybackErrorEvent(error)) }
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
override fun onTrackMetadata(metadata: TrackMetadata) {
|
|
1048
|
+
post { this@AudioBrowser.onTrackMetadata(metadata) }
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
override fun onChapterMetadata(chapters: List<ChapterMetadata>) {
|
|
1052
|
+
post { this@AudioBrowser.onChapterMetadata(chapters.toTypedArray()) }
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
override fun onTimedMetadata(metadata: TimedMetadata) {
|
|
1056
|
+
post { this@AudioBrowser.onTimedMetadata(metadata) }
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
override fun handleRemotePlay(): Boolean {
|
|
1060
|
+
val handled =
|
|
1061
|
+
this@AudioBrowser.handleRemotePlay?.let {
|
|
1062
|
+
it.invoke()
|
|
1063
|
+
true
|
|
1064
|
+
} ?: false
|
|
1065
|
+
|
|
1066
|
+
// Defer notification until after play operation completes
|
|
1067
|
+
post { this@AudioBrowser.onRemotePlay() }
|
|
1068
|
+
|
|
1069
|
+
return handled
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
override fun handleRemotePause(): Boolean {
|
|
1073
|
+
val handled =
|
|
1074
|
+
this@AudioBrowser.handleRemotePause?.let {
|
|
1075
|
+
it.invoke()
|
|
1076
|
+
true
|
|
1077
|
+
} ?: false
|
|
1078
|
+
|
|
1079
|
+
// Defer notification until after pause operation completes
|
|
1080
|
+
post { this@AudioBrowser.onRemotePause() }
|
|
1081
|
+
|
|
1082
|
+
return handled
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
override fun handleRemoteStop(): Boolean {
|
|
1086
|
+
val handled =
|
|
1087
|
+
this@AudioBrowser.handleRemoteStop?.let {
|
|
1088
|
+
it.invoke()
|
|
1089
|
+
true
|
|
1090
|
+
} ?: false
|
|
1091
|
+
|
|
1092
|
+
// Defer notification until after stop operation completes
|
|
1093
|
+
post { this@AudioBrowser.onRemoteStop() }
|
|
1094
|
+
|
|
1095
|
+
return handled
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
override fun handleRemoteNext(): Boolean {
|
|
1099
|
+
val handled =
|
|
1100
|
+
this@AudioBrowser.handleRemoteNext?.let {
|
|
1101
|
+
it.invoke()
|
|
1102
|
+
true
|
|
1103
|
+
} ?: false
|
|
1104
|
+
|
|
1105
|
+
// Defer notification until after next operation completes
|
|
1106
|
+
post { this@AudioBrowser.onRemoteNext() }
|
|
1107
|
+
|
|
1108
|
+
return handled
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
override fun handleRemotePrevious(): Boolean {
|
|
1112
|
+
val handled =
|
|
1113
|
+
this@AudioBrowser.handleRemotePrevious?.let {
|
|
1114
|
+
it.invoke()
|
|
1115
|
+
true
|
|
1116
|
+
} ?: false
|
|
1117
|
+
|
|
1118
|
+
// Defer notification until after previous operation completes
|
|
1119
|
+
post { this@AudioBrowser.onRemotePrevious() }
|
|
1120
|
+
|
|
1121
|
+
return handled
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
override fun handleRemoteJumpForward(event: RemoteJumpForwardEvent): Boolean {
|
|
1125
|
+
val handled =
|
|
1126
|
+
this@AudioBrowser.handleRemoteJumpForward?.let {
|
|
1127
|
+
it.invoke(event)
|
|
1128
|
+
true
|
|
1129
|
+
} ?: false
|
|
1130
|
+
|
|
1131
|
+
// Defer notification until after jump forward operation completes
|
|
1132
|
+
post { this@AudioBrowser.onRemoteJumpForward(event) }
|
|
1133
|
+
|
|
1134
|
+
return handled
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
override fun handleRemoteJumpBackward(event: RemoteJumpBackwardEvent): Boolean {
|
|
1138
|
+
val handled =
|
|
1139
|
+
this@AudioBrowser.handleRemoteJumpBackward?.let {
|
|
1140
|
+
it.invoke(event)
|
|
1141
|
+
true
|
|
1142
|
+
} ?: false
|
|
1143
|
+
|
|
1144
|
+
// Defer notification until after jump backward operation completes
|
|
1145
|
+
post { this@AudioBrowser.onRemoteJumpBackward(event) }
|
|
1146
|
+
|
|
1147
|
+
return handled
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
override fun handleRemoteSeek(event: RemoteSeekEvent): Boolean {
|
|
1151
|
+
val handled =
|
|
1152
|
+
this@AudioBrowser.handleRemoteSeek?.let {
|
|
1153
|
+
it.invoke(event)
|
|
1154
|
+
true
|
|
1155
|
+
} ?: false
|
|
1156
|
+
|
|
1157
|
+
// Defer notification until after seek operation completes
|
|
1158
|
+
post { this@AudioBrowser.onRemoteSeek(event) }
|
|
1159
|
+
|
|
1160
|
+
return handled
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
override fun onRemoteSetRating(event: RemoteSetRatingEvent) {
|
|
1164
|
+
post { this@AudioBrowser.onRemoteSetRating(event) }
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
override fun onOptionsChanged(options: PlayerUpdateOptions) {
|
|
1168
|
+
// Not currently emitted to JS
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
override fun onFavoriteChanged(event: FavoriteChangedEvent) {
|
|
1172
|
+
post { this@AudioBrowser.onFavoriteChanged(event) }
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
override fun onNowPlayingChanged(metadata: NowPlayingMetadata) {
|
|
1176
|
+
post { this@AudioBrowser.onNowPlayingChanged(metadata) }
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
override fun onOnlineChanged(online: Boolean) {
|
|
1180
|
+
post { this@AudioBrowser.onOnlineChanged(online) }
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
override fun onEqualizerChanged(settings: EqualizerSettings) {
|
|
1184
|
+
post { this@AudioBrowser.onEqualizerChanged(settings) }
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
override fun onSleepTimerChanged(timer: SleepTimer?) {
|
|
1188
|
+
post { this@AudioBrowser.onSleepTimerChanged(timer) }
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
}
|