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.
Files changed (30) hide show
  1. package/android/src/main/java/org/dwbn/plugins/playlist/OnStatusCallback.kt +3 -13
  2. package/android/src/main/java/org/dwbn/plugins/playlist/PlaylistPlugin.kt +120 -32
  3. package/android/src/main/java/org/dwbn/plugins/playlist/RmxAudioPlayer.java +41 -0
  4. package/android/src/test/java/org/dwbn/plugins/playlist/StatusBridgePolicyTest.kt +56 -0
  5. package/dist/docs.json +72 -0
  6. package/dist/esm/RmxAudioPlayer.js +14 -3
  7. package/dist/esm/RmxAudioPlayer.js.map +1 -1
  8. package/dist/esm/definitions.d.ts +19 -0
  9. package/dist/esm/web.d.ts +8 -0
  10. package/dist/esm/web.js +39 -24
  11. package/dist/esm/web.js.map +1 -1
  12. package/dist/plugin.cjs.js +55 -27
  13. package/dist/plugin.cjs.js.map +1 -1
  14. package/dist/plugin.js +55 -27
  15. package/dist/plugin.js.map +1 -1
  16. package/ios/Plugin/AudioTrack.swift +6 -1
  17. package/ios/Plugin/Plugin.m +0 -1
  18. package/ios/Plugin/Plugin.swift +42 -17
  19. package/ios/Plugin/RmxAudioPlayer.swift +101 -8
  20. package/ios/PluginTests/PluginTests.swift +12 -24
  21. package/package.json +1 -1
  22. package/android/.gradle/8.11.1/checksums/checksums.lock +0 -0
  23. package/android/.gradle/8.11.1/checksums/md5-checksums.bin +0 -0
  24. package/android/.gradle/8.11.1/checksums/sha1-checksums.bin +0 -0
  25. package/android/.gradle/8.11.1/executionHistory/executionHistory.bin +0 -0
  26. package/android/.gradle/8.11.1/executionHistory/executionHistory.lock +0 -0
  27. package/android/.gradle/8.11.1/fileChanges/last-build.bin +0 -0
  28. package/android/.gradle/8.11.1/fileHashes/fileHashes.bin +0 -0
  29. package/android/.gradle/8.11.1/fileHashes/fileHashes.lock +0 -0
  30. 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
- val data = JSObject()
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 = options.optBoolean("resetStreamOnPause", this.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
- val removedTracks = audioPlayerImpl!!.playlistManager.removeAllItems(removals)
162
- if (removedTracks.size > 0) {
163
- for (removedItem in removedTracks) {
164
- onStatus(
165
- RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED,
166
- removedItem.trackId,
167
- removedItem.toDict()
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", 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
- if (audioPlayerImpl!!.playlistManager.playlistHandler != null) {
217
- val isPlaying =
218
- (audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer != null
219
- && audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying!!)
220
- // There's a bug in the threaded repeater that it stacks up the repeat calls instead of ignoring
221
- // additional ones or starting a new one. E.g. every time this is called, you'd get a new repeat cycle,
222
- // meaning you get N updates per second. Ew.
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
- audioPlayerImpl!!.playlistManager.playlistHandler?.play()
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.getInt("position", 0)!! * 1000.0).toLong()
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.getInt("position", 0)!! * 1000.0).toLong()
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.getInt("position", 0)!! * 1000.0).toLong()
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.getInt("position", 0)!! * 1000.0).toLong()
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.invokePausePlay()
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.getInt("position", (position / 1000.0f).toInt())!! * 1000.0).toLong()
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
- return
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
- return
457
+ statusCallback = OnStatusCallback(this)
407
458
  }
408
459
  statusCallback!!.onStatus(what, trackId, param)
409
460
  }
410
461
 
411
462
  private fun destroyResources() {
412
- statusCallback = null
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
- return Playlist.removeItem({ id: removeItem.trackId, index: removeItem.trackIndex });
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
- return Playlist.removeItems({ items: items });
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":"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"}
@@ -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;