@javascriptcommon/react-native-track-player 1.2.23 → 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 +80 -63
- package/android/proguard-rules.txt +0 -3
- package/android/src/main/AndroidManifest.xml +10 -11
- 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/{guichaguri → doublesymmetry}/trackplayer/extensions/AudioPlayerStateExt.kt +3 -3
- 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/{guichaguri → doublesymmetry}/trackplayer/model/MetadataAdapter.kt +20 -17
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
- package/android/src/main/java/com/{guichaguri/trackplayer/kotlinaudio/models → doublesymmetry/trackplayer/model}/PlaybackMetadata.kt +31 -28
- package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/model/State.kt +1 -1
- 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/{guichaguri → doublesymmetry}/trackplayer/module/MusicEvents.kt +10 -9
- 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/{guichaguri/trackplayer/service → doublesymmetry/trackplayer/utils}/BundleUtils.kt +50 -20
- 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/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/EventHolder.kt +7 -7
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/PlayerEventHolder.kt +22 -9
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioContentType.kt +1 -1
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +118 -0
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioItemTransitionReason.kt +3 -3
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioPlayerState.kt +2 -2
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/BufferConfig.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/CacheConfig.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/Capability.kt +1 -1
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/FocusChangeData.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/MediaSessionCallback.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayWhenReadyChangeData.kt +1 -3
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackEndedReason.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackError.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayerConfig.kt +8 -5
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +40 -0
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PositionChangedReason.kt +1 -1
- 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/{guichaguri/trackplayer/kotlinaudio/players → lovegaoshi/kotlinaudio/player}/QueuedAudioPlayer.kt +68 -58
- 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 +3 -4
- 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/ic_home-playstore.png +0 -0
- package/android/src/main/ic_repeat-playstore.png +0 -0
- package/android/src/main/ic_repeat_50-playstore.png +0 -0
- package/android/src/main/ic_shuffle-playstore.png +0 -0
- package/android/src/main/ic_shuffle_50-playstore.png +0 -0
- package/android/src/main/ic_shuffle_sm-playstore.png +0 -0
- package/android/src/main/ic_stop-playstore.png +0 -0
- package/android/src/main/ic_test-playstore.png +0 -0
- package/android/src/main/java/com/guichaguri/trackplayer/HeadlessJsMediaService.java +0 -225
- package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.kt +0 -25
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/NotificationEventHolder.kt +0 -20
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AAMediaSessionCallback.kt +0 -10
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItem.kt +0 -66
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationConfig.kt +0 -43
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationMetadata.kt +0 -8
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationState.kt +0 -8
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerOptions.kt +0 -9
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/QueuedPlayerOptions.kt +0 -49
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/notification/NotificationManager.kt +0 -678
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/AudioPlayer.kt +0 -10
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/BaseAudioPlayer.kt +0 -864
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/MediaSourceExt.kt +0 -35
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/PlayerCache.kt +0 -26
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/utils/Utils.kt +0 -12
- package/android/src/main/java/com/guichaguri/trackplayer/model/Track.kt +0 -120
- package/android/src/main/java/com/guichaguri/trackplayer/model/TrackAudioItem.kt +0 -19
- package/android/src/main/java/com/guichaguri/trackplayer/model/TrackType.kt +0 -11
- package/android/src/main/java/com/guichaguri/trackplayer/module/AutoConnectionDetector.kt +0 -151
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.kt +0 -1177
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.kt +0 -31
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.kt +0 -347
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.kt +0 -1254
- package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.kt +0 -228
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.kt +0 -141
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.kt +0 -396
- package/android/src/main/res/drawable-hdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_home.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_home.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_home.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_home.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_home.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/android/src/main/res/mipmap-hdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/raw/silent_5_seconds.mp3 +0 -0
- package/android/src/main/res/strings.xml +0 -6
- package/index.d.ts +0 -235
- 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 -178
- /package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
package com.doublesymmetry.trackplayer.utils
|
|
2
|
+
|
|
3
|
+
import androidx.lifecycle.DefaultLifecycleObserver
|
|
4
|
+
import androidx.lifecycle.LifecycleOwner
|
|
5
|
+
import androidx.lifecycle.ProcessLifecycleOwner
|
|
6
|
+
import com.facebook.react.bridge.UiThreadUtil
|
|
7
|
+
|
|
8
|
+
object AppForegroundTracker {
|
|
9
|
+
private var activityCount = 0
|
|
10
|
+
|
|
11
|
+
val foregrounded: Boolean
|
|
12
|
+
get() = activityCount > 0
|
|
13
|
+
|
|
14
|
+
val backgrounded: Boolean
|
|
15
|
+
get() = activityCount <= 0
|
|
16
|
+
|
|
17
|
+
fun start() {
|
|
18
|
+
UiThreadUtil.runOnUiThread {
|
|
19
|
+
ProcessLifecycleOwner.get().lifecycle.addObserver(Observer)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
object Observer : DefaultLifecycleObserver {
|
|
24
|
+
|
|
25
|
+
override fun onResume(owner: LifecycleOwner) {
|
|
26
|
+
super.onResume(owner)
|
|
27
|
+
activityCount++
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override fun onPause(owner: LifecycleOwner) {
|
|
31
|
+
super.onPause(owner)
|
|
32
|
+
activityCount--
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
package com.
|
|
1
|
+
package com.doublesymmetry.trackplayer.utils
|
|
2
2
|
|
|
3
3
|
import android.content.ContentResolver
|
|
4
4
|
import android.content.Context
|
|
5
5
|
import android.net.Uri
|
|
6
6
|
import android.os.Bundle
|
|
7
7
|
import android.support.v4.media.RatingCompat
|
|
8
|
+
import androidx.media3.common.HeartRating
|
|
9
|
+
import androidx.media3.common.PercentageRating
|
|
10
|
+
import androidx.media3.common.Rating
|
|
11
|
+
import androidx.media3.common.StarRating
|
|
12
|
+
import androidx.media3.common.ThumbRating
|
|
13
|
+
import com.doublesymmetry.trackplayer.R
|
|
8
14
|
import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper
|
|
9
15
|
|
|
10
16
|
/**
|
|
@@ -16,12 +22,12 @@ object BundleUtils {
|
|
|
16
22
|
val obj = data[key]
|
|
17
23
|
if (obj is String) {
|
|
18
24
|
// Remote or Local Uri
|
|
19
|
-
if (obj.trim { it <= ' ' }.isEmpty()) throw RuntimeException("The URL cannot be empty")
|
|
25
|
+
if (obj.trim { it <= ' ' }.isEmpty()) throw RuntimeException("$key: The URL cannot be empty")
|
|
20
26
|
return Uri.parse(obj as String?)
|
|
21
27
|
} else if (obj is Bundle) {
|
|
22
28
|
// require/import
|
|
23
29
|
val uri = obj.getString("uri")
|
|
24
|
-
val helper = ResourceDrawableIdHelper.
|
|
30
|
+
val helper = ResourceDrawableIdHelper.instance
|
|
25
31
|
val id = helper.getResourceDrawableId(context, uri)
|
|
26
32
|
return if (id > 0) {
|
|
27
33
|
// In production, we can obtain the resource uri
|
|
@@ -44,7 +50,7 @@ object BundleUtils {
|
|
|
44
50
|
if (!data.containsKey(key)) return 0
|
|
45
51
|
val obj = data[key] as? Bundle ?: return 0
|
|
46
52
|
var name = obj.getString("uri")
|
|
47
|
-
if (name
|
|
53
|
+
if (name.isNullOrEmpty()) return 0
|
|
48
54
|
name = name.lowercase().replace("-", "_")
|
|
49
55
|
return try {
|
|
50
56
|
name.toInt()
|
|
@@ -53,7 +59,7 @@ object BundleUtils {
|
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
|
|
56
|
-
fun getIcon(context: Context, options: Bundle, propertyName: String, defaultIcon: Int): Int {
|
|
62
|
+
private fun getIcon(context: Context, options: Bundle, propertyName: String, defaultIcon: Int): Int {
|
|
57
63
|
if (!options.containsKey(propertyName)) return defaultIcon
|
|
58
64
|
|
|
59
65
|
val bundle = options.getBundle(propertyName) ?: return defaultIcon
|
|
@@ -63,41 +69,58 @@ object BundleUtils {
|
|
|
63
69
|
return if (icon == 0) defaultIcon else icon
|
|
64
70
|
}
|
|
65
71
|
|
|
72
|
+
fun getCustomIcon(context: Context, options: Bundle, propertyName: String, defaultIcon: Int): Int {
|
|
73
|
+
when (getIntOrNull(options, propertyName)) {
|
|
74
|
+
0 -> return R.drawable.hearte_24px
|
|
75
|
+
1 -> return R.drawable.heart_24px
|
|
76
|
+
2 -> return R.drawable.baseline_repeat_24
|
|
77
|
+
3 -> return R.drawable.baseline_repeat_one_24
|
|
78
|
+
4 -> return R.drawable.shuffle_24px
|
|
79
|
+
5 -> return R.drawable.ifl_24px
|
|
80
|
+
}
|
|
81
|
+
return getIcon(context, options, propertyName, defaultIcon)
|
|
82
|
+
}
|
|
83
|
+
|
|
66
84
|
fun getIconOrNull(context: Context, options: Bundle, propertyName: String): Int? {
|
|
67
85
|
if (!options.containsKey(propertyName)) return null
|
|
68
86
|
|
|
69
87
|
val bundle = options.getBundle(propertyName) ?: return null
|
|
70
88
|
|
|
71
|
-
val helper = ResourceDrawableIdHelper.
|
|
89
|
+
val helper = ResourceDrawableIdHelper.instance
|
|
72
90
|
val icon = helper.getResourceDrawableId(context, bundle.getString("uri"))
|
|
73
91
|
return if (icon == 0) null else icon
|
|
74
92
|
}
|
|
75
93
|
|
|
76
|
-
fun getRating(data: Bundle?, key: String?, ratingType: Int):
|
|
94
|
+
fun getRating(data: Bundle?, key: String?, ratingType: Int): Rating? {
|
|
77
95
|
return if (!data!!.containsKey(key) || ratingType == RatingCompat.RATING_NONE) {
|
|
78
|
-
|
|
96
|
+
null
|
|
79
97
|
} else if (ratingType == RatingCompat.RATING_HEART) {
|
|
80
|
-
|
|
98
|
+
HeartRating(data.getBoolean(key, true))
|
|
81
99
|
} else if (ratingType == RatingCompat.RATING_THUMB_UP_DOWN) {
|
|
82
|
-
|
|
100
|
+
ThumbRating(data.getBoolean(key, true))
|
|
83
101
|
} else if (ratingType == RatingCompat.RATING_PERCENTAGE) {
|
|
84
|
-
|
|
102
|
+
PercentageRating(data.getFloat(key, 0f))
|
|
85
103
|
} else {
|
|
86
|
-
|
|
104
|
+
StarRating(5, data.getFloat(key, 0f))
|
|
87
105
|
}
|
|
88
106
|
}
|
|
89
107
|
|
|
90
108
|
fun setRating(data: Bundle, key: String?, rating: RatingCompat) {
|
|
91
109
|
if (!rating.isRated) return
|
|
92
110
|
val ratingType = rating.ratingStyle
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
111
|
+
when (ratingType) {
|
|
112
|
+
RatingCompat.RATING_HEART -> {
|
|
113
|
+
data.putBoolean(key, rating.hasHeart())
|
|
114
|
+
}
|
|
115
|
+
RatingCompat.RATING_THUMB_UP_DOWN -> {
|
|
116
|
+
data.putBoolean(key, rating.isThumbUp)
|
|
117
|
+
}
|
|
118
|
+
RatingCompat.RATING_PERCENTAGE -> {
|
|
119
|
+
data.putDouble(key, rating.percentRating.toDouble())
|
|
120
|
+
}
|
|
121
|
+
else -> {
|
|
122
|
+
data.putDouble(key, rating.starRating.toDouble())
|
|
123
|
+
}
|
|
101
124
|
}
|
|
102
125
|
}
|
|
103
126
|
|
|
@@ -114,4 +137,11 @@ object BundleUtils {
|
|
|
114
137
|
value.toInt()
|
|
115
138
|
} else null
|
|
116
139
|
}
|
|
140
|
+
|
|
141
|
+
fun getDoubleOrNull(data: Bundle?, key: String?): Double? {
|
|
142
|
+
val value = data!![key]
|
|
143
|
+
return if (value is Number) {
|
|
144
|
+
value.toDouble()
|
|
145
|
+
} else null
|
|
146
|
+
}
|
|
117
147
|
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
package com.doublesymmetry.trackplayer.utils
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Bitmap
|
|
5
|
+
import android.graphics.BitmapFactory
|
|
6
|
+
import android.graphics.drawable.BitmapDrawable
|
|
7
|
+
import android.net.Uri
|
|
8
|
+
import android.os.Build
|
|
9
|
+
import androidx.media3.common.util.BitmapLoader
|
|
10
|
+
import androidx.media3.common.util.Util.isBitmapFactorySupportedMimeType
|
|
11
|
+
import androidx.media3.common.util.UnstableApi
|
|
12
|
+
import coil.ImageLoader
|
|
13
|
+
import coil.request.ImageRequest
|
|
14
|
+
import com.lovegaoshi.kotlinaudio.utils.getEmbeddedBitmap
|
|
15
|
+
import com.google.common.util.concurrent.ListenableFuture
|
|
16
|
+
import jp.wasabeef.transformers.coil.CropSquareTransformation
|
|
17
|
+
import kotlinx.coroutines.MainScope
|
|
18
|
+
import kotlinx.coroutines.guava.future
|
|
19
|
+
import java.io.IOException
|
|
20
|
+
import javax.inject.Inject
|
|
21
|
+
|
|
22
|
+
// https://github.com/androidx/media/issues/121
|
|
23
|
+
|
|
24
|
+
@UnstableApi
|
|
25
|
+
class CoilBitmapLoader @Inject constructor(
|
|
26
|
+
private val context: Context,
|
|
27
|
+
private val cropSquare: Boolean = false,
|
|
28
|
+
) : BitmapLoader {
|
|
29
|
+
|
|
30
|
+
private val scope = MainScope()
|
|
31
|
+
private val imageLoader = ImageLoader(context)
|
|
32
|
+
|
|
33
|
+
override fun supportsMimeType(mimeType: String): Boolean {
|
|
34
|
+
return isBitmapFactorySupportedMimeType(mimeType)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override fun decodeBitmap(data: ByteArray): ListenableFuture<Bitmap> {
|
|
38
|
+
val bitmap = BitmapFactory.decodeByteArray(data, /* offset= */0, data.size)
|
|
39
|
+
return scope.future {
|
|
40
|
+
bitmap ?: throw IOException("Unable to decode bitmap")
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override fun loadBitmap(uri: Uri): ListenableFuture<Bitmap> = scope.future {
|
|
45
|
+
val bitmap: Bitmap?
|
|
46
|
+
val parsedUri = uri.toString()
|
|
47
|
+
if (parsedUri.startsWith("file://")) {
|
|
48
|
+
bitmap = getEmbeddedBitmap(parsedUri.substring(7))
|
|
49
|
+
} else {
|
|
50
|
+
var imgrequest = ImageRequest.Builder(context)
|
|
51
|
+
.data(uri)
|
|
52
|
+
.allowHardware(false)
|
|
53
|
+
// HACK: header implementation should be done via parsed data from uri
|
|
54
|
+
|
|
55
|
+
if (Build.MANUFACTURER == "samsung" || cropSquare) {
|
|
56
|
+
imgrequest = imgrequest.transformations(CropSquareTransformation())
|
|
57
|
+
}
|
|
58
|
+
val response = imageLoader.execute(imgrequest.build())
|
|
59
|
+
bitmap = (response.drawable as? BitmapDrawable)?.bitmap
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
bitmap ?: Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
package com.doublesymmetry.trackplayer.utils
|
|
2
|
+
|
|
3
|
+
import android.net.Uri
|
|
4
|
+
import android.os.Bundle
|
|
5
|
+
import androidx.media3.common.MediaItem
|
|
6
|
+
import androidx.media3.common.MediaMetadata
|
|
7
|
+
|
|
8
|
+
fun buildMediaItem(
|
|
9
|
+
title: String? = null,
|
|
10
|
+
subtitle: String? = null,
|
|
11
|
+
mediaId: String,
|
|
12
|
+
isPlayable: Boolean,
|
|
13
|
+
subtitleConfigurations: List<MediaItem.SubtitleConfiguration> = mutableListOf(),
|
|
14
|
+
album: String? = null,
|
|
15
|
+
artist: String? = null,
|
|
16
|
+
genre: String? = null,
|
|
17
|
+
sourceUri: Uri? = null,
|
|
18
|
+
imageUri: Uri? = null,
|
|
19
|
+
extras: Bundle? = null
|
|
20
|
+
): MediaItem {
|
|
21
|
+
val metadata =
|
|
22
|
+
MediaMetadata.Builder()
|
|
23
|
+
.setAlbumTitle(album)
|
|
24
|
+
.setTitle(title)
|
|
25
|
+
.setSubtitle(subtitle)
|
|
26
|
+
.setArtist(artist)
|
|
27
|
+
.setGenre(genre)
|
|
28
|
+
.setIsBrowsable(!isPlayable)
|
|
29
|
+
.setIsPlayable(isPlayable)
|
|
30
|
+
.setArtworkUri(imageUri)
|
|
31
|
+
.setMediaType(if (isPlayable) MediaMetadata.MEDIA_TYPE_MUSIC else MediaMetadata.MEDIA_TYPE_FOLDER_MIXED)
|
|
32
|
+
.setExtras(extras)
|
|
33
|
+
.build()
|
|
34
|
+
|
|
35
|
+
return MediaItem.Builder()
|
|
36
|
+
.setMediaId(mediaId)
|
|
37
|
+
.setSubtitleConfigurations(subtitleConfigurations)
|
|
38
|
+
.setMediaMetadata(metadata)
|
|
39
|
+
.setUri(sourceUri)
|
|
40
|
+
.build()
|
|
41
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package com.doublesymmetry.trackplayer.video
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.widget.FrameLayout
|
|
5
|
+
import androidx.media3.ui.PlayerView
|
|
6
|
+
import androidx.media3.ui.AspectRatioFrameLayout
|
|
7
|
+
import com.doublesymmetry.trackplayer.service.MusicService
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A simple wrapper that surfaces the ExoPlayer instance managed by RN Track Player
|
|
11
|
+
* inside a Media3 [PlayerView] so that React Native can render the video track.
|
|
12
|
+
*/
|
|
13
|
+
class TrackPlayerVideoView(context: Context) : FrameLayout(context) {
|
|
14
|
+
private val playerView: PlayerView = PlayerView(context).apply {
|
|
15
|
+
useController = false
|
|
16
|
+
layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
init {
|
|
20
|
+
addView(playerView)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
override fun onAttachedToWindow() {
|
|
24
|
+
super.onAttachedToWindow()
|
|
25
|
+
// Get the ExoPlayer instance from the running MusicService if available
|
|
26
|
+
playerView.player = MusicService.instance?.audioPlayer?.exoPlayer
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun onDetachedFromWindow() {
|
|
30
|
+
playerView.player = null
|
|
31
|
+
super.onDetachedFromWindow()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
fun setResizeMode(mode: String?) {
|
|
35
|
+
when (mode) {
|
|
36
|
+
"cover" -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM
|
|
37
|
+
"stretch" -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL
|
|
38
|
+
"none" -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH
|
|
39
|
+
else -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT // contain default
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoViewManager.kt
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
package com.doublesymmetry.trackplayer.video
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.uimanager.SimpleViewManager
|
|
4
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
5
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
6
|
+
|
|
7
|
+
class TrackPlayerVideoViewManager : SimpleViewManager<TrackPlayerVideoView>() {
|
|
8
|
+
override fun getName() = "RNTrackPlayerVideoView"
|
|
9
|
+
|
|
10
|
+
override fun createViewInstance(reactContext: ThemedReactContext): TrackPlayerVideoView {
|
|
11
|
+
return TrackPlayerVideoView(reactContext)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@ReactProp(name = "resizeMode")
|
|
15
|
+
fun setResizeMode(view: TrackPlayerVideoView, mode: String?) {
|
|
16
|
+
view.setResizeMode(mode)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
package com.
|
|
1
|
+
package com.lovegaoshi.kotlinaudio.event
|
|
2
2
|
|
|
3
|
-
class EventHolder internal constructor(private val
|
|
3
|
+
class EventHolder internal constructor(private val playerEventHolder: PlayerEventHolder) {
|
|
4
4
|
val audioItemTransition
|
|
5
5
|
get() = playerEventHolder.audioItemTransition
|
|
6
6
|
|
|
7
|
-
val notificationStateChange
|
|
8
|
-
get() = notificationEventHolder.notificationStateChange
|
|
9
|
-
|
|
10
7
|
val onAudioFocusChanged
|
|
11
8
|
get() = playerEventHolder.onAudioFocusChanged
|
|
12
9
|
|
|
13
|
-
val
|
|
14
|
-
get() = playerEventHolder.
|
|
10
|
+
val onCommonMetadata
|
|
11
|
+
get() = playerEventHolder.onCommonMetadata
|
|
12
|
+
|
|
13
|
+
val onTimedMetadata
|
|
14
|
+
get() = playerEventHolder.onTimedMetadata
|
|
15
15
|
|
|
16
16
|
val onPlayerActionTriggeredExternally
|
|
17
17
|
get() = playerEventHolder.onPlayerActionTriggeredExternally
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
package com.
|
|
1
|
+
package com.lovegaoshi.kotlinaudio.event
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
import
|
|
3
|
+
import androidx.annotation.OptIn
|
|
4
|
+
import androidx.media3.common.MediaMetadata
|
|
5
|
+
import androidx.media3.common.Metadata
|
|
6
|
+
import androidx.media3.common.util.UnstableApi
|
|
7
|
+
import com.lovegaoshi.kotlinaudio.models.*
|
|
5
8
|
import kotlinx.coroutines.MainScope
|
|
6
9
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
|
7
10
|
import kotlinx.coroutines.flow.asSharedFlow
|
|
@@ -21,7 +24,7 @@ class PlayerEventHolder {
|
|
|
21
24
|
|
|
22
25
|
private var _playWhenReadyChange = MutableSharedFlow<PlayWhenReadyChangeData>(1)
|
|
23
26
|
/**
|
|
24
|
-
* Use these events to track when [com.
|
|
27
|
+
* Use these events to track when [com.lovegaoshi.kotlinaudio.players.BaseAudioPlayer.playWhenReady]
|
|
25
28
|
* changes.
|
|
26
29
|
*/
|
|
27
30
|
var playWhenReadyChange = _playWhenReadyChange.asSharedFlow()
|
|
@@ -41,8 +44,11 @@ class PlayerEventHolder {
|
|
|
41
44
|
private var _onAudioFocusChanged = MutableSharedFlow<FocusChangeData>(1)
|
|
42
45
|
var onAudioFocusChanged = _onAudioFocusChanged.asSharedFlow()
|
|
43
46
|
|
|
44
|
-
private var
|
|
45
|
-
var
|
|
47
|
+
private var _onCommonMetadata = MutableSharedFlow<MediaMetadata>(1)
|
|
48
|
+
var onCommonMetadata = _onCommonMetadata.asSharedFlow()
|
|
49
|
+
|
|
50
|
+
private var _onTimedMetadata = MutableSharedFlow<Metadata>(1)
|
|
51
|
+
var onTimedMetadata = _onTimedMetadata.asSharedFlow()
|
|
46
52
|
|
|
47
53
|
private var _onPlayerActionTriggeredExternally = MutableSharedFlow<MediaSessionCallback>()
|
|
48
54
|
|
|
@@ -51,7 +57,7 @@ class PlayerEventHolder {
|
|
|
51
57
|
*
|
|
52
58
|
* The sources can be: media buttons on headphones, Android Wear, Android Auto, Google Assistant, media notification, etc.
|
|
53
59
|
*
|
|
54
|
-
* For this observable to send events, set [interceptPlayerActionsTriggeredExternally][com.
|
|
60
|
+
* For this observable to send events, set [interceptPlayerActionsTriggeredExternally][com.lovegaoshi.kotlinaudio.models.PlayerConfig.interceptPlayerActionsTriggeredExternally] to true.
|
|
55
61
|
*/
|
|
56
62
|
var onPlayerActionTriggeredExternally = _onPlayerActionTriggeredExternally.asSharedFlow()
|
|
57
63
|
|
|
@@ -91,9 +97,16 @@ class PlayerEventHolder {
|
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
99
|
|
|
94
|
-
internal fun
|
|
100
|
+
internal fun updateOnCommonMetadata(metadata: MediaMetadata) {
|
|
101
|
+
coroutineScope.launch {
|
|
102
|
+
_onCommonMetadata.emit(metadata)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@OptIn(UnstableApi::class)
|
|
107
|
+
internal fun updateOnTimedMetadata(metadata: Metadata) {
|
|
95
108
|
coroutineScope.launch {
|
|
96
|
-
|
|
109
|
+
_onTimedMetadata.emit(metadata)
|
|
97
110
|
}
|
|
98
111
|
}
|
|
99
112
|
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
package com.lovegaoshi.kotlinaudio.models
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Bitmap
|
|
5
|
+
import android.os.Bundle
|
|
6
|
+
import androidx.core.net.toUri
|
|
7
|
+
import androidx.media3.common.MediaItem
|
|
8
|
+
import androidx.media3.common.MediaMetadata
|
|
9
|
+
import com.lovegaoshi.kotlinaudio.utils.getEmbeddedBitmapArray
|
|
10
|
+
import com.lovegaoshi.kotlinaudio.utils.saveMediaCoverToPng
|
|
11
|
+
import java.util.UUID
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
data class DefaultAudioItem(
|
|
15
|
+
override var audioUrl: String,
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Set to [MediaType.DEFAULT] by default.
|
|
19
|
+
*/
|
|
20
|
+
override val type: MediaType = MediaType.DEFAULT,
|
|
21
|
+
|
|
22
|
+
override var artist: String? = null,
|
|
23
|
+
override var title: String? = null,
|
|
24
|
+
override var albumTitle: String? = null,
|
|
25
|
+
override var artwork: String? = null,
|
|
26
|
+
override val duration: Long? = null,
|
|
27
|
+
override val options: AudioItemOptions? = null,
|
|
28
|
+
override val mediaId: String? = null,
|
|
29
|
+
) : AudioItem
|
|
30
|
+
|
|
31
|
+
class AudioItemHolder(
|
|
32
|
+
var audioItem: AudioItem
|
|
33
|
+
) {
|
|
34
|
+
var artworkBitmap: Bitmap? = null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface AudioItem {
|
|
38
|
+
var audioUrl: String
|
|
39
|
+
val type: MediaType
|
|
40
|
+
var artist: String?
|
|
41
|
+
var title: String?
|
|
42
|
+
var albumTitle: String?
|
|
43
|
+
val artwork: String?
|
|
44
|
+
val duration: Long?
|
|
45
|
+
val options: AudioItemOptions?
|
|
46
|
+
val mediaId: String?
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
data class AudioItemOptions(
|
|
50
|
+
val headers: HashMap<String, String>? = null,
|
|
51
|
+
val userAgent: String? = null,
|
|
52
|
+
val resourceId: Int? = null
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
enum class MediaType(val value: String) {
|
|
56
|
+
/**
|
|
57
|
+
* The default media type. Should be used for streams over HTTP or files
|
|
58
|
+
*/
|
|
59
|
+
DEFAULT("default"),
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The DASH media type for adaptive streams. Should be used with DASH manifests.
|
|
63
|
+
*/
|
|
64
|
+
DASH("dash"),
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The HLS media type for adaptive streams. Should be used with HLS playlists.
|
|
68
|
+
*/
|
|
69
|
+
HLS("hls"),
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The SmoothStreaming media type for adaptive streams. Should be used with SmoothStreaming manifests.
|
|
73
|
+
*/
|
|
74
|
+
SMOOTH_STREAMING("smoothstreaming");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
fun audioItem2MediaItem(audioItem: AudioItem, context: Context? = null): MediaItem {
|
|
80
|
+
return MediaItem.Builder()
|
|
81
|
+
.setMediaId(audioItem.mediaId ?: UUID.randomUUID().toString())
|
|
82
|
+
.setUri(audioItem.audioUrl)
|
|
83
|
+
.setMediaMetadata(
|
|
84
|
+
MediaMetadata.Builder()
|
|
85
|
+
.setTitle(audioItem.title)
|
|
86
|
+
.setArtist(audioItem.artist)
|
|
87
|
+
.setArtworkUri((
|
|
88
|
+
if (context != null && audioItem.audioUrl.startsWith("file://")) {
|
|
89
|
+
saveMediaCoverToPng(
|
|
90
|
+
audioItem.audioUrl,
|
|
91
|
+
context.contentResolver,
|
|
92
|
+
audioItem.mediaId ?: audioItem.audioUrl
|
|
93
|
+
)
|
|
94
|
+
?: audioItem.artwork
|
|
95
|
+
}
|
|
96
|
+
else audioItem.artwork)?.toUri())
|
|
97
|
+
.setArtworkData(if (audioItem.audioUrl.startsWith("file://")) getEmbeddedBitmapArray(
|
|
98
|
+
audioItem.audioUrl.substring(7)) else null, MediaMetadata.PICTURE_TYPE_MEDIA)
|
|
99
|
+
.setExtras(Bundle().apply {
|
|
100
|
+
audioItem.options?.headers?.let {
|
|
101
|
+
putSerializable("headers", audioItem.options!!.headers)
|
|
102
|
+
}
|
|
103
|
+
audioItem.options?.userAgent?.let {
|
|
104
|
+
putString("user-agent", it)
|
|
105
|
+
}
|
|
106
|
+
audioItem.options?.resourceId?.let {
|
|
107
|
+
putInt("resource-id", it)
|
|
108
|
+
}
|
|
109
|
+
putString("type", audioItem.type.toString())
|
|
110
|
+
putString("uri", audioItem.audioUrl)
|
|
111
|
+
}).build())
|
|
112
|
+
.setTag(audioItem)
|
|
113
|
+
.build()
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
fun mediaItem2AudioItem(item: MediaItem?): AudioItem? {
|
|
117
|
+
return item?.localConfiguration?.tag as AudioItem?
|
|
118
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.
|
|
1
|
+
package com.lovegaoshi.kotlinaudio.models
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Use these events to track when and why an [AudioItem] transitions to another.
|
|
@@ -14,8 +14,8 @@ sealed class AudioItemTransitionReason(val oldPosition: Long) {
|
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* A seek to another [AudioItem] has occurred. Usually triggered when calling
|
|
17
|
-
* [QueuedAudioPlayer.next][com.
|
|
18
|
-
* or [QueuedAudioPlayer.previous][com.
|
|
17
|
+
* [QueuedAudioPlayer.next][com.lovegaoshi.kotlinaudio.players.QueuedAudioPlayer.next]
|
|
18
|
+
* or [QueuedAudioPlayer.previous][com.lovegaoshi.kotlinaudio.players.QueuedAudioPlayer.previous].
|
|
19
19
|
*/
|
|
20
20
|
class SEEK_TO_ANOTHER_AUDIO_ITEM(oldPosition: Long) : AudioItemTransitionReason(oldPosition)
|
|
21
21
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.
|
|
1
|
+
package com.lovegaoshi.kotlinaudio.models
|
|
2
2
|
|
|
3
3
|
enum class AudioPlayerState {
|
|
4
4
|
/** The current [AudioItem] is being loaded for playback. */
|
|
@@ -22,7 +22,7 @@ enum class AudioPlayerState {
|
|
|
22
22
|
/** No [AudioItem] is loaded and the player is doing nothing. */
|
|
23
23
|
IDLE,
|
|
24
24
|
|
|
25
|
-
/**
|
|
25
|
+
/** Playback stopped due to the end of the queue being reached. */
|
|
26
26
|
ENDED,
|
|
27
27
|
|
|
28
28
|
/** The player stopped playing due to an error. */
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
package com.lovegaoshi.kotlinaudio.models
|
|
2
|
+
|
|
3
|
+
import android.os.Bundle
|
|
4
|
+
import androidx.media3.common.util.UnstableApi
|
|
5
|
+
import androidx.media3.session.CommandButton
|
|
6
|
+
import androidx.media3.session.SessionCommand
|
|
7
|
+
|
|
8
|
+
@UnstableApi
|
|
9
|
+
data class CustomButton (
|
|
10
|
+
val displayName: String = "",
|
|
11
|
+
val iconRes: Int = 0,
|
|
12
|
+
val sessionCommand: String? = null,
|
|
13
|
+
val onLayout: Boolean = false,
|
|
14
|
+
val commandButton: CommandButton = CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
|
15
|
+
.setDisplayName(displayName)
|
|
16
|
+
.setIconResId(iconRes)
|
|
17
|
+
.setSessionCommand(SessionCommand(sessionCommand ?: displayName, Bundle()))
|
|
18
|
+
.build()
|
|
19
|
+
)
|