@javascriptcommon/react-native-track-player 1.2.23 → 4.1.5

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.
Files changed (507) hide show
  1. package/LICENSE +201 -21
  2. package/README.md +8 -0
  3. package/android/build.gradle +80 -63
  4. package/android/proguard-rules.txt +0 -3
  5. package/android/src/main/AndroidManifest.xml +10 -11
  6. package/android/src/main/java/com/doublesymmetry/trackplayer/HeadlessJsMediaService.kt +199 -0
  7. package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayer.kt +33 -0
  8. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/extensions/AudioPlayerStateExt.kt +3 -3
  9. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/EnumExtensions.kt +5 -0
  10. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/NumberExt.kt +13 -0
  11. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/model/MetadataAdapter.kt +20 -17
  12. package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
  13. package/android/src/main/java/com/{guichaguri/trackplayer/kotlinaudio/models → doublesymmetry/trackplayer/model}/PlaybackMetadata.kt +31 -28
  14. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/model/State.kt +1 -1
  15. package/android/src/main/java/com/doublesymmetry/trackplayer/model/Track.kt +67 -0
  16. package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackAudioItem.kt +18 -0
  17. package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackMetadata.kt +38 -0
  18. package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/module/MusicEvents.kt +10 -9
  19. package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicModule.kt +778 -0
  20. package/android/src/main/java/com/doublesymmetry/trackplayer/service/MusicService.kt +1286 -0
  21. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/AppForegroundTracker.kt +35 -0
  22. package/android/src/main/java/com/{guichaguri/trackplayer/service → doublesymmetry/trackplayer/utils}/BundleUtils.kt +50 -20
  23. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/CoilBitmapLoader.kt +65 -0
  24. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/MediaItemBuilder.kt +41 -0
  25. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/RejectionException.kt +11 -0
  26. package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoView.kt +42 -0
  27. package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoViewManager.kt +18 -0
  28. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/EventHolder.kt +7 -7
  29. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/PlayerEventHolder.kt +22 -9
  30. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioContentType.kt +1 -1
  31. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +118 -0
  32. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioItemTransitionReason.kt +3 -3
  33. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioPlayerState.kt +2 -2
  34. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/BufferConfig.kt +1 -1
  35. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/CacheConfig.kt +1 -1
  36. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/Capability.kt +1 -1
  37. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
  38. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/FocusChangeData.kt +1 -1
  39. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/MediaSessionCallback.kt +1 -1
  40. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayWhenReadyChangeData.kt +1 -3
  41. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackEndedReason.kt +1 -1
  42. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackError.kt +1 -1
  43. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayerConfig.kt +8 -5
  44. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +40 -0
  45. package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PositionChangedReason.kt +1 -1
  46. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/RepeatMode.kt +16 -0
  47. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/WakeMode.kt +7 -0
  48. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/AudioPlayer.kt +756 -0
  49. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/ForwardingPlayer.java +1124 -0
  50. package/android/src/main/java/com/{guichaguri/trackplayer/kotlinaudio/players → lovegaoshi/kotlinaudio/player}/QueuedAudioPlayer.kt +68 -58
  51. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/APMRenderersFactory.kt +33 -0
  52. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Buffer.kt +34 -0
  53. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Cache.kt +27 -0
  54. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/FocusManager.kt +59 -0
  55. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/MediaFactory.kt +130 -0
  56. package/android/src/main/java/com/lovegaoshi/kotlinaudio/processors/TeeListener.kt +171 -0
  57. package/android/src/main/java/com/lovegaoshi/kotlinaudio/service/MusicService.kt +127 -0
  58. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/FFT.java +99 -0
  59. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/Utils.kt +113 -0
  60. package/android/src/main/res/drawable/baseline_repeat_24.xml +5 -0
  61. package/android/src/main/res/drawable/baseline_repeat_one_24.xml +5 -0
  62. package/android/src/main/res/drawable/forward.xml +5 -0
  63. package/android/src/main/res/drawable/heart_24px.xml +5 -0
  64. package/android/src/main/res/drawable/hearte_24px.xml +5 -0
  65. package/android/src/main/res/drawable/ifl_24px.xml +5 -0
  66. package/android/src/main/res/drawable/rewind.xml +5 -0
  67. package/android/src/main/res/drawable/shuffle_24px.xml +5 -0
  68. package/android/src/main/res/values/strings.xml +3 -4
  69. package/android/src/main/res/xml/automotive_app_desc.xml +3 -0
  70. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/22AMillion.jpg +0 -0
  71. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/Contents.json +21 -0
  72. package/ios/Example/SwiftAudio/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  73. package/ios/Example/SwiftAudio/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  74. package/ios/Example/SwiftAudio/Assets.xcassets/Contents.json +6 -0
  75. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/Contents.json +21 -0
  76. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/cover.jpg +0 -0
  77. package/ios/Example/SwiftAudio/AudioController.swift +46 -0
  78. package/ios/Example/SwiftAudio/Extensions.swift +22 -0
  79. package/ios/Example/SwiftAudio/PlayerView.swift +172 -0
  80. package/ios/Example/SwiftAudio/PlayerViewModel.swift +120 -0
  81. package/ios/Example/SwiftAudio/Preview Content/Preview Assets.xcassets/Contents.json +6 -0
  82. package/ios/Example/SwiftAudio/QueueView.swift +65 -0
  83. package/ios/{TrackPlayer.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist → Example/SwiftAudio/SwiftAudio.entitlements} +6 -8
  84. package/ios/Example/SwiftAudio/SwiftAudioApp.swift +17 -0
  85. package/ios/Example/SwiftAudio.xcodeproj/project.pbxproj +412 -0
  86. package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/contents.xcworkspacedata +1 -1
  87. package/ios/RNTrackPlayer/Models/Capabilities.swift +39 -4
  88. package/ios/RNTrackPlayer/Models/MediaURL.swift +12 -6
  89. package/ios/RNTrackPlayer/Models/MetadataAdapter.swift +147 -0
  90. package/ios/RNTrackPlayer/Models/PitchAlgorithms.swift +13 -0
  91. package/ios/RNTrackPlayer/Models/SessionCategories.swift +106 -0
  92. package/ios/RNTrackPlayer/Models/State.swift +26 -0
  93. package/ios/RNTrackPlayer/Models/Track.swift +74 -54
  94. package/ios/RNTrackPlayer/RNTrackPlayer.swift +867 -406
  95. package/ios/RNTrackPlayer/Support/RNTrackPlayer-Bridging-Header.h +1 -0
  96. package/ios/RNTrackPlayer/TrackPlayer.h +14 -0
  97. package/ios/RNTrackPlayer/TrackPlayer.mm +249 -0
  98. package/ios/RNTrackPlayer/Utils/EventType.swift +45 -0
  99. package/ios/RNTrackPlayer/Utils/Metadata.swift +60 -0
  100. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoView.swift +83 -0
  101. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.m +5 -0
  102. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.swift +17 -0
  103. package/ios/SwiftAudioEx/Package.swift +20 -0
  104. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapper.swift +531 -0
  105. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperDelegate.swift +27 -0
  106. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperProtocol.swift +69 -0
  107. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperState.swift +43 -0
  108. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioItem.swift +158 -0
  109. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayer.swift +459 -0
  110. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayerError.swift +26 -0
  111. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSession.swift +33 -0
  112. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSessionController.swift +135 -0
  113. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioTap.swift +96 -0
  114. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Event.swift +155 -0
  115. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/MediaItemProperty.swift +95 -0
  116. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoCenter.swift +17 -0
  117. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoController.swift +73 -0
  118. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoControllerProtocol.swift +26 -0
  119. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoKeyValue.swift +14 -0
  120. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoProperty.swift +234 -0
  121. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemNotificationObserver.swift +102 -0
  122. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemObserver.swift +136 -0
  123. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerObserver.swift +120 -0
  124. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerTimeObserver.swift +112 -0
  125. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueueManager.swift +356 -0
  126. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueuedAudioPlayer.swift +236 -0
  127. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommand.swift +170 -0
  128. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommandController.swift +206 -0
  129. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RepeatMode.swift +15 -0
  130. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/TimeEventFrequency.swift +26 -0
  131. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Utils/DispatchQueueType.swift +18 -0
  132. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/WaveformAudioTap.swift +159 -0
  133. package/lib/specs/NativeTrackPlayer.d.ts +134 -0
  134. package/lib/specs/NativeTrackPlayer.js +4 -0
  135. package/lib/src/TrackPlayerModule.web.d.ts +2 -0
  136. package/lib/src/TrackPlayerModule.web.js +2 -0
  137. package/lib/src/VideoView.d.ts +16 -0
  138. package/lib/src/VideoView.js +25 -0
  139. package/lib/src/constants/AndroidAudioContentType.d.ts +35 -0
  140. package/lib/src/constants/AndroidAudioContentType.js +36 -0
  141. package/lib/src/constants/AndroidAutoContentStyle.d.ts +10 -0
  142. package/lib/src/constants/AndroidAutoContentStyle.js +11 -0
  143. package/lib/src/constants/AppKilledPlaybackBehavior.d.ts +17 -0
  144. package/lib/src/constants/AppKilledPlaybackBehavior.js +18 -0
  145. package/lib/src/constants/Capability.d.ts +17 -0
  146. package/lib/src/constants/Capability.js +19 -0
  147. package/lib/src/constants/Event.d.ts +172 -0
  148. package/lib/src/constants/Event.js +173 -0
  149. package/lib/src/constants/IOSCategory.d.ts +36 -0
  150. package/lib/src/constants/IOSCategory.js +37 -0
  151. package/lib/src/constants/IOSCategoryMode.d.ts +47 -0
  152. package/lib/src/constants/IOSCategoryMode.js +48 -0
  153. package/lib/src/constants/IOSCategoryOptions.d.ts +44 -0
  154. package/lib/src/constants/IOSCategoryOptions.js +45 -0
  155. package/lib/src/constants/MediaItemPlayable.d.ts +4 -0
  156. package/lib/src/constants/MediaItemPlayable.js +5 -0
  157. package/lib/src/constants/PitchAlgorithm.d.ts +14 -0
  158. package/lib/src/constants/PitchAlgorithm.js +16 -0
  159. package/lib/src/constants/RatingType.d.ts +8 -0
  160. package/lib/src/constants/RatingType.js +10 -0
  161. package/lib/src/constants/RepeatMode.d.ts +8 -0
  162. package/lib/src/constants/RepeatMode.js +10 -0
  163. package/lib/src/constants/State.d.ts +34 -0
  164. package/lib/src/constants/State.js +35 -0
  165. package/lib/src/constants/TrackType.d.ts +6 -0
  166. package/lib/src/constants/TrackType.js +7 -0
  167. package/lib/src/constants/index.d.ts +14 -0
  168. package/lib/src/constants/index.js +14 -0
  169. package/lib/src/hooks/index.d.ts +6 -0
  170. package/lib/src/hooks/index.js +6 -0
  171. package/lib/src/hooks/useActiveTrack.d.ts +2 -0
  172. package/lib/src/hooks/useActiveTrack.js +28 -0
  173. package/lib/src/hooks/useAppIsInBackground.d.ts +1 -0
  174. package/lib/src/hooks/useAppIsInBackground.js +16 -0
  175. package/lib/src/hooks/useIsPlaying.d.ts +35 -0
  176. package/lib/src/hooks/useIsPlaying.js +50 -0
  177. package/lib/src/hooks/usePlayWhenReady.d.ts +1 -0
  178. package/lib/src/hooks/usePlayWhenReady.js +27 -0
  179. package/lib/src/hooks/usePlaybackState.d.ts +10 -0
  180. package/lib/src/hooks/usePlaybackState.js +35 -0
  181. package/lib/src/hooks/useProgress.d.ts +7 -0
  182. package/lib/src/hooks/useProgress.js +55 -0
  183. package/lib/src/hooks/useTrackPlayerEvents.d.ts +8 -0
  184. package/lib/src/hooks/useTrackPlayerEvents.js +30 -0
  185. package/lib/src/index.d.ts +6 -0
  186. package/lib/src/index.js +6 -0
  187. package/lib/src/interfaces/AndroidAutoBrowseTree.d.ts +5 -0
  188. package/lib/src/interfaces/AndroidAutoBrowseTree.js +1 -0
  189. package/lib/src/interfaces/AndroidOptions.d.ts +41 -0
  190. package/lib/src/interfaces/AndroidOptions.js +1 -0
  191. package/lib/src/interfaces/CustomButtons.d.ts +5 -0
  192. package/lib/src/interfaces/CustomButtons.js +1 -0
  193. package/lib/src/interfaces/FeedbackOptions.d.ts +6 -0
  194. package/lib/src/interfaces/FeedbackOptions.js +1 -0
  195. package/lib/src/interfaces/MediaItem.d.ts +18 -0
  196. package/lib/src/interfaces/MediaItem.js +1 -0
  197. package/lib/src/interfaces/MetadataOptions.d.ts +3 -0
  198. package/lib/src/interfaces/MetadataOptions.js +1 -0
  199. package/lib/src/interfaces/NowPlayingMetadata.d.ts +4 -0
  200. package/lib/src/interfaces/NowPlayingMetadata.js +1 -0
  201. package/lib/src/interfaces/PlaybackState.d.ts +8 -0
  202. package/lib/src/interfaces/PlaybackState.js +1 -0
  203. package/lib/src/interfaces/PlayerOptions.d.ts +132 -0
  204. package/lib/src/interfaces/PlayerOptions.js +1 -0
  205. package/lib/src/interfaces/Progress.d.ts +15 -0
  206. package/lib/src/interfaces/Progress.js +1 -0
  207. package/lib/src/interfaces/ResourceObject.d.ts +1 -0
  208. package/lib/src/interfaces/ResourceObject.js +1 -0
  209. package/lib/src/interfaces/ServiceHandler.d.ts +1 -0
  210. package/lib/src/interfaces/ServiceHandler.js +1 -0
  211. package/lib/src/interfaces/Track.d.ts +21 -0
  212. package/lib/src/interfaces/Track.js +1 -0
  213. package/lib/src/interfaces/TrackMetadataBase.d.ts +28 -0
  214. package/lib/src/interfaces/TrackMetadataBase.js +1 -0
  215. package/lib/src/interfaces/UpdateOptions.d.ts +52 -0
  216. package/lib/src/interfaces/UpdateOptions.js +1 -0
  217. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.d.ts +33 -0
  218. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.js +1 -0
  219. package/lib/src/interfaces/events/ControllerConnectedEvent.d.ts +8 -0
  220. package/lib/src/interfaces/events/ControllerConnectedEvent.js +1 -0
  221. package/lib/src/interfaces/events/EventPayloadByEvent.d.ts +77 -0
  222. package/lib/src/interfaces/events/EventPayloadByEvent.js +1 -0
  223. package/lib/src/interfaces/events/FFTUpdateEvent.d.ts +7 -0
  224. package/lib/src/interfaces/events/FFTUpdateEvent.js +1 -0
  225. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.d.ts +24 -0
  226. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.js +1 -0
  227. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.d.ts +4 -0
  228. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.js +1 -0
  229. package/lib/src/interfaces/events/PlaybackErrorEvent.d.ts +6 -0
  230. package/lib/src/interfaces/events/PlaybackErrorEvent.js +1 -0
  231. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.d.ts +16 -0
  232. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.js +1 -0
  233. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.d.ts +4 -0
  234. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.js +1 -0
  235. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.d.ts +4 -0
  236. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.js +1 -0
  237. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.d.ts +9 -0
  238. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.js +1 -0
  239. package/lib/src/interfaces/events/PlaybackResumeEvent.d.ts +3 -0
  240. package/lib/src/interfaces/events/PlaybackResumeEvent.js +1 -0
  241. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.d.ts +11 -0
  242. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.js +1 -0
  243. package/lib/src/interfaces/events/PlayerErrorEvent.d.ts +6 -0
  244. package/lib/src/interfaces/events/PlayerErrorEvent.js +1 -0
  245. package/lib/src/interfaces/events/RemoteBrowseEvent.d.ts +4 -0
  246. package/lib/src/interfaces/events/RemoteBrowseEvent.js +1 -0
  247. package/lib/src/interfaces/events/RemoteCustomActionEvent.d.ts +7 -0
  248. package/lib/src/interfaces/events/RemoteCustomActionEvent.js +1 -0
  249. package/lib/src/interfaces/events/RemoteDuckEvent.d.ts +13 -0
  250. package/lib/src/interfaces/events/RemoteDuckEvent.js +1 -0
  251. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.d.ts +7 -0
  252. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.js +1 -0
  253. package/lib/src/interfaces/events/RemoteJumpForwardEvent.d.ts +7 -0
  254. package/lib/src/interfaces/events/RemoteJumpForwardEvent.js +1 -0
  255. package/lib/src/interfaces/events/RemotePlayIdEvent.d.ts +4 -0
  256. package/lib/src/interfaces/events/RemotePlayIdEvent.js +1 -0
  257. package/lib/src/interfaces/events/RemotePlaySearchEvent.d.ts +9 -0
  258. package/lib/src/interfaces/events/RemotePlaySearchEvent.js +1 -0
  259. package/lib/src/interfaces/events/RemoteSearchEvent.d.ts +3 -0
  260. package/lib/src/interfaces/events/RemoteSearchEvent.js +1 -0
  261. package/lib/src/interfaces/events/RemoteSeekEvent.d.ts +4 -0
  262. package/lib/src/interfaces/events/RemoteSeekEvent.js +1 -0
  263. package/lib/src/interfaces/events/RemoteSetRatingEvent.d.ts +4 -0
  264. package/lib/src/interfaces/events/RemoteSetRatingEvent.js +1 -0
  265. package/lib/src/interfaces/events/RemoteSkipEvent.d.ts +3 -0
  266. package/lib/src/interfaces/events/RemoteSkipEvent.js +1 -0
  267. package/lib/src/interfaces/events/index.d.ts +20 -0
  268. package/lib/src/interfaces/events/index.js +20 -0
  269. package/lib/src/interfaces/index.d.ts +15 -0
  270. package/lib/src/interfaces/index.js +15 -0
  271. package/lib/src/resolveAssetSource.d.ts +2 -0
  272. package/lib/src/resolveAssetSource.js +3 -0
  273. package/lib/src/resolveAssetSource.web.d.ts +2 -0
  274. package/lib/src/resolveAssetSource.web.js +8 -0
  275. package/lib/src/trackPlayer.d.ts +371 -0
  276. package/lib/src/trackPlayer.js +627 -0
  277. package/lib/web/TrackPlayer/Player.d.ts +40 -0
  278. package/lib/web/TrackPlayer/Player.js +188 -0
  279. package/lib/web/TrackPlayer/PlaylistPlayer.d.ts +31 -0
  280. package/lib/web/TrackPlayer/PlaylistPlayer.js +181 -0
  281. package/lib/web/TrackPlayer/RepeatMode.d.ts +5 -0
  282. package/lib/web/TrackPlayer/RepeatMode.js +6 -0
  283. package/lib/web/TrackPlayer/SetupNotCalledError.d.ts +3 -0
  284. package/lib/web/TrackPlayer/SetupNotCalledError.js +5 -0
  285. package/lib/web/TrackPlayer/index.d.ts +3 -0
  286. package/lib/web/TrackPlayer/index.js +3 -0
  287. package/lib/web/TrackPlayerModule.d.ts +63 -0
  288. package/lib/web/TrackPlayerModule.js +153 -0
  289. package/lib/web/index.d.ts +3 -0
  290. package/lib/web/index.js +3 -0
  291. package/package.json +85 -6
  292. package/react-native-track-player.podspec +13 -13
  293. package/specs/NativeTrackPlayer.ts +153 -0
  294. package/src/TrackPlayerModule.web.ts +2 -0
  295. package/src/VideoView.tsx +51 -0
  296. package/src/constants/AndroidAudioContentType.ts +35 -0
  297. package/src/constants/AndroidAutoContentStyle.ts +10 -0
  298. package/src/constants/AppKilledPlaybackBehavior.ts +19 -0
  299. package/src/constants/Capability.ts +19 -0
  300. package/src/constants/Event.ts +173 -0
  301. package/src/constants/IOSCategory.ts +36 -0
  302. package/src/constants/IOSCategoryMode.ts +47 -0
  303. package/src/constants/IOSCategoryOptions.ts +44 -0
  304. package/src/constants/MediaItemPlayable.ts +4 -0
  305. package/src/constants/PitchAlgorithm.ts +16 -0
  306. package/src/constants/RatingType.ts +10 -0
  307. package/src/constants/RepeatMode.ts +10 -0
  308. package/src/constants/State.ts +34 -0
  309. package/src/constants/TrackType.ts +6 -0
  310. package/src/constants/index.ts +14 -0
  311. package/src/hooks/index.ts +6 -0
  312. package/src/hooks/useActiveTrack.ts +36 -0
  313. package/src/hooks/useAppIsInBackground.ts +20 -0
  314. package/src/hooks/useIsPlaying.ts +56 -0
  315. package/src/hooks/usePlayWhenReady.ts +37 -0
  316. package/src/hooks/usePlaybackState.ts +45 -0
  317. package/src/hooks/useProgress.ts +64 -0
  318. package/src/hooks/useTrackPlayerEvents.ts +48 -0
  319. package/src/index.ts +8 -0
  320. package/src/interfaces/AndroidAutoBrowseTree.ts +6 -0
  321. package/src/interfaces/AndroidOptions.ts +48 -0
  322. package/src/interfaces/CustomButtons.ts +6 -0
  323. package/src/interfaces/FeedbackOptions.ts +7 -0
  324. package/src/interfaces/MediaItem.ts +19 -0
  325. package/src/interfaces/MetadataOptions.ts +4 -0
  326. package/src/interfaces/NowPlayingMetadata.ts +5 -0
  327. package/src/interfaces/PlaybackState.ts +11 -0
  328. package/src/interfaces/PlayerOptions.ts +138 -0
  329. package/src/interfaces/Progress.ts +15 -0
  330. package/src/interfaces/ResourceObject.ts +1 -0
  331. package/src/interfaces/ServiceHandler.ts +1 -0
  332. package/src/interfaces/Track.ts +23 -0
  333. package/src/interfaces/TrackMetadataBase.ts +29 -0
  334. package/src/interfaces/UpdateOptions.ts +59 -0
  335. package/src/interfaces/events/AudioMetadataReceivedEvent.ts +37 -0
  336. package/src/interfaces/events/ControllerConnectedEvent.ts +9 -0
  337. package/src/interfaces/events/EventPayloadByEvent.ts +80 -0
  338. package/src/interfaces/events/FFTUpdateEvent.ts +9 -0
  339. package/src/interfaces/events/PlaybackActiveTrackChangedEvent.ts +29 -0
  340. package/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.ts +4 -0
  341. package/src/interfaces/events/PlaybackErrorEvent.ts +6 -0
  342. package/src/interfaces/events/PlaybackMetadataReceivedEvent.ts +16 -0
  343. package/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.ts +4 -0
  344. package/src/interfaces/events/PlaybackProgressUpdatedEvent.ts +5 -0
  345. package/src/interfaces/events/PlaybackQueueEndedEvent.ts +9 -0
  346. package/src/interfaces/events/PlaybackResumeEvent.ts +5 -0
  347. package/src/interfaces/events/PlaybackTrackChangedEvent.ts +11 -0
  348. package/src/interfaces/events/PlayerErrorEvent.ts +6 -0
  349. package/src/interfaces/events/RemoteBrowseEvent.ts +4 -0
  350. package/src/interfaces/events/RemoteCustomActionEvent.ts +7 -0
  351. package/src/interfaces/events/RemoteDuckEvent.ts +13 -0
  352. package/src/interfaces/events/RemoteJumpBackwardEvent.ts +7 -0
  353. package/src/interfaces/events/RemoteJumpForwardEvent.ts +7 -0
  354. package/src/interfaces/events/RemotePlayIdEvent.ts +4 -0
  355. package/src/interfaces/events/RemotePlaySearchEvent.ts +21 -0
  356. package/src/interfaces/events/RemoteSearchEvent.ts +3 -0
  357. package/src/interfaces/events/RemoteSeekEvent.ts +4 -0
  358. package/src/interfaces/events/RemoteSetRatingEvent.ts +5 -0
  359. package/src/interfaces/events/RemoteSkipEvent.ts +3 -0
  360. package/src/interfaces/events/index.ts +20 -0
  361. package/src/interfaces/index.ts +15 -0
  362. package/src/resolveAssetSource.ts +3 -0
  363. package/src/resolveAssetSource.web.ts +10 -0
  364. package/src/trackPlayer.ts +806 -0
  365. package/web/TrackPlayer/Player.ts +201 -0
  366. package/web/TrackPlayer/PlaylistPlayer.ts +215 -0
  367. package/web/TrackPlayer/RepeatMode.ts +6 -0
  368. package/web/TrackPlayer/SetupNotCalledError.ts +5 -0
  369. package/web/TrackPlayer/index.ts +3 -0
  370. package/web/TrackPlayerModule.ts +181 -0
  371. package/web/index.ts +4 -0
  372. package/CHANGELOG.md +0 -75
  373. package/android/react-native-music-control.iml +0 -139
  374. package/android/react-native-track-player.iml +0 -151
  375. package/android/src/main/ic_home-playstore.png +0 -0
  376. package/android/src/main/ic_repeat-playstore.png +0 -0
  377. package/android/src/main/ic_repeat_50-playstore.png +0 -0
  378. package/android/src/main/ic_shuffle-playstore.png +0 -0
  379. package/android/src/main/ic_shuffle_50-playstore.png +0 -0
  380. package/android/src/main/ic_shuffle_sm-playstore.png +0 -0
  381. package/android/src/main/ic_stop-playstore.png +0 -0
  382. package/android/src/main/ic_test-playstore.png +0 -0
  383. package/android/src/main/java/com/guichaguri/trackplayer/HeadlessJsMediaService.java +0 -225
  384. package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.kt +0 -25
  385. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/NotificationEventHolder.kt +0 -20
  386. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AAMediaSessionCallback.kt +0 -10
  387. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItem.kt +0 -66
  388. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationConfig.kt +0 -43
  389. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationMetadata.kt +0 -8
  390. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationState.kt +0 -8
  391. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerOptions.kt +0 -9
  392. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/QueuedPlayerOptions.kt +0 -49
  393. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/notification/NotificationManager.kt +0 -678
  394. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/AudioPlayer.kt +0 -10
  395. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/BaseAudioPlayer.kt +0 -864
  396. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/MediaSourceExt.kt +0 -35
  397. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/PlayerCache.kt +0 -26
  398. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/utils/Utils.kt +0 -12
  399. package/android/src/main/java/com/guichaguri/trackplayer/model/Track.kt +0 -120
  400. package/android/src/main/java/com/guichaguri/trackplayer/model/TrackAudioItem.kt +0 -19
  401. package/android/src/main/java/com/guichaguri/trackplayer/model/TrackType.kt +0 -11
  402. package/android/src/main/java/com/guichaguri/trackplayer/module/AutoConnectionDetector.kt +0 -151
  403. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.kt +0 -1177
  404. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.kt +0 -31
  405. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.kt +0 -347
  406. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.kt +0 -1254
  407. package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.kt +0 -228
  408. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.kt +0 -141
  409. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.kt +0 -396
  410. package/android/src/main/res/drawable-hdpi/ic_forward.png +0 -0
  411. package/android/src/main/res/drawable-hdpi/ic_home.png +0 -0
  412. package/android/src/main/res/drawable-hdpi/ic_next.png +0 -0
  413. package/android/src/main/res/drawable-hdpi/ic_pause.png +0 -0
  414. package/android/src/main/res/drawable-hdpi/ic_play.png +0 -0
  415. package/android/src/main/res/drawable-hdpi/ic_previous.png +0 -0
  416. package/android/src/main/res/drawable-hdpi/ic_rewind.png +0 -0
  417. package/android/src/main/res/drawable-hdpi/ic_stop.png +0 -0
  418. package/android/src/main/res/drawable-mdpi/ic_forward.png +0 -0
  419. package/android/src/main/res/drawable-mdpi/ic_home.png +0 -0
  420. package/android/src/main/res/drawable-mdpi/ic_next.png +0 -0
  421. package/android/src/main/res/drawable-mdpi/ic_pause.png +0 -0
  422. package/android/src/main/res/drawable-mdpi/ic_play.png +0 -0
  423. package/android/src/main/res/drawable-mdpi/ic_previous.png +0 -0
  424. package/android/src/main/res/drawable-mdpi/ic_rewind.png +0 -0
  425. package/android/src/main/res/drawable-mdpi/ic_stop.png +0 -0
  426. package/android/src/main/res/drawable-xhdpi/ic_forward.png +0 -0
  427. package/android/src/main/res/drawable-xhdpi/ic_home.png +0 -0
  428. package/android/src/main/res/drawable-xhdpi/ic_next.png +0 -0
  429. package/android/src/main/res/drawable-xhdpi/ic_pause.png +0 -0
  430. package/android/src/main/res/drawable-xhdpi/ic_play.png +0 -0
  431. package/android/src/main/res/drawable-xhdpi/ic_previous.png +0 -0
  432. package/android/src/main/res/drawable-xhdpi/ic_rewind.png +0 -0
  433. package/android/src/main/res/drawable-xhdpi/ic_stop.png +0 -0
  434. package/android/src/main/res/drawable-xxhdpi/ic_forward.png +0 -0
  435. package/android/src/main/res/drawable-xxhdpi/ic_home.png +0 -0
  436. package/android/src/main/res/drawable-xxhdpi/ic_next.png +0 -0
  437. package/android/src/main/res/drawable-xxhdpi/ic_pause.png +0 -0
  438. package/android/src/main/res/drawable-xxhdpi/ic_play.png +0 -0
  439. package/android/src/main/res/drawable-xxhdpi/ic_previous.png +0 -0
  440. package/android/src/main/res/drawable-xxhdpi/ic_rewind.png +0 -0
  441. package/android/src/main/res/drawable-xxhdpi/ic_stop.png +0 -0
  442. package/android/src/main/res/drawable-xxxhdpi/ic_forward.png +0 -0
  443. package/android/src/main/res/drawable-xxxhdpi/ic_home.png +0 -0
  444. package/android/src/main/res/drawable-xxxhdpi/ic_next.png +0 -0
  445. package/android/src/main/res/drawable-xxxhdpi/ic_pause.png +0 -0
  446. package/android/src/main/res/drawable-xxxhdpi/ic_play.png +0 -0
  447. package/android/src/main/res/drawable-xxxhdpi/ic_previous.png +0 -0
  448. package/android/src/main/res/drawable-xxxhdpi/ic_rewind.png +0 -0
  449. package/android/src/main/res/drawable-xxxhdpi/ic_stop.png +0 -0
  450. package/android/src/main/res/mipmap-hdpi/ic_arrow_down_circle_foreground.png +0 -0
  451. package/android/src/main/res/mipmap-hdpi/ic_clock_now_foreground.png +0 -0
  452. package/android/src/main/res/mipmap-hdpi/ic_close_foreground.png +0 -0
  453. package/android/src/main/res/mipmap-hdpi/ic_heart_foreground.png +0 -0
  454. package/android/src/main/res/mipmap-hdpi/ic_heart_outlined_foreground.png +0 -0
  455. package/android/src/main/res/mipmap-hdpi/ic_repeat_off_foreground.png +0 -0
  456. package/android/src/main/res/mipmap-hdpi/ic_repeat_on_foreground.png +0 -0
  457. package/android/src/main/res/mipmap-hdpi/ic_shuffle_off_foreground.png +0 -0
  458. package/android/src/main/res/mipmap-hdpi/ic_shuffle_on_foreground.png +0 -0
  459. package/android/src/main/res/mipmap-mdpi/ic_arrow_down_circle_foreground.png +0 -0
  460. package/android/src/main/res/mipmap-mdpi/ic_clock_now_foreground.png +0 -0
  461. package/android/src/main/res/mipmap-mdpi/ic_close_foreground.png +0 -0
  462. package/android/src/main/res/mipmap-mdpi/ic_heart_foreground.png +0 -0
  463. package/android/src/main/res/mipmap-mdpi/ic_heart_outlined_foreground.png +0 -0
  464. package/android/src/main/res/mipmap-mdpi/ic_repeat_off_foreground.png +0 -0
  465. package/android/src/main/res/mipmap-mdpi/ic_repeat_on_foreground.png +0 -0
  466. package/android/src/main/res/mipmap-mdpi/ic_shuffle_off_foreground.png +0 -0
  467. package/android/src/main/res/mipmap-mdpi/ic_shuffle_on_foreground.png +0 -0
  468. package/android/src/main/res/mipmap-xhdpi/ic_arrow_down_circle_foreground.png +0 -0
  469. package/android/src/main/res/mipmap-xhdpi/ic_clock_now_foreground.png +0 -0
  470. package/android/src/main/res/mipmap-xhdpi/ic_close_foreground.png +0 -0
  471. package/android/src/main/res/mipmap-xhdpi/ic_heart_foreground.png +0 -0
  472. package/android/src/main/res/mipmap-xhdpi/ic_heart_outlined_foreground.png +0 -0
  473. package/android/src/main/res/mipmap-xhdpi/ic_repeat_off_foreground.png +0 -0
  474. package/android/src/main/res/mipmap-xhdpi/ic_repeat_on_foreground.png +0 -0
  475. package/android/src/main/res/mipmap-xhdpi/ic_shuffle_off_foreground.png +0 -0
  476. package/android/src/main/res/mipmap-xhdpi/ic_shuffle_on_foreground.png +0 -0
  477. package/android/src/main/res/mipmap-xxhdpi/ic_arrow_down_circle_foreground.png +0 -0
  478. package/android/src/main/res/mipmap-xxhdpi/ic_clock_now_foreground.png +0 -0
  479. package/android/src/main/res/mipmap-xxhdpi/ic_close_foreground.png +0 -0
  480. package/android/src/main/res/mipmap-xxhdpi/ic_heart_foreground.png +0 -0
  481. package/android/src/main/res/mipmap-xxhdpi/ic_heart_outlined_foreground.png +0 -0
  482. package/android/src/main/res/mipmap-xxhdpi/ic_repeat_off_foreground.png +0 -0
  483. package/android/src/main/res/mipmap-xxhdpi/ic_repeat_on_foreground.png +0 -0
  484. package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_off_foreground.png +0 -0
  485. package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_on_foreground.png +0 -0
  486. package/android/src/main/res/mipmap-xxxhdpi/ic_arrow_down_circle_foreground.png +0 -0
  487. package/android/src/main/res/mipmap-xxxhdpi/ic_clock_now_foreground.png +0 -0
  488. package/android/src/main/res/mipmap-xxxhdpi/ic_close_foreground.png +0 -0
  489. package/android/src/main/res/mipmap-xxxhdpi/ic_heart_foreground.png +0 -0
  490. package/android/src/main/res/mipmap-xxxhdpi/ic_heart_outlined_foreground.png +0 -0
  491. package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_off_foreground.png +0 -0
  492. package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_on_foreground.png +0 -0
  493. package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_off_foreground.png +0 -0
  494. package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_on_foreground.png +0 -0
  495. package/android/src/main/res/raw/silent_5_seconds.mp3 +0 -0
  496. package/android/src/main/res/strings.xml +0 -6
  497. package/index.d.ts +0 -235
  498. package/index.js +0 -4
  499. package/ios/RNTrackPlayer/RNTrackPlayerBridge.h +0 -12
  500. package/ios/RNTrackPlayer/RNTrackPlayerBridge.m +0 -29
  501. package/ios/TrackPlayer.xcodeproj/project.pbxproj +0 -495
  502. package/ios/TrackPlayer.xcodeproj/project.xcworkspace/xcuserdata/marco.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  503. package/lib/ProgressComponent.js +0 -70
  504. package/lib/eventTypes.js +0 -28
  505. package/lib/hooks.js +0 -160
  506. package/lib/index.js +0 -178
  507. /package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
@@ -0,0 +1,778 @@
1
+ package com.doublesymmetry.trackplayer.module
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.content.*
5
+ import android.os.Build
6
+ import android.os.Bundle
7
+ import android.os.IBinder
8
+ import android.support.v4.media.RatingCompat
9
+ import androidx.media3.common.MediaItem
10
+ import androidx.media.utils.MediaConstants
11
+ import com.lovegaoshi.kotlinaudio.models.Capability
12
+ import com.lovegaoshi.kotlinaudio.models.RepeatMode
13
+ import com.doublesymmetry.trackplayer.model.State
14
+ import com.doublesymmetry.trackplayer.model.Track
15
+ import com.doublesymmetry.trackplayer.module.MusicEvents.Companion.EVENT_INTENT
16
+ import com.doublesymmetry.trackplayer.service.MusicService
17
+ import com.doublesymmetry.trackplayer.utils.AppForegroundTracker
18
+ import com.doublesymmetry.trackplayer.utils.RejectionException
19
+ import com.doublesymmetry.trackplayer.NativeTrackPlayerSpec
20
+ import com.facebook.react.bridge.*
21
+ import androidx.media3.common.Player
22
+ import androidx.media3.session.MediaBrowser
23
+ import androidx.media3.session.SessionToken
24
+ import com.doublesymmetry.trackplayer.utils.buildMediaItem
25
+ import kotlinx.coroutines.MainScope
26
+ import kotlinx.coroutines.delay
27
+ import kotlinx.coroutines.launch
28
+ import timber.log.Timber
29
+ import java.util.*
30
+ import androidx.core.net.toUri
31
+ import com.facebook.react.module.annotations.ReactModule
32
+
33
+
34
+ /**
35
+ * @author Milen Pivchev @mpivchev
36
+ */
37
+ @ReactModule(name = MusicModule.NAME)
38
+ class MusicModule(reactContext: ReactApplicationContext) : NativeTrackPlayerSpec(reactContext),
39
+ ServiceConnection {
40
+ private lateinit var browser: MediaBrowser
41
+ private var playerOptions: Bundle? = null
42
+ private var isServiceBound = false
43
+ private var playerSetUpPromise: Promise? = null
44
+ private val scope = MainScope()
45
+ private lateinit var musicService: MusicService
46
+ private val context = reactContext
47
+
48
+ override fun getName() = NAME
49
+
50
+ companion object {
51
+ const val NAME = "TrackPlayer"
52
+ }
53
+
54
+ override fun addListener(eventType: String) {
55
+ // No implementation needed for TurboModule
56
+ // This implements the abstract method required by NativeTrackPlayerSpec
57
+ }
58
+
59
+ override fun removeListeners(count: Double) {
60
+ // No implementation needed for TurboModule
61
+ // This implements the abstract method required by NativeTrackPlayerSpec
62
+ }
63
+
64
+ override fun initialize() {
65
+ AppForegroundTracker.start()
66
+ }
67
+
68
+ override fun onServiceConnected(name: ComponentName, service: IBinder) {
69
+ launchInScope {
70
+ // If a binder already exists, don't get a new one
71
+ if (!::musicService.isInitialized) {
72
+ val binder: MusicService.MusicBinder = service as MusicService.MusicBinder
73
+ musicService = binder.service
74
+ musicService.setupPlayer(playerOptions)
75
+ playerSetUpPromise?.resolve(null)
76
+ }
77
+
78
+ isServiceBound = true
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Called when a connection to the Service has been lost.
84
+ */
85
+ override fun onServiceDisconnected(name: ComponentName) {
86
+ launchInScope {
87
+ isServiceBound = false
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Checks wither service is bound, or rejects. Returns whether promise was rejected.
93
+ */
94
+ private fun verifyServiceBoundOrReject(promise: Promise): Boolean {
95
+ if (!isServiceBound) {
96
+ promise.reject(
97
+ "player_not_initialized",
98
+ "The player is not initialized. Call setupPlayer first."
99
+ )
100
+ return true
101
+ }
102
+
103
+ return false
104
+ }
105
+
106
+ private fun bundleToTrack(bundle: Bundle): Track {
107
+ return Track(context, bundle, 0)
108
+ }
109
+
110
+ private fun hashmapToMediaItem(hashmap: HashMap<String, String>): MediaItem {
111
+ val mediaUri = hashmap["mediaUri"]
112
+ val iconUri = hashmap["iconUri"]
113
+
114
+ val extras = Bundle()
115
+ hashmap["groupTitle"]?.let {
116
+ extras.putString(
117
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, it)
118
+ }
119
+ hashmap["contentStyle"]?.toInt()?.let {
120
+ extras.putInt(
121
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM, it)
122
+ }
123
+ hashmap["childrenPlayableContentStyle"]?.toInt()?.let {
124
+ extras.putInt(
125
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE, it)
126
+ }
127
+ hashmap["childrenBrowsableContentStyle"]?.toInt()?.let {
128
+ extras.putInt(
129
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE, it)
130
+ }
131
+
132
+ // playbackProgress should contain a string representation of a number between 0 and 1 if present
133
+ hashmap["playbackProgress"]?.toDouble()?.let {
134
+ if (it > 0.98) {
135
+ extras.putInt(
136
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
137
+ MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED)
138
+ } else if (it == 0.0) {
139
+ extras.putInt(
140
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
141
+ MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED)
142
+ } else {
143
+ extras.putInt(
144
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS,
145
+ MediaConstants.DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED)
146
+ extras.putDouble(
147
+ MediaConstants.DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE, it)
148
+ }
149
+ }
150
+ return buildMediaItem(
151
+ isPlayable = hashmap["playable"]?.toInt() != 1,
152
+ title = hashmap["title"],
153
+ mediaId = hashmap["mediaId"] ?: "no-media-id",
154
+ imageUri = iconUri?.toUri(),
155
+ artist = hashmap["subtitle"],
156
+ subtitle = hashmap["subtitle"],
157
+ sourceUri = mediaUri?.toUri(),
158
+ extras = extras
159
+ )
160
+ }
161
+
162
+ private fun readableArrayToMediaItems(data: ArrayList<HashMap<String, String>>): MutableList<MediaItem> {
163
+ return data.map {
164
+ hashmapToMediaItem(it)
165
+ }.toMutableList()
166
+ }
167
+
168
+ private fun rejectWithException(callback: Promise, exception: Exception) {
169
+ when (exception) {
170
+ is RejectionException -> {
171
+ callback.reject(exception.code, exception)
172
+ }
173
+ else -> {
174
+ callback.reject("runtime_exception", exception)
175
+ }
176
+ }
177
+ }
178
+
179
+ private fun readableArrayToTrackList(data: ReadableArray?): MutableList<Track> {
180
+ val bundleList = Arguments.toList(data)
181
+ if (bundleList !is ArrayList) {
182
+ throw RejectionException("invalid_parameter", "Was not given an array of tracks")
183
+ }
184
+ return bundleList.map {
185
+ if (it is Bundle) {
186
+ bundleToTrack(it)
187
+ } else {
188
+ throw RejectionException(
189
+ "invalid_track_object",
190
+ "Track was not a dictionary type"
191
+ )
192
+ }
193
+ }.toMutableList()
194
+ }
195
+
196
+ /* ****************************** API ****************************** */
197
+ override fun getTypedExportedConstants(): MutableMap<String, Any> {
198
+ return HashMap<String, Any>().apply {
199
+ // Capabilities
200
+ this["CAPABILITY_PLAY"] = Capability.PLAY.ordinal
201
+ this["CAPABILITY_PLAY_FROM_ID"] = Capability.PLAY_FROM_ID.ordinal
202
+ this["CAPABILITY_PLAY_FROM_SEARCH"] = Capability.PLAY_FROM_SEARCH.ordinal
203
+ this["CAPABILITY_PAUSE"] = Capability.PAUSE.ordinal
204
+ this["CAPABILITY_STOP"] = Capability.STOP.ordinal
205
+ this["CAPABILITY_SEEK_TO"] = Capability.SEEK_TO.ordinal
206
+ this["CAPABILITY_SKIP"] = OnErrorAction.SKIP.ordinal
207
+ this["CAPABILITY_SKIP_TO_NEXT"] = Capability.SKIP_TO_NEXT.ordinal
208
+ this["CAPABILITY_SKIP_TO_PREVIOUS"] = Capability.SKIP_TO_PREVIOUS.ordinal
209
+ this["CAPABILITY_SET_RATING"] = Capability.SET_RATING.ordinal
210
+ this["CAPABILITY_JUMP_FORWARD"] = Capability.JUMP_FORWARD.ordinal
211
+ this["CAPABILITY_JUMP_BACKWARD"] = Capability.JUMP_BACKWARD.ordinal
212
+
213
+ // States
214
+ this["STATE_NONE"] = State.None.state
215
+ this["STATE_READY"] = State.Ready.state
216
+ this["STATE_PLAYING"] = State.Playing.state
217
+ this["STATE_PAUSED"] = State.Paused.state
218
+ this["STATE_STOPPED"] = State.Stopped.state
219
+ this["STATE_BUFFERING"] = State.Buffering.state
220
+ this["STATE_LOADING"] = State.Loading.state
221
+
222
+ // Rating Types
223
+ this["RATING_HEART"] = RatingCompat.RATING_HEART
224
+ this["RATING_THUMBS_UP_DOWN"] = RatingCompat.RATING_THUMB_UP_DOWN
225
+ this["RATING_3_STARS"] = RatingCompat.RATING_3_STARS
226
+ this["RATING_4_STARS"] = RatingCompat.RATING_4_STARS
227
+ this["RATING_5_STARS"] = RatingCompat.RATING_5_STARS
228
+ this["RATING_PERCENTAGE"] = RatingCompat.RATING_PERCENTAGE
229
+
230
+ // Repeat Modes
231
+ this["REPEAT_OFF"] = Player.REPEAT_MODE_OFF
232
+ this["REPEAT_TRACK"] = Player.REPEAT_MODE_ONE
233
+ this["REPEAT_QUEUE"] = Player.REPEAT_MODE_ALL
234
+
235
+ // TODO: not implemented
236
+ this["PITCH_ALGORITHM_LINEAR"] = -1
237
+ this["PITCH_ALGORITHM_MUSIC"] = -1
238
+ this["PITCH_ALGORITHM_VOICE"] = -1
239
+ this["CAPABILITY_LIKE"] = -1
240
+ this["CAPABILITY_DISLIKE"] = -1
241
+ this["CAPABILITY_BOOKMARK"] = -1
242
+
243
+ }
244
+ }
245
+
246
+ @SuppressLint("UnspecifiedRegisterReceiverFlag")
247
+ override fun setupPlayer(options: ReadableMap?, background: Boolean, promise: Promise) {
248
+ if (isServiceBound) {
249
+ promise.reject(
250
+ "player_already_initialized",
251
+ "The player has already been initialized via setupPlayer."
252
+ )
253
+ return
254
+ }
255
+
256
+ // prevent crash Fatal Exception: android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException
257
+ if (!background
258
+ && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
259
+ && AppForegroundTracker.backgrounded) {
260
+ promise.reject(
261
+ "android_cannot_setup_player_in_background",
262
+ "On Android the app must be in the foreground when setting up the player."
263
+ )
264
+ return
265
+ }
266
+
267
+
268
+ val bundledData = Arguments.toBundle(options)
269
+
270
+ playerSetUpPromise = promise
271
+ playerOptions = bundledData
272
+
273
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
274
+ context.registerReceiver(
275
+ MusicEvents(context),
276
+ IntentFilter(EVENT_INTENT), Context.RECEIVER_NOT_EXPORTED
277
+ )
278
+ } else {
279
+ context.registerReceiver(
280
+ MusicEvents(context),
281
+ IntentFilter(EVENT_INTENT)
282
+ )
283
+ }
284
+
285
+ val musicModule = this
286
+ try {
287
+ Intent(context, MusicService::class.java).also { intent ->
288
+ context.bindService(intent, musicModule, Context.BIND_AUTO_CREATE)
289
+ val sessionToken =
290
+ SessionToken(context, ComponentName(context, MusicService::class.java))
291
+ val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
292
+ // browser = browserFuture.get()
293
+ }
294
+ } catch (exception: Exception) {
295
+ Timber.tag("RNTP").w(exception, "Could not initialize service")
296
+ throw exception
297
+ }
298
+ }
299
+
300
+ override fun updateOptions(data: ReadableMap?, callback: Promise) = launchInScope {
301
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
302
+
303
+ val options = Arguments.toBundle(data)
304
+
305
+ options?.let {
306
+ musicService.updateOptions(it)
307
+ }
308
+
309
+ callback.resolve(null)
310
+ }
311
+
312
+ override fun setEqualizerPreset(preset: Double, callback: Promise) = launchInScope {
313
+ musicService.setEqualizerPreset(preset.toInt())
314
+ callback.resolve(null)
315
+ }
316
+
317
+ override fun getCurrentEqualizerPreset(callback: Promise) = launchInScope {
318
+ callback.resolve(musicService.getCurrentEqualizerPreset())
319
+ }
320
+
321
+ override fun getEqualizerPresets(callback: Promise) = launchInScope {
322
+ callback.resolve(Arguments.fromList(musicService.getEqualizerPresets()))
323
+ }
324
+
325
+
326
+ override fun setLoudnessEnhance(gain: Double, callback: Promise) = launchInScope {
327
+ musicService.setLoudnessEnhance(gain.toInt())
328
+ callback.resolve(null)
329
+ }
330
+
331
+
332
+ override fun add(data: ReadableArray?, insertBeforeIndex: Double, callback: Promise) = launchInScope {
333
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
334
+
335
+ val insertB4Index = insertBeforeIndex.toInt()
336
+
337
+ try {
338
+ val tracks = readableArrayToTrackList(data)
339
+ if (insertB4Index < -1 || insertB4Index > musicService.tracks.size) {
340
+ callback.reject("index_out_of_bounds", "The track index is out of bounds")
341
+ return@launchInScope
342
+ }
343
+ val index = if (insertB4Index == -1) musicService.tracks.size else insertB4Index
344
+ musicService.add(
345
+ tracks,
346
+ index
347
+ )
348
+ callback.resolve(index)
349
+ } catch (exception: Exception) {
350
+ rejectWithException(callback, exception)
351
+ }
352
+ }
353
+
354
+ override fun load(data: ReadableMap?, callback: Promise) = launchInScope {
355
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
356
+ if (data == null) {
357
+ callback.resolve(null)
358
+ return@launchInScope
359
+ }
360
+ val bundle = Arguments.toBundle(data)
361
+ if (bundle is Bundle) {
362
+ musicService.load(bundleToTrack(bundle))
363
+ callback.resolve(null)
364
+ } else {
365
+ callback.reject("invalid_track_object", "Track was not a dictionary type")
366
+ }
367
+ }
368
+
369
+ override fun move(fromIndex: Double, toIndex: Double, callback: Promise) = launchInScope {
370
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
371
+ musicService.move(fromIndex.toInt(), toIndex.toInt())
372
+ callback.resolve(null)
373
+ }
374
+
375
+ override fun remove(data: ReadableArray?, callback: Promise) = launchInScope {
376
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
377
+ val inputIndexes = Arguments.toList(data)
378
+ if (inputIndexes != null) {
379
+ val size = musicService.tracks.size
380
+ val indexes: ArrayList<Int> = ArrayList()
381
+ for (inputIndex in inputIndexes) {
382
+ val index = inputIndex as? Int ?: inputIndex.toString().toInt()
383
+ if (index < 0 || index >= size) {
384
+ callback.reject(
385
+ "index_out_of_bounds",
386
+ "One or more indexes was out of bounds"
387
+ )
388
+ return@launchInScope
389
+ }
390
+ indexes.add(index)
391
+ }
392
+ musicService.remove(indexes)
393
+ }
394
+ callback.resolve(null)
395
+ }
396
+
397
+ override fun updateMetadataForTrack(index: Double, map: ReadableMap?, callback: Promise) =
398
+ launchInScope {
399
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
400
+
401
+ val indexInt = index.toInt()
402
+ if (indexInt < 0 || indexInt >= musicService.tracks.size) {
403
+ callback.reject("index_out_of_bounds", "The index is out of bounds")
404
+ } else {
405
+ val context: ReactContext = context
406
+ val track = musicService.tracks[indexInt]
407
+ track.setMetadata(context, Arguments.toBundle(map), 0)
408
+ musicService.updateMetadataForTrack(indexInt, track)
409
+
410
+ callback.resolve(null)
411
+ }
412
+ }
413
+
414
+ override fun updateNowPlayingMetadata(map: ReadableMap?, callback: Promise) = launchInScope {
415
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
416
+
417
+ if (musicService.tracks.isEmpty())
418
+ callback.reject("no_current_item", "There is no current item in the player")
419
+
420
+ Arguments.toBundle(map)?.let {
421
+ val track = bundleToTrack(it)
422
+ musicService.updateNowPlayingMetadata(track)
423
+ }
424
+
425
+ callback.resolve(null)
426
+ }
427
+
428
+ override fun removeUpcomingTracks(callback: Promise) = launchInScope {
429
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
430
+
431
+ musicService.removeUpcomingTracks()
432
+ callback.resolve(null)
433
+ }
434
+
435
+ override fun skip(index: Double, initialPosition: Double, callback: Promise) = launchInScope {
436
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
437
+ musicService.skip(index.toInt())
438
+ if (initialPosition >= 0) {
439
+ musicService.seekTo(initialPosition.toFloat())
440
+ }
441
+
442
+ callback.resolve(null)
443
+ }
444
+
445
+ override fun skipToNext(initialTime: Double, callback: Promise) = launchInScope {
446
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
447
+
448
+ musicService.skipToNext()
449
+
450
+ if (initialTime >= 0) {
451
+ musicService.seekTo(initialTime.toFloat())
452
+ }
453
+
454
+ callback.resolve(null)
455
+ }
456
+
457
+ override fun skipToPrevious(initialTime: Double, callback: Promise) = launchInScope {
458
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
459
+
460
+ musicService.skipToPrevious()
461
+
462
+ if (initialTime >= 0) {
463
+ musicService.seekTo(initialTime.toFloat())
464
+ }
465
+
466
+ callback.resolve(null)
467
+ }
468
+
469
+ override fun reset(callback: Promise) = launchInScope {
470
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
471
+
472
+ musicService.stop()
473
+ delay(300) // Allow playback to stop
474
+ musicService.clear()
475
+
476
+ callback.resolve(null)
477
+ }
478
+
479
+ override fun play(callback: Promise) = launchInScope {
480
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
481
+
482
+ musicService.play()
483
+ callback.resolve(null)
484
+ }
485
+
486
+ override fun pause(callback: Promise) = launchInScope {
487
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
488
+
489
+ musicService.pause()
490
+ callback.resolve(null)
491
+ }
492
+
493
+ override fun stop(callback: Promise) = launchInScope {
494
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
495
+
496
+ musicService.stop()
497
+ callback.resolve(null)
498
+ }
499
+
500
+ override fun seekTo(seconds: Double, callback: Promise) = launchInScope {
501
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
502
+
503
+ musicService.seekTo(seconds.toFloat())
504
+ callback.resolve(null)
505
+ }
506
+
507
+ override fun seekBy(offset: Double, callback: Promise) = launchInScope {
508
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
509
+
510
+ musicService.seekBy(offset.toFloat())
511
+ callback.resolve(null)
512
+ }
513
+
514
+ override fun retry(callback: Promise) = launchInScope {
515
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
516
+
517
+ musicService.retry()
518
+ callback.resolve(null)
519
+ }
520
+
521
+ override fun setVolume(volume: Double, callback: Promise) = launchInScope {
522
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
523
+
524
+ musicService.setVolume(volume.toFloat())
525
+ callback.resolve(null)
526
+ }
527
+
528
+ override fun getVolume(callback: Promise) = launchInScope {
529
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
530
+
531
+ callback.resolve(musicService.getVolume())
532
+ }
533
+
534
+ override fun setRate(rate: Double, callback: Promise) = launchInScope {
535
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
536
+
537
+ musicService.setRate(rate.toFloat())
538
+ callback.resolve(null)
539
+ }
540
+
541
+ override fun getPitch(callback: Promise) = launchInScope {
542
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
543
+
544
+ callback.resolve(musicService.getPitch())
545
+ }
546
+
547
+ override fun setPitch(rate: Double, callback: Promise) = launchInScope {
548
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
549
+
550
+ musicService.setPitch(rate.toFloat())
551
+ callback.resolve(null)
552
+ }
553
+
554
+ override fun getRate(callback: Promise) = launchInScope {
555
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
556
+
557
+ callback.resolve(musicService.getRate())
558
+ }
559
+
560
+ override fun setRepeatMode(mode: Double, callback: Promise) = launchInScope {
561
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
562
+
563
+ musicService.setRepeatMode(RepeatMode.fromOrdinal(mode.toInt()))
564
+ callback.resolve(null)
565
+ }
566
+
567
+ override fun getRepeatMode(callback: Promise) = launchInScope {
568
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
569
+
570
+ callback.resolve(musicService.getRepeatMode().ordinal)
571
+ }
572
+
573
+ override fun setPlayWhenReady(playWhenReady: Boolean, callback: Promise) = launchInScope {
574
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
575
+
576
+ musicService.playWhenReady = playWhenReady
577
+ callback.resolve(null)
578
+ }
579
+
580
+ override fun getPlayWhenReady(callback: Promise) = launchInScope {
581
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
582
+
583
+ callback.resolve(musicService.playWhenReady)
584
+ }
585
+
586
+ override fun getTrack(index: Double, callback: Promise) = launchInScope {
587
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
588
+
589
+ if( index < 0 || index >= musicService.tracks.size) {
590
+ callback.resolve(null)
591
+ return@launchInScope
592
+ }
593
+
594
+ val originalItem = musicService.tracks[index.toInt()].originalItem
595
+ callback.resolve(if(originalItem == null) null else Arguments.fromBundle(originalItem))
596
+ }
597
+
598
+ override fun getQueue(callback: Promise) = launchInScope {
599
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
600
+
601
+ callback.resolve(Arguments.fromList(musicService.tracks.map { it.originalItem }))
602
+ }
603
+
604
+ override fun setQueue(data: ReadableArray?, callback: Promise) = launchInScope {
605
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
606
+
607
+ try {
608
+ musicService.clear()
609
+ musicService.add(readableArrayToTrackList(data))
610
+ callback.resolve(null)
611
+ } catch (exception: Exception) {
612
+ rejectWithException(callback, exception)
613
+ }
614
+ }
615
+
616
+ override fun getActiveTrackIndex(callback: Promise) = launchInScope {
617
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
618
+ callback.resolve(
619
+ if (musicService.tracks.isEmpty()) null else musicService.getCurrentTrackIndex()
620
+ )
621
+ }
622
+
623
+ override fun getActiveTrack(callback: Promise) = launchInScope {
624
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
625
+ if(musicService.tracks.isEmpty()) {
626
+ callback.resolve(null)
627
+ return@launchInScope
628
+ }
629
+
630
+ val activeTrack = musicService.tracks[musicService.getCurrentTrackIndex()].originalItem
631
+ callback.resolve(if(activeTrack == null) null else Arguments.fromBundle(activeTrack))
632
+ }
633
+
634
+
635
+ override fun getProgress(callback: Promise) = launchInScope {
636
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
637
+ val bundle = Bundle()
638
+ bundle.putDouble("duration", musicService.getDurationInSeconds())
639
+ bundle.putDouble("position", musicService.getPositionInSeconds())
640
+ bundle.putDouble("buffered", musicService.getBufferedPositionInSeconds())
641
+ callback.resolve(Arguments.fromBundle(bundle))
642
+ }
643
+
644
+ override fun getPlaybackState(callback: Promise) = launchInScope {
645
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
646
+ callback.resolve(Arguments.fromBundle(musicService.getPlayerStateBundle(musicService.state)))
647
+ }
648
+
649
+ override fun setAnimatedVolume(volume: Double, duration: Double, interval: Double, msg: String, callback: Promise) = launchInScope {
650
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
651
+ musicService.setAnimatedVolume(volume.toFloat(), duration.toLong(), interval.toLong(), msg).await()
652
+ delay(duration.toLong())
653
+ callback.resolve(null)
654
+ }
655
+
656
+ override fun fadeOutPause(duration: Double, interval: Double, callback: Promise) = launchInScope {
657
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
658
+ musicService.fadeOutPause(duration.toLong(), interval.toLong())
659
+ delay(duration.toLong())
660
+ callback.resolve(null)
661
+ }
662
+
663
+ override fun fadeOutNext(duration: Double, interval: Double, toVolume: Double, callback: Promise) = launchInScope {
664
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
665
+ musicService.fadeOutNext(duration.toLong(), interval.toLong(), toVolume.toFloat())
666
+ delay(duration.toLong())
667
+ callback.resolve(null)
668
+ }
669
+
670
+ override fun fadeOutPrevious(duration: Double, interval: Double, toVolume: Double, callback: Promise) = launchInScope {
671
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
672
+ musicService.fadeOutPrevious(duration.toLong(), interval.toLong(), toVolume.toFloat())
673
+ delay(duration.toLong())
674
+ callback.resolve(null)
675
+ }
676
+
677
+ override fun fadeOutJump(
678
+ index: Double,
679
+ duration: Double,
680
+ interval: Double,
681
+ toVolume: Double,
682
+ callback: Promise
683
+ ) = launchInScope {
684
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
685
+ musicService.fadeOutJump(index.toInt(), duration.toLong(), interval.toLong(), toVolume.toFloat())
686
+ delay(duration.toLong())
687
+ callback.resolve(null)
688
+ }
689
+
690
+ override fun setBrowseTree(mediaItems: ReadableMap, callback: Promise) = launchInScope {
691
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
692
+ val mediaItemsMap = mediaItems.toHashMap()
693
+ musicService.mediaTree = mediaItemsMap.mapValues { readableArrayToMediaItems(it.value as ArrayList<HashMap<String, String>>) }
694
+ Timber.tag("APM").d("refreshing browseTree")
695
+ musicService.notifyChildrenChanged()
696
+ callback.resolve(musicService.mediaTree.toString())
697
+ }
698
+
699
+ // this method doesn't seem to affect style after onGetRoot is called, and won't change if notifyChildrenChanged is emitted.
700
+ override fun setBrowseTreeStyle(
701
+ browsableStyle: Double,
702
+ playableStyle: Double,
703
+ callback: Promise
704
+ ) = launchInScope {
705
+ fun getStyle(check: Int): Int {
706
+ return when (check) {
707
+ 1 -> MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM
708
+ 2 -> MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM
709
+ 3 -> MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM
710
+ else -> MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM
711
+ }
712
+ }
713
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
714
+ musicService.mediaTreeStyle = listOf(
715
+ getStyle(browsableStyle.toInt()),
716
+ getStyle(playableStyle.toInt())
717
+ )
718
+ callback.resolve(null)
719
+ }
720
+
721
+ override fun setSearchResults(mediaItems: ReadableArray, callback: Promise) = launchInScope {
722
+ musicService.setSearchResults(readableArrayToMediaItems(mediaItems.toArrayList() as ArrayList<HashMap<String, String>>).toTypedArray())
723
+ callback.resolve(null)
724
+ }
725
+
726
+ override fun setPlaybackState(mediaID: String, callback: Promise) = launchInScope {
727
+ // TODO: not implemented!
728
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
729
+ callback.resolve(null)
730
+ }
731
+
732
+ override fun acquireWakeLock(callback: Promise) = launchInScope {
733
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
734
+ musicService.acquireWakeLock()
735
+ callback.resolve(null)
736
+ }
737
+
738
+ override fun abandonWakeLock(callback: Promise) = launchInScope {
739
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
740
+ musicService.abandonWakeLock()
741
+ callback.resolve(null)
742
+ }
743
+
744
+ override fun crossFadePrepare(previous: Boolean, seektoDouble: Double?, callback: Promise) = launchInScope {
745
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
746
+ musicService.crossFadePrepare(previous, seektoDouble ?: 0.0)
747
+ callback.resolve(null)
748
+ }
749
+
750
+ override fun switchExoPlayer(
751
+ fadeDuration: Double,
752
+ fadeInterval: Double,
753
+ fadeToVolume: Double,
754
+ waitUntil: Double?,
755
+ callback: Promise) = launchInScope {
756
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
757
+ musicService.switchExoPlayer(
758
+ fadeDuration = fadeDuration.toLong(),
759
+ fadeInterval = fadeInterval.toLong(),
760
+ fadeToVolume = fadeToVolume.toFloat(),
761
+ waitUntil = waitUntil?.toLong() ?: 0
762
+ )
763
+ callback.resolve(null)
764
+ }
765
+
766
+ override fun getLastConnectedPackage(callback: Promise) = launchInScope {
767
+ if (verifyServiceBoundOrReject(callback)) return@launchInScope
768
+ callback.resolve(musicService.lastConnectedPackage)
769
+ }
770
+
771
+ // Bridgeless interop layer tries to pass the `Job` from `scope.launch` to the JS side
772
+ // which causes an exception. We can work around this using a wrapper.
773
+ private fun launchInScope(block: suspend () -> Unit) {
774
+ scope.launch {
775
+ block()
776
+ }
777
+ }
778
+ }