From 1115fea74fd79794c3f230b532c71094e5ac793d Mon Sep 17 00:00:00 2001 From: Ricardo Corrie Date: Thu, 18 Jul 2024 18:46:12 -0400 Subject: [PATCH] Removes screen share event handling from external-api middleware and moves it into a common screen-share middleware to be used by both native and RN sdks --- ios/sdk/sdk.xcodeproj/project.pbxproj | 54 +++++++++----- ios/sdk/src/JitsiMeet.m | 6 +- ios/sdk/src/ScheenshareEventEmiter.h | 25 ------- ios/sdk/src/ScheenshareEventEmiter.m | 72 ------------------- .../ScreenShareEventEmitter.h | 5 ++ .../ScreenShareEventEmitter.m | 0 react-native-sdk/prepare_sdk.js | 12 ++-- react/features/app/middlewares.native.ts | 1 + .../mobile/external-api/middleware.ts | 11 --- .../mobile/react-native-sdk/functions.js | 11 --- .../mobile/react-native-sdk/middleware.js | 49 +------------ .../features/mobile/screen-share/functions.ts | 12 ++++ .../mobile/screen-share/middleware.ts | 70 ++++++++++++++++++ 13 files changed, 135 insertions(+), 193 deletions(-) delete mode 100644 ios/sdk/src/ScheenshareEventEmiter.h delete mode 100644 ios/sdk/src/ScheenshareEventEmiter.m rename ios/sdk/src/{screen-share => }/ScreenShareEventEmitter.h (90%) rename ios/sdk/src/{screen-share => }/ScreenShareEventEmitter.m (100%) create mode 100644 react/features/mobile/screen-share/functions.ts create mode 100644 react/features/mobile/screen-share/middleware.ts diff --git a/ios/sdk/sdk.xcodeproj/project.pbxproj b/ios/sdk/sdk.xcodeproj/project.pbxproj index 222940884998..2955b909e93e 100644 --- a/ios/sdk/sdk.xcodeproj/project.pbxproj +++ b/ios/sdk/sdk.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -33,15 +33,15 @@ 4E0EF63A28CA4069005D1B03 /* JMCallKitProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0EF63728CA4069005D1B03 /* JMCallKitProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4E0EF63B28CA4069005D1B03 /* JMCallKitProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */; }; 4E0EF63C28CA4069005D1B03 /* JMCallKitProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */; }; - 4E51B76425E5345E0038575A /* ScheenshareEventEmiter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */; }; - 4E51B76525E5345E0038575A /* ScheenshareEventEmiter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */; }; + 4E51B76425E5345E0038575A /* ScreenShareEventEmitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E51B76225E5345E0038575A /* ScreenShareEventEmitter.h */; }; + 4E51B76525E5345E0038575A /* ScreenShareEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScreenShareEventEmitter.m */; }; 4E812F3328F9A4290087ACC9 /* JitsiMeetView+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E812F3228F9A4290087ACC9 /* JitsiMeetView+Private.h */; }; 4E812F3428F9A4290087ACC9 /* JitsiMeetView+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E812F3228F9A4290087ACC9 /* JitsiMeetView+Private.h */; }; 4E812F3928F9A4ED0087ACC9 /* JitsiMeetView+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E812F3628F9A4ED0087ACC9 /* JitsiMeetView+Private.m */; }; 4E812F3A28F9A4ED0087ACC9 /* JitsiMeetView+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E812F3628F9A4ED0087ACC9 /* JitsiMeetView+Private.m */; }; 4ED4FFF32721B9B90074E620 /* JitsiAudioSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4ED4FFF42721B9B90074E620 /* JitsiAudioSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */; }; - 6F08DF7D4458EE3CF3F36F6D /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + 6F08DF7D4458EE3CF3F36F6D /* (null) in Frameworks */ = {isa = PBXBuildFile; }; 9A8EE79C77C17743BB66E8BD /* libPods-JitsiMeetSDKLite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B46497DE9A95BDF5E312AF48 /* libPods-JitsiMeetSDKLite.a */; }; A4A934E9212F3ADB001E9388 /* Dropbox.m in Sources */ = {isa = PBXBuildFile; fileRef = A4A934E8212F3ADB001E9388 /* Dropbox.m */; }; C6245F5D2053091D0040BE68 /* image-resize@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5B2053091D0040BE68 /* image-resize@2x.png */; }; @@ -66,7 +66,7 @@ DE9A0132289A9A9A00E41CBB /* RCTBridgeWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B93EF7C1EC9DDCD0030D24D /* RCTBridgeWrapper.h */; }; DE9A0133289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = DE81A2DC2317ED5400AE1940 /* JitsiMeetBaseLogHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE9A0134289A9A9A00E41CBB /* JitsiMeetSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = DEA9F283258A5D9900D4CD74 /* JitsiMeetSDK.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DE9A0135289A9A9A00E41CBB /* ScheenshareEventEmiter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */; }; + DE9A0135289A9A9A00E41CBB /* ScreenShareEventEmitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E51B76225E5345E0038575A /* ScreenShareEventEmitter.h */; }; DE9A0136289A9A9A00E41CBB /* JitsiMeetBaseLogHandler+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DE65AACB2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h */; }; DE9A0138289A9A9A00E41CBB /* JitsiMeetViewDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B412F1B1EDEC80100B1A0A6 /* JitsiMeetViewDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE9A0139289A9A9A00E41CBB /* JitsiAudioSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -94,7 +94,7 @@ DE9A0153289A9A9A00E41CBB /* Proximity.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495E1EC4B6C600B793EE /* Proximity.m */; }; DE9A0155289A9A9A00E41CBB /* ReactUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DEFE535521FB2E8300011A3A /* ReactUtils.m */; }; DE9A0157289A9A9A00E41CBB /* DragGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6A3425E204EF76800E062DD /* DragGestureController.swift */; }; - DE9A0158289A9A9A00E41CBB /* ScheenshareEventEmiter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */; }; + DE9A0158289A9A9A00E41CBB /* ScreenShareEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScreenShareEventEmitter.m */; }; DE9A015C289A9A9A00E41CBB /* JitsiMeetLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2D32316AC4D00AE1940 /* JitsiMeetLogger.m */; }; DE9A015E289A9A9A00E41CBB /* JitsiMeetView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B412F171EDEC65D00B1A0A6 /* JitsiMeetView.m */; }; DE9A015F289A9A9A00E41CBB /* JitsiMeet.m in Sources */ = {isa = PBXBuildFile; fileRef = DEFE535321FB1BF800011A3A /* JitsiMeet.m */; }; @@ -138,8 +138,8 @@ 4E0EF63428CA317E005D1B03 /* JMCallKitListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JMCallKitListener.h; sourceTree = ""; }; 4E0EF63728CA4069005D1B03 /* JMCallKitProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JMCallKitProxy.h; sourceTree = ""; }; 4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JMCallKitProxy.m; sourceTree = ""; }; - 4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScheenshareEventEmiter.h; sourceTree = ""; }; - 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScheenshareEventEmiter.m; sourceTree = ""; }; + 4E51B76225E5345E0038575A /* ScreenShareEventEmitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScreenShareEventEmitter.h; sourceTree = ""; }; + 4E51B76325E5345E0038575A /* ScreenShareEventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScreenShareEventEmitter.m; sourceTree = ""; }; 4E812F3228F9A4290087ACC9 /* JitsiMeetView+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JitsiMeetView+Private.h"; sourceTree = ""; }; 4E812F3628F9A4ED0087ACC9 /* JitsiMeetView+Private.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "JitsiMeetView+Private.m"; sourceTree = ""; }; 4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiAudioSession.h; sourceTree = ""; }; @@ -195,7 +195,7 @@ files = ( 0BB9AD791F5EC6D7001C08DB /* Intents.framework in Frameworks */, 0BB9AD771F5EC6CE001C08DB /* CallKit.framework in Frameworks */, - 6F08DF7D4458EE3CF3F36F6D /* BuildFile in Frameworks */, + 6F08DF7D4458EE3CF3F36F6D /* (null) in Frameworks */, 3453F4A32680898C4A40E821 /* libPods-JitsiMeetSDK.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -292,8 +292,8 @@ C8AFD27E2462C613000293D2 /* InfoPlistUtil.m */, C81E9AB825AC5AD800B134D9 /* ExternalAPI.h */, 0BA13D301EE83FF8007BEF7F /* ExternalAPI.m */, - 4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */, - 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */, + 4E51B76225E5345E0038575A /* ScreenShareEventEmitter.h */, + 4E51B76325E5345E0038575A /* ScreenShareEventEmitter.m */, DE9A0170289A9A9A00E41CBB /* Lite-Info.plist */, ); path = src; @@ -367,7 +367,7 @@ 0B93EF7E1EC9DDCD0030D24D /* RCTBridgeWrapper.h in Headers */, DE81A2DE2317ED5400AE1940 /* JitsiMeetBaseLogHandler.h in Headers */, DEA9F284258A5D9900D4CD74 /* JitsiMeetSDK.h in Headers */, - 4E51B76425E5345E0038575A /* ScheenshareEventEmiter.h in Headers */, + 4E51B76425E5345E0038575A /* ScreenShareEventEmitter.h in Headers */, DE65AACC2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h in Headers */, 0B412F221EDEF6EA00B1A0A6 /* JitsiMeetViewDelegate.h in Headers */, 4E0EF63528CA317E005D1B03 /* JMCallKitListener.h in Headers */, @@ -393,7 +393,7 @@ DE9A0132289A9A9A00E41CBB /* RCTBridgeWrapper.h in Headers */, DE9A0133289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.h in Headers */, DE9A0134289A9A9A00E41CBB /* JitsiMeetSDK.h in Headers */, - DE9A0135289A9A9A00E41CBB /* ScheenshareEventEmiter.h in Headers */, + DE9A0135289A9A9A00E41CBB /* ScreenShareEventEmitter.h in Headers */, DE9A0136289A9A9A00E41CBB /* JitsiMeetBaseLogHandler+Private.h in Headers */, DE9A0138289A9A9A00E41CBB /* JitsiMeetViewDelegate.h in Headers */, 4E0EF63628CA317E005D1B03 /* JMCallKitListener.h in Headers */, @@ -678,7 +678,7 @@ 4E0EF63228CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */, DEFE535621FB2E8300011A3A /* ReactUtils.m in Sources */, C6A34261204EF76800E062DD /* DragGestureController.swift in Sources */, - 4E51B76525E5345E0038575A /* ScheenshareEventEmiter.m in Sources */, + 4E51B76525E5345E0038575A /* ScreenShareEventEmitter.m in Sources */, A4A934E9212F3ADB001E9388 /* Dropbox.m in Sources */, DE81A2D52316AC4D00AE1940 /* JitsiMeetLogger.m in Sources */, 0B412F191EDEC65D00B1A0A6 /* JitsiMeetView.m in Sources */, @@ -711,7 +711,7 @@ 4E812F3A28F9A4ED0087ACC9 /* JitsiMeetView+Private.m in Sources */, DE9A0155289A9A9A00E41CBB /* ReactUtils.m in Sources */, DE9A0157289A9A9A00E41CBB /* DragGestureController.swift in Sources */, - DE9A0158289A9A9A00E41CBB /* ScheenshareEventEmiter.m in Sources */, + DE9A0158289A9A9A00E41CBB /* ScreenShareEventEmitter.m in Sources */, DE9A015C289A9A9A00E41CBB /* JitsiMeetLogger.m in Sources */, 4E0EF63328CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */, DE9A015E289A9A9A00E41CBB /* JitsiMeetView.m in Sources */, @@ -873,7 +873,11 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; INFOPLIST_FILE = src/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -902,7 +906,11 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; INFOPLIST_FILE = src/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -935,7 +943,11 @@ "JITSI_MEET_SDK_LITE=1", ); INFOPLIST_FILE = "src/Lite-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios; PRODUCT_NAME = JitsiMeetSDK; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -969,7 +981,11 @@ JITSI_MEET_SDK_LITE, ); INFOPLIST_FILE = "src/Lite-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios; PRODUCT_NAME = JitsiMeetSDK; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/ios/sdk/src/JitsiMeet.m b/ios/sdk/src/JitsiMeet.m index db993fada8b0..5e17cf14a8c3 100644 --- a/ios/sdk/src/JitsiMeet.m +++ b/ios/sdk/src/JitsiMeet.m @@ -24,7 +24,7 @@ #import "RCTBridgeWrapper.h" #import "ReactUtils.h" #import "RNSplashScreen.h" -#import "ScheenshareEventEmiter.h" +#import "ScreenShareEventEmitter.h" #import @@ -36,7 +36,7 @@ @implementation JitsiMeet { RCTBridgeWrapper *_bridgeWrapper; NSDictionary *_launchOptions; - ScheenshareEventEmiter *_screenshareEventEmiter; + ScreenShareEventEmitter *_screenShareEventEmitter; } #pragma mak - This class is a singleton @@ -64,7 +64,7 @@ - (instancetype)init { _bridgeWrapper = [[RCTBridgeWrapper alloc] init]; // Initialize the listener for handling start/stop screensharing notifications. - _screenshareEventEmiter = [[ScheenshareEventEmiter alloc] init]; + _screenShareEventEmitter = [[ScreenShareEventEmitter alloc] init]; // Register a fatal error handler for React. registerReactFatalErrorHandler(); diff --git a/ios/sdk/src/ScheenshareEventEmiter.h b/ios/sdk/src/ScheenshareEventEmiter.h deleted file mode 100644 index aa998efe041b..000000000000 --- a/ios/sdk/src/ScheenshareEventEmiter.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright @ 2021-present 8x8, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface ScheenshareEventEmiter : NSObject - -@end - -NS_ASSUME_NONNULL_END diff --git a/ios/sdk/src/ScheenshareEventEmiter.m b/ios/sdk/src/ScheenshareEventEmiter.m deleted file mode 100644 index 137bb3ec337b..000000000000 --- a/ios/sdk/src/ScheenshareEventEmiter.m +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright @ 2021-present 8x8, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "ScheenshareEventEmiter.h" -#import "JitsiMeet+Private.h" -#import "ExternalAPI.h" - -NSNotificationName const kBroadcastStartedNotification = @"iOS_BroadcastStarted"; -NSNotificationName const kBroadcastStoppedNotification = @"iOS_BroadcastStopped"; - -@implementation ScheenshareEventEmiter { - CFNotificationCenterRef _notificationCenter; -} - -- (instancetype)init { - self = [super init]; - if (self) { - _notificationCenter = CFNotificationCenterGetDarwinNotifyCenter(); - [self setupObserver]; - } - - return self; -} - -- (void)dealloc { - [self clearObserver]; -} - -// MARK: Private Methods - -- (void)setupObserver { - CFNotificationCenterAddObserver(_notificationCenter, (__bridge const void *)(self), broadcastStartedNotificationCallback, (__bridge CFStringRef)kBroadcastStartedNotification, NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - CFNotificationCenterAddObserver(_notificationCenter, (__bridge const void *)(self), broadcastStoppedNotificationCallback, (__bridge CFStringRef)kBroadcastStoppedNotification, NULL, CFNotificationSuspensionBehaviorDeliverImmediately); -} - -- (void)clearObserver { - CFNotificationCenterRemoveObserver(_notificationCenter, (__bridge const void *)(self), (__bridge CFStringRef)kBroadcastStartedNotification, NULL); - CFNotificationCenterRemoveObserver(_notificationCenter, (__bridge const void *)(self), (__bridge CFStringRef)kBroadcastStoppedNotification, NULL); -} - -void broadcastStartedNotificationCallback(CFNotificationCenterRef center, - void *observer, - CFStringRef name, - const void *object, - CFDictionaryRef userInfo) { - ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI]; - [externalAPI toggleScreenShare:true]; -} - -void broadcastStoppedNotificationCallback(CFNotificationCenterRef center, - void *observer, - CFStringRef name, - const void *object, - CFDictionaryRef userInfo) { - ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI]; - [externalAPI toggleScreenShare:false]; -} - -@end diff --git a/ios/sdk/src/screen-share/ScreenShareEventEmitter.h b/ios/sdk/src/ScreenShareEventEmitter.h similarity index 90% rename from ios/sdk/src/screen-share/ScreenShareEventEmitter.h rename to ios/sdk/src/ScreenShareEventEmitter.h index e926c79f54b4..8670f9bb3aa2 100644 --- a/ios/sdk/src/screen-share/ScreenShareEventEmitter.h +++ b/ios/sdk/src/ScreenShareEventEmitter.h @@ -13,9 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#import #import #import +NS_ASSUME_NONNULL_BEGIN + @interface ScreenShareEventEmitter : RCTEventEmitter @end + +NS_ASSUME_NONNULL_END diff --git a/ios/sdk/src/screen-share/ScreenShareEventEmitter.m b/ios/sdk/src/ScreenShareEventEmitter.m similarity index 100% rename from ios/sdk/src/screen-share/ScreenShareEventEmitter.m rename to ios/sdk/src/ScreenShareEventEmitter.m diff --git a/react-native-sdk/prepare_sdk.js b/react-native-sdk/prepare_sdk.js index 2b1ce7ce5c7c..0660fe963047 100644 --- a/react-native-sdk/prepare_sdk.js +++ b/react-native-sdk/prepare_sdk.js @@ -126,10 +126,6 @@ copyFolderRecursiveSync( `${iosSrcPath}/dropbox`, iosDestPath ); -copyFolderRecursiveSync( - `${iosSrcPath}/screen-share`, - iosDestPath -); fs.copyFileSync( `${iosSrcPath}/AppInfo.m`, `${iosDestPath}/AppInfo.m` @@ -166,6 +162,14 @@ fs.copyFileSync( `${iosSrcPath}/LocaleDetector.m`, `${iosDestPath}/LocaleDetector.m` ); +fs.copyFileSync( + `${iosSrcPath}/ScreenShareEventEmitter.m`, + `${iosDestPath}/ScreenShareEventEmitter.m` +); +fs.copyFileSync( + `${iosSrcPath}/ScreenShareEventEmitter.h`, + `${iosDestPath}/ScreenShareEventEmitter.h` +); fs.copyFileSync( `${iosSrcPath}/POSIX.m`, `${iosDestPath}/POSIX.m` diff --git a/react/features/app/middlewares.native.ts b/react/features/app/middlewares.native.ts index c951be56f001..4bdd961aad71 100644 --- a/react/features/app/middlewares.native.ts +++ b/react/features/app/middlewares.native.ts @@ -10,6 +10,7 @@ import '../mobile/permissions/middleware'; import '../mobile/proximity/middleware'; import '../mobile/wake-lock/middleware'; import '../mobile/react-native-sdk/middleware'; +import '../mobile/screen-share/middleware'; import '../mobile/watchos/middleware'; import '../share-room/middleware'; import '../shared-video/middleware'; diff --git a/react/features/mobile/external-api/middleware.ts b/react/features/mobile/external-api/middleware.ts index 7c1c1f6798dd..fc5cc3c0d7e7 100644 --- a/react/features/mobile/external-api/middleware.ts +++ b/react/features/mobile/external-api/middleware.ts @@ -8,7 +8,6 @@ import { AnyAction } from 'redux'; import { ENDPOINT_TEXT_MESSAGE_NAME } from '../../../../modules/API/constants'; import { appNavigate } from '../../app/actions.native'; import { IStore } from '../../app/types'; -import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../../base/app/actionTypes'; import { CONFERENCE_BLURRED, CONFERENCE_FAILED, @@ -128,12 +127,6 @@ externalAPIEnabled && MiddlewareRegistry.register(store => next => action => { const { type } = action; switch (type) { - case APP_WILL_MOUNT: - _registerForNativeEvents(store); - break; - case APP_WILL_UNMOUNT: - _unregisterForNativeEvents(); - break; case CONFERENCE_FAILED: { const { error, ...data } = action; @@ -373,10 +366,6 @@ function _registerForNativeEvents(store: IStore) { } }); - eventEmitter.addListener(ExternalAPI.TOGGLE_SCREEN_SHARE, ({ enabled }: any) => { - dispatch(toggleScreensharing(enabled)); - }); - eventEmitter.addListener(ExternalAPI.RETRIEVE_PARTICIPANTS_INFO, ({ requestId }: any) => { const participantsInfo = []; diff --git a/react/features/mobile/react-native-sdk/functions.js b/react/features/mobile/react-native-sdk/functions.js index 17675b35876d..72865177e55d 100644 --- a/react/features/mobile/react-native-sdk/functions.js +++ b/react/features/mobile/react-native-sdk/functions.js @@ -11,14 +11,3 @@ export function isExternalAPIAvailable() { return ExternalAPI !== null; } - -/** - * Determines if the ScreenShareEventEmitter native module is available. - * - * @returns {boolean} If yes {@code true} otherwise {@code false}. - */ -export function isScreenShareAPIAvailable() { - const { ScreenShareEventEmitter } = NativeModules; - - return ScreenShareEventEmitter !== null; -} diff --git a/react/features/mobile/react-native-sdk/middleware.js b/react/features/mobile/react-native-sdk/middleware.js index 0099ed5903cb..53955663a6a7 100644 --- a/react/features/mobile/react-native-sdk/middleware.js +++ b/react/features/mobile/react-native-sdk/middleware.js @@ -1,6 +1,3 @@ -import { NativeEventEmitter, NativeModules } from 'react-native'; - -import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../../base/app/actionTypes'; import { getAppProp } from '../../base/app/functions'; import { CONFERENCE_BLURRED, @@ -13,26 +10,13 @@ import { import { SET_AUDIO_MUTED, SET_VIDEO_MUTED } from '../../base/media/actionTypes'; import { PARTICIPANT_JOINED, PARTICIPANT_LEFT } from '../../base/participants/actionTypes'; import MiddlewareRegistry from '../../base/redux/MiddlewareRegistry'; -import { toggleScreensharing } from '../../base/tracks/actions.native'; import { READY_TO_CLOSE } from '../external-api/actionTypes'; import { participantToParticipantInfo } from '../external-api/functions'; import { ENTER_PICTURE_IN_PICTURE } from '../picture-in-picture/actionTypes'; -import { isExternalAPIAvailable, isScreenShareAPIAvailable } from './functions'; +import { isExternalAPIAvailable } from './functions'; const externalAPIEnabled = isExternalAPIAvailable(); -const screenShareApi = isScreenShareAPIAvailable(); - -let screenShareEventEmitter; - -// Get the native module -const { ScreenShareEventEmitter } = NativeModules; - -// Create an event emitter - -if (screenShareApi) { - screenShareEventEmitter = new NativeEventEmitter(ScreenShareEventEmitter); -} /** * Check if native modules are being used or not. @@ -44,12 +28,6 @@ if (screenShareApi) { const rnSdkHandlers = getAppProp(store, 'rnSdkHandlers'); switch (type) { - case APP_WILL_MOUNT: - _registerForNativeEvents(store); - break; - case APP_WILL_UNMOUNT: - _unregisterForNativeEvents(); - break; case SET_AUDIO_MUTED: rnSdkHandlers?.onAudioMutedChanged?.(action.muted); break; @@ -105,28 +83,3 @@ if (screenShareApi) { return result; }); - -/** - * Registers for events sent from the native side via NativeEventEmitter. - * - * @param {Store} store - The redux store. - * @private - * @returns {void} - */ -function _registerForNativeEvents(store) { - const { dispatch } = store; - - screenShareEventEmitter.addListener(ScreenShareEventEmitter.TOGGLE_SCREEN_SHARE, ({ enabled }) => { - dispatch(toggleScreensharing(enabled)); - }); -} - -/** - * Unregister for events sent from the native side via NativeEventEmitter. - * - * @private - * @returns {void} - */ -function _unregisterForNativeEvents() { - screenShareEventEmitter.removeAllListeners(ScreenShareEventEmitter.TOGGLE_SCREEN_SHARE); -} diff --git a/react/features/mobile/screen-share/functions.ts b/react/features/mobile/screen-share/functions.ts new file mode 100644 index 000000000000..d5fa3b05095a --- /dev/null +++ b/react/features/mobile/screen-share/functions.ts @@ -0,0 +1,12 @@ +import { NativeModules } from 'react-native'; + +/** + * Determines if the ScreenShareEventEmitter native module is available. + * + * @returns {boolean} If yes {@code true} otherwise {@code false}. + */ +export function isScreenShareAPIAvailable() { + const { ScreenShareEventEmitter } = NativeModules; + + return ScreenShareEventEmitter !== null; +} diff --git a/react/features/mobile/screen-share/middleware.ts b/react/features/mobile/screen-share/middleware.ts new file mode 100644 index 000000000000..e12a23299374 --- /dev/null +++ b/react/features/mobile/screen-share/middleware.ts @@ -0,0 +1,70 @@ +/* eslint-disable lines-around-comment */ + +import { NativeEventEmitter, NativeModules } from 'react-native'; + +import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../../base/app/actionTypes'; +import MiddlewareRegistry from '../../base/redux/MiddlewareRegistry'; +import { toggleScreensharing } from '../../base/tracks/actions.native'; + +import { isScreenShareAPIAvailable } from './functions'; + +const screenShareApi = isScreenShareAPIAvailable(); + +let screenShareEventEmitter: any; + +// Get the native module +const { ScreenShareEventEmitter } = NativeModules; + +// Create an event emitter + +if (screenShareApi) { + screenShareEventEmitter = new NativeEventEmitter(ScreenShareEventEmitter); +} + +/** + * Middleware that captures Redux actions and uses the ExternalAPI module to + * turn them into native events so the application knows about them. + * + * @param {Store} store - Redux store. + * @returns {Function} + */ +screenShareEventEmitter && MiddlewareRegistry.register(store => next => action => { + const result = next(action); + const { type } = action; + + switch (type) { + case APP_WILL_MOUNT: + _registerForNativeEvents(store); + break; + case APP_WILL_UNMOUNT: + _unregisterForNativeEvents(); + break; + } + + return result; +}); + +/** + * Registers for events sent from the native side via NativeEventEmitter. + * + * @param {Store} store - The redux store. + * @private + * @returns {void} + */ +function _registerForNativeEvents(store) { + const { dispatch } = store; + + screenShareEventEmitter.addListener(ScreenShareEventEmitter.TOGGLE_SCREEN_SHARE, ({ enabled }) => { + dispatch(toggleScreensharing(enabled)); + }); +} + +/** + * Unregister for events sent from the native side via NativeEventEmitter. + * + * @private + * @returns {void} + */ +function _unregisterForNativeEvents() { + screenShareEventEmitter.removeAllListeners(ScreenShareEventEmitter.TOGGLE_SCREEN_SHARE); +}