capacitor-plugin-playlist 0.8.6 → 0.9.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 CHANGED
@@ -89,6 +89,34 @@ architect => build => options:
89
89
  </application>
90
90
  ```
91
91
 
92
+ ##### Gradle Configuration (Gradle 9+)
93
+
94
+ **Important**: If you're using Gradle 9 or later, you need to ensure the Kotlin plugin is declared in your root `android/build.gradle` file. This plugin no longer includes its own `buildscript` block to avoid conflicts with Gradle 9's plugin loading requirements.
95
+
96
+ Add the Kotlin plugin to your root `android/build.gradle`:
97
+
98
+ ```gradle
99
+ buildscript {
100
+ ext.kotlin_version = '2.3.0' // Or your preferred Kotlin version
101
+
102
+ repositories {
103
+ google()
104
+ mavenCentral()
105
+ }
106
+ dependencies {
107
+ classpath 'com.android.tools.build:gradle:8.13.2'
108
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
109
+ // ... other dependencies
110
+ }
111
+ }
112
+
113
+ ext {
114
+ kotlin_version = '2.3.0' // Make it available to subprojects
115
+ }
116
+ ```
117
+
118
+ The plugin's `build.gradle` will automatically use the Kotlin plugin from the root project. If you see a warning about the Kotlin plugin being loaded multiple times, ensure you've removed any `buildscript` blocks that declare the Kotlin plugin from other subprojects (except the root project).
119
+
92
120
  ##### Glide image loading for notifiction center
93
121
 
94
122
  To be able to use glide you need to create a file MyAppGlideModule.java:
@@ -6,18 +6,6 @@ ext {
6
6
  androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.7.0'
7
7
  }
8
8
 
9
- buildscript {
10
- ext.kotlin_version = project.hasProperty("kotlin_version") ? rootProject.ext.kotlin_version : '2.2.20'
11
- repositories {
12
- google()
13
- mavenCentral()
14
- }
15
- dependencies {
16
- classpath 'com.android.tools.build:gradle:8.13.0'
17
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
18
- }
19
- }
20
-
21
9
  apply plugin: 'com.android.library'
22
10
  apply plugin: 'kotlin-android'
23
11
 
@@ -64,18 +52,18 @@ dependencies {
64
52
  testImplementation "junit:junit:$junitVersion"
65
53
  androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
66
54
  androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
67
- implementation "androidx.core:core-ktx:1.6.0"
68
- implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
55
+ implementation "androidx.core:core-ktx:1.17.0"
56
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:${rootProject.ext.kotlin_version}"
69
57
 
70
58
  // Image Exomedia
71
- implementation 'com.devbrackets.android:exomedia:5.1.0'
59
+ implementation 'com.devbrackets.android:exomedia:5.2.0'
72
60
 
73
61
  // Image Loading
74
- implementation 'com.github.bumptech.glide:glide:4.16.0'
75
- annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
62
+ implementation 'com.github.bumptech.glide:glide:5.0.5'
63
+ annotationProcessor 'com.github.bumptech.glide:compiler:5.0.5'
76
64
 
77
65
  // Playlist support
78
66
  implementation 'com.devbrackets.android:playlistcore:2.2.0'
79
- implementation 'androidx.work:work-runtime-ktx:2.7.1'
67
+ implementation 'androidx.work:work-runtime-ktx:2.11.0'
80
68
 
81
69
  }
@@ -37,7 +37,9 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
37
37
  fun setOptions(call: PluginCall) {
38
38
  Handler(Looper.getMainLooper()).post {
39
39
  val options: JSObject = call.getObject("options") ?: JSObject()
40
- resetStreamOnPause = options.optBoolean("resetStreamOnPause", this.resetStreamOnPause)
40
+ // resetStreamOnPause is a top-level option; "options" is reserved for notification options.
41
+ resetStreamOnPause =
42
+ call.getBoolean("resetStreamOnPause", this.resetStreamOnPause) ?: this.resetStreamOnPause
41
43
  Log.i("AudioPlayerOptions", options.toString())
42
44
  audioPlayerImpl!!.resetStreamOnPause = resetStreamOnPause
43
45
  audioPlayerImpl!!.setOptions(options)
@@ -150,7 +152,6 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
150
152
  fun removeItems(call: PluginCall) {
151
153
  Handler(Looper.getMainLooper()).post {
152
154
  val items: JSONArray = call.getArray("items")
153
- var removed = 0
154
155
 
155
156
  val removals = ArrayList<TrackRemovalItem>()
156
157
  for (index in 0 until items.length()) {
@@ -158,21 +159,19 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
158
159
  val trackIndex = entry.optInt("trackIndex", -1)
159
160
  val trackId = entry.optString("trackId", "")
160
161
  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
- }
162
+ }
163
+
164
+ val removedTracks = audioPlayerImpl!!.playlistManager.removeAllItems(removals)
165
+ for (removedItem in removedTracks) {
166
+ onStatus(
167
+ RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED,
168
+ removedItem.trackId,
169
+ removedItem.toDict()
170
+ )
172
171
  }
173
172
 
174
173
  val result = JSObject()
175
- result.put("removed", removed)
174
+ result.put("removed", removedTracks.size)
176
175
  call.resolve(result)
177
176
 
178
177
  Log.i(TAG, "removeItems")
@@ -213,16 +212,20 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
213
212
  @PluginMethod
214
213
  fun play(call: PluginCall) {
215
214
  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.
215
+ val handler = audioPlayerImpl!!.playlistManager.playlistHandler
216
+ if (handler == null || handler.currentMediaPlayer == null) {
217
+ // MediaPlayer was released or MediaService was killed (e.g. after a long video session
218
+ // where audio focus was permanently abandoned). Fall back to beginPlayback which
219
+ // re-starts the service, re-prepares the MediaPlayer, and re-acquires audio focus.
220
+ val posMs = (audioPlayerImpl!!.getLastKnownPositionSec() * 1000f).toLong()
221
+ audioPlayerImpl!!.playlistManager.beginPlayback(posMs, false)
222
+ Log.i(TAG, "play: handler/mediaPlayer was null — re-armed via beginPlayback at ${posMs}ms")
223
+ } else {
224
+ // Handler and MediaPlayer are alive — use the lightweight resume path.
225
+ // Guard against stacking up repeat cycles (playlistcore bug): skip if already playing.
226
+ val isPlaying = handler.currentMediaPlayer?.isPlaying ?: false
223
227
  if (!isPlaying) {
224
- audioPlayerImpl!!.playlistManager.playlistHandler?.play()
225
- //audioPlayerImpl.getPlaylistManager().playlistHandler.seek(position)
228
+ handler.play()
226
229
  }
227
230
  }
228
231
 
@@ -237,7 +240,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
237
240
  Handler(Looper.getMainLooper()).post {
238
241
  val index: Int =
239
242
  call.getInt("index", audioPlayerImpl!!.playlistManager.currentPosition)!!
240
- val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
243
+ val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
241
244
 
242
245
  audioPlayerImpl!!.playlistManager.currentPosition = index
243
246
  audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
@@ -255,7 +258,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
255
258
  if ("" != id) {
256
259
  // alternatively we could search for the item and set the current index to that item.
257
260
  val code = id.hashCode()
258
- val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
261
+ val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
259
262
  audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
260
263
  audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
261
264
  }
@@ -274,7 +277,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
274
277
 
275
278
  audioPlayerImpl!!.playlistManager.currentPosition = index
276
279
 
277
- val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
280
+ val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
278
281
 
279
282
  audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
280
283
 
@@ -294,7 +297,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
294
297
  val code = id.hashCode()
295
298
  audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
296
299
 
297
- val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
300
+ val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
298
301
 
299
302
  audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
300
303
  }
@@ -307,7 +310,9 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
307
310
  @PluginMethod
308
311
  fun pause(call: PluginCall) {
309
312
  Handler(Looper.getMainLooper()).post {
310
- audioPlayerImpl!!.playlistManager.invokePausePlay()
313
+ if (audioPlayerImpl!!.playlistManager.isPlaying) {
314
+ audioPlayerImpl!!.playlistManager.playlistHandler?.pause(false)
315
+ }
311
316
 
312
317
  call.resolve()
313
318
 
@@ -347,7 +352,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
347
352
  }
348
353
 
349
354
  val seekPosition =
350
- (call.getInt("position", (position / 1000.0f).toInt())!! * 1000.0).toLong()
355
+ (call.getFloat("position", position / 1000.0f)!! * 1000.0f).toLong()
351
356
 
352
357
  val isPlaying: Boolean? =
353
358
  audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying
@@ -387,6 +392,36 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
387
392
  }
388
393
  }
389
394
 
395
+ @PluginMethod
396
+ fun prepareForVideoHandoff(call: PluginCall) {
397
+ Handler(Looper.getMainLooper()).post {
398
+ audioPlayerImpl!!.prepareForVideoHandoff()
399
+ call.resolve()
400
+ Log.i(TAG, "prepareForVideoHandoff")
401
+ }
402
+ }
403
+
404
+ @PluginMethod
405
+ fun resumeAfterVideoHandoff(call: PluginCall) {
406
+ Handler(Looper.getMainLooper()).post {
407
+ val position = call.getFloat("position", 0f)!!
408
+ audioPlayerImpl!!.resumeAfterVideoHandoff(position)
409
+ call.resolve()
410
+ Log.i(TAG, "resumeAfterVideoHandoff")
411
+ }
412
+ }
413
+
414
+ @PluginMethod
415
+ fun getLastKnownPosition(call: PluginCall) {
416
+ Handler(Looper.getMainLooper()).post {
417
+ val position = audioPlayerImpl!!.getLastKnownPositionSec()
418
+ val o = JSObject()
419
+ o.put("position", position.toDouble())
420
+ call.resolve(o)
421
+ Log.i(TAG, "getLastKnownPosition")
422
+ }
423
+ }
424
+
390
425
  override fun handleOnDestroy() {
391
426
  Log.d(TAG, "Plugin destroy")
392
427
  super.handleOnDestroy()
@@ -395,21 +430,26 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
395
430
 
396
431
  override fun onError(errorCode: RmxAudioErrorType?, trackId: String?, message: String?) {
397
432
  if (statusCallback == null) {
398
- return
433
+ statusCallback = OnStatusCallback(this)
399
434
  }
400
435
  val errorObj = OnStatusCallback.createErrorWithCode(errorCode, message)
401
436
  onStatus(RmxAudioStatusMessage.RMXSTATUS_ERROR, trackId, errorObj)
402
437
  }
403
438
 
404
439
  override fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
440
+ // Defensive: recreate the callback if it was ever cleared (e.g. by an unexpected
441
+ // destroyResources call) so that audio events are never permanently silenced.
405
442
  if (statusCallback == null) {
406
- return
443
+ statusCallback = OnStatusCallback(this)
407
444
  }
408
445
  statusCallback!!.onStatus(what, trackId, param)
409
446
  }
410
447
 
411
448
  private fun destroyResources() {
412
- statusCallback = null
449
+ // Do NOT null statusCallback here — it is bound to the Plugin instance and must remain
450
+ // alive for the entire app lifetime. Nulling it silences all subsequent audio events
451
+ // (PLAYING, PAUSE, PLAYBACK_POSITION, etc.) because onStatus() would early-return.
452
+ // Only clear the playback items so native memory is released.
413
453
  audioPlayerImpl!!.playlistManager.clearItems()
414
454
  }
415
455
 
@@ -450,4 +450,36 @@ 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
+ }
453
485
  }
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":"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,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,QAAQ,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,UAAU,CAAC,OAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAW,EAAC,CAAC,CAAC;QACzF,CAAC,CAAC;QAEF;;;WAGG;QACH,gBAAW,GAAG,CAAC,KAA0B,EAAE,EAAE;YACzC,OAAO,QAAQ,CAAC,WAAW,CAAC,EAAC,KAAK,EAAE,KAA4B,EAAC,CAAC,CAAC;QACvE,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;QA5ME,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;IAsMD;;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"}
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;
package/dist/esm/web.js CHANGED
@@ -9,6 +9,7 @@ export class PlaylistWeb extends WebPlugin {
9
9
  this.options = {};
10
10
  this.currentTrack = null;
11
11
  this.lastState = 'stopped';
12
+ this.lastKnownHandoffPosition = 0;
12
13
  this.hlsLoaded = false;
13
14
  }
14
15
  addAllItems(options) {
@@ -86,16 +87,18 @@ export class PlaylistWeb extends WebPlugin {
86
87
  return Promise.resolve();
87
88
  }
88
89
  removeItem(options) {
89
- this.playlistItems.forEach((item, index) => {
90
- if (options.index && options.index === index) {
91
- const removedTrack = this.playlistItems.splice(index, 1);
92
- this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, removedTrack[0], removedTrack[0].trackId);
93
- }
94
- else if (options.id && options.id === item.trackId) {
95
- const removedTrack = this.playlistItems.splice(index, 1);
96
- this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, removedTrack[0], removedTrack[0].trackId);
97
- }
98
- });
90
+ // options.index can be 0; don't use a truthy check.
91
+ let removeIndex = -1;
92
+ if (options.index !== undefined && options.index !== null) {
93
+ removeIndex = options.index;
94
+ }
95
+ else if (options.id) {
96
+ removeIndex = this.playlistItems.findIndex((t) => t.trackId === options.id);
97
+ }
98
+ if (removeIndex >= 0 && removeIndex < this.playlistItems.length) {
99
+ const removedTrack = this.playlistItems.splice(removeIndex, 1)[0];
100
+ this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, removedTrack, removedTrack === null || removedTrack === void 0 ? void 0 : removedTrack.trackId);
101
+ }
99
102
  return Promise.resolve();
100
103
  }
101
104
  removeItems(options) {
@@ -162,7 +165,7 @@ export class PlaylistWeb extends WebPlugin {
162
165
  async skipForward() {
163
166
  let found = null;
164
167
  this.playlistItems.forEach((item, index) => {
165
- if (!found && this.getCurrentTrackId() === item.trackId) {
168
+ if (found === null && this.getCurrentTrackId() === item.trackId) {
166
169
  found = index;
167
170
  }
168
171
  });
@@ -170,30 +173,29 @@ export class PlaylistWeb extends WebPlugin {
170
173
  found = -1;
171
174
  }
172
175
  if (found !== null) {
173
- this.updateStatus(RmxAudioStatusMessage.RMX_STATUS_SKIP_BACK, {
174
- currentIndex: found + 1,
175
- currentItem: this.playlistItems[found + 1]
176
- }, this.playlistItems[found + 1].trackId);
177
- return this.setCurrent(this.playlistItems[found + 1]);
176
+ const targetIndex = found + 1;
177
+ this.updateStatus(RmxAudioStatusMessage.RMX_STATUS_SKIP_FORWARD, {
178
+ currentIndex: targetIndex,
179
+ currentItem: this.playlistItems[targetIndex]
180
+ }, this.playlistItems[targetIndex].trackId);
181
+ return this.setCurrent(this.playlistItems[targetIndex]);
178
182
  }
179
183
  return Promise.reject();
180
184
  }
181
185
  async skipBack() {
182
186
  let found = null;
183
187
  this.playlistItems.forEach((item, index) => {
184
- if (!found && this.getCurrentTrackId() === item.trackId) {
188
+ if (found === null && this.getCurrentTrackId() === item.trackId) {
185
189
  found = index;
186
190
  }
187
191
  });
188
- if (found === 0) {
189
- found = this.playlistItems.length - 1;
190
- }
191
192
  if (found !== null) {
193
+ const targetIndex = found === 0 ? this.playlistItems.length - 1 : found - 1;
192
194
  this.updateStatus(RmxAudioStatusMessage.RMX_STATUS_SKIP_BACK, {
193
- currentIndex: found - 1,
194
- currentItem: this.playlistItems[found - 1]
195
- }, this.playlistItems[found - 1].trackId);
196
- return this.setCurrent(this.playlistItems[found - 1]);
195
+ currentIndex: targetIndex,
196
+ currentItem: this.playlistItems[targetIndex]
197
+ }, this.playlistItems[targetIndex].trackId);
198
+ return this.setCurrent(this.playlistItems[targetIndex]);
197
199
  }
198
200
  return Promise.reject();
199
201
  }
@@ -204,6 +206,19 @@ export class PlaylistWeb extends WebPlugin {
204
206
  }
205
207
  return Promise.reject();
206
208
  }
209
+ async prepareForVideoHandoff() {
210
+ var _a, _b;
211
+ this.lastKnownHandoffPosition = (_b = (_a = this.audio) === null || _a === void 0 ? void 0 : _a.currentTime) !== null && _b !== void 0 ? _b : 0;
212
+ await this.pause();
213
+ return Promise.resolve();
214
+ }
215
+ async resumeAfterVideoHandoff(options) {
216
+ this.lastKnownHandoffPosition = options.position;
217
+ return Promise.resolve();
218
+ }
219
+ async getLastKnownPosition() {
220
+ return Promise.resolve({ position: this.lastKnownHandoffPosition });
221
+ }
207
222
  async setMediaSessionRemoteControlMetadata() {
208
223
  const audioTrack = this.currentTrack;
209
224
  if (!navigator.mediaSession) {