react-native-media-notification 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/android/src/main/java/com/mediacontrols/CustomCommandButton.kt +26 -4
- package/android/src/main/java/com/mediacontrols/MediaControlsPlayer.kt +6 -2
- package/android/src/main/java/com/mediacontrols/MediaControlsService.kt +8 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/NativeMediaControls.d.ts +2 -2
- package/lib/typescript/src/NativeMediaControls.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +5 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/NativeMediaControls.ts +2 -2
- package/src/index.tsx +14 -3
package/README.md
CHANGED
|
@@ -80,7 +80,9 @@ If you want to customize the small media notification icon on Android, you can a
|
|
|
80
80
|
</resources>
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
You can also customize all action icons by overwriting the default icon drawables (e.g. `media3_icon_play`, `media3_icon_pause`, ...)
|
|
84
|
+
|
|
85
|
+
## Usage
|
|
84
86
|
|
|
85
87
|
### Basic Setup
|
|
86
88
|
|
|
@@ -153,6 +155,10 @@ MediaControls.addEventListener('unduck', () => {}); // restore volume after inte
|
|
|
153
155
|
await MediaControls.stopMediaNotification();
|
|
154
156
|
```
|
|
155
157
|
|
|
158
|
+
## Planned
|
|
159
|
+
- Full Android Auto Support (Headless Tasks, Voice Commands, Media Library)
|
|
160
|
+
- Add more actions/metadata information and better customization
|
|
161
|
+
|
|
156
162
|
## API Reference
|
|
157
163
|
|
|
158
164
|
### Functions
|
|
@@ -1,37 +1,59 @@
|
|
|
1
1
|
package com.mediacontrols
|
|
2
2
|
|
|
3
3
|
import android.os.Bundle
|
|
4
|
+
import androidx.media3.common.util.UnstableApi
|
|
4
5
|
import androidx.media3.session.CommandButton
|
|
5
|
-
import androidx.media3.session.CommandButton.
|
|
6
|
-
import androidx.media3.session.CommandButton.
|
|
6
|
+
import androidx.media3.session.CommandButton.ICON_NEXT
|
|
7
|
+
import androidx.media3.session.CommandButton.ICON_PREVIOUS
|
|
7
8
|
import androidx.media3.session.CommandButton.ICON_SHUFFLE_OFF
|
|
8
9
|
import androidx.media3.session.CommandButton.ICON_SHUFFLE_ON
|
|
10
|
+
import androidx.media3.session.CommandButton.ICON_SKIP_BACK_15
|
|
11
|
+
import androidx.media3.session.CommandButton.ICON_SKIP_FORWARD_15
|
|
9
12
|
import androidx.media3.session.SessionCommand
|
|
10
13
|
|
|
11
14
|
private const val CUSTOM_COMMAND_REWIND_ACTION_ID = "REWIND_15"
|
|
12
15
|
private const val CUSTOM_COMMAND_FORWARD_ACTION_ID = "FAST_FWD_15"
|
|
16
|
+
private const val CUSTOM_COMMAND_NEXT_ACTION_ID = "SKIP_TO_NEXT"
|
|
17
|
+
private const val CUSTOM_COMMAND_PREVIOUS_ACTION_ID = "SKIP_TO_PREVIOUS"
|
|
13
18
|
private const val CUSTOM_COMMAND_SHUFFLE_ON_ACTION_ID = "SHUFFLE_ON"
|
|
14
19
|
private const val CUSTOM_COMMAND_SHUFFLE_OFF_ACTION_ID = "SHUFFLE_OFF"
|
|
15
20
|
private const val CUSTOM_COMMAND_REPEAT_ONE_ACTION_ID = "REPEAT_ONE"
|
|
16
21
|
private const val CUSTOM_COMMAND_REPEAT_ALL_ACTION_ID = "REPEAT_ALL"
|
|
17
22
|
private const val CUSTOM_COMMAND_REPEAT_OFF_ACTION_ID = "REPEAT_OFF"
|
|
18
23
|
|
|
24
|
+
@UnstableApi
|
|
19
25
|
enum class CustomCommandButton(
|
|
20
26
|
val customAction: String,
|
|
21
27
|
val commandButton: CommandButton,
|
|
22
28
|
) {
|
|
29
|
+
PREVIOUS(
|
|
30
|
+
customAction = CUSTOM_COMMAND_PREVIOUS_ACTION_ID,
|
|
31
|
+
commandButton = CommandButton.Builder(ICON_PREVIOUS)
|
|
32
|
+
.setDisplayName("Previous")
|
|
33
|
+
.setSessionCommand(SessionCommand(CUSTOM_COMMAND_PREVIOUS_ACTION_ID, Bundle()))
|
|
34
|
+
.build(),
|
|
35
|
+
),
|
|
23
36
|
REWIND(
|
|
24
37
|
customAction = CUSTOM_COMMAND_REWIND_ACTION_ID,
|
|
25
|
-
commandButton = CommandButton.Builder(
|
|
38
|
+
commandButton = CommandButton.Builder(ICON_SKIP_BACK_15)
|
|
26
39
|
.setDisplayName("Rewind")
|
|
27
40
|
.setSessionCommand(SessionCommand(CUSTOM_COMMAND_REWIND_ACTION_ID, Bundle()))
|
|
41
|
+
.setSlots(CommandButton.SLOT_BACK, CommandButton.SLOT_OVERFLOW)
|
|
28
42
|
.build(),
|
|
29
43
|
),
|
|
30
44
|
FORWARD(
|
|
31
45
|
customAction = CUSTOM_COMMAND_FORWARD_ACTION_ID,
|
|
32
|
-
commandButton = CommandButton.Builder(
|
|
46
|
+
commandButton = CommandButton.Builder(ICON_SKIP_FORWARD_15)
|
|
33
47
|
.setDisplayName("Forward")
|
|
34
48
|
.setSessionCommand(SessionCommand(CUSTOM_COMMAND_FORWARD_ACTION_ID, Bundle()))
|
|
49
|
+
.setSlots(CommandButton.SLOT_FORWARD, CommandButton.SLOT_OVERFLOW)
|
|
50
|
+
.build(),
|
|
51
|
+
),
|
|
52
|
+
NEXT(
|
|
53
|
+
customAction = CUSTOM_COMMAND_NEXT_ACTION_ID,
|
|
54
|
+
commandButton = CommandButton.Builder(ICON_NEXT)
|
|
55
|
+
.setDisplayName("Next")
|
|
56
|
+
.setSessionCommand(SessionCommand(CUSTOM_COMMAND_NEXT_ACTION_ID, Bundle()))
|
|
35
57
|
.build(),
|
|
36
58
|
),
|
|
37
59
|
SHUFFLE_ON(
|
|
@@ -238,6 +238,12 @@ class MediaControlsPlayer(
|
|
|
238
238
|
|
|
239
239
|
fun getAvailableCustomCommands(): Set<CommandButton> {
|
|
240
240
|
return mutableSetOf<CommandButton>().apply {
|
|
241
|
+
if (isControlEnabled(Controls.PREVIOUS)) add(CustomCommandButton.PREVIOUS.commandButton)
|
|
242
|
+
if (isControlEnabled(Controls.NEXT)) add(CustomCommandButton.NEXT.commandButton)
|
|
243
|
+
|
|
244
|
+
if (isControlEnabled(Controls.SEEK_BACKWARD)) add(CustomCommandButton.REWIND.commandButton)
|
|
245
|
+
if (isControlEnabled(Controls.SEEK_FORWARD)) add(CustomCommandButton.FORWARD.commandButton)
|
|
246
|
+
|
|
241
247
|
if(isControlEnabled(Controls.SHUFFLE)) {
|
|
242
248
|
if (state.shuffleModeEnabled) {
|
|
243
249
|
add(CustomCommandButton.SHUFFLE_ON.commandButton)
|
|
@@ -252,8 +258,6 @@ class MediaControlsPlayer(
|
|
|
252
258
|
REPEAT_MODE_ALL -> add(CustomCommandButton.REPEAT_ALL.commandButton)
|
|
253
259
|
}
|
|
254
260
|
}
|
|
255
|
-
if (isControlEnabled(Controls.SEEK_BACKWARD)) add(CustomCommandButton.REWIND.commandButton)
|
|
256
|
-
if (isControlEnabled(Controls.SEEK_FORWARD)) add(CustomCommandButton.FORWARD.commandButton)
|
|
257
261
|
}
|
|
258
262
|
}
|
|
259
263
|
|
|
@@ -189,6 +189,10 @@ class MediaControlsService : MediaSessionService() {
|
|
|
189
189
|
}
|
|
190
190
|
Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
|
191
191
|
}
|
|
192
|
+
CustomCommandButton.PREVIOUS.customAction -> {
|
|
193
|
+
player?.seekToPreviousMediaItem()
|
|
194
|
+
Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
|
195
|
+
}
|
|
192
196
|
CustomCommandButton.FORWARD.customAction -> {
|
|
193
197
|
player?.seekForward()
|
|
194
198
|
Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
|
@@ -197,6 +201,10 @@ class MediaControlsService : MediaSessionService() {
|
|
|
197
201
|
player?.seekBack()
|
|
198
202
|
Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
|
199
203
|
}
|
|
204
|
+
CustomCommandButton.NEXT.customAction -> {
|
|
205
|
+
player?.seekToNextMediaItem()
|
|
206
|
+
Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
|
207
|
+
}
|
|
200
208
|
CustomCommandButton.SHUFFLE_ON.customAction, CustomCommandButton.SHUFFLE_OFF.customAction -> {
|
|
201
209
|
player?.emitShuffleClicked()
|
|
202
210
|
Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
package/lib/module/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import MediaControls, { ALL_MEDIA_EVENTS } from "./NativeMediaControls.js";
|
|
4
4
|
import { EventEmitter } from 'fbemitter';
|
|
5
|
+
import { Image } from 'react-native';
|
|
5
6
|
const eventEmitter = new EventEmitter();
|
|
6
7
|
let unsubscribe = null;
|
|
7
8
|
const setUpNativeEventListener = () => {
|
|
@@ -21,6 +22,9 @@ const setUpNativeEventListener = () => {
|
|
|
21
22
|
* Updates the metadata for the current media track.
|
|
22
23
|
*/
|
|
23
24
|
export async function updateMetadata(metadata) {
|
|
25
|
+
if (metadata.artwork && typeof metadata.artwork !== 'string') {
|
|
26
|
+
metadata.artwork = Image.resolveAssetSource(metadata.artwork).uri;
|
|
27
|
+
}
|
|
24
28
|
return MediaControls.updateMetadata(metadata);
|
|
25
29
|
}
|
|
26
30
|
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MediaControls","ALL_MEDIA_EVENTS","EventEmitter","eventEmitter","unsubscribe","setUpNativeEventListener","onEvent","event","command","seekPosition","emit","position","updateMetadata","metadata","stopMediaNotification","enableAudioInterruption","enabled","enableBackgroundMode","setControlEnabled","name","includes","Error","shutdown","addEventListener","handler","addListener","removeAllListeners","forEach","e"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,aAAa,IAClBC,gBAAgB,QAGX,0BAAuB;AAE9B,SAASC,YAAY,QAA2B,WAAW;
|
|
1
|
+
{"version":3,"names":["MediaControls","ALL_MEDIA_EVENTS","EventEmitter","Image","eventEmitter","unsubscribe","setUpNativeEventListener","onEvent","event","command","seekPosition","emit","position","updateMetadata","metadata","artwork","resolveAssetSource","uri","stopMediaNotification","enableAudioInterruption","enabled","enableBackgroundMode","setControlEnabled","name","includes","Error","shutdown","addEventListener","handler","addListener","removeAllListeners","forEach","e"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,aAAa,IAClBC,gBAAgB,QAGX,0BAAuB;AAE9B,SAASC,YAAY,QAA2B,WAAW;AAC3D,SAEEC,KAAK,QACA,cAAc;AAWrB,MAAMC,YAAY,GAAG,IAAIF,YAAY,CAAC,CAAC;AACvC,IAAIG,WAA2C,GAAG,IAAI;AAEtD,MAAMC,wBAAwB,GAAGA,CAAA,KAAM;EACrC,IAAID,WAAW,EAAE;EAEjBA,WAAW,GAAGL,aAAa,CAACO,OAAO,CAAEC,KAAK,IAAK;IAC7C,MAAM;MAAEC,OAAO;MAAEC;IAAa,CAAC,GAAGF,KAAK;IACvCJ,YAAY,CAACO,IAAI,CAACF,OAAO,EAAE;MAAEG,QAAQ,EAAEF;IAAa,CAAC,CAAC;EACxD,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA,OAAO,eAAeG,cAAcA,CAClCC,QAA4B,EACb;EACf,IAAIA,QAAQ,CAACC,OAAO,IAAI,OAAOD,QAAQ,CAACC,OAAO,KAAK,QAAQ,EAAE;IAC5DD,QAAQ,CAACC,OAAO,GAAGZ,KAAK,CAACa,kBAAkB,CAACF,QAAQ,CAACC,OAAO,CAAC,CAACE,GAAG;EACnE;EACA,OAAOjB,aAAa,CAACa,cAAc,CAACC,QAAoC,CAAC;AAC3E;;AAEA;AACA;AACA;AACA,OAAO,eAAeI,qBAAqBA,CAAA,EAAkB;EAC3D,OAAOlB,aAAa,CAACkB,qBAAqB,CAAC,CAAC;AAC9C;;AAEA;AACA;AACA;AACA,OAAO,eAAeC,uBAAuBA,CAACC,OAAgB,EAAiB;EAC7E,OAAOpB,aAAa,CAACmB,uBAAuB,CAACC,OAAO,CAAC;AACvD;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAACD,OAAgB,EAAQ;EAC3DpB,aAAa,CAACqB,oBAAoB,CAACD,OAAO,CAAC;AAC7C;AAEA,OAAO,SAASE,iBAAiBA,CAACC,IAAkB,EAAEH,OAAgB,EAAQ;EAC5E,IAAI,CAACnB,gBAAgB,CAACuB,QAAQ,CAACD,IAAI,CAAC,EAAE;IACpC,MAAM,IAAIE,KAAK,CAAC,gCAAgCF,IAAI,EAAE,CAAC;EACzD;EACAvB,aAAa,CAACsB,iBAAiB,CAACC,IAAI,EAAEH,OAAO,CAAC;AAChD;AAEA,OAAO,SAASM,QAAQA,CAAA,EAAS;EAC/B1B,aAAa,CAAC0B,QAAQ,CAAC,CAAC;AAC1B;;AAEA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAC9BnB,KAAwB,EACxBoB,OAA+C,EAC5B;EACnBtB,wBAAwB,CAAC,CAAC;EAC1B,OAAOF,YAAY,CAACyB,WAAW,CAACrB,KAAK,EAAEoB,OAAO,CAAC;AACjD;;AAEA;AACA;AACA;AACA,OAAO,SAASE,kBAAkBA,CAACtB,KAAyB,EAAQ;EAClE,IAAIA,KAAK,EAAE;IACTJ,YAAY,CAAC0B,kBAAkB,CAACtB,KAAK,CAAC;EACxC,CAAC,MAAM;IACLP,gBAAgB,CAAC8B,OAAO,CAAEC,CAAC,IAAK5B,YAAY,CAAC0B,kBAAkB,CAACE,CAAC,CAAC,CAAC;EACrE;AACF;;AAEA","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@ import type { EventEmitter } from 'react-native/Libraries/Types/CodegenTypes';
|
|
|
3
3
|
export declare const ALL_MEDIA_EVENTS: readonly ["play", "pause", "stop", "skipToNext", "skipToPrevious", "seekForward", "seekBackward", "seek", "shuffle", "repeatMode"];
|
|
4
4
|
export type MediaControl = (typeof ALL_MEDIA_EVENTS)[number];
|
|
5
5
|
export type MediaControlEvent = MediaControl | 'duck' | 'unDuck';
|
|
6
|
-
export interface
|
|
6
|
+
export interface NativeMediaTrackMetadata {
|
|
7
7
|
title: string;
|
|
8
8
|
artist: string;
|
|
9
9
|
album?: string;
|
|
@@ -20,7 +20,7 @@ export interface NativeEvent {
|
|
|
20
20
|
}
|
|
21
21
|
export interface Spec extends TurboModule {
|
|
22
22
|
setControlEnabled(name: string, enabled: boolean): void;
|
|
23
|
-
updateMetadata(metadata:
|
|
23
|
+
updateMetadata(metadata: NativeMediaTrackMetadata): Promise<void>;
|
|
24
24
|
stopMediaNotification(): Promise<void>;
|
|
25
25
|
enableAudioInterruption(enabled: boolean): Promise<void>;
|
|
26
26
|
enableBackgroundMode(enabled: boolean): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeMediaControls.d.ts","sourceRoot":"","sources":["../../../src/NativeMediaControls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAG9E,eAAO,MAAM,gBAAgB,oIAWnB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"NativeMediaControls.d.ts","sourceRoot":"","sources":["../../../src/NativeMediaControls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAG9E,eAAO,MAAM,gBAAgB,oIAWnB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,cAAc,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGzD,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7C,QAAQ,IAAI,IAAI,CAAC;IAGjB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;CAC7C;;AAED,wBAAuE"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { type MediaControl, type MediaControlEvent } from './NativeMediaControls';
|
|
2
|
-
import type {
|
|
2
|
+
import type { NativeMediaTrackMetadata } from './NativeMediaControls';
|
|
3
3
|
import { EventSubscription } from 'fbemitter';
|
|
4
|
+
import type { ImageSourcePropType } from 'react-native/Libraries/Image/Image';
|
|
5
|
+
interface MediaTrackMetadata extends Omit<NativeMediaTrackMetadata, 'artwork'> {
|
|
6
|
+
artwork?: string | ImageSourcePropType;
|
|
7
|
+
}
|
|
4
8
|
export type MediaControlEventData = {
|
|
5
9
|
position?: number;
|
|
6
10
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAsB,EAEpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAsB,EAEpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAgB,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAK5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,UAAU,kBAAmB,SAAQ,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACxC;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAcF;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE3D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAK5E;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,qBAAqB,KAAK,IAAI,GAC9C,iBAAiB,CAGnB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAMlE;AAGD,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-media-notification",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Display and manage media style notifications based on react-native-music-control",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -19,7 +19,7 @@ export type MediaControl = (typeof ALL_MEDIA_EVENTS)[number];
|
|
|
19
19
|
|
|
20
20
|
export type MediaControlEvent = MediaControl | 'duck' | 'unDuck';
|
|
21
21
|
|
|
22
|
-
export interface
|
|
22
|
+
export interface NativeMediaTrackMetadata {
|
|
23
23
|
title: string;
|
|
24
24
|
artist: string;
|
|
25
25
|
album?: string;
|
|
@@ -38,7 +38,7 @@ export interface NativeEvent {
|
|
|
38
38
|
|
|
39
39
|
export interface Spec extends TurboModule {
|
|
40
40
|
setControlEnabled(name: string, enabled: boolean): void;
|
|
41
|
-
updateMetadata(metadata:
|
|
41
|
+
updateMetadata(metadata: NativeMediaTrackMetadata): Promise<void>;
|
|
42
42
|
stopMediaNotification(): Promise<void>;
|
|
43
43
|
|
|
44
44
|
// Audio interruption handling
|
package/src/index.tsx
CHANGED
|
@@ -3,9 +3,17 @@ import MediaControls, {
|
|
|
3
3
|
type MediaControl,
|
|
4
4
|
type MediaControlEvent,
|
|
5
5
|
} from './NativeMediaControls';
|
|
6
|
-
import type {
|
|
6
|
+
import type { NativeMediaTrackMetadata } from './NativeMediaControls';
|
|
7
7
|
import { EventEmitter, EventSubscription } from 'fbemitter';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
type EventSubscription as NativeEventSubscription,
|
|
10
|
+
Image,
|
|
11
|
+
} from 'react-native';
|
|
12
|
+
import type { ImageSourcePropType } from 'react-native/Libraries/Image/Image';
|
|
13
|
+
|
|
14
|
+
interface MediaTrackMetadata extends Omit<NativeMediaTrackMetadata, 'artwork'> {
|
|
15
|
+
artwork?: string | ImageSourcePropType;
|
|
16
|
+
}
|
|
9
17
|
|
|
10
18
|
export type MediaControlEventData = {
|
|
11
19
|
position?: number; // für seek events
|
|
@@ -29,7 +37,10 @@ const setUpNativeEventListener = () => {
|
|
|
29
37
|
export async function updateMetadata(
|
|
30
38
|
metadata: MediaTrackMetadata
|
|
31
39
|
): Promise<void> {
|
|
32
|
-
|
|
40
|
+
if (metadata.artwork && typeof metadata.artwork !== 'string') {
|
|
41
|
+
metadata.artwork = Image.resolveAssetSource(metadata.artwork).uri;
|
|
42
|
+
}
|
|
43
|
+
return MediaControls.updateMetadata(metadata as NativeMediaTrackMetadata);
|
|
33
44
|
}
|
|
34
45
|
|
|
35
46
|
/**
|