capacitor-plugin-playlist 0.4.0 → 0.4.2

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 (127) hide show
  1. package/android/.gradle/8.0.2/checksums/checksums.lock +0 -0
  2. package/android/.gradle/8.0.2/checksums/md5-checksums.bin +0 -0
  3. package/android/.gradle/8.0.2/checksums/sha1-checksums.bin +0 -0
  4. package/android/.gradle/8.0.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  5. package/android/.gradle/8.0.2/executionHistory/executionHistory.bin +0 -0
  6. package/android/.gradle/8.0.2/executionHistory/executionHistory.lock +0 -0
  7. package/android/.gradle/8.0.2/fileHashes/fileHashes.bin +0 -0
  8. package/android/.gradle/8.0.2/fileHashes/fileHashes.lock +0 -0
  9. package/android/.gradle/8.0.2/fileHashes/resourceHashesCache.bin +0 -0
  10. package/android/.gradle/8.2.1/checksums/checksums.lock +0 -0
  11. package/android/.gradle/8.2.1/checksums/md5-checksums.bin +0 -0
  12. package/android/.gradle/8.2.1/checksums/sha1-checksums.bin +0 -0
  13. package/android/.gradle/8.2.1/dependencies-accessors/dependencies-accessors.lock +0 -0
  14. package/android/.gradle/8.2.1/executionHistory/executionHistory.bin +0 -0
  15. package/android/.gradle/8.2.1/executionHistory/executionHistory.lock +0 -0
  16. package/android/.gradle/8.2.1/fileChanges/last-build.bin +0 -0
  17. package/android/.gradle/8.2.1/fileHashes/fileHashes.bin +0 -0
  18. package/android/.gradle/8.2.1/fileHashes/fileHashes.lock +0 -0
  19. package/android/.gradle/8.2.1/gc.properties +0 -0
  20. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  21. package/android/.gradle/buildOutputCleanup/cache.properties +2 -2
  22. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  23. package/android/.gradle/config.properties +2 -0
  24. package/android/.gradle/file-system.probe +0 -0
  25. package/android/.idea/compiler.xml +6 -0
  26. package/android/.idea/gradle.xml +8 -3
  27. package/android/.idea/kotlinc.xml +6 -0
  28. package/android/.idea/migrations.xml +10 -0
  29. package/android/.idea/misc.xml +2 -2
  30. package/android/.project +34 -0
  31. package/android/bin/.gradle/8.0.2/checksums/checksums.lock +0 -0
  32. package/android/bin/.gradle/8.0.2/checksums/md5-checksums.bin +0 -0
  33. package/android/bin/.gradle/8.0.2/checksums/sha1-checksums.bin +0 -0
  34. package/android/bin/.gradle/8.0.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  35. package/android/bin/.gradle/8.0.2/dependencies-accessors/gc.properties +0 -0
  36. package/android/bin/.gradle/8.0.2/executionHistory/executionHistory.bin +0 -0
  37. package/android/bin/.gradle/8.0.2/executionHistory/executionHistory.lock +0 -0
  38. package/android/bin/.gradle/8.0.2/fileChanges/last-build.bin +0 -0
  39. package/android/bin/.gradle/8.0.2/fileHashes/fileHashes.bin +0 -0
  40. package/android/bin/.gradle/8.0.2/fileHashes/fileHashes.lock +0 -0
  41. package/android/bin/.gradle/8.0.2/fileHashes/resourceHashesCache.bin +0 -0
  42. package/android/bin/.gradle/8.0.2/gc.properties +0 -0
  43. package/android/bin/.gradle/8.2.1/checksums/checksums.lock +0 -0
  44. package/android/bin/.gradle/8.2.1/checksums/md5-checksums.bin +0 -0
  45. package/android/bin/.gradle/8.2.1/checksums/sha1-checksums.bin +0 -0
  46. package/android/bin/.gradle/8.2.1/dependencies-accessors/dependencies-accessors.lock +0 -0
  47. package/android/bin/.gradle/8.2.1/dependencies-accessors/gc.properties +0 -0
  48. package/android/bin/.gradle/8.2.1/executionHistory/executionHistory.bin +0 -0
  49. package/android/bin/.gradle/8.2.1/executionHistory/executionHistory.lock +0 -0
  50. package/android/bin/.gradle/8.2.1/fileChanges/last-build.bin +0 -0
  51. package/android/bin/.gradle/8.2.1/fileHashes/fileHashes.bin +0 -0
  52. package/android/bin/.gradle/8.2.1/fileHashes/fileHashes.lock +0 -0
  53. package/android/bin/.gradle/8.2.1/gc.properties +0 -0
  54. package/android/bin/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  55. package/android/bin/.gradle/buildOutputCleanup/cache.properties +2 -0
  56. package/android/bin/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  57. package/android/bin/.gradle/config.properties +2 -0
  58. package/android/bin/.gradle/file-system.probe +0 -0
  59. package/android/bin/.gradle/vcs-1/gc.properties +0 -0
  60. package/android/bin/.idea/compiler.xml +6 -0
  61. package/android/bin/.idea/gradle.xml +19 -0
  62. package/android/bin/.idea/kotlinc.xml +6 -0
  63. package/android/bin/.idea/migrations.xml +10 -0
  64. package/android/bin/.idea/misc.xml +9 -0
  65. package/android/bin/.idea/vcs.xml +6 -0
  66. package/android/bin/.project +34 -0
  67. package/android/bin/build.gradle +79 -0
  68. package/android/bin/gradle/wrapper/gradle-wrapper.jar +0 -0
  69. package/android/bin/gradle/wrapper/gradle-wrapper.properties +6 -0
  70. package/android/bin/gradle.properties +22 -0
  71. package/android/bin/gradlew +244 -0
  72. package/android/bin/gradlew.bat +92 -0
  73. package/android/bin/local.properties +8 -0
  74. package/android/bin/proguard-rules.pro +21 -0
  75. package/android/bin/settings.gradle +2 -0
  76. package/android/bin/src/androidTest/java/com/getcapacitor/android/ExampleInstrumentedTest.class +0 -0
  77. package/android/bin/src/main/AndroidManifest.xml +4 -0
  78. package/android/bin/src/main/java/org/dwbn/plugins/playlist/App.kt +61 -0
  79. package/android/bin/src/main/java/org/dwbn/plugins/playlist/FakeR.kt +39 -0
  80. package/android/bin/src/main/java/org/dwbn/plugins/playlist/OnStatusCallback.kt +34 -0
  81. package/android/bin/src/main/java/org/dwbn/plugins/playlist/OnStatusReportListener.class +0 -0
  82. package/android/bin/src/main/java/org/dwbn/plugins/playlist/PlaylistItemOptions.class +0 -0
  83. package/android/bin/src/main/java/org/dwbn/plugins/playlist/PlaylistPlugin.kt +403 -0
  84. package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxAudioErrorType.class +0 -0
  85. package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxAudioPlayer.class +0 -0
  86. package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxAudioStatusMessage.class +0 -0
  87. package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxConstants.class +0 -0
  88. package/android/bin/src/main/java/org/dwbn/plugins/playlist/TrackRemovalItem.class +0 -0
  89. package/android/bin/src/main/java/org/dwbn/plugins/playlist/data/AudioTrack.kt +94 -0
  90. package/android/bin/src/main/java/org/dwbn/plugins/playlist/manager/MediaControlsListener.kt +13 -0
  91. package/android/bin/src/main/java/org/dwbn/plugins/playlist/manager/Options.kt +77 -0
  92. package/android/bin/src/main/java/org/dwbn/plugins/playlist/manager/PlaylistManager.kt +286 -0
  93. package/android/bin/src/main/java/org/dwbn/plugins/playlist/notification/PlaylistNotificationProvider.kt +26 -0
  94. package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/AudioApi.kt +101 -0
  95. package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/AudioPlaylistHandler$Builder.class +0 -0
  96. package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/AudioPlaylistHandler.class +0 -0
  97. package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/BaseMediaApi.kt +40 -0
  98. package/android/bin/src/main/java/org/dwbn/plugins/playlist/service/MediaImageProvider.kt +79 -0
  99. package/android/bin/src/main/java/org/dwbn/plugins/playlist/service/MediaService.kt +54 -0
  100. package/android/bin/src/main/res/.gitkeep +0 -0
  101. package/android/bin/src/main/res/drawable/ic_closed_caption_white_24dp.xml +9 -0
  102. package/android/bin/src/main/res/drawable/ic_demo_icon_adaptive.xml +15 -0
  103. package/android/bin/src/main/res/drawable/ic_launcher_background.xml +48 -0
  104. package/android/bin/src/main/res/drawable/ic_launcher_foreground.xml +22 -0
  105. package/android/bin/src/main/res/drawable/ic_notification_icon.png +0 -0
  106. package/android/bin/src/main/res/layout/bridge_layout_main.xml +15 -0
  107. package/android/bin/src/main/res/values/colors.xml +3 -0
  108. package/android/bin/src/main/res/values/strings.xml +3 -0
  109. package/android/bin/src/main/res/values/styles.xml +3 -0
  110. package/android/bin/src/test/java/com/getcapacitor/ExampleUnitTest.class +0 -0
  111. package/android/build.gradle +0 -4
  112. package/android/local.properties +1 -1
  113. package/android/src/main/java/org/dwbn/plugins/playlist/manager/PlaylistManager.kt +3 -2
  114. package/dist/docs.json +1350 -92
  115. package/dist/esm/web.js +1 -6
  116. package/dist/esm/web.js.map +1 -1
  117. package/dist/plugin.cjs.js +1 -6
  118. package/dist/plugin.cjs.js.map +1 -1
  119. package/dist/plugin.js +1 -6
  120. package/dist/plugin.js.map +1 -1
  121. package/package.json +2 -2
  122. package/android/.gradle/checksums/checksums.lock +0 -0
  123. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  124. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  125. package/android/.idea/modules/android.iml +0 -18
  126. package/android/.idea/modules.xml +0 -8
  127. /package/android/.gradle/{configuration-cache → 8.2.1/dependencies-accessors}/gc.properties +0 -0
@@ -0,0 +1,403 @@
1
+ package org.dwbn.plugins.playlist
2
+
3
+ import android.util.Log
4
+ import com.devbrackets.android.playlistcore.data.MediaProgress
5
+ import com.getcapacitor.*
6
+ import com.getcapacitor.annotation.CapacitorPlugin
7
+ import org.dwbn.plugins.playlist.data.AudioTrack
8
+ import org.json.JSONArray
9
+ import org.json.JSONObject
10
+ import java.util.*
11
+
12
+ @CapacitorPlugin(name = "Playlist")
13
+ class PlaylistPlugin : Plugin(), OnStatusReportListener {
14
+ var TAG = "PlaylistPlugin"
15
+ private var statusCallback: OnStatusCallback? = null
16
+ private var audioPlayerImpl: RmxAudioPlayer? = null
17
+ private var resetStreamOnPause = true
18
+
19
+ override fun load() {
20
+ return;
21
+ audioPlayerImpl = RmxAudioPlayer(this, (this.context.applicationContext as App))
22
+ }
23
+
24
+ @PluginMethod
25
+ fun initialize(call: PluginCall) {
26
+ call.resolve()
27
+ return;
28
+ statusCallback = OnStatusCallback(this)
29
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_REGISTER, "INIT", null)
30
+ Log.i(TAG, "Initialized...")
31
+ audioPlayerImpl!!.resume()
32
+ }
33
+ @PluginMethod
34
+ fun setOptions(call: PluginCall) {
35
+ call.resolve()
36
+ return;
37
+ val options: JSObject = call.getObject("options") ?: JSObject()
38
+ resetStreamOnPause = options.optBoolean("resetStreamOnPause", this.resetStreamOnPause)
39
+ Log.i("AudioPlayerOptions", options.toString())
40
+ audioPlayerImpl!!.resetStreamOnPause = resetStreamOnPause
41
+ audioPlayerImpl!!.setOptions(options)
42
+ call.resolve()
43
+ }
44
+
45
+ @PluginMethod
46
+ fun release(call: PluginCall) {
47
+ call.resolve()
48
+ return;
49
+ destroyResources()
50
+ call.resolve()
51
+ Log.i(TAG,"released")
52
+ }
53
+
54
+ @PluginMethod
55
+ fun setLoop(call: PluginCall) {
56
+ call.resolve()
57
+ return;
58
+ val loop: Boolean = call.getBoolean("loop", audioPlayerImpl!!.playlistManager.loop)!!
59
+ audioPlayerImpl!!.playlistManager.loop = loop
60
+ call.resolve()
61
+ Log.i(TAG,"setLoop: " + (if (loop) "TRUE" else "FALSE"))
62
+ }
63
+
64
+ @PluginMethod
65
+ fun setPlaylistItems(call: PluginCall) {
66
+ call.resolve()
67
+ return;
68
+ val items: JSArray = call.getArray("items")
69
+ val optionsArgs: JSONObject = call.getObject("options")
70
+ val options = PlaylistItemOptions(optionsArgs)
71
+
72
+ val trackItems: ArrayList<AudioTrack> = getTrackItems(items)
73
+ audioPlayerImpl!!.playlistManager.setAllItems(trackItems, options)
74
+ for (playerItem in trackItems) {
75
+ if (playerItem.trackId != null) {
76
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, playerItem.trackId, playerItem.toDict())
77
+ }
78
+ }
79
+
80
+ call.resolve()
81
+
82
+ Log.i(TAG,"setPlaylistItems" + items.length().toString())
83
+ }
84
+
85
+ @PluginMethod
86
+ fun addItem(call: PluginCall) {
87
+ call.resolve()
88
+ return;
89
+ val item: JSONObject = call.getObject("item")
90
+ val playerItem: AudioTrack? = getTrackItem(item)
91
+ audioPlayerImpl!!.getPlaylistManager().addItem(playerItem)
92
+ x
93
+
94
+ if (playerItem?.trackId != null) {
95
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, playerItem.trackId, playerItem.toDict())
96
+ }
97
+ call.resolve()
98
+ Log.i(TAG,"addItem")
99
+ }
100
+
101
+ @PluginMethod
102
+ fun addAllItems(call: PluginCall) {
103
+ call.resolve()
104
+ return;
105
+ val items: JSONArray = call.getArray("items")
106
+ val trackItems = getTrackItems(items)
107
+ audioPlayerImpl!!.playlistManager.addAllItems(trackItems)
108
+
109
+ for (playerItem in trackItems) {
110
+ if (playerItem.trackId != null) {
111
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, playerItem.trackId, playerItem.toDict())
112
+ }
113
+ }
114
+ call.resolve()
115
+ Log.i(TAG,"addAllItems")
116
+ }
117
+
118
+ @PluginMethod
119
+ fun removeItem(call: PluginCall) {
120
+ call.resolve()
121
+ return;
122
+ val trackIndex: Int = call.getInt("index", -1)!!
123
+ val trackId: String = call.getString("id", "")!!
124
+ Log.i(TAG,"removeItem trackIn" )
125
+ val item = audioPlayerImpl!!.playlistManager.removeItem(trackIndex, trackId)
126
+
127
+ if (item != null) {
128
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, item.trackId, item.toDict())
129
+ call.resolve()
130
+ }
131
+ else {
132
+ call.reject("Could not find item!")
133
+ }
134
+ }
135
+
136
+ @PluginMethod
137
+ fun removeItems(call: PluginCall) {
138
+ call.resolve()
139
+ return;
140
+ val items: JSONArray = call.getArray("items")
141
+ var removed = 0
142
+
143
+ val removals = ArrayList<TrackRemovalItem>()
144
+ for (index in 0 until items.length()) {
145
+ val entry = items.optJSONObject(index) ?: continue
146
+ val trackIndex = entry.optInt("trackIndex", -1)
147
+ val trackId = entry.optString("trackId", "")
148
+ removals.add(TrackRemovalItem(trackIndex, trackId))
149
+ val removedTracks = audioPlayerImpl!!.playlistManager.removeAllItems(removals)
150
+ if (removedTracks.size > 0) {
151
+ for (removedItem in removedTracks) {
152
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, removedItem.trackId, removedItem.toDict())
153
+ }
154
+ removed = removedTracks.size
155
+ }
156
+ }
157
+
158
+ val result = JSObject()
159
+ result.put("removed", removed)
160
+ call.resolve(result)
161
+
162
+ Log.i(TAG,"removeItems")
163
+ }
164
+
165
+ @PluginMethod
166
+ fun clearAllItems(call: PluginCall) {
167
+ call.resolve()
168
+ return;
169
+ audioPlayerImpl!!.playlistManager.clearItems()
170
+
171
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_PLAYLIST_CLEARED, "INVALID", null)
172
+ call.resolve()
173
+
174
+ Log.i(TAG,"clearAllItems")
175
+ }
176
+
177
+ @PluginMethod
178
+ fun play(call: PluginCall) {
179
+ call.resolve()
180
+ return;
181
+ if (audioPlayerImpl!!.playlistManager.playlistHandler != null) {
182
+ val isPlaying = (audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer != null
183
+ && audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying!!)
184
+ // There's a bug in the threaded repeater that it stacks up the repeat calls instead of ignoring
185
+ // additional ones or starting a new one. E.g. every time this is called, you'd get a new repeat cycle,
186
+ // meaning you get N updates per second. Ew.
187
+ if (!isPlaying) {
188
+ audioPlayerImpl!!.playlistManager.playlistHandler?.play()
189
+ //audioPlayerImpl.getPlaylistManager().playlistHandler.seek(position)
190
+ }
191
+ }
192
+
193
+ call.resolve()
194
+
195
+ Log.i(TAG,"play")
196
+ }
197
+
198
+ @PluginMethod
199
+ fun playTrackByIndex(call: PluginCall) {
200
+ call.resolve()
201
+ return;
202
+ val index: Int = call.getInt("index", audioPlayerImpl!!.playlistManager.currentPosition)!!
203
+ val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
204
+
205
+ audioPlayerImpl!!.playlistManager.currentPosition = index
206
+ audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
207
+
208
+ call.resolve()
209
+
210
+ Log.i(TAG,"playTrackByIndex")
211
+ }
212
+
213
+ @PluginMethod
214
+ fun playTrackById(call: PluginCall) {
215
+ call.resolve()
216
+ return;
217
+ val id: String = call.getString("id")!!
218
+ if ("" != id) {
219
+ // alternatively we could search for the item and set the current index to that item.
220
+ val code = id.hashCode()
221
+ val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
222
+ audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
223
+ audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
224
+ }
225
+
226
+ call.resolve()
227
+
228
+ Log.i(TAG,"playTrackById")
229
+ }
230
+
231
+ @PluginMethod
232
+ fun selectTrackByIndex(call: PluginCall) {
233
+ call.resolve()
234
+ return;
235
+ val index: Int = call.getInt("index", audioPlayerImpl!!.playlistManager.currentPosition)!!
236
+
237
+ audioPlayerImpl!!.playlistManager.currentPosition = index
238
+
239
+ val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
240
+
241
+ audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
242
+
243
+ call.resolve()
244
+
245
+ Log.i(TAG,"selectTrackByIndex")
246
+ }
247
+
248
+
249
+ @PluginMethod
250
+ fun selectTrackById(call: PluginCall) {
251
+ call.resolve()
252
+ return;
253
+ val id: String = call.getString("id")!!
254
+ if ("" != id) {
255
+ // alternatively we could search for the item and set the current index to that item.
256
+ val code = id.hashCode()
257
+ audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
258
+
259
+ val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
260
+
261
+ audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
262
+ }
263
+ call.resolve()
264
+
265
+ Log.i(TAG,"selectTrackById")
266
+ }
267
+
268
+ @PluginMethod
269
+ fun pause(call: PluginCall) {
270
+ call.resolve()
271
+ return;
272
+ audioPlayerImpl!!.playlistManager.invokePausePlay()
273
+
274
+ call.resolve()
275
+
276
+ Log.i(TAG,"pause")
277
+ }
278
+
279
+ @PluginMethod
280
+ fun skipForward(call: PluginCall) {
281
+ call.resolve()
282
+ return;
283
+ audioPlayerImpl!!.playlistManager.invokeNext()
284
+
285
+ call.resolve()
286
+
287
+ Log.i(TAG,"skipForward")
288
+ }
289
+
290
+ @PluginMethod
291
+ fun skipBack(call: PluginCall) {
292
+ call.resolve()
293
+ return;
294
+ audioPlayerImpl!!.playlistManager.invokePrevious()
295
+
296
+ call.resolve()
297
+
298
+ Log.i(TAG,"skipBack")
299
+ }
300
+
301
+ @PluginMethod
302
+ fun seekTo(call: PluginCall) {
303
+ call.resolve()
304
+ return;
305
+ var position: Long = 0
306
+ val progress: MediaProgress? = audioPlayerImpl!!.playlistManager.currentProgress
307
+ if (progress != null) {
308
+ position = progress.position
309
+ }
310
+
311
+ val seekPosition = (call.getInt("position", (position / 1000.0f).toInt())!! * 1000.0).toLong()
312
+
313
+ val isPlaying: Boolean? = audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying
314
+ audioPlayerImpl!!.playlistManager.playlistHandler?.seek(seekPosition)
315
+ if (isPlaying === null || !isPlaying) {
316
+ audioPlayerImpl!!.playlistManager.playlistHandler?.pause(false)
317
+ }
318
+
319
+ call.resolve()
320
+
321
+ Log.i(TAG,"seekTo")
322
+ }
323
+
324
+ @PluginMethod
325
+ fun setPlaybackRate(call: PluginCall) {
326
+ call.resolve()
327
+ return;
328
+ val speed = call.getFloat("rate", audioPlayerImpl!!.playlistManager.getPlaybackSpeed())!!
329
+ audioPlayerImpl!!.playlistManager.setPlaybackSpeed(speed)
330
+
331
+ call.resolve()
332
+
333
+ Log.i(TAG,"setPlaybackRate")
334
+ }
335
+
336
+ @PluginMethod
337
+ fun setVolume(call: PluginCall) {
338
+ call.resolve()
339
+ return;
340
+ val volume = call.getFloat("volume", audioPlayerImpl!!.volume)!!
341
+ audioPlayerImpl!!.volume = volume
342
+
343
+ call.resolve()
344
+
345
+ Log.i(TAG,"addItem")
346
+ }
347
+
348
+ override fun handleOnDestroy() {
349
+ Log.d(TAG, "Plugin destroy")
350
+ super.handleOnDestroy()
351
+ return;
352
+ destroyResources()
353
+ }
354
+
355
+ override fun onError(errorCode: RmxAudioErrorType?, trackId: String?, message: String?) {
356
+ return;
357
+ if (statusCallback == null) {
358
+ return
359
+ }
360
+ val errorObj = OnStatusCallback.createErrorWithCode(errorCode, message)
361
+ onStatus(RmxAudioStatusMessage.RMXSTATUS_ERROR, trackId, errorObj)
362
+ }
363
+
364
+ override fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
365
+ return;
366
+ if (statusCallback == null) {
367
+ return
368
+ }
369
+ statusCallback!!.onStatus(what, trackId, param)
370
+ }
371
+
372
+ private fun destroyResources() {
373
+ return;
374
+ statusCallback = null
375
+ audioPlayerImpl!!.playlistManager.clearItems()
376
+ }
377
+
378
+ private fun getTrackItem(item: JSONObject?): AudioTrack? {
379
+ if (item != null) {
380
+ val track = AudioTrack(item)
381
+ return if (track.trackId != null) {
382
+ track
383
+ } else null
384
+ }
385
+ return null
386
+ }
387
+ private fun getTrackItems(items: JSONArray?): ArrayList<AudioTrack> {
388
+ val trackItems = ArrayList<AudioTrack>()
389
+ if (items != null && items.length() > 0) {
390
+ for (index in 0 until items.length()) {
391
+ val obj = items.optJSONObject(index)
392
+ val track: AudioTrack = getTrackItem(obj) ?: continue
393
+ trackItems.add(track)
394
+ }
395
+ }
396
+ return trackItems
397
+ }
398
+
399
+ fun emit(name: String, data: JSObject) {
400
+ return;
401
+ this.notifyListeners(name, data, true)
402
+ }
403
+ }
@@ -0,0 +1,94 @@
1
+ package org.dwbn.plugins.playlist.data
2
+
3
+ import com.devbrackets.android.playlistcore.annotation.SupportedMediaType
4
+ import com.devbrackets.android.playlistcore.api.PlaylistItem
5
+ import com.devbrackets.android.playlistcore.manager.BasePlaylistManager
6
+ import org.json.JSONException
7
+ import org.json.JSONObject
8
+
9
+ class AudioTrack (private val config: JSONObject) : PlaylistItem {
10
+ var bufferPercentFloat = 0f
11
+ set(buff) {
12
+ // There is a bug in MediaProgress where if bufferPercent == 100 it sets bufferPercentFloat
13
+ // to 100 instead of to 1.
14
+ field = Math.min(Math.max(bufferPercentFloat, buff), 1f)
15
+ }
16
+ var bufferPercent = 0
17
+ set(buff) {
18
+ field = Math.max(bufferPercent, buff)
19
+ }
20
+ var duration: Long = 0
21
+ set(dur) {
22
+ field = Math.max(0, dur)
23
+ }
24
+
25
+ fun toDict(): JSONObject {
26
+ val info = JSONObject()
27
+ try {
28
+ info.put("trackId", trackId)
29
+ info.put("isStream", isStream)
30
+ info.put("assetUrl", mediaUrl)
31
+ info.put("albumArt", thumbnailUrl)
32
+ info.put("artist", artist)
33
+ info.put("album", album)
34
+ info.put("title", title)
35
+ } catch (e: JSONException) {
36
+ // I can think of no reason this would ever fail
37
+ }
38
+ return info
39
+ }
40
+
41
+ override val id: Long
42
+ get() =
43
+ if (trackId == null) {
44
+ 0
45
+ } else trackId.hashCode().toLong()
46
+
47
+ val isStream: Boolean
48
+ get() = config.optBoolean("isStream", false)
49
+
50
+ val trackId: String?
51
+ get() {
52
+ val trackId = config.optString("trackId")
53
+ return if (trackId == "") {
54
+ null
55
+ } else trackId
56
+ }
57
+
58
+ // Would really like to set this to true once the cache has it...
59
+ override val downloaded: Boolean
60
+ get() = false // Would really like to set this to true once the cache has it...
61
+
62
+ // ... at which point we can return a value here.
63
+ override val downloadedMediaUri: String?
64
+ get() = null // ... at which point we can return a value here.
65
+
66
+ @get:SupportedMediaType
67
+ override val mediaType: Int
68
+ get() = BasePlaylistManager.AUDIO
69
+
70
+ override val mediaUrl: String
71
+ get() = config.optString("assetUrl", "")
72
+
73
+ // we should have a good default here.
74
+ override val thumbnailUrl: String?
75
+ get() {
76
+ val albumArt = config.optString("albumArt")
77
+ return if (albumArt == "") {
78
+ null
79
+ } else albumArt // we should have a good default here.
80
+ }
81
+
82
+ override val artworkUrl: String?
83
+ get() = thumbnailUrl
84
+
85
+ override val title: String
86
+ get() = config.optString("title")
87
+
88
+ override val album: String
89
+ get() = config.optString("album")
90
+
91
+ override val artist: String
92
+ get() = config.optString("artist")
93
+
94
+ }
@@ -0,0 +1,13 @@
1
+ package org.dwbn.plugins.playlist.manager
2
+
3
+ import org.dwbn.plugins.playlist.data.AudioTrack
4
+
5
+ /*
6
+ * Interface to enable the PlaylistManager to send these events out.
7
+ * We could add more like play/pause/toggle/stop, but right now there
8
+ * are other ways to get all the other information.
9
+ */
10
+ interface MediaControlsListener {
11
+ fun onNext(currentItem: AudioTrack?, currentIndex: Int)
12
+ fun onPrevious(currentItem: AudioTrack?, currentIndex: Int)
13
+ }
@@ -0,0 +1,77 @@
1
+ /*
2
+ * Apache 2.0 License
3
+ *
4
+ * Copyright (c) Sebastian Katzer 2017
5
+ *
6
+ * This file contains Original Code and/or Modifications of Original Code
7
+ * as defined in and that are subject to the Apache License
8
+ * Version 2.0 (the 'License'). You may not use this file except in
9
+ * compliance with the License. Please obtain a copy of the License at
10
+ * http://opensource.org/licenses/Apache-2.0/ and read it before using this
11
+ * file.
12
+ *
13
+ * The Original Code and all software distributed under the License are
14
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18
+ * Please see the License for the specific language governing rights and
19
+ * limitations under the License.
20
+ */
21
+ package org.dwbn.plugins.playlist.manager
22
+
23
+ import android.content.Context
24
+ import org.json.JSONObject
25
+
26
+ class Options {
27
+ /**
28
+ * Wrapped JSON object.
29
+ */
30
+ // The original JSON object
31
+ val dict: JSONObject
32
+
33
+ /**
34
+ * Application context.
35
+ */
36
+ // The application context
37
+ val context: Context
38
+
39
+ /**
40
+ * Constructor
41
+ *
42
+ * @param context The application context.
43
+ */
44
+ constructor(context: Context) {
45
+ this.context = context
46
+ dict = JSONObject()
47
+ }
48
+
49
+ /**
50
+ * Constructor
51
+ *
52
+ * @param context The application context.
53
+ * @param options The options dict map.
54
+ */
55
+ constructor(context: Context, options: JSONObject) {
56
+ this.context = context
57
+ dict = options
58
+ }
59
+
60
+ /**
61
+ * JSON object as string.
62
+ */
63
+ override fun toString(): String {
64
+ return dict.toString()
65
+ }
66
+
67
+ /**
68
+ * icon resource ID for the local notification.
69
+ */
70
+ val icon: String
71
+ get() = dict.optString("icon", DEFAULT_ICON)
72
+
73
+ companion object {
74
+ // Default icon path
75
+ private const val DEFAULT_ICON = "icon"
76
+ }
77
+ }