diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/BroadcastEvent.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/BroadcastEvent.java index 0e73839641..6a976719c6 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/BroadcastEvent.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/BroadcastEvent.java @@ -92,7 +92,8 @@ public class BroadcastEvent { READY_TO_CLOSE("org.jitsi.meet.READY_TO_CLOSE"), TRANSCRIPTION_CHUNK_RECEIVED("org.jitsi.meet.TRANSCRIPTION_CHUNK_RECEIVED"), CUSTOM_BUTTON_PRESSED("org.jitsi.meet.CUSTOM_BUTTON_PRESSED"), - CONFERENCE_UNIQUE_ID_SET("org.jitsi.meet.CONFERENCE_UNIQUE_ID_SET"); + CONFERENCE_UNIQUE_ID_SET("org.jitsi.meet.CONFERENCE_UNIQUE_ID_SET"), + RECORDING_STATUS_CHANGED("org.jitsi.meet.RECORDING_STATUS_CHANGED"); private static final String CONFERENCE_BLURRED_NAME = "CONFERENCE_BLURRED"; private static final String CONFERENCE_FOCUSED_NAME = "CONFERENCE_FOCUSED"; @@ -112,6 +113,8 @@ public class BroadcastEvent { private static final String TRANSCRIPTION_CHUNK_RECEIVED_NAME = "TRANSCRIPTION_CHUNK_RECEIVED"; private static final String CUSTOM_BUTTON_PRESSED_NAME = "CUSTOM_BUTTON_PRESSED"; private static final String CONFERENCE_UNIQUE_ID_SET_NAME = "CONFERENCE_UNIQUE_ID_SET"; + private static final String RECORDING_STATUS_CHANGED_NAME = "RECORDING_STATUS_CHANGED"; + private final String action; Type(String action) { @@ -169,6 +172,8 @@ public class BroadcastEvent { return CUSTOM_BUTTON_PRESSED; case CONFERENCE_UNIQUE_ID_SET_NAME: return CONFERENCE_UNIQUE_ID_SET; + case RECORDING_STATUS_CHANGED_NAME: + return RECORDING_STATUS_CHANGED; } return null; diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java index d27f310618..be8b64ef7f 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetActivity.java @@ -279,6 +279,10 @@ public class JitsiMeetActivity extends AppCompatActivity // JitsiMeetLogger.i("Conference unique id set: " + extraData); // } +// protected void onRecordingStatusChanged(HashMap extraData) { +// JitsiMeetLogger.i("Recording status changed: " + extraData); +// } + // Activity lifecycle methods // @@ -371,6 +375,9 @@ public class JitsiMeetActivity extends AppCompatActivity // case CONFERENCE_UNIQUE_ID_SET: // onConferenceUniqueIdSet(event.getData()); // break; + // case RECORDING_STATUS_CHANGED: + // onRecordingStatusChanged(event.getData()); + // break; } } } diff --git a/ios/app/src/ViewController.m b/ios/app/src/ViewController.m index c2fa860f45..c9ee9d65e0 100644 --- a/ios/app/src/ViewController.m +++ b/ios/app/src/ViewController.m @@ -106,6 +106,10 @@ [self _onJitsiMeetViewDelegateEvent:@"READY_TO_CLOSE" withData:data]; } +// - (void)recordingStatusChanged:(NSDictionary *)data { +// [self _onJitsiMeetViewDelegateEvent:@"RECORDING_STATUS_CHANGED" withData:data]; +// } + // - (void)transcriptionChunkReceived:(NSDictionary *)data { // [self _onJitsiMeetViewDelegateEvent:@"TRANSCRIPTION_CHUNK_RECEIVED" withData:data]; // } diff --git a/ios/sdk/src/JitsiMeetViewDelegate.h b/ios/sdk/src/JitsiMeetViewDelegate.h index 7ae5b06ec2..0e3e925bb6 100644 --- a/ios/sdk/src/JitsiMeetViewDelegate.h +++ b/ios/sdk/src/JitsiMeetViewDelegate.h @@ -137,4 +137,11 @@ */ - (void)conferenceUniqueIdSet:(NSDictionary *)data; +/** + * Called when the recording status has changed. + * + * The `data` dictionary contains a `sessionData` key. + */ +- (void)recordingStatusChanged:(NSDictionary *)data; + @end diff --git a/react/features/mobile/external-api/middleware.ts b/react/features/mobile/external-api/middleware.ts index 2e62efcd6a..de03d94dd7 100644 --- a/react/features/mobile/external-api/middleware.ts +++ b/react/features/mobile/external-api/middleware.ts @@ -56,6 +56,7 @@ import { closeChat, openChat, sendMessage, setPrivateMessageRecipient } from '.. import { isEnabled as isDropboxEnabled } from '../../dropbox/functions.native'; import { hideNotification, showNotification } from '../../notifications/actions'; import { NOTIFICATION_TIMEOUT_TYPE, NOTIFICATION_TYPE } from '../../notifications/constants'; +import { RECORDING_SESSION_UPDATED } from '../../recording/actionTypes'; import { RECORDING_METADATA_ID, RECORDING_TYPES } from '../../recording/constants'; import { getActiveSession } from '../../recording/functions'; import { setRequestingSubtitles } from '../../subtitles/actions.any'; @@ -104,6 +105,11 @@ const SCREEN_SHARE_TOGGLED = 'SCREEN_SHARE_TOGGLED'; */ const PARTICIPANTS_INFO_RETRIEVED = 'PARTICIPANTS_INFO_RETRIEVED'; +/** + * Event which will be emitted on the native side to indicate the recording status has changed. + */ +const RECORDING_STATUS_CHANGED = 'RECORDING_STATUS_CHANGED'; + const externalAPIEnabled = isExternalAPIAvailable(); let eventEmitter: any; @@ -211,7 +217,7 @@ externalAPIEnabled && MiddlewareRegistry.register(store => next => action => { sendEvent( store, CUSTOM_BUTTON_PRESSED, - { + /* data */ { id, text }); @@ -279,6 +285,34 @@ externalAPIEnabled && MiddlewareRegistry.register(store => next => action => { sendEvent(store, type, /* data */ {}); break; + case RECORDING_SESSION_UPDATED: { + const { + error, + id, + initiator, + liveStreamViewURL, + mode, + status, + terminator, + timestamp + } = action.sessionData; + + sendEvent( + store, + RECORDING_STATUS_CHANGED, + /* data */ { + error, + id, + initiator, + liveStreamViewURL, + mode, + status, + terminator, + timestamp + }); + break; + } + case SET_ROOM: _maybeTriggerEarlyConferenceWillJoin(store, action); break;