capacitor-plugin-playlist 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -23
- package/android/build.gradle +1 -3
- package/android/src/main/java/org/dwbn/plugins/playlist/App.kt +0 -43
- package/android/src/main/java/org/dwbn/plugins/playlist/PlaylistPlugin.kt +217 -153
- package/android/src/main/java/org/dwbn/plugins/playlist/RmxAudioPlayer.java +4 -2
- package/android/src/main/java/org/dwbn/plugins/playlist/manager/PlaylistManager.kt +8 -6
- package/android/src/main/java/org/dwbn/plugins/playlist/playlist/AudioApi.kt +20 -11
- package/android/src/main/java/org/dwbn/plugins/playlist/playlist/AudioPlaylistHandler.java +1 -46
- package/android/src/main/java/org/dwbn/plugins/playlist/playlist/BaseMediaApi.kt +4 -8
- package/android/src/main/java/org/dwbn/plugins/playlist/service/MediaService.kt +17 -0
- package/package.json +1 -1
- package/android/.gradle/8.0.2/checksums/checksums.lock +0 -0
- package/android/.gradle/8.0.2/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/8.0.2/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/8.0.2/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/8.0.2/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.0.2/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/8.0.2/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/8.0.2/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.0.2/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/8.0.2/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.0.2/fileHashes/resourceHashesCache.bin +0 -0
- package/android/.gradle/8.0.2/gc.properties +0 -0
- package/android/.gradle/8.2.1/checksums/checksums.lock +0 -0
- package/android/.gradle/8.2.1/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/8.2.1/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/8.2.1/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/8.2.1/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.2.1/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/8.2.1/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/8.2.1/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.2.1/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/8.2.1/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.2.1/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/config.properties +0 -2
- package/android/.gradle/file-system.probe +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/compiler.xml +0 -6
- package/android/.idea/gradle.xml +0 -19
- package/android/.idea/kotlinc.xml +0 -6
- package/android/.idea/migrations.xml +0 -10
- package/android/.idea/misc.xml +0 -9
- package/android/.idea/vcs.xml +0 -6
- package/android/bin/.gradle/8.0.2/checksums/checksums.lock +0 -0
- package/android/bin/.gradle/8.0.2/checksums/md5-checksums.bin +0 -0
- package/android/bin/.gradle/8.0.2/checksums/sha1-checksums.bin +0 -0
- package/android/bin/.gradle/8.0.2/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/bin/.gradle/8.0.2/dependencies-accessors/gc.properties +0 -0
- package/android/bin/.gradle/8.0.2/executionHistory/executionHistory.bin +0 -0
- package/android/bin/.gradle/8.0.2/executionHistory/executionHistory.lock +0 -0
- package/android/bin/.gradle/8.0.2/fileChanges/last-build.bin +0 -0
- package/android/bin/.gradle/8.0.2/fileHashes/fileHashes.bin +0 -0
- package/android/bin/.gradle/8.0.2/fileHashes/fileHashes.lock +0 -0
- package/android/bin/.gradle/8.0.2/fileHashes/resourceHashesCache.bin +0 -0
- package/android/bin/.gradle/8.0.2/gc.properties +0 -0
- package/android/bin/.gradle/8.2.1/checksums/checksums.lock +0 -0
- package/android/bin/.gradle/8.2.1/checksums/md5-checksums.bin +0 -0
- package/android/bin/.gradle/8.2.1/checksums/sha1-checksums.bin +0 -0
- package/android/bin/.gradle/8.2.1/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/bin/.gradle/8.2.1/dependencies-accessors/gc.properties +0 -0
- package/android/bin/.gradle/8.2.1/executionHistory/executionHistory.bin +0 -0
- package/android/bin/.gradle/8.2.1/executionHistory/executionHistory.lock +0 -0
- package/android/bin/.gradle/8.2.1/fileChanges/last-build.bin +0 -0
- package/android/bin/.gradle/8.2.1/fileHashes/fileHashes.bin +0 -0
- package/android/bin/.gradle/8.2.1/fileHashes/fileHashes.lock +0 -0
- package/android/bin/.gradle/8.2.1/gc.properties +0 -0
- package/android/bin/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/bin/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/android/bin/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/bin/.gradle/config.properties +0 -2
- package/android/bin/.gradle/file-system.probe +0 -0
- package/android/bin/.gradle/vcs-1/gc.properties +0 -0
- package/android/bin/.idea/compiler.xml +0 -6
- package/android/bin/.idea/gradle.xml +0 -19
- package/android/bin/.idea/kotlinc.xml +0 -6
- package/android/bin/.idea/migrations.xml +0 -10
- package/android/bin/.idea/misc.xml +0 -9
- package/android/bin/.idea/vcs.xml +0 -6
- package/android/bin/.project +0 -34
- package/android/bin/build.gradle +0 -79
- package/android/bin/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/bin/gradle/wrapper/gradle-wrapper.properties +0 -7
- package/android/bin/gradle.properties +0 -22
- package/android/bin/gradlew +0 -248
- package/android/bin/gradlew.bat +0 -92
- package/android/bin/local.properties +0 -8
- package/android/bin/proguard-rules.pro +0 -21
- package/android/bin/settings.gradle +0 -2
- package/android/bin/src/androidTest/java/com/getcapacitor/android/ExampleInstrumentedTest.class +0 -0
- package/android/bin/src/main/AndroidManifest.xml +0 -4
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/App.kt +0 -62
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/FakeR.kt +0 -39
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/OnStatusCallback.kt +0 -34
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/OnStatusReportListener.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/PlaylistItemOptions.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/PlaylistPlugin.kt +0 -356
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxAudioErrorType.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxAudioPlayer.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxAudioStatusMessage.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/RmxConstants.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/TrackRemovalItem.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/data/AudioTrack.kt +0 -94
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/manager/MediaControlsListener.kt +0 -13
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/manager/Options.kt +0 -77
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/manager/PlaylistManager.kt +0 -286
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/notification/PlaylistNotificationProvider.kt +0 -26
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/AudioApi.kt +0 -101
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/AudioPlaylistHandler$Builder.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/AudioPlaylistHandler.class +0 -0
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/playlist/BaseMediaApi.kt +0 -40
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/service/MediaImageProvider.kt +0 -79
- package/android/bin/src/main/java/org/dwbn/plugins/playlist/service/MediaService.kt +0 -53
- package/android/bin/src/main/res/.gitkeep +0 -0
- package/android/bin/src/main/res/drawable/ic_closed_caption_white_24dp.xml +0 -9
- package/android/bin/src/main/res/drawable/ic_demo_icon_adaptive.xml +0 -15
- package/android/bin/src/main/res/drawable/ic_launcher_background.xml +0 -48
- package/android/bin/src/main/res/drawable/ic_launcher_foreground.xml +0 -22
- package/android/bin/src/main/res/drawable/ic_notification_icon.png +0 -0
- package/android/bin/src/main/res/layout/bridge_layout_main.xml +0 -15
- package/android/bin/src/main/res/values/colors.xml +0 -3
- package/android/bin/src/main/res/values/strings.xml +0 -3
- package/android/bin/src/main/res/values/styles.xml +0 -3
- package/android/bin/src/test/java/com/getcapacitor/ExampleUnitTest.class +0 -0
- package/android/local.properties +0 -8
|
@@ -1,356 +0,0 @@
|
|
|
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
|
-
audioPlayerImpl = RmxAudioPlayer(this, (this.context.applicationContext as App))
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@PluginMethod
|
|
24
|
-
fun initialize(call: PluginCall) {
|
|
25
|
-
statusCallback = OnStatusCallback(this)
|
|
26
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_REGISTER, "INIT", null)
|
|
27
|
-
Log.i(TAG, "Initialized...")
|
|
28
|
-
audioPlayerImpl!!.resume()
|
|
29
|
-
call.resolve()
|
|
30
|
-
}
|
|
31
|
-
@PluginMethod
|
|
32
|
-
fun setOptions(call: PluginCall) {
|
|
33
|
-
val options: JSObject = call.getObject("options") ?: JSObject()
|
|
34
|
-
resetStreamOnPause = options.optBoolean("resetStreamOnPause", this.resetStreamOnPause)
|
|
35
|
-
Log.i("AudioPlayerOptions", options.toString())
|
|
36
|
-
audioPlayerImpl!!.resetStreamOnPause = resetStreamOnPause
|
|
37
|
-
audioPlayerImpl!!.setOptions(options)
|
|
38
|
-
call.resolve()
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
@PluginMethod
|
|
42
|
-
fun release(call: PluginCall) {
|
|
43
|
-
destroyResources()
|
|
44
|
-
call.resolve()
|
|
45
|
-
Log.i(TAG,"released")
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
@PluginMethod
|
|
49
|
-
fun setLoop(call: PluginCall) {
|
|
50
|
-
val loop: Boolean = call.getBoolean("loop", audioPlayerImpl!!.playlistManager.loop)!!
|
|
51
|
-
audioPlayerImpl!!.playlistManager.loop = loop
|
|
52
|
-
call.resolve()
|
|
53
|
-
Log.i(TAG,"setLoop: " + (if (loop) "TRUE" else "FALSE"))
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
@PluginMethod
|
|
57
|
-
fun setPlaylistItems(call: PluginCall) {
|
|
58
|
-
val items: JSArray = call.getArray("items")
|
|
59
|
-
val optionsArgs: JSONObject = call.getObject("options")
|
|
60
|
-
val options = PlaylistItemOptions(optionsArgs)
|
|
61
|
-
|
|
62
|
-
val trackItems: ArrayList<AudioTrack> = getTrackItems(items)
|
|
63
|
-
audioPlayerImpl!!.playlistManager.setAllItems(trackItems, options)
|
|
64
|
-
for (playerItem in trackItems) {
|
|
65
|
-
if (playerItem.trackId != null) {
|
|
66
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, playerItem.trackId, playerItem.toDict())
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
call.resolve()
|
|
71
|
-
|
|
72
|
-
Log.i(TAG,"setPlaylistItems" + items.length().toString())
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
@PluginMethod
|
|
76
|
-
fun addItem(call: PluginCall) {
|
|
77
|
-
val item: JSONObject = call.getObject("item")
|
|
78
|
-
val playerItem: AudioTrack? = getTrackItem(item)
|
|
79
|
-
audioPlayerImpl!!.getPlaylistManager().addItem(playerItem)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (playerItem?.trackId != null) {
|
|
83
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, playerItem.trackId, playerItem.toDict())
|
|
84
|
-
}
|
|
85
|
-
call.resolve()
|
|
86
|
-
Log.i(TAG,"addItem")
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
@PluginMethod
|
|
90
|
-
fun addAllItems(call: PluginCall) {
|
|
91
|
-
val items: JSONArray = call.getArray("items")
|
|
92
|
-
val trackItems = getTrackItems(items)
|
|
93
|
-
audioPlayerImpl!!.playlistManager.addAllItems(trackItems)
|
|
94
|
-
|
|
95
|
-
for (playerItem in trackItems) {
|
|
96
|
-
if (playerItem.trackId != null) {
|
|
97
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, playerItem.trackId, playerItem.toDict())
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
call.resolve()
|
|
101
|
-
Log.i(TAG,"addAllItems")
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
@PluginMethod
|
|
105
|
-
fun removeItem(call: PluginCall) {
|
|
106
|
-
val trackIndex: Int = call.getInt("index", -1)!!
|
|
107
|
-
val trackId: String = call.getString("id", "")!!
|
|
108
|
-
Log.i(TAG,"removeItem trackIn" )
|
|
109
|
-
val item = audioPlayerImpl!!.playlistManager.removeItem(trackIndex, trackId)
|
|
110
|
-
|
|
111
|
-
if (item != null) {
|
|
112
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, item.trackId, item.toDict())
|
|
113
|
-
call.resolve()
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
call.reject("Could not find item!")
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
@PluginMethod
|
|
121
|
-
fun removeItems(call: PluginCall) {
|
|
122
|
-
val items: JSONArray = call.getArray("items")
|
|
123
|
-
var removed = 0
|
|
124
|
-
|
|
125
|
-
val removals = ArrayList<TrackRemovalItem>()
|
|
126
|
-
for (index in 0 until items.length()) {
|
|
127
|
-
val entry = items.optJSONObject(index) ?: continue
|
|
128
|
-
val trackIndex = entry.optInt("trackIndex", -1)
|
|
129
|
-
val trackId = entry.optString("trackId", "")
|
|
130
|
-
removals.add(TrackRemovalItem(trackIndex, trackId))
|
|
131
|
-
val removedTracks = audioPlayerImpl!!.playlistManager.removeAllItems(removals)
|
|
132
|
-
if (removedTracks.size > 0) {
|
|
133
|
-
for (removedItem in removedTracks) {
|
|
134
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, removedItem.trackId, removedItem.toDict())
|
|
135
|
-
}
|
|
136
|
-
removed = removedTracks.size
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
val result = JSObject()
|
|
141
|
-
result.put("removed", removed)
|
|
142
|
-
call.resolve(result)
|
|
143
|
-
|
|
144
|
-
Log.i(TAG,"removeItems")
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
@PluginMethod
|
|
148
|
-
fun clearAllItems(call: PluginCall) {
|
|
149
|
-
audioPlayerImpl!!.playlistManager.clearItems()
|
|
150
|
-
|
|
151
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_PLAYLIST_CLEARED, "INVALID", null)
|
|
152
|
-
call.resolve()
|
|
153
|
-
|
|
154
|
-
Log.i(TAG,"clearAllItems")
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
@PluginMethod
|
|
158
|
-
fun play(call: PluginCall) {
|
|
159
|
-
if (audioPlayerImpl!!.playlistManager.playlistHandler != null) {
|
|
160
|
-
val isPlaying = (audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer != null
|
|
161
|
-
&& audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying!!)
|
|
162
|
-
// There's a bug in the threaded repeater that it stacks up the repeat calls instead of ignoring
|
|
163
|
-
// additional ones or starting a new one. E.g. every time this is called, you'd get a new repeat cycle,
|
|
164
|
-
// meaning you get N updates per second. Ew.
|
|
165
|
-
if (!isPlaying) {
|
|
166
|
-
audioPlayerImpl!!.playlistManager.playlistHandler?.play()
|
|
167
|
-
//audioPlayerImpl.getPlaylistManager().playlistHandler.seek(position)
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
call.resolve()
|
|
172
|
-
|
|
173
|
-
Log.i(TAG,"play")
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
@PluginMethod
|
|
177
|
-
fun playTrackByIndex(call: PluginCall) {
|
|
178
|
-
val index: Int = call.getInt("index", audioPlayerImpl!!.playlistManager.currentPosition)!!
|
|
179
|
-
val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
|
|
180
|
-
|
|
181
|
-
audioPlayerImpl!!.playlistManager.currentPosition = index
|
|
182
|
-
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
|
|
183
|
-
|
|
184
|
-
call.resolve()
|
|
185
|
-
|
|
186
|
-
Log.i(TAG,"playTrackByIndex")
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
@PluginMethod
|
|
190
|
-
fun playTrackById(call: PluginCall) {
|
|
191
|
-
val id: String = call.getString("id")!!
|
|
192
|
-
if ("" != id) {
|
|
193
|
-
// alternatively we could search for the item and set the current index to that item.
|
|
194
|
-
val code = id.hashCode()
|
|
195
|
-
val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
|
|
196
|
-
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
197
|
-
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
call.resolve()
|
|
201
|
-
|
|
202
|
-
Log.i(TAG,"playTrackById")
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
@PluginMethod
|
|
206
|
-
fun selectTrackByIndex(call: PluginCall) {
|
|
207
|
-
val index: Int = call.getInt("index", audioPlayerImpl!!.playlistManager.currentPosition)!!
|
|
208
|
-
|
|
209
|
-
audioPlayerImpl!!.playlistManager.currentPosition = index
|
|
210
|
-
|
|
211
|
-
val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
|
|
212
|
-
|
|
213
|
-
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
|
|
214
|
-
|
|
215
|
-
call.resolve()
|
|
216
|
-
|
|
217
|
-
Log.i(TAG,"selectTrackByIndex")
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
@PluginMethod
|
|
222
|
-
fun selectTrackById(call: PluginCall) {
|
|
223
|
-
val id: String = call.getString("id")!!
|
|
224
|
-
if ("" != id) {
|
|
225
|
-
// alternatively we could search for the item and set the current index to that item.
|
|
226
|
-
val code = id.hashCode()
|
|
227
|
-
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
228
|
-
|
|
229
|
-
val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
|
|
230
|
-
|
|
231
|
-
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
|
|
232
|
-
}
|
|
233
|
-
call.resolve()
|
|
234
|
-
|
|
235
|
-
Log.i(TAG,"selectTrackById")
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
@PluginMethod
|
|
239
|
-
fun pause(call: PluginCall) {
|
|
240
|
-
audioPlayerImpl!!.playlistManager.invokePausePlay()
|
|
241
|
-
|
|
242
|
-
call.resolve()
|
|
243
|
-
|
|
244
|
-
Log.i(TAG,"pause")
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
@PluginMethod
|
|
248
|
-
fun skipForward(call: PluginCall) {
|
|
249
|
-
audioPlayerImpl!!.playlistManager.invokeNext()
|
|
250
|
-
|
|
251
|
-
call.resolve()
|
|
252
|
-
|
|
253
|
-
Log.i(TAG,"skipForward")
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
@PluginMethod
|
|
257
|
-
fun skipBack(call: PluginCall) {
|
|
258
|
-
audioPlayerImpl!!.playlistManager.invokePrevious()
|
|
259
|
-
|
|
260
|
-
call.resolve()
|
|
261
|
-
|
|
262
|
-
Log.i(TAG,"skipBack")
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
@PluginMethod
|
|
266
|
-
fun seekTo(call: PluginCall) {
|
|
267
|
-
var position: Long = 0
|
|
268
|
-
val progress: MediaProgress? = audioPlayerImpl!!.playlistManager.currentProgress
|
|
269
|
-
if (progress != null) {
|
|
270
|
-
position = progress.position
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
val seekPosition = (call.getInt("position", (position / 1000.0f).toInt())!! * 1000.0).toLong()
|
|
274
|
-
|
|
275
|
-
val isPlaying: Boolean? = audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying
|
|
276
|
-
audioPlayerImpl!!.playlistManager.playlistHandler?.seek(seekPosition)
|
|
277
|
-
if (isPlaying === null || !isPlaying) {
|
|
278
|
-
audioPlayerImpl!!.playlistManager.playlistHandler?.pause(false)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
call.resolve()
|
|
282
|
-
|
|
283
|
-
Log.i(TAG,"seekTo")
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
@PluginMethod
|
|
287
|
-
fun setPlaybackRate(call: PluginCall) {
|
|
288
|
-
val speed = call.getFloat("rate", audioPlayerImpl!!.playlistManager.getPlaybackSpeed())!!
|
|
289
|
-
audioPlayerImpl!!.playlistManager.setPlaybackSpeed(speed)
|
|
290
|
-
|
|
291
|
-
call.resolve()
|
|
292
|
-
|
|
293
|
-
Log.i(TAG,"setPlaybackRate")
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
@PluginMethod
|
|
297
|
-
fun setVolume(call: PluginCall) {
|
|
298
|
-
val volume = call.getFloat("volume", audioPlayerImpl!!.volume)!!
|
|
299
|
-
audioPlayerImpl!!.volume = volume
|
|
300
|
-
|
|
301
|
-
call.resolve()
|
|
302
|
-
|
|
303
|
-
Log.i(TAG,"addItem")
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
override fun handleOnDestroy() {
|
|
307
|
-
Log.d(TAG, "Plugin destroy")
|
|
308
|
-
super.handleOnDestroy()
|
|
309
|
-
destroyResources()
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
override fun onError(errorCode: RmxAudioErrorType?, trackId: String?, message: String?) {
|
|
313
|
-
if (statusCallback == null) {
|
|
314
|
-
return
|
|
315
|
-
}
|
|
316
|
-
val errorObj = OnStatusCallback.createErrorWithCode(errorCode, message)
|
|
317
|
-
onStatus(RmxAudioStatusMessage.RMXSTATUS_ERROR, trackId, errorObj)
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
override fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
|
|
321
|
-
if (statusCallback == null) {
|
|
322
|
-
return
|
|
323
|
-
}
|
|
324
|
-
statusCallback!!.onStatus(what, trackId, param)
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
private fun destroyResources() {
|
|
328
|
-
statusCallback = null
|
|
329
|
-
audioPlayerImpl!!.playlistManager.clearItems()
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
private fun getTrackItem(item: JSONObject?): AudioTrack? {
|
|
333
|
-
if (item != null) {
|
|
334
|
-
val track = AudioTrack(item)
|
|
335
|
-
return if (track.trackId != null) {
|
|
336
|
-
track
|
|
337
|
-
} else null
|
|
338
|
-
}
|
|
339
|
-
return null
|
|
340
|
-
}
|
|
341
|
-
private fun getTrackItems(items: JSONArray?): ArrayList<AudioTrack> {
|
|
342
|
-
val trackItems = ArrayList<AudioTrack>()
|
|
343
|
-
if (items != null && items.length() > 0) {
|
|
344
|
-
for (index in 0 until items.length()) {
|
|
345
|
-
val obj = items.optJSONObject(index)
|
|
346
|
-
val track: AudioTrack = getTrackItem(obj) ?: continue
|
|
347
|
-
trackItems.add(track)
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
return trackItems
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
fun emit(name: String, data: JSObject) {
|
|
354
|
-
this.notifyListeners(name, data, true)
|
|
355
|
-
}
|
|
356
|
-
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,94 +0,0 @@
|
|
|
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
|
-
}
|
package/android/bin/src/main/java/org/dwbn/plugins/playlist/manager/MediaControlsListener.kt
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
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
|
-
}
|