@javascriptcommon/react-native-track-player 1.2.9 → 4.1.4
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/LICENSE +201 -21
- package/README.md +8 -0
- package/android/build.gradle +92 -18
- package/android/proguard-rules.txt +0 -3
- package/android/src/main/AndroidManifest.xml +10 -13
- package/android/src/main/java/com/doublesymmetry/trackplayer/HeadlessJsMediaService.kt +199 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayer.kt +33 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/AudioPlayerStateExt.kt +19 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/EnumExtensions.kt +5 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/NumberExt.kt +13 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/MetadataAdapter.kt +227 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/PlaybackMetadata.kt +203 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/State.kt +13 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/Track.kt +67 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackAudioItem.kt +18 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackMetadata.kt +38 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicEvents.kt +67 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicModule.kt +778 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/service/MusicService.kt +1286 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/AppForegroundTracker.kt +35 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/BundleUtils.kt +147 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/CoilBitmapLoader.kt +65 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/MediaItemBuilder.kt +41 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/RejectionException.kt +11 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoView.kt +42 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoViewManager.kt +18 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/EventHolder.kt +30 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/PlayerEventHolder.kt +124 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioContentType.kt +10 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +118 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItemTransitionReason.kt +33 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioPlayerState.kt +30 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/BufferConfig.kt +8 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CacheConfig.kt +17 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/Capability.kt +19 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/FocusChangeData.kt +3 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/MediaSessionCallback.kt +17 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayWhenReadyChangeData.kt +3 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackEndedReason.kt +5 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackError.kt +6 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerConfig.kt +36 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +40 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PositionChangedReason.kt +39 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/RepeatMode.kt +16 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/WakeMode.kt +7 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/AudioPlayer.kt +756 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/ForwardingPlayer.java +1124 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/QueuedAudioPlayer.kt +279 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/APMRenderersFactory.kt +33 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Buffer.kt +34 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Cache.kt +27 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/FocusManager.kt +59 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/MediaFactory.kt +130 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/processors/TeeListener.kt +171 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/service/MusicService.kt +127 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/FFT.java +99 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/Utils.kt +113 -0
- package/android/src/main/res/drawable/baseline_repeat_24.xml +5 -0
- package/android/src/main/res/drawable/baseline_repeat_one_24.xml +5 -0
- package/android/src/main/res/drawable/forward.xml +5 -0
- package/android/src/main/res/drawable/heart_24px.xml +5 -0
- package/android/src/main/res/drawable/hearte_24px.xml +5 -0
- package/android/src/main/res/drawable/ifl_24px.xml +5 -0
- package/android/src/main/res/drawable/rewind.xml +5 -0
- package/android/src/main/res/drawable/shuffle_24px.xml +5 -0
- package/android/src/main/res/values/strings.xml +5 -0
- package/android/src/main/res/xml/automotive_app_desc.xml +3 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/22AMillion.jpg +0 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/Contents.json +21 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/Contents.json +6 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/Contents.json +21 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/cover.jpg +0 -0
- package/ios/Example/SwiftAudio/AudioController.swift +46 -0
- package/ios/Example/SwiftAudio/Extensions.swift +22 -0
- package/ios/Example/SwiftAudio/PlayerView.swift +172 -0
- package/ios/Example/SwiftAudio/PlayerViewModel.swift +120 -0
- package/ios/Example/SwiftAudio/Preview Content/Preview Assets.xcassets/Contents.json +6 -0
- package/ios/Example/SwiftAudio/QueueView.swift +65 -0
- package/ios/{TrackPlayer.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist → Example/SwiftAudio/SwiftAudio.entitlements} +6 -8
- package/ios/Example/SwiftAudio/SwiftAudioApp.swift +17 -0
- package/ios/Example/SwiftAudio.xcodeproj/project.pbxproj +412 -0
- package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/contents.xcworkspacedata +1 -1
- package/ios/RNTrackPlayer/Models/Capabilities.swift +39 -4
- package/ios/RNTrackPlayer/Models/MediaURL.swift +12 -6
- package/ios/RNTrackPlayer/Models/MetadataAdapter.swift +147 -0
- package/ios/RNTrackPlayer/Models/PitchAlgorithms.swift +13 -0
- package/ios/RNTrackPlayer/Models/SessionCategories.swift +106 -0
- package/ios/RNTrackPlayer/Models/State.swift +26 -0
- package/ios/RNTrackPlayer/Models/Track.swift +74 -54
- package/ios/RNTrackPlayer/RNTrackPlayer.swift +867 -406
- package/ios/RNTrackPlayer/Support/RNTrackPlayer-Bridging-Header.h +1 -0
- package/ios/RNTrackPlayer/TrackPlayer.h +14 -0
- package/ios/RNTrackPlayer/TrackPlayer.mm +249 -0
- package/ios/RNTrackPlayer/Utils/EventType.swift +45 -0
- package/ios/RNTrackPlayer/Utils/Metadata.swift +60 -0
- package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoView.swift +83 -0
- package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.m +5 -0
- package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.swift +17 -0
- package/ios/SwiftAudioEx/Package.swift +20 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapper.swift +531 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperDelegate.swift +27 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperProtocol.swift +69 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperState.swift +43 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioItem.swift +158 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayer.swift +459 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayerError.swift +26 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSession.swift +33 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSessionController.swift +135 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioTap.swift +96 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Event.swift +155 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/MediaItemProperty.swift +95 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoCenter.swift +17 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoController.swift +73 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoControllerProtocol.swift +26 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoKeyValue.swift +14 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoProperty.swift +234 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemNotificationObserver.swift +102 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemObserver.swift +136 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerObserver.swift +120 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerTimeObserver.swift +112 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueueManager.swift +356 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueuedAudioPlayer.swift +236 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommand.swift +170 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommandController.swift +206 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RepeatMode.swift +15 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/TimeEventFrequency.swift +26 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Utils/DispatchQueueType.swift +18 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/WaveformAudioTap.swift +159 -0
- package/lib/specs/NativeTrackPlayer.d.ts +134 -0
- package/lib/specs/NativeTrackPlayer.js +4 -0
- package/lib/src/TrackPlayerModule.web.d.ts +2 -0
- package/lib/src/TrackPlayerModule.web.js +2 -0
- package/lib/src/VideoView.d.ts +16 -0
- package/lib/src/VideoView.js +25 -0
- package/lib/src/constants/AndroidAudioContentType.d.ts +35 -0
- package/lib/src/constants/AndroidAudioContentType.js +36 -0
- package/lib/src/constants/AndroidAutoContentStyle.d.ts +10 -0
- package/lib/src/constants/AndroidAutoContentStyle.js +11 -0
- package/lib/src/constants/AppKilledPlaybackBehavior.d.ts +17 -0
- package/lib/src/constants/AppKilledPlaybackBehavior.js +18 -0
- package/lib/src/constants/Capability.d.ts +17 -0
- package/lib/src/constants/Capability.js +19 -0
- package/lib/src/constants/Event.d.ts +172 -0
- package/lib/src/constants/Event.js +173 -0
- package/lib/src/constants/IOSCategory.d.ts +36 -0
- package/lib/src/constants/IOSCategory.js +37 -0
- package/lib/src/constants/IOSCategoryMode.d.ts +47 -0
- package/lib/src/constants/IOSCategoryMode.js +48 -0
- package/lib/src/constants/IOSCategoryOptions.d.ts +44 -0
- package/lib/src/constants/IOSCategoryOptions.js +45 -0
- package/lib/src/constants/MediaItemPlayable.d.ts +4 -0
- package/lib/src/constants/MediaItemPlayable.js +5 -0
- package/lib/src/constants/PitchAlgorithm.d.ts +14 -0
- package/lib/src/constants/PitchAlgorithm.js +16 -0
- package/lib/src/constants/RatingType.d.ts +8 -0
- package/lib/src/constants/RatingType.js +10 -0
- package/lib/src/constants/RepeatMode.d.ts +8 -0
- package/lib/src/constants/RepeatMode.js +10 -0
- package/lib/src/constants/State.d.ts +34 -0
- package/lib/src/constants/State.js +35 -0
- package/lib/src/constants/TrackType.d.ts +6 -0
- package/lib/src/constants/TrackType.js +7 -0
- package/lib/src/constants/index.d.ts +14 -0
- package/lib/src/constants/index.js +14 -0
- package/lib/src/hooks/index.d.ts +6 -0
- package/lib/src/hooks/index.js +6 -0
- package/lib/src/hooks/useActiveTrack.d.ts +2 -0
- package/lib/src/hooks/useActiveTrack.js +28 -0
- package/lib/src/hooks/useAppIsInBackground.d.ts +1 -0
- package/lib/src/hooks/useAppIsInBackground.js +16 -0
- package/lib/src/hooks/useIsPlaying.d.ts +35 -0
- package/lib/src/hooks/useIsPlaying.js +50 -0
- package/lib/src/hooks/usePlayWhenReady.d.ts +1 -0
- package/lib/src/hooks/usePlayWhenReady.js +27 -0
- package/lib/src/hooks/usePlaybackState.d.ts +10 -0
- package/lib/src/hooks/usePlaybackState.js +35 -0
- package/lib/src/hooks/useProgress.d.ts +7 -0
- package/lib/src/hooks/useProgress.js +55 -0
- package/lib/src/hooks/useTrackPlayerEvents.d.ts +8 -0
- package/lib/src/hooks/useTrackPlayerEvents.js +30 -0
- package/lib/src/index.d.ts +6 -0
- package/lib/src/index.js +6 -0
- package/lib/src/interfaces/AndroidAutoBrowseTree.d.ts +5 -0
- package/lib/src/interfaces/AndroidAutoBrowseTree.js +1 -0
- package/lib/src/interfaces/AndroidOptions.d.ts +41 -0
- package/lib/src/interfaces/AndroidOptions.js +1 -0
- package/lib/src/interfaces/CustomButtons.d.ts +5 -0
- package/lib/src/interfaces/CustomButtons.js +1 -0
- package/lib/src/interfaces/FeedbackOptions.d.ts +6 -0
- package/lib/src/interfaces/FeedbackOptions.js +1 -0
- package/lib/src/interfaces/MediaItem.d.ts +18 -0
- package/lib/src/interfaces/MediaItem.js +1 -0
- package/lib/src/interfaces/MetadataOptions.d.ts +3 -0
- package/lib/src/interfaces/MetadataOptions.js +1 -0
- package/lib/src/interfaces/NowPlayingMetadata.d.ts +4 -0
- package/lib/src/interfaces/NowPlayingMetadata.js +1 -0
- package/lib/src/interfaces/PlaybackState.d.ts +8 -0
- package/lib/src/interfaces/PlaybackState.js +1 -0
- package/lib/src/interfaces/PlayerOptions.d.ts +132 -0
- package/lib/src/interfaces/PlayerOptions.js +1 -0
- package/lib/src/interfaces/Progress.d.ts +15 -0
- package/lib/src/interfaces/Progress.js +1 -0
- package/lib/src/interfaces/ResourceObject.d.ts +1 -0
- package/lib/src/interfaces/ResourceObject.js +1 -0
- package/lib/src/interfaces/ServiceHandler.d.ts +1 -0
- package/lib/src/interfaces/ServiceHandler.js +1 -0
- package/lib/src/interfaces/Track.d.ts +21 -0
- package/lib/src/interfaces/Track.js +1 -0
- package/lib/src/interfaces/TrackMetadataBase.d.ts +28 -0
- package/lib/src/interfaces/TrackMetadataBase.js +1 -0
- package/lib/src/interfaces/UpdateOptions.d.ts +52 -0
- package/lib/src/interfaces/UpdateOptions.js +1 -0
- package/lib/src/interfaces/events/AudioMetadataReceivedEvent.d.ts +33 -0
- package/lib/src/interfaces/events/AudioMetadataReceivedEvent.js +1 -0
- package/lib/src/interfaces/events/ControllerConnectedEvent.d.ts +8 -0
- package/lib/src/interfaces/events/ControllerConnectedEvent.js +1 -0
- package/lib/src/interfaces/events/EventPayloadByEvent.d.ts +77 -0
- package/lib/src/interfaces/events/EventPayloadByEvent.js +1 -0
- package/lib/src/interfaces/events/FFTUpdateEvent.d.ts +7 -0
- package/lib/src/interfaces/events/FFTUpdateEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.d.ts +24 -0
- package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.d.ts +4 -0
- package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackErrorEvent.d.ts +6 -0
- package/lib/src/interfaces/events/PlaybackErrorEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.d.ts +16 -0
- package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.d.ts +4 -0
- package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.d.ts +4 -0
- package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackQueueEndedEvent.d.ts +9 -0
- package/lib/src/interfaces/events/PlaybackQueueEndedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackResumeEvent.d.ts +3 -0
- package/lib/src/interfaces/events/PlaybackResumeEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackTrackChangedEvent.d.ts +11 -0
- package/lib/src/interfaces/events/PlaybackTrackChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlayerErrorEvent.d.ts +6 -0
- package/lib/src/interfaces/events/PlayerErrorEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteBrowseEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemoteBrowseEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteCustomActionEvent.d.ts +7 -0
- package/lib/src/interfaces/events/RemoteCustomActionEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteDuckEvent.d.ts +13 -0
- package/lib/src/interfaces/events/RemoteDuckEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteJumpBackwardEvent.d.ts +7 -0
- package/lib/src/interfaces/events/RemoteJumpBackwardEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteJumpForwardEvent.d.ts +7 -0
- package/lib/src/interfaces/events/RemoteJumpForwardEvent.js +1 -0
- package/lib/src/interfaces/events/RemotePlayIdEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemotePlayIdEvent.js +1 -0
- package/lib/src/interfaces/events/RemotePlaySearchEvent.d.ts +9 -0
- package/lib/src/interfaces/events/RemotePlaySearchEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSearchEvent.d.ts +3 -0
- package/lib/src/interfaces/events/RemoteSearchEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSeekEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemoteSeekEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSetRatingEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemoteSetRatingEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSkipEvent.d.ts +3 -0
- package/lib/src/interfaces/events/RemoteSkipEvent.js +1 -0
- package/lib/src/interfaces/events/index.d.ts +20 -0
- package/lib/src/interfaces/events/index.js +20 -0
- package/lib/src/interfaces/index.d.ts +15 -0
- package/lib/src/interfaces/index.js +15 -0
- package/lib/src/resolveAssetSource.d.ts +2 -0
- package/lib/src/resolveAssetSource.js +3 -0
- package/lib/src/resolveAssetSource.web.d.ts +2 -0
- package/lib/src/resolveAssetSource.web.js +8 -0
- package/lib/src/trackPlayer.d.ts +371 -0
- package/lib/src/trackPlayer.js +627 -0
- package/lib/web/TrackPlayer/Player.d.ts +40 -0
- package/lib/web/TrackPlayer/Player.js +188 -0
- package/lib/web/TrackPlayer/PlaylistPlayer.d.ts +31 -0
- package/lib/web/TrackPlayer/PlaylistPlayer.js +181 -0
- package/lib/web/TrackPlayer/RepeatMode.d.ts +5 -0
- package/lib/web/TrackPlayer/RepeatMode.js +6 -0
- package/lib/web/TrackPlayer/SetupNotCalledError.d.ts +3 -0
- package/lib/web/TrackPlayer/SetupNotCalledError.js +5 -0
- package/lib/web/TrackPlayer/index.d.ts +3 -0
- package/lib/web/TrackPlayer/index.js +3 -0
- package/lib/web/TrackPlayerModule.d.ts +63 -0
- package/lib/web/TrackPlayerModule.js +153 -0
- package/lib/web/index.d.ts +3 -0
- package/lib/web/index.js +3 -0
- package/package.json +85 -6
- package/react-native-track-player.podspec +13 -13
- package/specs/NativeTrackPlayer.ts +153 -0
- package/src/TrackPlayerModule.web.ts +2 -0
- package/src/VideoView.tsx +51 -0
- package/src/constants/AndroidAudioContentType.ts +35 -0
- package/src/constants/AndroidAutoContentStyle.ts +10 -0
- package/src/constants/AppKilledPlaybackBehavior.ts +19 -0
- package/src/constants/Capability.ts +19 -0
- package/src/constants/Event.ts +173 -0
- package/src/constants/IOSCategory.ts +36 -0
- package/src/constants/IOSCategoryMode.ts +47 -0
- package/src/constants/IOSCategoryOptions.ts +44 -0
- package/src/constants/MediaItemPlayable.ts +4 -0
- package/src/constants/PitchAlgorithm.ts +16 -0
- package/src/constants/RatingType.ts +10 -0
- package/src/constants/RepeatMode.ts +10 -0
- package/src/constants/State.ts +34 -0
- package/src/constants/TrackType.ts +6 -0
- package/src/constants/index.ts +14 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/useActiveTrack.ts +36 -0
- package/src/hooks/useAppIsInBackground.ts +20 -0
- package/src/hooks/useIsPlaying.ts +56 -0
- package/src/hooks/usePlayWhenReady.ts +37 -0
- package/src/hooks/usePlaybackState.ts +45 -0
- package/src/hooks/useProgress.ts +64 -0
- package/src/hooks/useTrackPlayerEvents.ts +48 -0
- package/src/index.ts +8 -0
- package/src/interfaces/AndroidAutoBrowseTree.ts +6 -0
- package/src/interfaces/AndroidOptions.ts +48 -0
- package/src/interfaces/CustomButtons.ts +6 -0
- package/src/interfaces/FeedbackOptions.ts +7 -0
- package/src/interfaces/MediaItem.ts +19 -0
- package/src/interfaces/MetadataOptions.ts +4 -0
- package/src/interfaces/NowPlayingMetadata.ts +5 -0
- package/src/interfaces/PlaybackState.ts +11 -0
- package/src/interfaces/PlayerOptions.ts +138 -0
- package/src/interfaces/Progress.ts +15 -0
- package/src/interfaces/ResourceObject.ts +1 -0
- package/src/interfaces/ServiceHandler.ts +1 -0
- package/src/interfaces/Track.ts +23 -0
- package/src/interfaces/TrackMetadataBase.ts +29 -0
- package/src/interfaces/UpdateOptions.ts +59 -0
- package/src/interfaces/events/AudioMetadataReceivedEvent.ts +37 -0
- package/src/interfaces/events/ControllerConnectedEvent.ts +9 -0
- package/src/interfaces/events/EventPayloadByEvent.ts +80 -0
- package/src/interfaces/events/FFTUpdateEvent.ts +9 -0
- package/src/interfaces/events/PlaybackActiveTrackChangedEvent.ts +29 -0
- package/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.ts +4 -0
- package/src/interfaces/events/PlaybackErrorEvent.ts +6 -0
- package/src/interfaces/events/PlaybackMetadataReceivedEvent.ts +16 -0
- package/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.ts +4 -0
- package/src/interfaces/events/PlaybackProgressUpdatedEvent.ts +5 -0
- package/src/interfaces/events/PlaybackQueueEndedEvent.ts +9 -0
- package/src/interfaces/events/PlaybackResumeEvent.ts +5 -0
- package/src/interfaces/events/PlaybackTrackChangedEvent.ts +11 -0
- package/src/interfaces/events/PlayerErrorEvent.ts +6 -0
- package/src/interfaces/events/RemoteBrowseEvent.ts +4 -0
- package/src/interfaces/events/RemoteCustomActionEvent.ts +7 -0
- package/src/interfaces/events/RemoteDuckEvent.ts +13 -0
- package/src/interfaces/events/RemoteJumpBackwardEvent.ts +7 -0
- package/src/interfaces/events/RemoteJumpForwardEvent.ts +7 -0
- package/src/interfaces/events/RemotePlayIdEvent.ts +4 -0
- package/src/interfaces/events/RemotePlaySearchEvent.ts +21 -0
- package/src/interfaces/events/RemoteSearchEvent.ts +3 -0
- package/src/interfaces/events/RemoteSeekEvent.ts +4 -0
- package/src/interfaces/events/RemoteSetRatingEvent.ts +5 -0
- package/src/interfaces/events/RemoteSkipEvent.ts +3 -0
- package/src/interfaces/events/index.ts +20 -0
- package/src/interfaces/index.ts +15 -0
- package/src/resolveAssetSource.ts +3 -0
- package/src/resolveAssetSource.web.ts +10 -0
- package/src/trackPlayer.ts +806 -0
- package/web/TrackPlayer/Player.ts +201 -0
- package/web/TrackPlayer/PlaylistPlayer.ts +215 -0
- package/web/TrackPlayer/RepeatMode.ts +6 -0
- package/web/TrackPlayer/SetupNotCalledError.ts +5 -0
- package/web/TrackPlayer/index.ts +3 -0
- package/web/TrackPlayerModule.ts +181 -0
- package/web/index.ts +4 -0
- package/CHANGELOG.md +0 -75
- package/android/react-native-music-control.iml +0 -139
- package/android/react-native-track-player.iml +0 -151
- package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.java +0 -28
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicEvents.java +0 -55
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.java +0 -298
- package/android/src/main/java/com/guichaguri/trackplayer/service/HeadlessJsMediaService.java +0 -174
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.java +0 -47
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.java +0 -383
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.java +0 -271
- package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.java +0 -243
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.java +0 -148
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.java +0 -379
- package/android/src/main/java/com/guichaguri/trackplayer/service/models/Track.java +0 -141
- package/android/src/main/java/com/guichaguri/trackplayer/service/models/TrackType.java +0 -35
- package/android/src/main/res/drawable-hdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_stop.png +0 -0
- package/index.d.ts +0 -174
- package/index.js +0 -4
- package/ios/RNTrackPlayer/RNTrackPlayerBridge.h +0 -12
- package/ios/RNTrackPlayer/RNTrackPlayerBridge.m +0 -29
- package/ios/TrackPlayer.xcodeproj/project.pbxproj +0 -495
- package/ios/TrackPlayer.xcodeproj/project.xcworkspace/xcuserdata/marco.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/lib/ProgressComponent.js +0 -70
- package/lib/eventTypes.js +0 -28
- package/lib/hooks.js +0 -160
- package/lib/index.js +0 -177
- /package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.module;
|
|
2
|
-
|
|
3
|
-
import android.app.AlarmManager;
|
|
4
|
-
import android.app.PendingIntent;
|
|
5
|
-
import android.app.Service;
|
|
6
|
-
import android.content.ComponentName;
|
|
7
|
-
import android.content.Context;
|
|
8
|
-
import android.content.Intent;
|
|
9
|
-
import android.content.IntentFilter;
|
|
10
|
-
import android.content.ServiceConnection;
|
|
11
|
-
import android.os.Build;
|
|
12
|
-
import android.os.Bundle;
|
|
13
|
-
import android.os.IBinder;
|
|
14
|
-
import android.support.v4.media.RatingCompat;
|
|
15
|
-
import android.support.v4.media.session.PlaybackStateCompat;
|
|
16
|
-
import android.util.Log;
|
|
17
|
-
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|
18
|
-
import com.facebook.react.bridge.*;
|
|
19
|
-
import com.guichaguri.trackplayer.service.MusicBinder;
|
|
20
|
-
import com.guichaguri.trackplayer.service.MusicService;
|
|
21
|
-
import com.guichaguri.trackplayer.service.Utils;
|
|
22
|
-
import com.guichaguri.trackplayer.service.models.Track;
|
|
23
|
-
|
|
24
|
-
import javax.annotation.Nonnull;
|
|
25
|
-
import javax.annotation.Nullable;
|
|
26
|
-
import java.util.*;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @author Guichaguri
|
|
30
|
-
*/
|
|
31
|
-
public class MusicModule extends ReactContextBaseJavaModule implements ServiceConnection {
|
|
32
|
-
|
|
33
|
-
private MusicBinder binder;
|
|
34
|
-
private MusicEvents eventHandler;
|
|
35
|
-
private ArrayDeque<Runnable> initCallbacks = new ArrayDeque<>();
|
|
36
|
-
private boolean connecting = false;
|
|
37
|
-
private Bundle options;
|
|
38
|
-
|
|
39
|
-
public MusicModule(ReactApplicationContext reactContext) {
|
|
40
|
-
super(reactContext);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@Override
|
|
44
|
-
@Nonnull
|
|
45
|
-
public String getName() {
|
|
46
|
-
return "TrackPlayerModule";
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@Override
|
|
50
|
-
public void initialize() {
|
|
51
|
-
ReactContext context = getReactApplicationContext();
|
|
52
|
-
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
|
|
53
|
-
|
|
54
|
-
eventHandler = new MusicEvents(context);
|
|
55
|
-
manager.registerReceiver(eventHandler, new IntentFilter(Utils.EVENT_INTENT));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
@Override
|
|
59
|
-
public void onCatalystInstanceDestroy() {
|
|
60
|
-
ReactContext context = getReactApplicationContext();
|
|
61
|
-
|
|
62
|
-
if(eventHandler != null) {
|
|
63
|
-
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
|
|
64
|
-
|
|
65
|
-
manager.unregisterReceiver(eventHandler);
|
|
66
|
-
eventHandler = null;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
@Override
|
|
71
|
-
public void onServiceConnected(ComponentName name, IBinder service) {
|
|
72
|
-
binder = (MusicBinder)service;
|
|
73
|
-
connecting = false;
|
|
74
|
-
|
|
75
|
-
// Reapply options that user set before with updateOptions
|
|
76
|
-
if (options != null) {
|
|
77
|
-
binder.updateOptions(options);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Triggers all callbacks
|
|
81
|
-
while(!initCallbacks.isEmpty()) {
|
|
82
|
-
binder.post(initCallbacks.remove());
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
@Override
|
|
87
|
-
public void onServiceDisconnected(ComponentName name) {
|
|
88
|
-
binder = null;
|
|
89
|
-
connecting = false;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Waits for a connection to the service and/or runs the {@link Runnable} in the player thread
|
|
94
|
-
*/
|
|
95
|
-
private void waitForConnection(Runnable r) {
|
|
96
|
-
if(binder != null) {
|
|
97
|
-
binder.post(r);
|
|
98
|
-
return;
|
|
99
|
-
} else {
|
|
100
|
-
initCallbacks.add(r);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if(connecting) return;
|
|
104
|
-
|
|
105
|
-
ReactApplicationContext context = getReactApplicationContext();
|
|
106
|
-
|
|
107
|
-
// Binds the service to get a MediaWrapper instance
|
|
108
|
-
Intent intent = new Intent(context, MusicService.class);
|
|
109
|
-
//context.startService(intent);
|
|
110
|
-
try {
|
|
111
|
-
if (Build.VERSION.SDK_INT >= 26) {
|
|
112
|
-
context.startForegroundService(intent);
|
|
113
|
-
} else {
|
|
114
|
-
context.startService(intent);
|
|
115
|
-
}
|
|
116
|
-
}catch(Exception ex){
|
|
117
|
-
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
|
118
|
-
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
|
|
119
|
-
Intent i = new Intent(context, MusicService.class);
|
|
120
|
-
PendingIntent pi = PendingIntent.getForegroundService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
|
121
|
-
Calendar calendar = Calendar.getInstance();
|
|
122
|
-
calendar.setTimeInMillis(System.currentTimeMillis());
|
|
123
|
-
calendar.add(Calendar.MILLISECOND, 200);
|
|
124
|
-
mgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
intent.setAction(Utils.CONNECT_INTENT);
|
|
128
|
-
context.bindService(intent, this, 0);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
connecting = true;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/* ****************************** API ****************************** */
|
|
136
|
-
|
|
137
|
-
@Nullable
|
|
138
|
-
@Override
|
|
139
|
-
public Map<String, Object> getConstants() {
|
|
140
|
-
Map<String, Object> constants = new HashMap<>();
|
|
141
|
-
|
|
142
|
-
// Capabilities
|
|
143
|
-
constants.put("CAPABILITY_PLAY", PlaybackStateCompat.ACTION_PLAY);
|
|
144
|
-
constants.put("CAPABILITY_PLAY_FROM_ID", PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID);
|
|
145
|
-
constants.put("CAPABILITY_PLAY_FROM_SEARCH", PlaybackStateCompat.ACTION_PLAY_FROM_SEARCH);
|
|
146
|
-
constants.put("CAPABILITY_PAUSE", PlaybackStateCompat.ACTION_PAUSE);
|
|
147
|
-
constants.put("CAPABILITY_STOP", PlaybackStateCompat.ACTION_STOP);
|
|
148
|
-
constants.put("CAPABILITY_SEEK_TO", PlaybackStateCompat.ACTION_SEEK_TO);
|
|
149
|
-
constants.put("CAPABILITY_SKIP", PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM);
|
|
150
|
-
constants.put("CAPABILITY_SKIP_TO_NEXT", PlaybackStateCompat.ACTION_SKIP_TO_NEXT);
|
|
151
|
-
constants.put("CAPABILITY_SKIP_TO_PREVIOUS", PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS);
|
|
152
|
-
constants.put("CAPABILITY_SET_RATING", PlaybackStateCompat.ACTION_SET_RATING);
|
|
153
|
-
constants.put("CAPABILITY_JUMP_FORWARD", PlaybackStateCompat.ACTION_FAST_FORWARD);
|
|
154
|
-
constants.put("CAPABILITY_JUMP_BACKWARD", PlaybackStateCompat.ACTION_REWIND);
|
|
155
|
-
|
|
156
|
-
// States
|
|
157
|
-
constants.put("STATE_NONE", PlaybackStateCompat.STATE_NONE);
|
|
158
|
-
constants.put("STATE_READY", PlaybackStateCompat.STATE_PAUSED);
|
|
159
|
-
constants.put("STATE_PLAYING", PlaybackStateCompat.STATE_PLAYING);
|
|
160
|
-
constants.put("STATE_PAUSED", PlaybackStateCompat.STATE_PAUSED);
|
|
161
|
-
constants.put("STATE_STOPPED", PlaybackStateCompat.STATE_STOPPED);
|
|
162
|
-
constants.put("STATE_BUFFERING", PlaybackStateCompat.STATE_BUFFERING);
|
|
163
|
-
constants.put("STATE_CONNECTING", PlaybackStateCompat.STATE_CONNECTING);
|
|
164
|
-
|
|
165
|
-
// Rating Types
|
|
166
|
-
constants.put("RATING_HEART", RatingCompat.RATING_HEART);
|
|
167
|
-
constants.put("RATING_THUMBS_UP_DOWN", RatingCompat.RATING_THUMB_UP_DOWN);
|
|
168
|
-
constants.put("RATING_3_STARS", RatingCompat.RATING_3_STARS);
|
|
169
|
-
constants.put("RATING_4_STARS", RatingCompat.RATING_4_STARS);
|
|
170
|
-
constants.put("RATING_5_STARS", RatingCompat.RATING_5_STARS);
|
|
171
|
-
constants.put("RATING_PERCENTAGE", RatingCompat.RATING_PERCENTAGE);
|
|
172
|
-
|
|
173
|
-
return constants;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
@ReactMethod
|
|
177
|
-
public void destroy() {
|
|
178
|
-
// Ignore if it was already destroyed
|
|
179
|
-
if (binder == null && !connecting) return;
|
|
180
|
-
|
|
181
|
-
try {
|
|
182
|
-
if(binder != null) {
|
|
183
|
-
binder.destroy();
|
|
184
|
-
binder = null;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
ReactContext context = getReactApplicationContext();
|
|
188
|
-
if(context != null) context.unbindService(this);
|
|
189
|
-
} catch(Exception ex) {
|
|
190
|
-
// This method shouldn't be throwing unhandled errors even if something goes wrong.
|
|
191
|
-
Log.e(Utils.LOG, "An error occurred while destroying the service", ex);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
@ReactMethod
|
|
196
|
-
public void updateOptions(ReadableMap data, final Promise callback) {
|
|
197
|
-
// keep options as we may need them for correct MetadataManager reinitialization later
|
|
198
|
-
options = Arguments.toBundle(data);
|
|
199
|
-
|
|
200
|
-
waitForConnection(() -> {
|
|
201
|
-
if(binder != null)
|
|
202
|
-
binder.updateOptions(options);
|
|
203
|
-
callback.resolve(null);
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
@ReactMethod
|
|
208
|
-
public void setNowPlaying(ReadableMap trackMap, final Promise callback) {
|
|
209
|
-
final Bundle bundle = Arguments.toBundle(trackMap);
|
|
210
|
-
|
|
211
|
-
waitForConnection(() -> {
|
|
212
|
-
try {
|
|
213
|
-
int state = trackMap.hasKey("state") ? trackMap.getInt("state") : 0;
|
|
214
|
-
|
|
215
|
-
long elapsedTime = -1;
|
|
216
|
-
|
|
217
|
-
if(trackMap.hasKey("elapsedTime")) {
|
|
218
|
-
try {
|
|
219
|
-
elapsedTime = Utils.toMillis(trackMap.getDouble("elapsedTime"));
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
catch(Exception ex){
|
|
223
|
-
elapsedTime = Utils.toMillis((long)trackMap.getInt("elapsedTime"));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
Track track = new Track(getReactApplicationContext(), bundle, binder.getRatingType());
|
|
228
|
-
binder.getManager().setCurrentTrack(track);
|
|
229
|
-
binder.getManager().getMetadata().updateMetadata(track);
|
|
230
|
-
binder.getManager().setState(state, elapsedTime);
|
|
231
|
-
} catch(Exception ex) {
|
|
232
|
-
callback.reject("invalid_track_object", ex);
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
if(binder != null && binder.getManager() != null && binder.getManager().getCurrentTrack() == null)
|
|
237
|
-
callback.reject("invalid_track_object", "Track is missing a required key");
|
|
238
|
-
|
|
239
|
-
callback.resolve(null);
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
@ReactMethod
|
|
244
|
-
public void updatePlayback(ReadableMap trackMap, final Promise callback) {
|
|
245
|
-
final Bundle bundle = Arguments.toBundle(trackMap);
|
|
246
|
-
|
|
247
|
-
waitForConnection(() -> {
|
|
248
|
-
try {
|
|
249
|
-
int state = trackMap.hasKey("state") ? trackMap.getInt("state") : 0;
|
|
250
|
-
long elapsedTime = -1;
|
|
251
|
-
|
|
252
|
-
if(trackMap.hasKey("elapsedTime")) {
|
|
253
|
-
try {
|
|
254
|
-
elapsedTime = Utils.toMillis((long)trackMap.getInt("elapsedTime"));
|
|
255
|
-
}
|
|
256
|
-
catch(Exception ex){
|
|
257
|
-
elapsedTime = Utils.toMillis(trackMap.getDouble("elapsedTime"));
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
long duration = -1;
|
|
262
|
-
|
|
263
|
-
if(trackMap.hasKey("duration")) {
|
|
264
|
-
try {
|
|
265
|
-
duration = Utils.toMillis((long)trackMap.getInt("duration"));
|
|
266
|
-
}
|
|
267
|
-
catch(Exception ex){
|
|
268
|
-
duration = Utils.toMillis(trackMap.getDouble("duration"));
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
//update current track duration
|
|
272
|
-
Track currentTrack = binder.getManager().getCurrentTrack();
|
|
273
|
-
if(currentTrack != null && duration > -1)
|
|
274
|
-
{
|
|
275
|
-
currentTrack.duration = duration;
|
|
276
|
-
binder.getManager().getMetadata().updateMetadata(currentTrack);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
binder.getManager().setState(state, elapsedTime);
|
|
280
|
-
} catch (Exception ex) {
|
|
281
|
-
callback.reject("invalid_track_object", ex);
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (binder != null && binder.getManager() != null && binder.getManager().getCurrentTrack() == null)
|
|
286
|
-
callback.reject("invalid_track_object", "Track is missing a required key");
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
@ReactMethod
|
|
290
|
-
public void reset(final Promise callback) {
|
|
291
|
-
waitForConnection(() -> {
|
|
292
|
-
if(binder != null && binder.getManager() != null) {
|
|
293
|
-
binder.getManager().onReset();
|
|
294
|
-
callback.resolve(null);
|
|
295
|
-
}
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
}
|
package/android/src/main/java/com/guichaguri/trackplayer/service/HeadlessJsMediaService.java
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.service;
|
|
2
|
-
|
|
3
|
-
import android.annotation.SuppressLint;
|
|
4
|
-
import android.content.BroadcastReceiver;
|
|
5
|
-
import android.content.Context;
|
|
6
|
-
import android.content.Intent;
|
|
7
|
-
import android.os.IBinder;
|
|
8
|
-
import android.os.PowerManager;
|
|
9
|
-
|
|
10
|
-
import androidx.annotation.Nullable;
|
|
11
|
-
import androidx.media.MediaBrowserServiceCompat;
|
|
12
|
-
import com.facebook.infer.annotation.Assertions;
|
|
13
|
-
import com.facebook.react.bridge.ReactContext;
|
|
14
|
-
import com.facebook.react.bridge.UiThreadUtil;
|
|
15
|
-
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
|
|
16
|
-
import com.facebook.react.jstasks.HeadlessJsTaskContext;
|
|
17
|
-
import com.facebook.react.jstasks.HeadlessJsTaskEventListener;
|
|
18
|
-
import com.facebook.react.ReactInstanceManager;
|
|
19
|
-
import com.facebook.react.ReactInstanceEventListener;
|
|
20
|
-
import com.facebook.react.ReactNativeHost;
|
|
21
|
-
import com.facebook.react.ReactApplication;
|
|
22
|
-
import java.util.Set;
|
|
23
|
-
import java.util.concurrent.CopyOnWriteArraySet;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Base class for running JS without a UI. Generally, you only need to override {@link
|
|
27
|
-
* #getTaskConfig}, which is called for every {@link #onStartCommand}. The result, if not {@code
|
|
28
|
-
* null}, is used to run a JS task.
|
|
29
|
-
*
|
|
30
|
-
* <p>If you need more fine-grained control over how tasks are run, you can override {@link
|
|
31
|
-
* #onStartCommand} and call {@link #startTask} depending on your custom logic.
|
|
32
|
-
*
|
|
33
|
-
* <p>If you're starting a {@code HeadlessJsTaskService} from a {@code BroadcastReceiver} (e.g.
|
|
34
|
-
* handling push notifications), make sure to call {@link #acquireWakeLockNow} before returning from
|
|
35
|
-
* {@link BroadcastReceiver#onReceive}, to make sure the device doesn't go to sleep before the
|
|
36
|
-
* service is started.
|
|
37
|
-
*/
|
|
38
|
-
public abstract class HeadlessJsMediaService extends MediaBrowserServiceCompat implements HeadlessJsTaskEventListener {
|
|
39
|
-
|
|
40
|
-
private final Set<Integer> mActiveTasks = new CopyOnWriteArraySet<>();
|
|
41
|
-
private static @Nullable PowerManager.WakeLock sWakeLock;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
@Override
|
|
46
|
-
public int onStartCommand(Intent intent, int flags, int startId) {
|
|
47
|
-
HeadlessJsTaskConfig taskConfig = getTaskConfig(intent);
|
|
48
|
-
if (taskConfig != null) {
|
|
49
|
-
startTask(taskConfig);
|
|
50
|
-
return START_REDELIVER_INTENT;
|
|
51
|
-
}
|
|
52
|
-
return START_NOT_STICKY;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Called from {@link #onStartCommand} to create a {@link HeadlessJsTaskConfig} for this intent.
|
|
57
|
-
*
|
|
58
|
-
* @param intent the {@link Intent} received in {@link #onStartCommand}.
|
|
59
|
-
* @return a {@link HeadlessJsTaskConfig} to be used with {@link #startTask}, or {@code null} to
|
|
60
|
-
* ignore this command.
|
|
61
|
-
*/
|
|
62
|
-
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Acquire a wake lock to ensure the device doesn't go to sleep while processing background tasks.
|
|
68
|
-
*/
|
|
69
|
-
@SuppressLint("WakelockTimeout")
|
|
70
|
-
public static void acquireWakeLockNow(Context context) {
|
|
71
|
-
if (sWakeLock == null || !sWakeLock.isHeld()) {
|
|
72
|
-
PowerManager powerManager =
|
|
73
|
-
Assertions.assertNotNull((PowerManager) context.getSystemService(POWER_SERVICE));
|
|
74
|
-
sWakeLock =
|
|
75
|
-
powerManager.newWakeLock(
|
|
76
|
-
PowerManager.PARTIAL_WAKE_LOCK, HeadlessJsMediaService.class.getCanonicalName());
|
|
77
|
-
sWakeLock.setReferenceCounted(false);
|
|
78
|
-
sWakeLock.acquire();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
@Override
|
|
83
|
-
public @Nullable IBinder onBind(Intent intent) {
|
|
84
|
-
return super.onBind(intent);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
@Override
|
|
88
|
-
public void onCreate() {
|
|
89
|
-
super.onCreate();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Start a task. This method handles starting a new React instance if required.
|
|
94
|
-
*
|
|
95
|
-
* <p>Has to be called on the UI thread.
|
|
96
|
-
*
|
|
97
|
-
* @param taskConfig describes what task to start and the parameters to pass to it
|
|
98
|
-
*/
|
|
99
|
-
protected void startTask(final HeadlessJsTaskConfig taskConfig) {
|
|
100
|
-
UiThreadUtil.assertOnUiThread();
|
|
101
|
-
acquireWakeLockNow(this);
|
|
102
|
-
final ReactInstanceManager reactInstanceManager =
|
|
103
|
-
getReactNativeHost().getReactInstanceManager();
|
|
104
|
-
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
|
|
105
|
-
if (reactContext == null) {
|
|
106
|
-
reactInstanceManager.addReactInstanceEventListener(
|
|
107
|
-
new ReactInstanceEventListener() {
|
|
108
|
-
@Override
|
|
109
|
-
public void onReactContextInitialized(ReactContext reactContext) {
|
|
110
|
-
invokeStartTask(reactContext, taskConfig);
|
|
111
|
-
reactInstanceManager.removeReactInstanceEventListener(this);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
reactInstanceManager.createReactContextInBackground();
|
|
115
|
-
} else {
|
|
116
|
-
invokeStartTask(reactContext, taskConfig);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
private void invokeStartTask(ReactContext reactContext, final HeadlessJsTaskConfig taskConfig) {
|
|
121
|
-
final HeadlessJsTaskContext headlessJsTaskContext =
|
|
122
|
-
HeadlessJsTaskContext.getInstance(reactContext);
|
|
123
|
-
headlessJsTaskContext.addTaskEventListener(this);
|
|
124
|
-
|
|
125
|
-
UiThreadUtil.runOnUiThread(
|
|
126
|
-
new Runnable() {
|
|
127
|
-
@Override
|
|
128
|
-
public void run() {
|
|
129
|
-
int taskId = headlessJsTaskContext.startTask(taskConfig);
|
|
130
|
-
mActiveTasks.add(taskId);
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
@Override
|
|
136
|
-
public void onDestroy() {
|
|
137
|
-
super.onDestroy();
|
|
138
|
-
|
|
139
|
-
if (getReactNativeHost().hasInstance()) {
|
|
140
|
-
ReactInstanceManager reactInstanceManager = getReactNativeHost().getReactInstanceManager();
|
|
141
|
-
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
|
|
142
|
-
if (reactContext != null) {
|
|
143
|
-
HeadlessJsTaskContext headlessJsTaskContext =
|
|
144
|
-
HeadlessJsTaskContext.getInstance(reactContext);
|
|
145
|
-
headlessJsTaskContext.removeTaskEventListener(this);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
if (sWakeLock != null) {
|
|
149
|
-
sWakeLock.release();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
@Override
|
|
154
|
-
public void onHeadlessJsTaskStart(int taskId) {}
|
|
155
|
-
|
|
156
|
-
@Override
|
|
157
|
-
public void onHeadlessJsTaskFinish(int taskId) {
|
|
158
|
-
mActiveTasks.remove(taskId);
|
|
159
|
-
if (mActiveTasks.size() == 0) {
|
|
160
|
-
stopSelf();
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Get the {@link ReactNativeHost} used by this app. By default, assumes {@link #getApplication()}
|
|
166
|
-
* is an instance of {@link ReactApplication} and calls {@link
|
|
167
|
-
* ReactApplication#getReactNativeHost()}. Override this method if your application class does not
|
|
168
|
-
* implement {@code ReactApplication} or you simply have a different mechanism for storing a
|
|
169
|
-
* {@code ReactNativeHost}, e.g. as a static field somewhere.
|
|
170
|
-
*/
|
|
171
|
-
protected ReactNativeHost getReactNativeHost() {
|
|
172
|
-
return ((ReactApplication) getApplication()).getReactNativeHost();
|
|
173
|
-
}
|
|
174
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.service;
|
|
2
|
-
|
|
3
|
-
import android.os.Binder;
|
|
4
|
-
import android.os.Bundle;
|
|
5
|
-
import android.os.Handler;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @author Guichaguri
|
|
9
|
-
*/
|
|
10
|
-
public class MusicBinder extends Binder {
|
|
11
|
-
|
|
12
|
-
private final MusicService service;
|
|
13
|
-
private final MusicManager manager;
|
|
14
|
-
|
|
15
|
-
public MusicBinder(MusicService service, MusicManager manager) {
|
|
16
|
-
this.service = service;
|
|
17
|
-
this.manager = manager;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public void post(Runnable r) {
|
|
21
|
-
if(service == null)
|
|
22
|
-
return;
|
|
23
|
-
|
|
24
|
-
if(service.handler == null)
|
|
25
|
-
service.handler = new Handler();
|
|
26
|
-
|
|
27
|
-
service.handler.post(r);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public MusicManager getManager(){ return this.manager; }
|
|
31
|
-
|
|
32
|
-
public void updateOptions(Bundle bundle) {
|
|
33
|
-
manager.setStopWithApp(bundle.getBoolean("stopWithApp", false));
|
|
34
|
-
manager.setAlwaysPauseOnInterruption(bundle.getBoolean("alwaysPauseOnInterruption", false));
|
|
35
|
-
manager.getMetadata().updateOptions(bundle);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public int getRatingType() {
|
|
39
|
-
return manager.getMetadata().getRatingType();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public void destroy() {
|
|
43
|
-
service.destroy(true);
|
|
44
|
-
service.stopSelf();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
}
|