@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.
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,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.guichaguri.trackplayer.service
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.getInstance()
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 == null || name.isEmpty()) return 0
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.getInstance()
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): RatingCompat? {
94
+ fun getRating(data: Bundle?, key: String?, ratingType: Int): Rating? {
77
95
  return if (!data!!.containsKey(key) || ratingType == RatingCompat.RATING_NONE) {
78
- RatingCompat.newUnratedRating(ratingType)
96
+ null
79
97
  } else if (ratingType == RatingCompat.RATING_HEART) {
80
- RatingCompat.newHeartRating(data.getBoolean(key, true))
98
+ HeartRating(data.getBoolean(key, true))
81
99
  } else if (ratingType == RatingCompat.RATING_THUMB_UP_DOWN) {
82
- RatingCompat.newThumbRating(data.getBoolean(key, true))
100
+ ThumbRating(data.getBoolean(key, true))
83
101
  } else if (ratingType == RatingCompat.RATING_PERCENTAGE) {
84
- RatingCompat.newPercentageRating(data.getFloat(key, 0f))
102
+ PercentageRating(data.getFloat(key, 0f))
85
103
  } else {
86
- RatingCompat.newStarRating(ratingType, data.getFloat(key, 0f))
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
- if (ratingType == RatingCompat.RATING_HEART) {
94
- data.putBoolean(key, rating.hasHeart())
95
- } else if (ratingType == RatingCompat.RATING_THUMB_UP_DOWN) {
96
- data.putBoolean(key, rating.isThumbUp)
97
- } else if (ratingType == RatingCompat.RATING_PERCENTAGE) {
98
- data.putDouble(key, rating.percentRating.toDouble())
99
- } else {
100
- data.putDouble(key, rating.starRating.toDouble())
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,11 @@
1
+ package com.doublesymmetry.trackplayer.utils
2
+
3
+ import com.facebook.react.bridge.Promise
4
+
5
+ /**
6
+ * @author Jonathan Puckey @puckey
7
+ */
8
+ data class RejectionException(
9
+ override val message: String,
10
+ val code : String
11
+ ) : Exception(message)
@@ -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
+ }
@@ -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.guichaguri.trackplayer.kotlinaudio.event
1
+ package com.lovegaoshi.kotlinaudio.event
2
2
 
3
- class EventHolder internal constructor(private val notificationEventHolder: NotificationEventHolder, private val playerEventHolder: PlayerEventHolder) {
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 onPlaybackMetadata
14
- get() = playerEventHolder.onPlaybackMetadata
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.guichaguri.trackplayer.kotlinaudio.event
1
+ package com.lovegaoshi.kotlinaudio.event
2
2
 
3
- // import com.doublesymmetry.kotlinaudio.models.*
4
- import com.guichaguri.trackplayer.kotlinaudio.models.*
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.doublesymmetry.kotlinaudio.players.BaseAudioPlayer.playWhenReady]
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 _onPlaybackMetadata = MutableSharedFlow<PlaybackMetadata>(1)
45
- var onPlaybackMetadata = _onPlaybackMetadata.asSharedFlow()
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.doublesymmetry.kotlinaudio.models.PlayerConfig.interceptPlayerActionsTriggeredExternally] to true.
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 updateOnPlaybackMetadata(metadata: PlaybackMetadata) {
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
- _onPlaybackMetadata.emit(metadata)
109
+ _onTimedMetadata.emit(metadata)
97
110
  }
98
111
  }
99
112
 
@@ -1,4 +1,4 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.models
1
+ package com.lovegaoshi.kotlinaudio.models
2
2
 
3
3
  enum class AudioContentType {
4
4
  MUSIC,
@@ -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.guichaguri.trackplayer.kotlinaudio.models
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.doublesymmetry.kotlinaudio.players.QueuedAudioPlayer.next]
18
- * or [QueuedAudioPlayer.previous][com.doublesymmetry.kotlinaudio.players.QueuedAudioPlayer.previous].
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.guichaguri.trackplayer.kotlinaudio.models
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
- /** The player has finished playing all the [AudioItem]s. TODO: Add additional info */
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. */
@@ -1,4 +1,4 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.models
1
+ package com.lovegaoshi.kotlinaudio.models
2
2
 
3
3
  data class BufferConfig(
4
4
  val minBuffer: Int?,
@@ -1,4 +1,4 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.models
1
+ package com.lovegaoshi.kotlinaudio.models
2
2
 
3
3
  /**
4
4
  * Configuration for cache properties of player.
@@ -1,4 +1,4 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.models
1
+ package com.lovegaoshi.kotlinaudio.models
2
2
 
3
3
  enum class Capability {
4
4
  PLAY,
@@ -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
+ )
@@ -1,3 +1,3 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.models
1
+ package com.lovegaoshi.kotlinaudio.models
2
2
 
3
3
  data class FocusChangeData(val isPaused: Boolean, val isFocusLostPermanently: Boolean)
@@ -1,4 +1,4 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.models
1
+ package com.lovegaoshi.kotlinaudio.models
2
2
 
3
3
  import android.os.Bundle
4
4
  import android.support.v4.media.RatingCompat
@@ -1,5 +1,3 @@
1
- package com.guichaguri.trackplayer.kotlinaudio.models
2
-
3
- import com.google.android.exoplayer2.Player
1
+ package com.lovegaoshi.kotlinaudio.models
4
2
 
5
3
  data class PlayWhenReadyChangeData(val playWhenReady: Boolean, val pausedBecauseReachedEnd: Boolean)