capacitor-plugin-playlist 0.8.7 → 0.9.1
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/android/src/main/java/org/dwbn/plugins/playlist/OnStatusCallback.kt +3 -13
- package/android/src/main/java/org/dwbn/plugins/playlist/PlaylistPlugin.kt +120 -32
- package/android/src/main/java/org/dwbn/plugins/playlist/RmxAudioPlayer.java +41 -0
- package/android/src/test/java/org/dwbn/plugins/playlist/StatusBridgePolicyTest.kt +56 -0
- package/dist/docs.json +72 -0
- package/dist/esm/RmxAudioPlayer.js +14 -3
- package/dist/esm/RmxAudioPlayer.js.map +1 -1
- package/dist/esm/definitions.d.ts +19 -0
- package/dist/esm/web.d.ts +8 -0
- package/dist/esm/web.js +39 -24
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +55 -27
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +55 -27
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/AudioTrack.swift +6 -1
- package/ios/Plugin/Plugin.m +0 -1
- package/ios/Plugin/Plugin.swift +42 -17
- package/ios/Plugin/RmxAudioPlayer.swift +101 -8
- package/ios/PluginTests/PluginTests.swift +12 -24
- package/package.json +1 -1
- package/android/.gradle/8.11.1/checksums/checksums.lock +0 -0
- package/android/.gradle/8.11.1/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/8.11.1/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/8.11.1/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/8.11.1/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/8.11.1/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.11.1/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/8.11.1/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.11.1/gc.properties +0 -0
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
package org.dwbn.plugins.playlist
|
|
2
2
|
|
|
3
|
-
import android.util.Log
|
|
4
|
-
import com.getcapacitor.JSObject
|
|
5
3
|
import org.json.JSONException
|
|
6
4
|
import org.json.JSONObject
|
|
7
5
|
|
|
8
6
|
class OnStatusCallback internal constructor(private val plugin: PlaylistPlugin) {
|
|
9
7
|
fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
|
|
10
|
-
|
|
11
|
-
val detail = JSObject()
|
|
12
|
-
detail.put("msgType", what.value)
|
|
13
|
-
detail.put("trackId", trackId)
|
|
14
|
-
detail.put("value", param)
|
|
15
|
-
data.put("action", "status")
|
|
16
|
-
data.put("status", detail)
|
|
17
|
-
Log.v(TAG, "statusChanged:$data")
|
|
18
|
-
plugin.emit("status", data)
|
|
8
|
+
plugin.emitStatus(what, trackId, param)
|
|
19
9
|
}
|
|
20
10
|
|
|
21
11
|
companion object {
|
|
@@ -26,9 +16,9 @@ class OnStatusCallback internal constructor(private val plugin: PlaylistPlugin)
|
|
|
26
16
|
error.put("code", code)
|
|
27
17
|
error.put("message", message ?: "")
|
|
28
18
|
} catch (e: JSONException) {
|
|
29
|
-
Log.e(TAG, "Exception while raising onStatus: ", e)
|
|
19
|
+
android.util.Log.e(TAG, "Exception while raising onStatus: ", e)
|
|
30
20
|
}
|
|
31
21
|
return error
|
|
32
22
|
}
|
|
33
23
|
}
|
|
34
|
-
}
|
|
24
|
+
}
|
|
@@ -17,6 +17,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
17
17
|
private var statusCallback: OnStatusCallback? = null
|
|
18
18
|
private var audioPlayerImpl: RmxAudioPlayer? = null
|
|
19
19
|
private var resetStreamOnPause = true
|
|
20
|
+
private var isWebViewActive = true
|
|
20
21
|
|
|
21
22
|
override fun load() {
|
|
22
23
|
audioPlayerImpl = RmxAudioPlayer(this, (this.context.applicationContext as App))
|
|
@@ -37,7 +38,9 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
37
38
|
fun setOptions(call: PluginCall) {
|
|
38
39
|
Handler(Looper.getMainLooper()).post {
|
|
39
40
|
val options: JSObject = call.getObject("options") ?: JSObject()
|
|
40
|
-
resetStreamOnPause
|
|
41
|
+
// resetStreamOnPause is a top-level option; "options" is reserved for notification options.
|
|
42
|
+
resetStreamOnPause =
|
|
43
|
+
call.getBoolean("resetStreamOnPause", this.resetStreamOnPause) ?: this.resetStreamOnPause
|
|
41
44
|
Log.i("AudioPlayerOptions", options.toString())
|
|
42
45
|
audioPlayerImpl!!.resetStreamOnPause = resetStreamOnPause
|
|
43
46
|
audioPlayerImpl!!.setOptions(options)
|
|
@@ -150,7 +153,6 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
150
153
|
fun removeItems(call: PluginCall) {
|
|
151
154
|
Handler(Looper.getMainLooper()).post {
|
|
152
155
|
val items: JSONArray = call.getArray("items")
|
|
153
|
-
var removed = 0
|
|
154
156
|
|
|
155
157
|
val removals = ArrayList<TrackRemovalItem>()
|
|
156
158
|
for (index in 0 until items.length()) {
|
|
@@ -158,21 +160,19 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
158
160
|
val trackIndex = entry.optInt("trackIndex", -1)
|
|
159
161
|
val trackId = entry.optString("trackId", "")
|
|
160
162
|
removals.add(TrackRemovalItem(trackIndex, trackId))
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
removed = removedTracks.size
|
|
171
|
-
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
val removedTracks = audioPlayerImpl!!.playlistManager.removeAllItems(removals)
|
|
166
|
+
for (removedItem in removedTracks) {
|
|
167
|
+
onStatus(
|
|
168
|
+
RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED,
|
|
169
|
+
removedItem.trackId,
|
|
170
|
+
removedItem.toDict()
|
|
171
|
+
)
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
val result = JSObject()
|
|
175
|
-
result.put("removed",
|
|
175
|
+
result.put("removed", removedTracks.size)
|
|
176
176
|
call.resolve(result)
|
|
177
177
|
|
|
178
178
|
Log.i(TAG, "removeItems")
|
|
@@ -213,16 +213,20 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
213
213
|
@PluginMethod
|
|
214
214
|
fun play(call: PluginCall) {
|
|
215
215
|
Handler(Looper.getMainLooper()).post {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
//
|
|
221
|
-
|
|
222
|
-
|
|
216
|
+
val handler = audioPlayerImpl!!.playlistManager.playlistHandler
|
|
217
|
+
if (handler == null || handler.currentMediaPlayer == null) {
|
|
218
|
+
// MediaPlayer was released or MediaService was killed (e.g. after a long video session
|
|
219
|
+
// where audio focus was permanently abandoned). Fall back to beginPlayback which
|
|
220
|
+
// re-starts the service, re-prepares the MediaPlayer, and re-acquires audio focus.
|
|
221
|
+
val posMs = (audioPlayerImpl!!.getLastKnownPositionSec() * 1000f).toLong()
|
|
222
|
+
audioPlayerImpl!!.playlistManager.beginPlayback(posMs, false)
|
|
223
|
+
Log.i(TAG, "play: handler/mediaPlayer was null — re-armed via beginPlayback at ${posMs}ms")
|
|
224
|
+
} else {
|
|
225
|
+
// Handler and MediaPlayer are alive — use the lightweight resume path.
|
|
226
|
+
// Guard against stacking up repeat cycles (playlistcore bug): skip if already playing.
|
|
227
|
+
val isPlaying = handler.currentMediaPlayer?.isPlaying ?: false
|
|
223
228
|
if (!isPlaying) {
|
|
224
|
-
|
|
225
|
-
//audioPlayerImpl.getPlaylistManager().playlistHandler.seek(position)
|
|
229
|
+
handler.play()
|
|
226
230
|
}
|
|
227
231
|
}
|
|
228
232
|
|
|
@@ -237,7 +241,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
237
241
|
Handler(Looper.getMainLooper()).post {
|
|
238
242
|
val index: Int =
|
|
239
243
|
call.getInt("index", audioPlayerImpl!!.playlistManager.currentPosition)!!
|
|
240
|
-
val seekPosition = (call.
|
|
244
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
241
245
|
|
|
242
246
|
audioPlayerImpl!!.playlistManager.currentPosition = index
|
|
243
247
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
|
|
@@ -255,7 +259,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
255
259
|
if ("" != id) {
|
|
256
260
|
// alternatively we could search for the item and set the current index to that item.
|
|
257
261
|
val code = id.hashCode()
|
|
258
|
-
val seekPosition = (call.
|
|
262
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
259
263
|
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
260
264
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
|
|
261
265
|
}
|
|
@@ -274,7 +278,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
274
278
|
|
|
275
279
|
audioPlayerImpl!!.playlistManager.currentPosition = index
|
|
276
280
|
|
|
277
|
-
val seekPosition = (call.
|
|
281
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
278
282
|
|
|
279
283
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
|
|
280
284
|
|
|
@@ -294,7 +298,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
294
298
|
val code = id.hashCode()
|
|
295
299
|
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
296
300
|
|
|
297
|
-
val seekPosition = (call.
|
|
301
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
298
302
|
|
|
299
303
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
|
|
300
304
|
}
|
|
@@ -307,7 +311,9 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
307
311
|
@PluginMethod
|
|
308
312
|
fun pause(call: PluginCall) {
|
|
309
313
|
Handler(Looper.getMainLooper()).post {
|
|
310
|
-
audioPlayerImpl!!.playlistManager.
|
|
314
|
+
if (audioPlayerImpl!!.playlistManager.isPlaying) {
|
|
315
|
+
audioPlayerImpl!!.playlistManager.playlistHandler?.pause(false)
|
|
316
|
+
}
|
|
311
317
|
|
|
312
318
|
call.resolve()
|
|
313
319
|
|
|
@@ -347,7 +353,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
347
353
|
}
|
|
348
354
|
|
|
349
355
|
val seekPosition =
|
|
350
|
-
(call.
|
|
356
|
+
(call.getFloat("position", position / 1000.0f)!! * 1000.0f).toLong()
|
|
351
357
|
|
|
352
358
|
val isPlaying: Boolean? =
|
|
353
359
|
audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying
|
|
@@ -387,6 +393,49 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
387
393
|
}
|
|
388
394
|
}
|
|
389
395
|
|
|
396
|
+
@PluginMethod
|
|
397
|
+
fun prepareForVideoHandoff(call: PluginCall) {
|
|
398
|
+
Handler(Looper.getMainLooper()).post {
|
|
399
|
+
audioPlayerImpl!!.prepareForVideoHandoff()
|
|
400
|
+
call.resolve()
|
|
401
|
+
Log.i(TAG, "prepareForVideoHandoff")
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
@PluginMethod
|
|
406
|
+
fun resumeAfterVideoHandoff(call: PluginCall) {
|
|
407
|
+
Handler(Looper.getMainLooper()).post {
|
|
408
|
+
val position = call.getFloat("position", 0f)!!
|
|
409
|
+
audioPlayerImpl!!.resumeAfterVideoHandoff(position)
|
|
410
|
+
call.resolve()
|
|
411
|
+
Log.i(TAG, "resumeAfterVideoHandoff")
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
@PluginMethod
|
|
416
|
+
fun getLastKnownPosition(call: PluginCall) {
|
|
417
|
+
Handler(Looper.getMainLooper()).post {
|
|
418
|
+
val position = audioPlayerImpl!!.getLastKnownPositionSec()
|
|
419
|
+
val o = JSObject()
|
|
420
|
+
o.put("position", position.toDouble())
|
|
421
|
+
call.resolve(o)
|
|
422
|
+
Log.i(TAG, "getLastKnownPosition")
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
override fun handleOnPause() {
|
|
427
|
+
super.handleOnPause()
|
|
428
|
+
isWebViewActive = false
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
override fun handleOnResume() {
|
|
432
|
+
super.handleOnResume()
|
|
433
|
+
isWebViewActive = true
|
|
434
|
+
Handler(Looper.getMainLooper()).post {
|
|
435
|
+
audioPlayerImpl?.emitPlaybackSnapshot()
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
390
439
|
override fun handleOnDestroy() {
|
|
391
440
|
Log.d(TAG, "Plugin destroy")
|
|
392
441
|
super.handleOnDestroy()
|
|
@@ -395,21 +444,26 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
395
444
|
|
|
396
445
|
override fun onError(errorCode: RmxAudioErrorType?, trackId: String?, message: String?) {
|
|
397
446
|
if (statusCallback == null) {
|
|
398
|
-
|
|
447
|
+
statusCallback = OnStatusCallback(this)
|
|
399
448
|
}
|
|
400
449
|
val errorObj = OnStatusCallback.createErrorWithCode(errorCode, message)
|
|
401
450
|
onStatus(RmxAudioStatusMessage.RMXSTATUS_ERROR, trackId, errorObj)
|
|
402
451
|
}
|
|
403
452
|
|
|
404
453
|
override fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
|
|
454
|
+
// Defensive: recreate the callback if it was ever cleared (e.g. by an unexpected
|
|
455
|
+
// destroyResources call) so that audio events are never permanently silenced.
|
|
405
456
|
if (statusCallback == null) {
|
|
406
|
-
|
|
457
|
+
statusCallback = OnStatusCallback(this)
|
|
407
458
|
}
|
|
408
459
|
statusCallback!!.onStatus(what, trackId, param)
|
|
409
460
|
}
|
|
410
461
|
|
|
411
462
|
private fun destroyResources() {
|
|
412
|
-
statusCallback
|
|
463
|
+
// Do NOT null statusCallback here — it is bound to the Plugin instance and must remain
|
|
464
|
+
// alive for the entire app lifetime. Nulling it silences all subsequent audio events
|
|
465
|
+
// (PLAYING, PAUSE, PLAYBACK_POSITION, etc.) because onStatus() would early-return.
|
|
466
|
+
// Only clear the playback items so native memory is released.
|
|
413
467
|
audioPlayerImpl!!.playlistManager.clearItems()
|
|
414
468
|
}
|
|
415
469
|
|
|
@@ -434,7 +488,41 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
434
488
|
return trackItems
|
|
435
489
|
}
|
|
436
490
|
|
|
491
|
+
fun emitStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
|
|
492
|
+
if (!shouldEmitStatusToBridge(what, isWebViewActive)) {
|
|
493
|
+
return
|
|
494
|
+
}
|
|
495
|
+
val data = JSObject()
|
|
496
|
+
val detail = JSObject()
|
|
497
|
+
detail.put("msgType", what.value)
|
|
498
|
+
detail.put("trackId", trackId)
|
|
499
|
+
detail.put("value", param)
|
|
500
|
+
data.put("action", "status")
|
|
501
|
+
data.put("status", detail)
|
|
502
|
+
Log.v(TAG, "statusChanged:$data")
|
|
503
|
+
notifyListeners("status", data, shouldRetainStatusEvent(what))
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/** @deprecated Use [emitStatus] so retain/gating policy is applied consistently. */
|
|
437
507
|
fun emit(name: String, data: JSObject) {
|
|
438
508
|
this.notifyListeners(name, data, true)
|
|
439
509
|
}
|
|
510
|
+
|
|
511
|
+
companion object {
|
|
512
|
+
@JvmStatic
|
|
513
|
+
internal fun shouldEmitStatusToBridge(
|
|
514
|
+
what: RmxAudioStatusMessage,
|
|
515
|
+
isWebViewActive: Boolean
|
|
516
|
+
): Boolean {
|
|
517
|
+
if (what == RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION && !isWebViewActive) {
|
|
518
|
+
return false
|
|
519
|
+
}
|
|
520
|
+
return true
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
@JvmStatic
|
|
524
|
+
internal fun shouldRetainStatusEvent(what: RmxAudioStatusMessage): Boolean {
|
|
525
|
+
return what != RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION
|
|
526
|
+
}
|
|
527
|
+
}
|
|
440
528
|
}
|
|
@@ -450,4 +450,45 @@ public class RmxAudioPlayer implements PlaybackStatusListener<AudioTrack>,
|
|
|
450
450
|
private void onStatus(RmxAudioStatusMessage what, String trackId, JSONObject param) {
|
|
451
451
|
statusListener.onStatus(what, trackId, param);
|
|
452
452
|
}
|
|
453
|
+
|
|
454
|
+
private float lastKnownHandoffPositionSec = 0f;
|
|
455
|
+
|
|
456
|
+
public void prepareForVideoHandoff() {
|
|
457
|
+
MediaProgress progress = playlistManager.getCurrentProgress();
|
|
458
|
+
if (progress != null) {
|
|
459
|
+
lastKnownHandoffPositionSec = progress.getPosition() / 1000f;
|
|
460
|
+
} else {
|
|
461
|
+
lastKnownHandoffPositionSec = 0f;
|
|
462
|
+
}
|
|
463
|
+
// Pause unconditionally (not only when isPlaying) so that DefaultAudioFocusProvider
|
|
464
|
+
// always abandons audio focus before CapacitorVideoPlayer.initPlayer acquires it.
|
|
465
|
+
// Calling pause() on an already-paused handler is safe; it triggers focus release.
|
|
466
|
+
if (playlistManager.getPlaylistHandler() != null) {
|
|
467
|
+
playlistManager.getPlaylistHandler().pause(false);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
public void resumeAfterVideoHandoff(float positionSec) {
|
|
472
|
+
lastKnownHandoffPositionSec = positionSec;
|
|
473
|
+
// Re-arm the audio session/service so the handler is primed before JS calls play().
|
|
474
|
+
// On Android, prepareForVideoHandoff() abandoned audio focus which may have caused
|
|
475
|
+
// the MediaService to stop itself (foreground service removal). beginPlayback with
|
|
476
|
+
// startPaused=true restarts the service, re-acquires audio focus, and prepares the
|
|
477
|
+
// MediaPlayer at the stored position — without auto-starting playback (JS owns FR111).
|
|
478
|
+
long positionMs = (long) (positionSec * 1000f);
|
|
479
|
+
playlistManager.beginPlayback(positionMs, true);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
public float getLastKnownPositionSec() {
|
|
483
|
+
return lastKnownHandoffPositionSec;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
public void emitPlaybackSnapshot() {
|
|
487
|
+
AudioTrack currentItem = playlistManager.getCurrentItem();
|
|
488
|
+
if (currentItem == null) {
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
JSONObject trackStatus = getPlayerStatus(currentItem);
|
|
492
|
+
onStatus(RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION, currentItem.getTrackId(), trackStatus);
|
|
493
|
+
}
|
|
453
494
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
package org.dwbn.plugins.playlist
|
|
2
|
+
|
|
3
|
+
import org.junit.Assert.assertFalse
|
|
4
|
+
import org.junit.Assert.assertTrue
|
|
5
|
+
import org.junit.Test
|
|
6
|
+
|
|
7
|
+
class StatusBridgePolicyTest {
|
|
8
|
+
|
|
9
|
+
@Test
|
|
10
|
+
fun playbackPosition_isSuppressedWhenWebViewInactive() {
|
|
11
|
+
assertFalse(
|
|
12
|
+
PlaylistPlugin.shouldEmitStatusToBridge(
|
|
13
|
+
RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION,
|
|
14
|
+
isWebViewActive = false
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Test
|
|
20
|
+
fun playbackPosition_isEmittedWhenWebViewActive() {
|
|
21
|
+
assertTrue(
|
|
22
|
+
PlaylistPlugin.shouldEmitStatusToBridge(
|
|
23
|
+
RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION,
|
|
24
|
+
isWebViewActive = true
|
|
25
|
+
)
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@Test
|
|
30
|
+
fun playing_isEmittedWhenWebViewInactive() {
|
|
31
|
+
assertTrue(
|
|
32
|
+
PlaylistPlugin.shouldEmitStatusToBridge(
|
|
33
|
+
RmxAudioStatusMessage.RMXSTATUS_PLAYING,
|
|
34
|
+
isWebViewActive = false
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@Test
|
|
40
|
+
fun playbackPosition_isNotRetained() {
|
|
41
|
+
assertFalse(
|
|
42
|
+
PlaylistPlugin.shouldRetainStatusEvent(
|
|
43
|
+
RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@Test
|
|
49
|
+
fun playing_isRetained() {
|
|
50
|
+
assertTrue(
|
|
51
|
+
PlaylistPlugin.shouldRetainStatusEvent(
|
|
52
|
+
RmxAudioStatusMessage.RMXSTATUS_PLAYING
|
|
53
|
+
)
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
}
|
package/dist/docs.json
CHANGED
|
@@ -362,6 +362,46 @@
|
|
|
362
362
|
"SetPlaybackRateOptions"
|
|
363
363
|
],
|
|
364
364
|
"slug": "setplaybackrate"
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"name": "prepareForVideoHandoff",
|
|
368
|
+
"signature": "() => Promise<void>",
|
|
369
|
+
"parameters": [],
|
|
370
|
+
"returns": "Promise<void>",
|
|
371
|
+
"tags": [],
|
|
372
|
+
"docs": "Epic 45 — release native audio session / focus so the video player can own playback.\nCall immediately before CapacitorVideoPlayer.initPlayer (Critical Rule 2).",
|
|
373
|
+
"complexTypes": [],
|
|
374
|
+
"slug": "prepareforvideohandoff"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"name": "resumeAfterVideoHandoff",
|
|
378
|
+
"signature": "(options: ResumeAfterVideoHandoffOptions) => Promise<void>",
|
|
379
|
+
"parameters": [
|
|
380
|
+
{
|
|
381
|
+
"name": "options",
|
|
382
|
+
"docs": "",
|
|
383
|
+
"type": "ResumeAfterVideoHandoffOptions"
|
|
384
|
+
}
|
|
385
|
+
],
|
|
386
|
+
"returns": "Promise<void>",
|
|
387
|
+
"tags": [],
|
|
388
|
+
"docs": "Epic 45 — optional resume hook after video exits (full behaviour in Stories 45.3/45.4).",
|
|
389
|
+
"complexTypes": [
|
|
390
|
+
"ResumeAfterVideoHandoffOptions"
|
|
391
|
+
],
|
|
392
|
+
"slug": "resumeaftervideohandoff"
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"name": "getLastKnownPosition",
|
|
396
|
+
"signature": "() => Promise<GetLastKnownPositionResult>",
|
|
397
|
+
"parameters": [],
|
|
398
|
+
"returns": "Promise<GetLastKnownPositionResult>",
|
|
399
|
+
"tags": [],
|
|
400
|
+
"docs": "Epic 45 — last audio head captured during prepare (seconds).",
|
|
401
|
+
"complexTypes": [
|
|
402
|
+
"GetLastKnownPositionResult"
|
|
403
|
+
],
|
|
404
|
+
"slug": "getlastknownposition"
|
|
365
405
|
}
|
|
366
406
|
],
|
|
367
407
|
"properties": []
|
|
@@ -1862,6 +1902,38 @@
|
|
|
1862
1902
|
"type": "number"
|
|
1863
1903
|
}
|
|
1864
1904
|
]
|
|
1905
|
+
},
|
|
1906
|
+
{
|
|
1907
|
+
"name": "ResumeAfterVideoHandoffOptions",
|
|
1908
|
+
"slug": "resumeaftervideohandoffoptions",
|
|
1909
|
+
"docs": "",
|
|
1910
|
+
"tags": [],
|
|
1911
|
+
"methods": [],
|
|
1912
|
+
"properties": [
|
|
1913
|
+
{
|
|
1914
|
+
"name": "position",
|
|
1915
|
+
"tags": [],
|
|
1916
|
+
"docs": "",
|
|
1917
|
+
"complexTypes": [],
|
|
1918
|
+
"type": "number"
|
|
1919
|
+
}
|
|
1920
|
+
]
|
|
1921
|
+
},
|
|
1922
|
+
{
|
|
1923
|
+
"name": "GetLastKnownPositionResult",
|
|
1924
|
+
"slug": "getlastknownpositionresult",
|
|
1925
|
+
"docs": "",
|
|
1926
|
+
"tags": [],
|
|
1927
|
+
"methods": [],
|
|
1928
|
+
"properties": [
|
|
1929
|
+
{
|
|
1930
|
+
"name": "position",
|
|
1931
|
+
"tags": [],
|
|
1932
|
+
"docs": "",
|
|
1933
|
+
"complexTypes": [],
|
|
1934
|
+
"type": "number"
|
|
1935
|
+
}
|
|
1936
|
+
]
|
|
1865
1937
|
}
|
|
1866
1938
|
],
|
|
1867
1939
|
"enums": [
|
|
@@ -151,16 +151,27 @@ export class RmxAudioPlayer {
|
|
|
151
151
|
throw new Error('Track removal spec is empty');
|
|
152
152
|
}
|
|
153
153
|
if (!removeItem.trackId && !removeItem.trackIndex) {
|
|
154
|
-
new Error('Track removal spec is invalid');
|
|
154
|
+
throw new Error('Track removal spec is invalid');
|
|
155
155
|
}
|
|
156
|
-
|
|
156
|
+
const opts = {};
|
|
157
|
+
if (removeItem.trackIndex !== undefined && removeItem.trackIndex !== null) {
|
|
158
|
+
opts.index = removeItem.trackIndex;
|
|
159
|
+
}
|
|
160
|
+
if (removeItem.trackId) {
|
|
161
|
+
opts.id = removeItem.trackId;
|
|
162
|
+
}
|
|
163
|
+
return Playlist.removeItem(opts);
|
|
157
164
|
};
|
|
158
165
|
/**
|
|
159
166
|
* Removes all given tracks from the playlist; these can be specified either by trackId or trackIndex. If the removed items
|
|
160
167
|
* include the currently playing item, the next available item will automatically begin playing.
|
|
161
168
|
*/
|
|
162
169
|
this.removeItems = (items) => {
|
|
163
|
-
|
|
170
|
+
const mapped = (items || []).map((item) => ({
|
|
171
|
+
id: item === null || item === void 0 ? void 0 : item.trackId,
|
|
172
|
+
index: item === null || item === void 0 ? void 0 : item.trackIndex
|
|
173
|
+
}));
|
|
174
|
+
return Playlist.removeItems({ items: mapped });
|
|
164
175
|
};
|
|
165
176
|
/**
|
|
166
177
|
* Clear the entire playlist. This will result in the STOPPED event being raised.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RmxAudioPlayer.js","sourceRoot":"","sources":["../../src/RmxAudioPlayer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"RmxAudioPlayer.js","sourceRoot":"","sources":["../../src/RmxAudioPlayer.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,iCAAiC,EACpC,MAAM,aAAa,CAAC;AAiBrB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxD;;GAEG;AAEH,MAAM,qBAAqB,GAAG;IAC1B,qBAAqB,CAAC,2BAA2B;IACjD,qBAAqB,CAAC,kBAAkB;IACxC,qBAAqB,CAAC,mBAAmB;IACzC,qBAAqB,CAAC,iBAAiB;IACvC,qBAAqB,CAAC,iBAAiB;IACvC,qBAAqB,CAAC,gBAAgB;IACtC,qBAAqB,CAAC,eAAe;IACrC,qBAAqB,CAAC,mBAAmB;IACzC,qBAAqB,CAAC,eAAe;CACxC,CAAC;AAEF,MAAM,OAAO,cAAc;IAevB;;;;OAIG;IACH,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC;IAC/E,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAGD;;OAEG;IACH;QA1EA,aAAQ,GAA6B,EAAE,CAAC;QACxC,YAAO,GAAuB,EAAC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAC,CAAC;QAGjE,kBAAa,GAAiD,GAAG,EAAE;QAC3E,CAAC,CAAC;QACM,iBAAY,GAA2B,GAAG,EAAE;QACpD,CAAC,CAAC;QAEM,kBAAa,GAAiF,SAAS,CAAC;QACxG,cAAS,GAAY,KAAK,CAAC;QAC3B,eAAU,GAAY,KAAK,CAAC;QAC5B,iBAAY,GAAsB,IAAI,CAAC;QAyE/C;;WAEG;QAEH;;WAEG;QACH,UAAK,GAAG,GAAG,EAAE;YACT,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC,CAAC;QAGF,eAAU,GAAG,KAAK,IAAI,EAAE;YACpB,QAAQ,CAAC,WAAW,CAChB,QAAQ,EACR,CAAC,IAAsD,EAAE,EAAE;gBACvD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/E,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,IAAI,CAAC,CAAC;gBACjE,CAAC;YACL,CAAC,CACJ,CAAC;YAEF,IAAI,CAAC;gBACD,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;YACzB,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,+CAA+C,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,eAAU,GAAG,CAAC,OAA2B,EAAE,EAAE;YACzC,IAAI,CAAC,OAAO,mCAAO,IAAI,CAAC,OAAO,GAAK,OAAO,CAAC,CAAC;YAC7C,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF;;WAEG;QAEH;;;;;;WAMG;QACH,qBAAgB,GAAG,CAAC,KAAmB,EAAE,OAA6B,EAAE,EAAE;YACtE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,EAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAC,CAAC,CAAC;QAC7F,CAAC,CAAC;QAEF;;WAEG;QACH,YAAO,GAAG,CAAC,SAAqB,EAAE,EAAE;YAChC,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,QAAQ,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,cAAc,EAAC,CAAC,CAAC;QACpD,CAAC,CAAC;QAEF;;WAEG;QACH,gBAAW,GAAG,CAAC,KAAmB,EAAE,EAAE;YAClC,OAAO,QAAQ,CAAC,WAAW,CAAC,EAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF;;WAEG;QACH,eAAU,GAAG,CAAC,UAA6B,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,IAAI,GAAsB,EAAE,CAAC;YACnC,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxE,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC;YACvC,CAAC;YACD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;YACjC,CAAC;YACD,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC;QAEF;;;WAGG;QACH,gBAAW,GAAG,CAAC,KAA0B,EAAE,EAAE;YACzC,MAAM,MAAM,GAAwB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7D,EAAE,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO;gBACjB,KAAK,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU;aAC1B,CAAC,CAAC,CAAC;YACJ,OAAO,QAAQ,CAAC,WAAW,CAAC,EAAC,KAAK,EAAE,MAAM,EAAC,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF;;WAEG;QACH,kBAAa,GAAG,GAAG,EAAE;YACjB,OAAO,QAAQ,CAAC,aAAa,EAAE,CAAC;QACpC,CAAC,CAAC;QAEF;;WAEG;QAEH;;WAEG;QACH,SAAI,GAAG,GAAG,EAAE;YACR,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF;;WAEG;QAEH,qBAAgB,GAAG,CAAC,KAAa,EAAE,QAAiB,EAAE,EAAE;YACpD,OAAO,QAAQ,CAAC,gBAAgB,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAC,CAAC,CAAC;QACvE,CAAC,CAAC;QAEF;;WAEG;QACH,kBAAa,GAAG,CAAC,EAAU,EAAE,QAAiB,EAAE,EAAE;YAC9C,OAAO,QAAQ,CAAC,aAAa,CAAC,EAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAC,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF;;WAEG;QACH,uBAAkB,GAAG,CAAC,KAAa,EAAE,QAAiB,EAAE,EAAE;YACtD,OAAO,QAAQ,CAAC,kBAAkB,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC;QAEF;;WAEG;QACH,oBAAe,GAAG,CAAC,EAAU,EAAE,QAAiB,EAAE,EAAE;YAChD,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAC,CAAC,CAAC;QACnE,CAAC,CAAC;QAEF;;WAEG;QACH,UAAK,GAAG,GAAG,EAAE;YACT,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC,CAAC;QAEF;;;WAGG;QACH,gBAAW,GAAG,GAAG,EAAE;YACf,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC,CAAC;QAEF;;WAEG;QACH,aAAQ,GAAG,GAAG,EAAE;YACZ,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC;QAEF;;;WAGG;QACH,WAAM,GAAG,CAAC,QAAgB,EAAE,EAAE;YAC1B,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC;QACvC,CAAC,CAAC;QAEF;;WAEG;QACH,oBAAe,GAAG,CAAC,IAAY,EAAE,EAAE;YAC/B,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAC,IAAI,EAAC,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF;;;;WAIG;QACH,cAAS,GAAG,CAAC,MAAc,EAAE,EAAE;YAC3B,OAAO,QAAQ,CAAC,iBAAiB,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;QAChD,CAAC,CAAC;QAEF;;WAEG;QACH,YAAO,GAAG,CAAC,IAAa,EAAE,EAAE;YACxB,OAAO,QAAQ,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;QAC1C,CAAC,CAAC;QAvNE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC1B,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC/B,CAAC,CAAC,CAAC;IACP,CAAC;IAiND;;OAEG;IAEH;;;;OAIG;IACO,QAAQ,CAAC,OAAe,EAAE,IAA2B,EAAE,KAAwF;;QACrJ,MAAM,MAAM,GAA0B,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAC,CAAC;QACtF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,4BAA4B,iCAAiC,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC;QACxH,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,KAAK,qBAAqB,CAAC,uBAAuB,EAAE,CAAC;YACnE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,MAAC,MAAM,CAAC,KAAkC,0CAAE,WAAW,CAAC;QAChF,CAAC;QAED,mEAAmE;QACnE,IAAI,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,uGAAuG;YACvG,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAE7D,IAAI,MAAM,CAAC,KAAK,IAAW,MAAM,CAAC,KAAM,CAAC,MAAM,EAAE,CAAC;oBAC9C,IAAI,CAAC,aAAa,GAAU,MAAM,CAAC,KAAM,CAAC,MAAM,CAAC;gBACrD,CAAC;gBAED,IAAI,MAAM,CAAC,OAAO,KAAK,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;oBAC7D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC3B,CAAC;gBAED,IAAI,MAAM,CAAC,OAAO,KAAK,qBAAqB,CAAC,eAAe,EAAE,CAAC;oBAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBAC1B,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IAUD,EAAE,CAAC,SAAiB,EAAE,QAAiC;QACnD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,SAAiB,EAAE,MAA+B;QAClD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;OAIG;IACO,IAAI,CAAC,GAAG,IAAW;QACzB,MAAM,SAAS,GAAW,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACjC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;YACtB,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -27,6 +27,25 @@ export interface PlaylistPlugin {
|
|
|
27
27
|
setPlaybackVolume(options: SetPlaybackVolumeOptions): Promise<void>;
|
|
28
28
|
setLoop(options: SetLoopOptions): Promise<void>;
|
|
29
29
|
setPlaybackRate(options: SetPlaybackRateOptions): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Epic 45 — release native audio session / focus so the video player can own playback.
|
|
32
|
+
* Call immediately before CapacitorVideoPlayer.initPlayer (Critical Rule 2).
|
|
33
|
+
*/
|
|
34
|
+
prepareForVideoHandoff(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Epic 45 — optional resume hook after video exits (full behaviour in Stories 45.3/45.4).
|
|
37
|
+
*/
|
|
38
|
+
resumeAfterVideoHandoff(options: ResumeAfterVideoHandoffOptions): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Epic 45 — last audio head captured during prepare (seconds).
|
|
41
|
+
*/
|
|
42
|
+
getLastKnownPosition(): Promise<GetLastKnownPositionResult>;
|
|
43
|
+
}
|
|
44
|
+
export interface ResumeAfterVideoHandoffOptions {
|
|
45
|
+
position: number;
|
|
46
|
+
}
|
|
47
|
+
export interface GetLastKnownPositionResult {
|
|
48
|
+
position: number;
|
|
30
49
|
}
|
|
31
50
|
export interface PlaylistOptions {
|
|
32
51
|
items: Array<AudioTrack>;
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -34,6 +34,14 @@ export declare class PlaylistWeb extends WebPlugin implements PlaylistPlugin {
|
|
|
34
34
|
skipForward(): Promise<void>;
|
|
35
35
|
skipBack(): Promise<void>;
|
|
36
36
|
setPlaybackRate(options: SetPlaybackRateOptions): Promise<void>;
|
|
37
|
+
protected lastKnownHandoffPosition: number;
|
|
38
|
+
prepareForVideoHandoff(): Promise<void>;
|
|
39
|
+
resumeAfterVideoHandoff(options: {
|
|
40
|
+
position: number;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
getLastKnownPosition(): Promise<{
|
|
43
|
+
position: number;
|
|
44
|
+
}>;
|
|
37
45
|
setMediaSessionRemoteControlMetadata(): Promise<void>;
|
|
38
46
|
mediaSessionControlsHandler(actionDetails: MediaSessionActionDetails): Promise<void>;
|
|
39
47
|
registerHtmlListeners(position?: number): void;
|