Compare commits

...

21 Commits

Author SHA1 Message Date
Saúl Ibarra Corretgé b84bb7d64b fix(ios) remove observers on dealloc for RCTDeviceInfo 2022-11-25 14:46:09 +01:00
Alex Bumbu a711a0e4bb Update JitsiMeet.h (#12574) 2022-11-17 15:33:50 +01:00
Saúl Ibarra Corretgé b3dc04880f fix(rn,config) fix forcing VP8 for bridge calls 2022-10-24 10:29:47 +02:00
Saúl Ibarra Corretgé 8ebd200357 feat(rn) use H.264 (HW codec) for P2P calls
This requires a custom video encoder / decoder factory which uses the
hardware codec only for H.264 and the software implementations for the rest.
2022-10-24 10:29:47 +02:00
Saúl Ibarra Corretgé 65e08a5397 fix(rn,filmstrip) fix dropping tiles on conference join 2022-10-24 09:23:39 +02:00
Saúl Ibarra Corretgé 12c07dc164 fix(rn,filmstrip) clear participants cache when changing conferences 2022-10-20 17:04:24 +02:00
Saúl Ibarra Corretgé acdfac7dcb fix(filmstrip) prevent duplicated participants 2022-10-20 17:04:10 +02:00
Saúl Ibarra Corretgé bdaf3d3185 fix(ios) fix mute "ping-pong" 2022-10-18 10:02:36 +02:00
Saúl Ibarra Corretgé 145012464f chore(ios) sync project file 2022-10-18 10:48:58 +03:00
Alex Bumbu 9503ccec93 fix(iOS, layout): fix iOS 16 layout
This (partially) reverts commit ddab27e292.

We're reverting this to fix the iOS 16 layout problems caused by the interaction between the app rootViewControoler and JitsiMeetViewController, with the downside that using any RN components based on native view controllers will most likely be faulty. The solution for this would be to change the SDK's entry point to a view controller, instead of JitsiMeetView.
2022-10-18 10:48:31 +03:00
Calinteodor e3f61c0aef feat(settings/native): fixed scroll inside screen (#12395)
* feat(settings): fixed scroll, bottom insets and bounce
2022-10-17 18:15:43 +03:00
Calinteodor 454ac10d62 feat(chat): fixed chat counter (#12385)
* feat(chat): fixed chat counter and updated new messages button web styles
2022-10-14 17:10:44 +03:00
Calin-Teodor 36c344ee9f feat(conference/native): adjusted carmode ui 2022-10-14 16:14:38 +03:00
Calin-Teodor 2307fd8da9 feat(prejoin/native): adjusted room name margins 2022-10-14 16:03:29 +03:00
kerem 910effaacf feat(deps,rn) update React Native to version 0.68.4 (#12376)
* BREAKING: update rn to 0.68.4
2022-10-14 16:02:55 +03:00
Calinteodor 8c29f4958c feat(prejoin/native): clear notifications when joining (#12361)
* feat(prejoin/native): clear notifications when joining
2022-10-13 17:06:16 +03:00
Calinteodor e6a6c32ab0 feat(toolbox/conference/audio-mode/chat/native): UI fixes and updates (#12375)
feat(toolbox/conference/audio-mode/chat/native): UI fixes and updates
2022-10-13 16:14:26 +03:00
Calinteodor ed6f17c814 feat(prejoin/native): ui updates (#12368)
* feat(prejoin/native): ui updates
2022-10-12 15:44:40 +03:00
Calinteodor b05ac3de69 feat(base/ui): fixed native button active style (#12353)
* feat(base/ui): fixed native button active style
2022-10-11 11:40:22 +02:00
Saúl Ibarra Corretgé 262043fd47 fix(android) fix crash in Android < 10
Activity.registerActivityLifecycleCallbacks is only available in API level 29.

Ref: https://developer.android.com/reference/android/app/Activity.html#registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks)
2022-10-11 11:27:05 +02:00
Saúl Ibarra Corretgé 6d0b352b65 chore(rn,version) set app and sdk versions to 22.6.0 and 6.2.0 2022-10-07 17:31:50 +02:00
49 changed files with 872 additions and 902 deletions

View File

@ -26,5 +26,5 @@ android.useAndroidX=true
android.enableJetifier=true
android.bundle.enableUncompressedNativeLibs=false
appVersion=99.0.0
sdkVersion=99.0.0
appVersion=22.6.0
sdkVersion=6.2.0

View File

@ -0,0 +1,46 @@
/*
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
package org.jitsi.meet.sdk;
import org.webrtc.VideoCodecInfo;
import java.util.Map;
import java.util.HashMap;
/** Container for static helper functions related to dealing with H264 codecs. */
class H264Utils {
public static final String H264_FMTP_PROFILE_LEVEL_ID = "profile-level-id";
public static final String H264_FMTP_LEVEL_ASYMMETRY_ALLOWED = "level-asymmetry-allowed";
public static final String H264_FMTP_PACKETIZATION_MODE = "packetization-mode";
public static final String H264_PROFILE_CONSTRAINED_BASELINE = "42e0";
public static final String H264_PROFILE_CONSTRAINED_HIGH = "640c";
public static final String H264_LEVEL_3_1 = "1f"; // 31 in hex.
public static final String H264_CONSTRAINED_HIGH_3_1 =
H264_PROFILE_CONSTRAINED_HIGH + H264_LEVEL_3_1;
public static final String H264_CONSTRAINED_BASELINE_3_1 =
H264_PROFILE_CONSTRAINED_BASELINE + H264_LEVEL_3_1;
public static Map<String, String> getDefaultH264Params(boolean isHighProfile) {
final Map<String, String> params = new HashMap<>();
params.put(VideoCodecInfo.H264_FMTP_LEVEL_ASYMMETRY_ALLOWED, "1");
params.put(VideoCodecInfo.H264_FMTP_PACKETIZATION_MODE, "1");
params.put(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID,
isHighProfile ? VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1
: VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1);
return params;
}
public static VideoCodecInfo DEFAULT_H264_BASELINE_PROFILE_CODEC =
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ false));
public static VideoCodecInfo DEFAULT_H264_HIGH_PROFILE_CODEC =
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ true));
}

View File

@ -15,6 +15,7 @@
*/
package org.jitsi.meet.sdk;
import android.app.Application;
import android.content.Context;
import android.util.Log;
@ -22,6 +23,7 @@ import androidx.annotation.NonNull;
import androidx.startup.Initializer;
import com.facebook.soloader.SoLoader;
import org.wonday.orientation.OrientationActivityLifecycle;
import java.util.Collections;
import java.util.List;
@ -37,6 +39,10 @@ public class JitsiInitializer implements Initializer<Boolean> {
// Register our uncaught exception handler.
JitsiMeetUncaughtExceptionHandler.register();
// Register activity lifecycle handler for the orientation locker module.
((Application) context).registerActivityLifecycleCallbacks(OrientationActivityLifecycle.getInstance());
return true;
}

View File

@ -31,7 +31,6 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.facebook.react.modules.core.PermissionListener;
import org.wonday.orientation.OrientationActivityLifecycle;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
@ -104,7 +103,6 @@ public class JitsiMeetActivity extends AppCompatActivity
this.jitsiView = findViewById(R.id.jitsiView);
registerForBroadcastMessages();
registerActivityLifecycleCallbacks(OrientationActivityLifecycle.getInstance());
if (!extraInitialize()) {
initialize();

View File

@ -31,12 +31,12 @@ import com.facebook.react.common.LifecycleState;
import com.facebook.react.jscexecutor.JSCExecutorFactory;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.uimanager.ViewManager;
import com.oney.WebRTCModule.EglUtils;
import com.oney.WebRTCModule.RTCVideoViewManager;
import com.oney.WebRTCModule.WebRTCModule;
import org.devio.rn.splashscreen.SplashScreenModule;
import org.webrtc.SoftwareVideoDecoderFactory;
import org.webrtc.SoftwareVideoEncoderFactory;
import org.webrtc.EglBase;
import org.webrtc.audio.AudioDeviceModule;
import org.webrtc.audio.JavaAudioDeviceModule;
@ -89,8 +89,10 @@ class ReactInstanceManagerHolder {
.createAudioDeviceModule();
options.setAudioDeviceModule(adm);
options.setVideoDecoderFactory(new SoftwareVideoDecoderFactory());
options.setVideoEncoderFactory(new SoftwareVideoEncoderFactory());
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
options.setVideoDecoderFactory(new WebRTCVideoDecoderFactory(eglContext));
options.setVideoEncoderFactory(new WebRTCVideoEncoderFactory(eglContext));
nativeModules.add(new WebRTCModule(reactContext, options));

View File

@ -0,0 +1,19 @@
package org.jitsi.meet.sdk;
/** Enumeration of supported video codec types. */
public enum VideoCodecMimeType {
VP8("video/x-vnd.on2.vp8"),
VP9("video/x-vnd.on2.vp9"),
H264("video/avc"),
AV1("video/av01");
private final String mimeType;
private VideoCodecMimeType(String mimeType) {
this.mimeType = mimeType;
}
String mimeType() {
return mimeType;
}
}

View File

@ -0,0 +1,52 @@
package org.jitsi.meet.sdk;
import androidx.annotation.Nullable;
import org.webrtc.EglBase;
import org.webrtc.HardwareVideoDecoderFactory;
import org.webrtc.SoftwareVideoDecoderFactory;
import org.webrtc.VideoCodecInfo;
import org.webrtc.VideoDecoder;
import org.webrtc.VideoDecoderFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* This is a custom video decoder factory for WebRTC which behaves similarly
* to the default one in iOS. It supports the following codecs:
*
* - In hardware: H.264 (baseline)
* - In software: VP8, VP9, AV1
*/
public class WebRTCVideoDecoderFactory implements VideoDecoderFactory {
private final VideoDecoderFactory hardwareVideoDecoderFactory;
private final VideoDecoderFactory softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
public WebRTCVideoDecoderFactory(@Nullable EglBase.Context eglContext) {
this.hardwareVideoDecoderFactory = new HardwareVideoDecoderFactory(eglContext);
}
@Nullable
@Override
public VideoDecoder createDecoder(VideoCodecInfo codecInfo) {
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
return this.hardwareVideoDecoderFactory.createDecoder(codecInfo);
}
return this.softwareVideoDecoderFactory.createDecoder(codecInfo);
}
@Override
public VideoCodecInfo[] getSupportedCodecs() {
List<VideoCodecInfo> codecs = new ArrayList<>();
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
}
}

View File

@ -0,0 +1,53 @@
package org.jitsi.meet.sdk;
import androidx.annotation.Nullable;
import org.webrtc.EglBase;
import org.webrtc.HardwareVideoEncoderFactory;
import org.webrtc.SoftwareVideoEncoderFactory;
import org.webrtc.VideoCodecInfo;
import org.webrtc.VideoEncoder;
import org.webrtc.VideoEncoderFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* This is a custom video encoder factory for WebRTC which behaves similarly
* to the default one in iOS. It supports the following codecs:
*
* - In hardware: H.264 (baseline)
* - In software: VP8, VP9, AV1
*/
public class WebRTCVideoEncoderFactory implements VideoEncoderFactory {
private final VideoEncoderFactory hardwareVideoEncoderFactory;
private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
public WebRTCVideoEncoderFactory(@Nullable EglBase.Context eglContext) {
this.hardwareVideoEncoderFactory =
new HardwareVideoEncoderFactory(eglContext, false, false);
}
@Nullable
@Override
public VideoEncoder createEncoder(VideoCodecInfo codecInfo) {
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
return this.hardwareVideoEncoderFactory.createEncoder(codecInfo);
}
return this.softwareVideoEncoderFactory.createEncoder(codecInfo);
}
@Override
public VideoCodecInfo[] getSupportedCodecs() {
List<VideoCodecInfo> codecs = new ArrayList<>();
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
}
}

View File

@ -13,14 +13,14 @@ PODS:
- CocoaLumberjack/Core (= 3.7.2)
- CocoaLumberjack/Core (3.7.2)
- DoubleConversion (1.1.6)
- FBLazyVector (0.68.3)
- FBReactNativeSpec (0.68.3):
- FBLazyVector (0.68.4)
- FBReactNativeSpec (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.3)
- RCTTypeSafety (= 0.68.3)
- React-Core (= 0.68.3)
- React-jsi (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- RCTRequired (= 0.68.4)
- RCTTypeSafety (= 0.68.4)
- React-Core (= 0.68.4)
- React-jsi (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- Firebase/Analytics (8.15.0):
- Firebase/Core
- Firebase/Core (8.15.0):
@ -163,201 +163,201 @@ PODS:
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- RCTRequired (0.68.3)
- RCTTypeSafety (0.68.3):
- FBLazyVector (= 0.68.3)
- RCTRequired (0.68.4)
- RCTTypeSafety (0.68.4):
- FBLazyVector (= 0.68.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.3)
- React-Core (= 0.68.3)
- React (0.68.3):
- React-Core (= 0.68.3)
- React-Core/DevSupport (= 0.68.3)
- React-Core/RCTWebSocket (= 0.68.3)
- React-RCTActionSheet (= 0.68.3)
- React-RCTAnimation (= 0.68.3)
- React-RCTBlob (= 0.68.3)
- React-RCTImage (= 0.68.3)
- React-RCTLinking (= 0.68.3)
- React-RCTNetwork (= 0.68.3)
- React-RCTSettings (= 0.68.3)
- React-RCTText (= 0.68.3)
- React-RCTVibration (= 0.68.3)
- React-callinvoker (0.68.3)
- React-Codegen (0.68.3):
- FBReactNativeSpec (= 0.68.3)
- RCTRequired (= 0.68.4)
- React-Core (= 0.68.4)
- React (0.68.4):
- React-Core (= 0.68.4)
- React-Core/DevSupport (= 0.68.4)
- React-Core/RCTWebSocket (= 0.68.4)
- React-RCTActionSheet (= 0.68.4)
- React-RCTAnimation (= 0.68.4)
- React-RCTBlob (= 0.68.4)
- React-RCTImage (= 0.68.4)
- React-RCTLinking (= 0.68.4)
- React-RCTNetwork (= 0.68.4)
- React-RCTSettings (= 0.68.4)
- React-RCTText (= 0.68.4)
- React-RCTVibration (= 0.68.4)
- React-callinvoker (0.68.4)
- React-Codegen (0.68.4):
- FBReactNativeSpec (= 0.68.4)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.3)
- RCTTypeSafety (= 0.68.3)
- React-Core (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-Core (0.68.3):
- RCTRequired (= 0.68.4)
- RCTTypeSafety (= 0.68.4)
- React-Core (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-Core (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.3)
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-Core/Default (= 0.68.4)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/CoreModulesHeaders (0.68.3):
- React-Core/CoreModulesHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/Default (0.68.3):
- React-Core/Default (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/DevSupport (0.68.3):
- React-Core/DevSupport (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.3)
- React-Core/RCTWebSocket (= 0.68.3)
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-jsinspector (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-Core/Default (= 0.68.4)
- React-Core/RCTWebSocket (= 0.68.4)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-jsinspector (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTActionSheetHeaders (0.68.3):
- React-Core/RCTActionSheetHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTAnimationHeaders (0.68.3):
- React-Core/RCTAnimationHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTBlobHeaders (0.68.3):
- React-Core/RCTBlobHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTImageHeaders (0.68.3):
- React-Core/RCTImageHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTLinkingHeaders (0.68.3):
- React-Core/RCTLinkingHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTNetworkHeaders (0.68.3):
- React-Core/RCTNetworkHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTSettingsHeaders (0.68.3):
- React-Core/RCTSettingsHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTTextHeaders (0.68.3):
- React-Core/RCTTextHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTVibrationHeaders (0.68.3):
- React-Core/RCTVibrationHeaders (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-Core/RCTWebSocket (0.68.3):
- React-Core/RCTWebSocket (0.68.4):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.3)
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsiexecutor (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-Core/Default (= 0.68.4)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsiexecutor (= 0.68.4)
- React-perflogger (= 0.68.4)
- Yoga
- React-CoreModules (0.68.3):
- React-CoreModules (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.3)
- React-Codegen (= 0.68.3)
- React-Core/CoreModulesHeaders (= 0.68.3)
- React-jsi (= 0.68.3)
- React-RCTImage (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-cxxreact (0.68.3):
- RCTTypeSafety (= 0.68.4)
- React-Codegen (= 0.68.4)
- React-Core/CoreModulesHeaders (= 0.68.4)
- React-jsi (= 0.68.4)
- React-RCTImage (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-cxxreact (0.68.4):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.68.3)
- React-jsi (= 0.68.3)
- React-jsinspector (= 0.68.3)
- React-logger (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-runtimeexecutor (= 0.68.3)
- React-jsi (0.68.3):
- React-callinvoker (= 0.68.4)
- React-jsi (= 0.68.4)
- React-jsinspector (= 0.68.4)
- React-logger (= 0.68.4)
- React-perflogger (= 0.68.4)
- React-runtimeexecutor (= 0.68.4)
- React-jsi (0.68.4):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsi/Default (= 0.68.3)
- React-jsi/Default (0.68.3):
- React-jsi/Default (= 0.68.4)
- React-jsi/Default (0.68.4):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsiexecutor (0.68.3):
- React-jsiexecutor (0.68.4):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-jsinspector (0.68.3)
- React-logger (0.68.3):
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-perflogger (= 0.68.4)
- React-jsinspector (0.68.4)
- React-logger (0.68.4):
- glog
- react-native-background-timer (2.4.1):
- React-Core
@ -390,71 +390,71 @@ PODS:
- React-Core
- react-native-webview (11.15.1):
- React-Core
- React-perflogger (0.68.3)
- React-RCTActionSheet (0.68.3):
- React-Core/RCTActionSheetHeaders (= 0.68.3)
- React-RCTAnimation (0.68.3):
- React-perflogger (0.68.4)
- React-RCTActionSheet (0.68.4):
- React-Core/RCTActionSheetHeaders (= 0.68.4)
- React-RCTAnimation (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.3)
- React-Codegen (= 0.68.3)
- React-Core/RCTAnimationHeaders (= 0.68.3)
- React-jsi (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-RCTBlob (0.68.3):
- RCTTypeSafety (= 0.68.4)
- React-Codegen (= 0.68.4)
- React-Core/RCTAnimationHeaders (= 0.68.4)
- React-jsi (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-RCTBlob (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Codegen (= 0.68.3)
- React-Core/RCTBlobHeaders (= 0.68.3)
- React-Core/RCTWebSocket (= 0.68.3)
- React-jsi (= 0.68.3)
- React-RCTNetwork (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-RCTImage (0.68.3):
- React-Codegen (= 0.68.4)
- React-Core/RCTBlobHeaders (= 0.68.4)
- React-Core/RCTWebSocket (= 0.68.4)
- React-jsi (= 0.68.4)
- React-RCTNetwork (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-RCTImage (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.3)
- React-Codegen (= 0.68.3)
- React-Core/RCTImageHeaders (= 0.68.3)
- React-jsi (= 0.68.3)
- React-RCTNetwork (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-RCTLinking (0.68.3):
- React-Codegen (= 0.68.3)
- React-Core/RCTLinkingHeaders (= 0.68.3)
- React-jsi (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-RCTNetwork (0.68.3):
- RCTTypeSafety (= 0.68.4)
- React-Codegen (= 0.68.4)
- React-Core/RCTImageHeaders (= 0.68.4)
- React-jsi (= 0.68.4)
- React-RCTNetwork (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-RCTLinking (0.68.4):
- React-Codegen (= 0.68.4)
- React-Core/RCTLinkingHeaders (= 0.68.4)
- React-jsi (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-RCTNetwork (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.3)
- React-Codegen (= 0.68.3)
- React-Core/RCTNetworkHeaders (= 0.68.3)
- React-jsi (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-RCTSettings (0.68.3):
- RCTTypeSafety (= 0.68.4)
- React-Codegen (= 0.68.4)
- React-Core/RCTNetworkHeaders (= 0.68.4)
- React-jsi (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-RCTSettings (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.3)
- React-Codegen (= 0.68.3)
- React-Core/RCTSettingsHeaders (= 0.68.3)
- React-jsi (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-RCTText (0.68.3):
- React-Core/RCTTextHeaders (= 0.68.3)
- React-RCTVibration (0.68.3):
- RCTTypeSafety (= 0.68.4)
- React-Codegen (= 0.68.4)
- React-Core/RCTSettingsHeaders (= 0.68.4)
- React-jsi (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-RCTText (0.68.4):
- React-Core/RCTTextHeaders (= 0.68.4)
- React-RCTVibration (0.68.4):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Codegen (= 0.68.3)
- React-Core/RCTVibrationHeaders (= 0.68.3)
- React-jsi (= 0.68.3)
- ReactCommon/turbomodule/core (= 0.68.3)
- React-runtimeexecutor (0.68.3):
- React-jsi (= 0.68.3)
- ReactCommon/turbomodule/core (0.68.3):
- React-Codegen (= 0.68.4)
- React-Core/RCTVibrationHeaders (= 0.68.4)
- React-jsi (= 0.68.4)
- ReactCommon/turbomodule/core (= 0.68.4)
- React-runtimeexecutor (0.68.4):
- React-jsi (= 0.68.4)
- ReactCommon/turbomodule/core (0.68.4):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.68.3)
- React-Core (= 0.68.3)
- React-cxxreact (= 0.68.3)
- React-jsi (= 0.68.3)
- React-logger (= 0.68.3)
- React-perflogger (= 0.68.3)
- React-callinvoker (= 0.68.4)
- React-Core (= 0.68.4)
- React-cxxreact (= 0.68.4)
- React-jsi (= 0.68.4)
- React-logger (= 0.68.4)
- React-perflogger (= 0.68.4)
- RNCalendarEvents (2.2.0):
- React
- RNCAsyncStorage (1.15.14):
@ -706,8 +706,8 @@ SPEC CHECKSUMS:
boost: a7c83b31436843459a1961bfd74b96033dc77234
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
FBLazyVector: 34f7420274737b6fcf2e2d9fd42641e66b4436a3
FBReactNativeSpec: 68c23fb2cea9393190e0815b673d742fa33d2dab
FBLazyVector: 023a2028f218d648b588348bfa9261b4914b93db
FBReactNativeSpec: 9f4902cc009389d3704ff75de2aa513dee34d5c2
Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d
FirebaseAnalytics: 7761cbadb00a717d8d0939363eb46041526474fa
FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1
@ -732,18 +732,18 @@ SPEC CHECKSUMS:
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
PromisesSwift: 99fddfe4a0ec88a56486644c0da106694c92a604
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
RCTRequired: b8caca023d386d43740dfb94c2cf68f695fa5e77
RCTTypeSafety: ec44ea1d6ad1e5cd6447b22159ff40c2ebbd23b1
React: 9f8c8afb9a9d61b7a1b01a1c6fb7f0d4f902988f
React-callinvoker: f813eee352cfd333208e8d67a72f584f5435769d
React-Codegen: 771562186fec8c7830897f97ca59de683abd3184
React-Core: 74670b4b715083e1c9003462f3f4fe32a70ba5c5
React-CoreModules: 34bd5b93e5322e60102a5ad78b992c882e558022
React-cxxreact: adc9fc6a9333ae779bd72effaf77173bd9f22bf7
React-jsi: ab91137ea7d92a86e48b6f15d3a5580bea471776
React-jsiexecutor: a5043e9e1e1bd13b80b58b228c6901b3721a4f54
React-jsinspector: 86e89b9f135787a2e8eb74b3fc00ec61e9a80ae1
React-logger: f790bd10f86b38012e108fb4b564023602702270
RCTRequired: e6003505912d056f21f64465063cf4b79418f2b9
RCTTypeSafety: d7ef4745c8d9c9faa65c26b4b6230fc5cd4c4424
React: 6692c30fb74ab29078b25c31c9841d863e08cdd9
React-callinvoker: fe2b234fa518d8bb7600707c536ab0a3e1f5edba
React-Codegen: 9964bb2422c7014894182ac50068caae05f68551
React-Core: a07bcd2f15ff93cddc9ceb07eddeec3d2ff8d990
React-CoreModules: 7fb4ee0fc35ad2b7daf775f0ef6309efdd8d3d82
React-cxxreact: 51a8058a35a2f02ad4175334a7cd24aa5558ced4
React-jsi: 69b974b418d2658a3f1799903be7cbcb8ac59755
React-jsiexecutor: 4f35a29798ba9d0d892a84001d11f626688dbb8e
React-jsinspector: 6f75220cd4b6020976d340ab21c63458dd3cad9e
React-logger: 7013d2499df6346e6a72802d4084badaaa82543b
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
@ -757,18 +757,18 @@ SPEC CHECKSUMS:
react-native-video: bb6f12a7198db53b261fefb5d609dc77417acc8b
react-native-webrtc: 4a4c31be61f88d1d3356526eebce72f462a6760e
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
React-perflogger: fa15d1d29ff7557ee25ea48f7f59e65896fb3215
React-RCTActionSheet: e83515333352a3cc19c146e3c7a63a8a9269da8f
React-RCTAnimation: 8032daa2846e3db7ac28c4c5a207d0bfb5e1e3ad
React-RCTBlob: fe40e206cebcb4f552e0ecdac3ef81b3baf3cb37
React-RCTImage: dfc0df14cbfec1ec54fdd4700b8fe3bf8127dde2
React-RCTLinking: ac9f65f0c8db738a6156ae7640ba92494b4770a5
React-RCTNetwork: cf289a0386a1bd057e5eabb8563dfe5ce0af868c
React-RCTSettings: 7889cfcf6c7d5738f3cb8889557a38eeea2f04ff
React-RCTText: fd249e1f8406fb6e35cc77a2b9ff66a3477bf41a
React-RCTVibration: f41f116aad644973f24653effb3db3de64fa0314
React-runtimeexecutor: 8cdd80915ed6dabf2221a689f1f7ddb50ea5e9f3
ReactCommon: 5b1b43a7d81a1ac4eec85f7c4db3283a14a3b13d
React-perflogger: 0b0500685176e53ea582c45179a653aa82e4ae49
React-RCTActionSheet: 38469be9d20242f9c717e43c2983e8e3e6c640c4
React-RCTAnimation: 93774f3e8857e7c3c1cbbd277056d02be4496be1
React-RCTBlob: 6d0567d7a6561b62feb8c3b1cc33b3c591ba85ab
React-RCTImage: 1006a91318a6181a0256b89d2e321b6ea0e2e6e3
React-RCTLinking: 0b2300493c879c3bcac2d4c6b0178e8d0e5e2202
React-RCTNetwork: b9a33a95703651abed92490e50396d54b7270a17
React-RCTSettings: e6464123e5b5062fc23bb5adb51188a6061e9601
React-RCTText: 188d6f0ae20cd28891f59ecad41028ee2f793757
React-RCTVibration: a67beb7d2f3c73e9b74c4124ef61b84c601be649
React-runtimeexecutor: 088723cf020113e64736a709f52719dbb359c73e
ReactCommon: 1a4f19f3b4366feec03a98bdbb200b6085c5000f
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
RNCAsyncStorage: ea6b5c280997b2b32a587793163b1f10e580c4f7
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
@ -781,7 +781,7 @@ SPEC CHECKSUMS:
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
RNSVG: f3b60aeeaa81960e2e0536c3a9eef50b667ef3a9
RNWatch: dae6c858a2051dbdcfb00b9a86cf4d90400263b4
Yoga: 2f6a78c58dcc2963bd8e34d96a4246d9dff2e3a7
Yoga: c926c8eec5c78a788b51e6c8a604825d00d694d7
PODFILE CHECKSUM: e671cdcdb80fab67e305861c36bfae8ed5a5b0ef

View File

@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>99.0.0</string>
<string>22.6.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>

View File

@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>99.0.0</string>
<string>22.6.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>

View File

@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>99.0.0</string>
<string>22.6.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>UISupportedInterfaceOrientations</key>

View File

@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>99.0.0</string>
<string>22.6.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CLKComplicationPrincipalClass</key>

View File

@ -35,14 +35,12 @@
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 */; };
4EBA6E61286072E300B31882 /* JitsiMeetViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EBA6E5F286072E300B31882 /* JitsiMeetViewController.h */; };
4EBA6E62286072E300B31882 /* JitsiMeetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EBA6E60286072E300B31882 /* JitsiMeetViewController.m */; };
4EBA6E652860B1E800B31882 /* JitsiMeetRenderingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EBA6E632860B1E800B31882 /* JitsiMeetRenderingView.h */; };
4EBA6E662860B1E800B31882 /* JitsiMeetRenderingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EBA6E642860B1E800B31882 /* JitsiMeetRenderingView.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 */; };
4EEC9630286C73A2008705FA /* JitsiMeetView+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EEC962E286C73A2008705FA /* JitsiMeetView+Private.h */; };
4EEC9631286C73A2008705FA /* JitsiMeetView+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EEC962F286C73A2008705FA /* JitsiMeetView+Private.m */; };
6F08DF7D4458EE3CF3F36F6D /* BuildFile 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 */; };
@ -70,20 +68,16 @@
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 */; };
DE9A0136289A9A9A00E41CBB /* JitsiMeetBaseLogHandler+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DE65AACB2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h */; };
DE9A0137289A9A9A00E41CBB /* JitsiMeetRenderingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EBA6E632860B1E800B31882 /* JitsiMeetRenderingView.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, ); }; };
DE9A013A289A9A9A00E41CBB /* JitsiMeetView+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EEC962E286C73A2008705FA /* JitsiMeetView+Private.h */; };
DE9A013B289A9A9A00E41CBB /* JitsiMeet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A013C289A9A9A00E41CBB /* JitsiMeetLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = DE81A2D22316AC4D00AE1940 /* JitsiMeetLogger.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A013D289A9A9A00E41CBB /* LogUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = DE65AAC92317FFCD00290BEC /* LogUtils.h */; };
DE9A013E289A9A9A00E41CBB /* JitsiMeetViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EBA6E5F286072E300B31882 /* JitsiMeetViewController.h */; };
DE9A013F289A9A9A00E41CBB /* JitsiMeetConferenceOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = DEAD3224220C497000E93636 /* JitsiMeetConferenceOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0140289A9A9A00E41CBB /* ExternalAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = C81E9AB825AC5AD800B134D9 /* ExternalAPI.h */; };
DE9A0141289A9A9A00E41CBB /* InfoPlistUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C8AFD27D2462C613000293D2 /* InfoPlistUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0143289A9A9A00E41CBB /* CallKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BB9AD7A1F5EC8F4001C08DB /* CallKit.m */; };
DE9A0144289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2DD2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m */; };
DE9A0145289A9A9A00E41CBB /* JitsiMeetRenderingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EBA6E642860B1E800B31882 /* JitsiMeetRenderingView.m */; };
DE9A0146289A9A9A00E41CBB /* JitsiAudioSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */; };
DE9A0147289A9A9A00E41CBB /* AppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BB9AD7C1F60356D001C08DB /* AppInfo.m */; };
DE9A0148289A9A9A00E41CBB /* LogBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2D72316AC7600AE1940 /* LogBridge.m */; };
@ -99,10 +93,8 @@
DE9A0152289A9A9A00E41CBB /* AudioMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495C1EC4B6C600B793EE /* AudioMode.m */; };
DE9A0153289A9A9A00E41CBB /* Proximity.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495E1EC4B6C600B793EE /* Proximity.m */; };
DE9A0155289A9A9A00E41CBB /* ReactUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DEFE535521FB2E8300011A3A /* ReactUtils.m */; };
DE9A0156289A9A9A00E41CBB /* JitsiMeetView+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EEC962F286C73A2008705FA /* JitsiMeetView+Private.m */; };
DE9A0157289A9A9A00E41CBB /* DragGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6A3425E204EF76800E062DD /* DragGestureController.swift */; };
DE9A0158289A9A9A00E41CBB /* ScheenshareEventEmiter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */; };
DE9A015A289A9A9A00E41CBB /* JitsiMeetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EBA6E60286072E300B31882 /* JitsiMeetViewController.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 */; };
@ -148,15 +140,11 @@
4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JMCallKitProxy.m; sourceTree = "<group>"; };
4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScheenshareEventEmiter.h; sourceTree = "<group>"; };
4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScheenshareEventEmiter.m; sourceTree = "<group>"; };
4EBA6E5F286072E300B31882 /* JitsiMeetViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeetViewController.h; sourceTree = "<group>"; };
4EBA6E60286072E300B31882 /* JitsiMeetViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JitsiMeetViewController.m; sourceTree = "<group>"; };
4EBA6E632860B1E800B31882 /* JitsiMeetRenderingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeetRenderingView.h; sourceTree = "<group>"; };
4EBA6E642860B1E800B31882 /* JitsiMeetRenderingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JitsiMeetRenderingView.m; sourceTree = "<group>"; };
4E812F3228F9A4290087ACC9 /* JitsiMeetView+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JitsiMeetView+Private.h"; sourceTree = "<group>"; };
4E812F3628F9A4ED0087ACC9 /* JitsiMeetView+Private.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "JitsiMeetView+Private.m"; sourceTree = "<group>"; };
4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiAudioSession.h; sourceTree = "<group>"; };
4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JitsiAudioSession.m; sourceTree = "<group>"; };
4ED4FFF52721BAE10074E620 /* JitsiAudioSession+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JitsiAudioSession+Private.h"; sourceTree = "<group>"; };
4EEC962E286C73A2008705FA /* JitsiMeetView+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JitsiMeetView+Private.h"; sourceTree = "<group>"; };
4EEC962F286C73A2008705FA /* JitsiMeetView+Private.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "JitsiMeetView+Private.m"; sourceTree = "<group>"; };
86389F55993FAAF6AEB3FA3E /* Pods-JitsiMeetSDKLite.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeetSDKLite.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite.release.xcconfig"; sourceTree = "<group>"; };
891FE43DAD30BC8976683100 /* Pods-JitsiMeetSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeetSDK.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK.release.xcconfig"; sourceTree = "<group>"; };
8F48C340DE0D91D1012976C5 /* Pods-JitsiMeetSDKLite.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeetSDKLite.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite.debug.xcconfig"; sourceTree = "<group>"; };
@ -281,14 +269,10 @@
DE81A2DC2317ED5400AE1940 /* JitsiMeetBaseLogHandler.h */,
DE65AACB2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h */,
DE81A2DD2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m */,
4E812F3228F9A4290087ACC9 /* JitsiMeetView+Private.h */,
4E812F3628F9A4ED0087ACC9 /* JitsiMeetView+Private.m */,
0B412F161EDEC65D00B1A0A6 /* JitsiMeetView.h */,
4EEC962E286C73A2008705FA /* JitsiMeetView+Private.h */,
4EEC962F286C73A2008705FA /* JitsiMeetView+Private.m */,
0B412F171EDEC65D00B1A0A6 /* JitsiMeetView.m */,
4EBA6E632860B1E800B31882 /* JitsiMeetRenderingView.h */,
4EBA6E642860B1E800B31882 /* JitsiMeetRenderingView.m */,
4EBA6E5F286072E300B31882 /* JitsiMeetViewController.h */,
4EBA6E60286072E300B31882 /* JitsiMeetViewController.m */,
DE81A2D72316AC7600AE1940 /* LogBridge.m */,
DE65AAC92317FFCD00290BEC /* LogUtils.h */,
DEAFA777229EAD3B0033A7FA /* RNRootView.h */,
@ -383,20 +367,18 @@
DEA9F284258A5D9900D4CD74 /* JitsiMeetSDK.h in Headers */,
4E51B76425E5345E0038575A /* ScheenshareEventEmiter.h in Headers */,
DE65AACC2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h in Headers */,
4EBA6E652860B1E800B31882 /* JitsiMeetRenderingView.h in Headers */,
0B412F221EDEF6EA00B1A0A6 /* JitsiMeetViewDelegate.h in Headers */,
4E0EF63528CA317E005D1B03 /* JMCallKitListener.h in Headers */,
4E0EF63028CA2FB3005D1B03 /* JMCallKitEmitter.h in Headers */,
4ED4FFF32721B9B90074E620 /* JitsiAudioSession.h in Headers */,
4E0EF63928CA4069005D1B03 /* JMCallKitProxy.h in Headers */,
4EEC9630286C73A2008705FA /* JitsiMeetView+Private.h in Headers */,
0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */,
DE81A2D42316AC4D00AE1940 /* JitsiMeetLogger.h in Headers */,
DE65AACA2317FFCD00290BEC /* LogUtils.h in Headers */,
4EBA6E61286072E300B31882 /* JitsiMeetViewController.h in Headers */,
DEAD3226220C497000E93636 /* JitsiMeetConferenceOptions.h in Headers */,
C81E9AB925AC5AD800B134D9 /* ExternalAPI.h in Headers */,
C8AFD27F2462C613000293D2 /* InfoPlistUtil.h in Headers */,
4E812F3328F9A4290087ACC9 /* JitsiMeetView+Private.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -411,20 +393,18 @@
DE9A0134289A9A9A00E41CBB /* JitsiMeetSDK.h in Headers */,
DE9A0135289A9A9A00E41CBB /* ScheenshareEventEmiter.h in Headers */,
DE9A0136289A9A9A00E41CBB /* JitsiMeetBaseLogHandler+Private.h in Headers */,
DE9A0137289A9A9A00E41CBB /* JitsiMeetRenderingView.h in Headers */,
DE9A0138289A9A9A00E41CBB /* JitsiMeetViewDelegate.h in Headers */,
4E0EF63628CA317E005D1B03 /* JMCallKitListener.h in Headers */,
4E0EF63128CA2FB3005D1B03 /* JMCallKitEmitter.h in Headers */,
DE9A0139289A9A9A00E41CBB /* JitsiAudioSession.h in Headers */,
4E0EF63A28CA4069005D1B03 /* JMCallKitProxy.h in Headers */,
DE9A013A289A9A9A00E41CBB /* JitsiMeetView+Private.h in Headers */,
DE9A013B289A9A9A00E41CBB /* JitsiMeet.h in Headers */,
DE9A013C289A9A9A00E41CBB /* JitsiMeetLogger.h in Headers */,
DE9A013D289A9A9A00E41CBB /* LogUtils.h in Headers */,
DE9A013E289A9A9A00E41CBB /* JitsiMeetViewController.h in Headers */,
DE9A013F289A9A9A00E41CBB /* JitsiMeetConferenceOptions.h in Headers */,
DE9A0140289A9A9A00E41CBB /* ExternalAPI.h in Headers */,
DE9A0141289A9A9A00E41CBB /* InfoPlistUtil.h in Headers */,
4E812F3428F9A4290087ACC9 /* JitsiMeetView+Private.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -686,8 +666,8 @@
0BB9AD7B1F5EC8F4001C08DB /* CallKit.m in Sources */,
DE81A2DF2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m in Sources */,
4E0EF63B28CA4069005D1B03 /* JMCallKitProxy.m in Sources */,
4EBA6E662860B1E800B31882 /* JitsiMeetRenderingView.m in Sources */,
4ED4FFF42721B9B90074E620 /* JitsiAudioSession.m in Sources */,
4E812F3928F9A4ED0087ACC9 /* JitsiMeetView+Private.m in Sources */,
0BB9AD7D1F60356D001C08DB /* AppInfo.m in Sources */,
DE81A2D92316AC7600AE1940 /* LogBridge.m in Sources */,
DEAFA779229EAD520033A7FA /* RNRootView.m in Sources */,
@ -703,11 +683,9 @@
0BCA49611EC4B6C600B793EE /* Proximity.m in Sources */,
4E0EF63228CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */,
DEFE535621FB2E8300011A3A /* ReactUtils.m in Sources */,
4EEC9631286C73A2008705FA /* JitsiMeetView+Private.m in Sources */,
C6A34261204EF76800E062DD /* DragGestureController.swift in Sources */,
4E51B76525E5345E0038575A /* ScheenshareEventEmiter.m in Sources */,
A4A934E9212F3ADB001E9388 /* Dropbox.m in Sources */,
4EBA6E62286072E300B31882 /* JitsiMeetViewController.m in Sources */,
DE81A2D52316AC4D00AE1940 /* JitsiMeetLogger.m in Sources */,
0B412F191EDEC65D00B1A0A6 /* JitsiMeetView.m in Sources */,
DEFE535421FB1BF800011A3A /* JitsiMeet.m in Sources */,
@ -721,7 +699,6 @@
files = (
DE9A0143289A9A9A00E41CBB /* CallKit.m in Sources */,
DE9A0144289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.m in Sources */,
DE9A0145289A9A9A00E41CBB /* JitsiMeetRenderingView.m in Sources */,
DE9A0146289A9A9A00E41CBB /* JitsiAudioSession.m in Sources */,
4E0EF63C28CA4069005D1B03 /* JMCallKitProxy.m in Sources */,
DE9A0147289A9A9A00E41CBB /* AppInfo.m in Sources */,
@ -737,11 +714,10 @@
DE9A0151289A9A9A00E41CBB /* LocaleDetector.m in Sources */,
DE9A0152289A9A9A00E41CBB /* AudioMode.m in Sources */,
DE9A0153289A9A9A00E41CBB /* Proximity.m in Sources */,
4E812F3A28F9A4ED0087ACC9 /* JitsiMeetView+Private.m in Sources */,
DE9A0155289A9A9A00E41CBB /* ReactUtils.m in Sources */,
DE9A0156289A9A9A00E41CBB /* JitsiMeetView+Private.m in Sources */,
DE9A0157289A9A9A00E41CBB /* DragGestureController.swift in Sources */,
DE9A0158289A9A9A00E41CBB /* ScheenshareEventEmiter.m in Sources */,
DE9A015A289A9A9A00E41CBB /* JitsiMeetViewController.m in Sources */,
DE9A015C289A9A9A00E41CBB /* JitsiMeetLogger.m in Sources */,
4E0EF63328CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */,
DE9A015E289A9A9A00E41CBB /* JitsiMeetView.m in Sources */,

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>99.0.0</string>
<string>6.2.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>

View File

@ -57,8 +57,8 @@
openURL:(NSURL *_Nonnull)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *_Nonnull)options;
- (UIInterfaceOrientationMask)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window;
- (UIInterfaceOrientationMask)application:(UIApplication *_Nonnull)application
supportedInterfaceOrientationsForWindow:(UIWindow *_Nonnull)window;
#pragma mark - Utility methods

View File

@ -1,30 +0,0 @@
/*
* Copyright @ 2022-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 <UIKit/UIKit.h>
#import "JitsiMeetViewDelegate.h"
NS_ASSUME_NONNULL_BEGIN
@interface JitsiMeetRenderingView : UIView
@property (nonatomic, assign) BOOL isPiPEnabled;
- (void)setProps:(NSDictionary *_Nonnull)newProps;
@end
NS_ASSUME_NONNULL_END

View File

@ -1,83 +0,0 @@
/*
* Copyright @ 2022-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.
*/
#include <mach/mach_time.h>
#import "JitsiMeetRenderingView.h"
#import "ReactUtils.h"
#import "RNRootView.h"
#import "JitsiMeet+Private.h"
/**
* Backwards compatibility: turn the boolean prop into a feature flag.
*/
static NSString *const PiPEnabledFeatureFlag = @"pip.enabled";
@interface JitsiMeetRenderingView ()
@end
@implementation JitsiMeetRenderingView {
/**
* React Native view where the entire content will be rendered.
*/
RNRootView *rootView;
}
/**
* Passes the given props to the React Native application. The props which we pass
* are a combination of 3 different sources:
*
* - JitsiMeet.defaultConferenceOptions
* - This function's parameters
* - Some extras which are added by this function
*/
- (void)setProps:(NSDictionary *_Nonnull)newProps {
NSMutableDictionary *props = mergeProps([[JitsiMeet sharedInstance] getDefaultProps], newProps);
// Set the PiP flag if it wasn't manually set.
NSMutableDictionary *featureFlags = props[@"flags"];
// TODO: temporary implementation
if (featureFlags[PiPEnabledFeatureFlag] == nil) {
featureFlags[PiPEnabledFeatureFlag] = @(self.isPiPEnabled);
}
// This method is supposed to be imperative i.e. a second
// invocation with one and the same URL is expected to join the respective
// conference again if the first invocation was followed by leaving the
// conference. However, React and, respectively,
// appProperties/initialProperties are declarative expressions i.e. one and
// the same URL will not trigger an automatic re-render in the JavaScript
// source code. The workaround implemented below introduces imperativeness
// in React Component props by defining a unique value per invocation.
props[@"timestamp"] = @(mach_absolute_time());
if (rootView) {
// Update props with the new URL.
rootView.appProperties = props;
} else {
RCTBridge *bridge = [[JitsiMeet sharedInstance] getReactBridge];
rootView = [[RNRootView alloc] initWithBridge:bridge
moduleName:@"App"
initialProperties:props];
rootView.backgroundColor = self.backgroundColor;
// Add rootView as a subview which completely covers this one.
[rootView setFrame:[self bounds]];
rootView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview:rootView];
}
}
@end

View File

@ -20,22 +20,23 @@
#import "ExternalAPI.h"
#import "JitsiMeet+Private.h"
#import "JitsiMeetConferenceOptions+Private.h"
#import "JitsiMeetView.h"
#import "JitsiMeetViewController.h"
#import "JitsiMeetView+Private.h"
#import "ReactUtils.h"
#import "RNRootView.h"
@interface JitsiMeetView ()
@property (nonatomic, strong) JitsiMeetViewController *jitsiMeetViewController;
@property (nonatomic, strong) UINavigationController *navController;
@property (nonatomic, readonly) BOOL isPiPEnabled;
/**
* Backwards compatibility: turn the boolean prop into a feature flag.
*/
static NSString *const PiPEnabledFeatureFlag = @"pip.enabled";
@end
@implementation JitsiMeetView
@dynamic isPiPEnabled;
@implementation JitsiMeetView {
/**
* React Native view where the entire content will be rendered.
*/
RNRootView *rootView;
}
#pragma mark Initializers
@ -66,10 +67,6 @@
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
/**
* Internal initialization:
*
@ -77,57 +74,72 @@
* - initializes the external API scope
*/
- (void)initWithXXX {
self.jitsiMeetViewController = [[JitsiMeetViewController alloc] init];
self.jitsiMeetViewController.view.frame = [self bounds];
[self addSubview:self.jitsiMeetViewController.view];
// Set a background color which is in accord with the JavaScript and Android
// parts of the application and causes less perceived visual flicker than
// the default background color.
self.backgroundColor
= [UIColor colorWithRed:.07f green:.07f blue:.07f alpha:1];
[self registerObservers];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark API
- (void)join:(JitsiMeetConferenceOptions *)options {
[self.jitsiMeetViewController join:options withPiP:self.isPiPEnabled];
[self setProps:options == nil ? @{} : [options asProps]];
}
- (void)leave {
[self.jitsiMeetViewController leave];
[self setProps:@{}];
}
- (void)hangUp {
[self.jitsiMeetViewController hangUp];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendHangUp];
}
- (void)setAudioMuted:(BOOL)muted {
[self.jitsiMeetViewController setAudioMuted:muted];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendSetAudioMuted:muted];
}
- (void)sendEndpointTextMessage:(NSString * _Nonnull)message :(NSString * _Nullable)to {
[self.jitsiMeetViewController sendEndpointTextMessage:message :to];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendEndpointTextMessage:message :to];
}
- (void)toggleScreenShare:(BOOL)enabled {
[self.jitsiMeetViewController toggleScreenShare:enabled];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI toggleScreenShare:enabled];
}
- (void)retrieveParticipantsInfo:(void (^ _Nonnull)(NSArray * _Nullable))completionHandler {
[self.jitsiMeetViewController retrieveParticipantsInfo:completionHandler];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI retrieveParticipantsInfo:completionHandler];
}
- (void)openChat:(NSString*)to {
[self.jitsiMeetViewController openChat:to];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI openChat:to];
}
- (void)closeChat {
[self.jitsiMeetViewController closeChat];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI closeChat];
}
- (void)sendChatMessage:(NSString * _Nonnull)message :(NSString * _Nullable)to {
[self.jitsiMeetViewController sendChatMessage:message :to];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendChatMessage:message :to];
}
- (void)setVideoMuted:(BOOL)muted {
[self.jitsiMeetViewController setVideoMuted:muted];
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendSetVideoMuted:muted];
}
- (void)setClosedCaptionsEnabled:(BOOL)enabled {
@ -135,47 +147,97 @@
[externalAPI sendSetClosedCaptionsEnabled:enabled];
}
#pragma mark Private
- (BOOL)isPiPEnabled {
return self.delegate && [self.delegate respondsToSelector:@selector(enterPictureInPicture:)];
}
#pragma mark Private methods
- (void)registerObservers {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUpdateViewPropsNotification:) name:updateViewPropsNotificationName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSendEventNotification:) name:sendEventNotificationName object:nil];
}
- (void)handleUpdateViewPropsNotification:(NSNotification *)notification {
NSDictionary *props = [notification.userInfo objectForKey:@"props"];
[self setProps:props];
}
- (void)handleSendEventNotification:(NSNotification *)notification {
NSString *eventName = notification.userInfo[@"name"];
NSString *eventData = notification.userInfo[@"data"];
SEL sel = NSSelectorFromString([self methodNameFromEventName:eventName]);
SEL sel = NSSelectorFromString([self methodNameFromEventName:eventName]);
if (sel && [self.delegate respondsToSelector:sel]) {
[self.delegate performSelector:sel withObject:eventData];
}
}
/**
* Converts a specific event name i.e. redux action type description to a
* method name.
* Converts a specific event name i.e. redux action type description to a
* method name.
*
* @param eventName The event name to convert to a method name.
* @return A method name constructed from the specified `eventName`.
*/
- (NSString *)methodNameFromEventName:(NSString *)eventName {
NSMutableString *methodName
= [NSMutableString stringWithCapacity:eventName.length];
for (NSString *c in [eventName componentsSeparatedByString:@"_"]) {
if (c.length) {
[methodName appendString:
methodName.length ? c.capitalizedString : c.lowercaseString];
}
}
[methodName appendString:@":"];
return methodName;
}
/**
* Passes the given props to the React Native application. The props which we pass
* are a combination of 3 different sources:
*
* @param eventName The event name to convert to a method name.
* @return A method name constructed from the specified `eventName`.
* - JitsiMeet.defaultConferenceOptions
* - This function's parameters
* - Some extras which are added by this function
*/
- (NSString *)methodNameFromEventName:(NSString *)eventName {
NSMutableString *methodName
= [NSMutableString stringWithCapacity:eventName.length];
- (void)setProps:(NSDictionary *_Nonnull)newProps {
NSMutableDictionary *props = mergeProps([[JitsiMeet sharedInstance] getDefaultProps], newProps);
for (NSString *c in [eventName componentsSeparatedByString:@"_"]) {
if (c.length) {
[methodName appendString:
methodName.length ? c.capitalizedString : c.lowercaseString];
}
}
[methodName appendString:@":"];
// Set the PiP flag if it wasn't manually set.
NSMutableDictionary *featureFlags = props[@"flags"];
if (featureFlags[PiPEnabledFeatureFlag] == nil) {
featureFlags[PiPEnabledFeatureFlag]
= [NSNumber numberWithBool:
self.delegate && [self.delegate respondsToSelector:@selector(enterPictureInPicture:)]];
}
return methodName;
// This method is supposed to be imperative i.e. a second
// invocation with one and the same URL is expected to join the respective
// conference again if the first invocation was followed by leaving the
// conference. However, React and, respectively,
// appProperties/initialProperties are declarative expressions i.e. one and
// the same URL will not trigger an automatic re-render in the JavaScript
// source code. The workaround implemented below introduces imperativeness
// in React Component props by defining a unique value per invocation.
props[@"timestamp"] = @(mach_absolute_time());
if (rootView) {
// Update props with the new URL.
rootView.appProperties = props;
} else {
RCTBridge *bridge = [[JitsiMeet sharedInstance] getReactBridge];
rootView
= [[RNRootView alloc] initWithBridge:bridge
moduleName:@"App"
initialProperties:props];
rootView.backgroundColor = self.backgroundColor;
// Add rootView as a subview which completely covers this one.
[rootView setFrame:[self bounds]];
rootView.autoresizingMask
= UIViewAutoresizingFlexibleWidth
| UIViewAutoresizingFlexibleHeight;
[self addSubview:rootView];
}
}
@end

View File

@ -1,38 +0,0 @@
/*
* Copyright @ 2022-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 <UIKit/UIKit.h>
#import "JitsiMeetConferenceOptions.h"
NS_ASSUME_NONNULL_BEGIN
@interface JitsiMeetViewController : UIViewController
- (void)join:(JitsiMeetConferenceOptions *)options withPiP:(BOOL)enablePiP;
- (void)leave;
- (void)hangUp;
- (void)setAudioMuted:(BOOL)muted;
- (void)sendEndpointTextMessage:(NSString * _Nonnull)message :(NSString * _Nullable)to;
- (void)toggleScreenShare:(BOOL)enabled;
- (void)retrieveParticipantsInfo:(void (^ _Nonnull)(NSArray * _Nullable))completionHandler;
- (void)openChat:(NSString*)to;
- (void)closeChat;
- (void)sendChatMessage:(NSString * _Nonnull)message :(NSString * _Nullable)to;
- (void)setVideoMuted:(BOOL)muted;
@end
NS_ASSUME_NONNULL_END

View File

@ -1,127 +0,0 @@
/*
* Copyright @ 2022-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 "JitsiMeetViewController.h"
#import "JitsiMeet+Private.h"
#import "JitsiMeetConferenceOptions+Private.h"
#import "JitsiMeetRenderingView.h"
#import "JitsiMeetView+Private.h"
@interface JitsiMeetViewController ()
@property (strong, nonatomic) JitsiMeetRenderingView *view;
@end
@implementation JitsiMeetViewController
@dynamic view;
- (instancetype)init {
self = [super init];
if (self) {
[self registerObservers];
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)loadView {
[super loadView];
self.view = [[JitsiMeetRenderingView alloc] init];
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Set a background color which is in accord with the JavaScript and Android
// parts of the application and causes less perceived visual flicker than
// the default background color.
self.view.backgroundColor = [UIColor colorWithRed:.07f green:.07f blue:.07f alpha:1];
}
- (void)join:(JitsiMeetConferenceOptions *)options withPiP:(BOOL)enablePiP {
self.view.isPiPEnabled = enablePiP;
[self.view setProps:options == nil ? @{} : [options asProps]];
}
- (void)leave {
[self.view setProps:@{}];
}
- (void)hangUp {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendHangUp];
}
- (void)setAudioMuted:(BOOL)muted {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendSetAudioMuted:muted];
}
- (void)sendEndpointTextMessage:(NSString * _Nonnull)message :(NSString * _Nullable)to {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendEndpointTextMessage:message :to];
}
- (void)toggleScreenShare:(BOOL)enabled {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI toggleScreenShare:enabled];
}
- (void)retrieveParticipantsInfo:(void (^ _Nonnull)(NSArray * _Nullable))completionHandler {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI retrieveParticipantsInfo:completionHandler];
}
- (void)openChat:(NSString*)to {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI openChat:to];
}
- (void)closeChat {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI closeChat];
}
- (void)sendChatMessage:(NSString * _Nonnull)message :(NSString * _Nullable)to {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendChatMessage:message :to];
}
- (void)setVideoMuted:(BOOL)muted {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendSetVideoMuted:muted];
}
#pragma mark Private
- (void)registerObservers {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUpdateViewPropsNotification:) name:updateViewPropsNotificationName object:nil];
}
- (void)handleUpdateViewPropsNotification:(NSNotification *)notification {
NSDictionary *props = [notification.userInfo objectForKey:@"props"];
[self.view setProps:props];
}
@end

View File

@ -253,7 +253,7 @@ static CXProviderConfiguration *_providerConfiguration = nil;
// XXX keep track of muted actions to avoid "ping-pong"ing. See
// JMCallKitEmitter for details on the CXSetMutedCallAction handling.
for (CXAction *action in transaction.actions) {
if ([CXAction isKindOfClass:[CXSetMutedCallAction class]]) {
if ([action isKindOfClass:[CXSetMutedCallAction class]]) {
[self.emitter addMuteAction:action.UUID];
}
}

View File

@ -96,7 +96,7 @@
"messageAccessibleTitleMe": "me says:",
"messageTo": "Private message to {{recipient}}",
"messagebox": "Type a message",
"newMessages": "new messages",
"newMessages": "New messages",
"nickname": {
"popover": "Choose a nickname",
"title": "Enter a nickname to use chat",

46
package-lock.json generated
View File

@ -88,7 +88,7 @@
"react-focus-lock": "2.5.1",
"react-i18next": "10.11.4",
"react-linkify": "1.0.0-alpha",
"react-native": "0.68.3",
"react-native": "0.68.4",
"react-native-background-timer": "2.4.1",
"react-native-calendar-events": "2.2.0",
"react-native-callstats": "3.73.7",
@ -15759,9 +15759,9 @@
}
},
"node_modules/promise": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
"integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz",
"integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==",
"dependencies": {
"asap": "~2.0.6"
}
@ -16096,9 +16096,9 @@
}
},
"node_modules/react-native": {
"version": "0.68.3",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.3.tgz",
"integrity": "sha512-LPgLQ4e96NWCrJPKlXzKfvlg1ddhfUplsEg00/cfBIMFZPJn2inzo9Rym8I/JYjmRORe4GjGY8kOem72hPm0Lw==",
"version": "0.68.4",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.4.tgz",
"integrity": "sha512-Hp5qwztQ1XNnV43QTz1kUx33iZHmJqbbe7L19V9psaWtX/h9j6SEtZ3UHBrigIPlppkIP1E5x3CDr9FdD4d6CA==",
"dependencies": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^7.0.3",
@ -16120,9 +16120,9 @@
"metro-source-map": "0.67.0",
"nullthrows": "^1.1.1",
"pretty-format": "^26.5.2",
"promise": "^8.0.3",
"promise": "^8.2.0",
"react-devtools-core": "^4.23.0",
"react-native-codegen": "^0.0.17",
"react-native-codegen": "^0.0.18",
"react-native-gradle-plugin": "^0.0.6",
"react-refresh": "^0.4.0",
"react-shallow-renderer": "16.14.1",
@ -16169,9 +16169,9 @@
}
},
"node_modules/react-native-codegen": {
"version": "0.0.17",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.17.tgz",
"integrity": "sha512-7GIEUmAemH9uWwB6iYXNNsPoPgH06pxzGRmdBzK98TgFBdYJZ7CBuZFPMe4jmHQTPOkQazKZ/w5O6/71JBixmw==",
"version": "0.0.18",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.18.tgz",
"integrity": "sha512-XPI9aVsFy3dvgDZvyGWrFnknNiyb22kg5nHgxa0vjWTH9ENLBgVRZt9A64xHZ8BYihH+gl0p/1JNOCIEUzRPBg==",
"dependencies": {
"@babel/parser": "^7.14.0",
"flow-parser": "^0.121.0",
@ -32227,9 +32227,9 @@
"dev": true
},
"promise": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
"integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz",
"integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==",
"requires": {
"asap": "~2.0.6"
}
@ -32478,9 +32478,9 @@
}
},
"react-native": {
"version": "0.68.3",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.3.tgz",
"integrity": "sha512-LPgLQ4e96NWCrJPKlXzKfvlg1ddhfUplsEg00/cfBIMFZPJn2inzo9Rym8I/JYjmRORe4GjGY8kOem72hPm0Lw==",
"version": "0.68.4",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.4.tgz",
"integrity": "sha512-Hp5qwztQ1XNnV43QTz1kUx33iZHmJqbbe7L19V9psaWtX/h9j6SEtZ3UHBrigIPlppkIP1E5x3CDr9FdD4d6CA==",
"requires": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^7.0.3",
@ -32502,9 +32502,9 @@
"metro-source-map": "0.67.0",
"nullthrows": "^1.1.1",
"pretty-format": "^26.5.2",
"promise": "^8.0.3",
"promise": "^8.2.0",
"react-devtools-core": "^4.23.0",
"react-native-codegen": "^0.0.17",
"react-native-codegen": "^0.0.18",
"react-native-gradle-plugin": "^0.0.6",
"react-refresh": "^0.4.0",
"react-shallow-renderer": "16.14.1",
@ -32536,9 +32536,9 @@
}
},
"react-native-codegen": {
"version": "0.0.17",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.17.tgz",
"integrity": "sha512-7GIEUmAemH9uWwB6iYXNNsPoPgH06pxzGRmdBzK98TgFBdYJZ7CBuZFPMe4jmHQTPOkQazKZ/w5O6/71JBixmw==",
"version": "0.0.18",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.18.tgz",
"integrity": "sha512-XPI9aVsFy3dvgDZvyGWrFnknNiyb22kg5nHgxa0vjWTH9ENLBgVRZt9A64xHZ8BYihH+gl0p/1JNOCIEUzRPBg==",
"requires": {
"@babel/parser": "^7.14.0",
"flow-parser": "^0.121.0",

View File

@ -93,7 +93,7 @@
"react-focus-lock": "2.5.1",
"react-i18next": "10.11.4",
"react-linkify": "1.0.0-alpha",
"react-native": "0.68.3",
"react-native": "0.68.4",
"react-native-background-timer": "2.4.1",
"react-native-calendar-events": "2.2.0",
"react-native-callstats": "3.73.7",

View File

@ -1,3 +1,19 @@
diff --git a/node_modules/react-native/React/CoreModules/RCTDeviceInfo.mm b/node_modules/react-native/React/CoreModules/RCTDeviceInfo.mm
index 8e21fa5..f9dfb5f 100644
--- a/node_modules/react-native/React/CoreModules/RCTDeviceInfo.mm
+++ b/node_modules/react-native/React/CoreModules/RCTDeviceInfo.mm
@@ -70,6 +70,11 @@ - (void)initialize
object:nil];
}
+- (void)dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
static BOOL RCTIsIPhoneX()
{
static BOOL isIPhoneX = NO;
diff --git a/node_modules/react-native/React/CoreModules/RCTTiming.mm b/node_modules/react-native/React/CoreModules/RCTTiming.mm
index 13d0d57..00e5d4c 100644
--- a/node_modules/react-native/React/CoreModules/RCTTiming.mm

View File

@ -27,6 +27,7 @@ import {
navigateRoot
} from '../mobile/navigation/rootNavigationContainerRef';
import { screen } from '../mobile/navigation/routes';
import { clearNotifications } from '../notifications';
import { setFatalError } from '../overlay';
import { getDefaultURL } from './functions';
@ -138,6 +139,7 @@ export function appNavigate(uri?: string) {
if (room) {
dispatch(createDesiredLocalTracks());
dispatch(clearNotifications());
if (isPrejoinPageEnabled(getState())) {
navigateRoot(screen.preJoin);

View File

@ -52,11 +52,14 @@ const INITIAL_RN_STATE: IConfig = {
disableAudioLevels: true,
p2p: {
preferredCodec: 'VP8'
preferredCodec: 'h264'
},
videoQuality: {
preferredCodec: 'VP8'
// FIXME: Mobile codecs should probably be configurable separately, rather
// than requiring this override here...
enforcePreferredCodec: true,
preferredCodec: 'vp8'
}
};

View File

@ -2,13 +2,11 @@ import { StyleSheet } from 'react-native';
import BaseTheme from '../../../../base/ui/components/BaseTheme.native';
import { ColorSchemeRegistry, schemeColor } from '../../../color-scheme';
import { BoxModel, ColorPalette } from '../../../styles';
import { BoxModel } from '../../../styles';
import { PREFERRED_DIALOG_SIZE } from '../../constants';
const BORDER_RADIUS = 5;
export const FIELD_UNDERLINE = ColorPalette.transparent;
/**
* NOTE: These Material guidelines based values are currently only used in
* dialogs (and related) but later on it would be nice to export it into a base
@ -16,7 +14,7 @@ export const FIELD_UNDERLINE = ColorPalette.transparent;
*/
export const MD_FONT_SIZE = 16;
export const MD_ITEM_HEIGHT = 48;
export const MD_ITEM_MARGIN_PADDING = 16;
export const MD_ITEM_MARGIN_PADDING = BaseTheme.spacing[3];
/**
* Reusable (colored) style for text in any branded dialogs.
@ -28,7 +26,7 @@ const brandedDialogText = {
};
const brandedDialogLabelStyle = {
color: ColorPalette.white,
color: BaseTheme.palette.text01,
flexShrink: 1,
fontSize: MD_FONT_SIZE,
opacity: 0.90
@ -41,7 +39,7 @@ const brandedDialogItemContainerStyle = {
};
const brandedDialogIconStyle = {
color: ColorPalette.white,
color: BaseTheme.palette.icon01,
fontSize: 24
};
@ -61,7 +59,7 @@ export const inputDialog = {
*/
export const bottomSheetStyles = {
sheetAreaCover: {
backgroundColor: ColorPalette.transparent,
backgroundColor: 'transparent',
flex: 1
},
@ -115,7 +113,7 @@ export const bottomSheetStyles = {
/**
* Additional style that is not directly used as a style object.
*/
underlayColor: ColorPalette.toggled
underlayColor: BaseTheme.palette.underlay01
},
/**

View File

@ -1,7 +1,6 @@
// @flow
import React from 'react';
import { ScrollView, View } from 'react-native';
import { View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { StyleType } from '../../styles';
@ -20,7 +19,7 @@ type Props = {
/**
* The children component(s) of the Modal, to be rendered.
*/
children: React$Node,
children: React.ReactNode,
/**
* Disabled forced keyboard dismiss?
@ -47,11 +46,6 @@ type Props = {
*/
safeAreaInsets?: Array,
/**
* Enable scroll for JitsiScreen.
*/
scrollEnabled?: boolean,
/**
* Additional style to be appended to the KeyboardAvoidingView containing the content of the modal.
*/
@ -66,7 +60,6 @@ const JitsiScreen = ({
hasBottomTextInput = false,
disableForcedKeyboardDismiss = false,
safeAreaInsets = [ 'left', 'right' ],
scrollEnabled = false,
style
}: Props) => {
const renderContent = () => (
@ -85,16 +78,6 @@ const JitsiScreen = ({
</JitsiKeyboardAvoidingView>
);
if (scrollEnabled) {
return (
<ScrollView
bounces = { false }
style = { styles.jitsiScreenContainer }>
{ renderContent() }
</ScrollView>
);
}
return (
<View style = { styles.jitsiScreenContainer }>
{ renderContent() }

View File

@ -1,6 +1,3 @@
// @flow
import { ColorSchemeRegistry, schemeColor } from '../../color-scheme';
export default {
@ -12,10 +9,3 @@ export default {
flex: 1
}
};
ColorSchemeRegistry.register('Modal', {
page: {
alignItems: 'stretch',
backgroundColor: schemeColor('background')
}
});

View File

@ -15,6 +15,7 @@ import styles from './buttonStyles';
export interface IButtonProps extends ButtonProps {
color?: string;
contentStyle?: Object | undefined;
labelStyle?: Object | undefined;
style?: Object | undefined;
}
@ -22,6 +23,7 @@ export interface IButtonProps extends ButtonProps {
const Button: React.FC<IButtonProps> = ({
accessibilityLabel,
color: buttonColor,
contentStyle,
disabled,
icon,
labelKey,
@ -88,6 +90,10 @@ const Button: React.FC<IButtonProps> = ({
accessibilityLabel = { t(accessibilityLabel ?? '') }
children = { t(labelKey ?? '') }
color = { color }
contentStyle = { [
styles.buttonContent,
contentStyle
] }
disabled = { disabled }
// @ts-ignore
icon = { icon }

View File

@ -23,6 +23,10 @@ export default {
...buttonLabel
},
buttonContent: {
height: BUTTON_HEIGHT
},
buttonLabelDisabled: {
...buttonLabel,
color: BaseTheme.palette.text03

View File

@ -16,6 +16,7 @@ import AbstractMessageRecipient, {
type Props as AbstractProps
} from '../AbstractMessageRecipient';
type Props = AbstractProps & {
/**
@ -132,7 +133,8 @@ class MessageRecipient extends AbstractMessageRecipient<Props> {
}) }
</Text>
<TouchableHighlight
onPress = { this._onResetPrivateMessageRecipient }>
onPress = { this._onResetPrivateMessageRecipient }
underlayColor = { 'transparent' }>
<Icon
src = { IconCancelSelection }
style = { _styles.messageRecipientCancelIcon } />

View File

@ -7,6 +7,7 @@ import { translate } from '../../../base/i18n/functions';
import Icon from '../../../base/icons/components/Icon';
import { IconArrowDown } from '../../../base/icons/svg';
import { withPixelLineHeight } from '../../../base/styles/functions.web';
import BaseTheme from '../../../base/ui/components/BaseTheme.web';
export interface INewMessagesButtonProps extends WithTranslation {
@ -29,7 +30,7 @@ const useStyles = makeStyles()((theme: Theme) => {
alignItems: 'center',
justifyContent: 'space-between',
height: '32px',
padding: '6px 8px',
padding: '8px',
border: 'none',
borderRadius: theme.shape.borderRadius,
backgroundColor: theme.palette.action02,
@ -49,12 +50,7 @@ const useStyles = makeStyles()((theme: Theme) => {
width: '20px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
paddingLeft: '5px',
'& svg': {
fill: theme.palette.uiBackground
}
justifyContent: 'center'
},
textContainer: {
@ -83,9 +79,9 @@ function NewMessagesButton({ onGoToFirstUnreadMessage, t }: INewMessagesButtonPr
type = 'button'>
<Icon
className = { styles.arrowDownIconContainer }
color = { BaseTheme.palette.icon04 }
size = { 14 }
src = { IconArrowDown } />
<div className = { styles.textContainer }> { t('chat.newMessages') }</div>
</button>
</div>);

View File

@ -7,6 +7,8 @@ import emojiAsciiAliases from 'react-emoji-render/data/asciiAliases';
import { IState } from '../app/types';
import { escapeRegexp } from '../base/util/helpers';
import { IMessage } from './reducer';
/**
* An ASCII emoticon regexp array to find and replace old-style ASCII
* emoticons (such as :O) with the new Unicode representation, so that
@ -93,14 +95,11 @@ export function getUnreadCount(state: IState) {
}
let reactionMessages = 0;
if (!lastReadMessage) {
return 0;
}
let lastReadIndex;
if (navigator.product === 'ReactNative') {
// React native stores the messages in a reversed order.
const lastReadIndex = messages.indexOf(lastReadMessage);
lastReadIndex = messages.indexOf(<IMessage>lastReadMessage);
for (let i = 0; i < lastReadIndex; i++) {
if (messages[i].isReaction) {
@ -111,7 +110,7 @@ export function getUnreadCount(state: IState) {
return lastReadIndex - reactionMessages;
}
const lastReadIndex = messages.lastIndexOf(lastReadMessage);
lastReadIndex = messages.lastIndexOf(<IMessage>lastReadMessage);
for (let i = lastReadIndex + 1; i < messagesCount; i++) {
if (messages[i].isReaction) {
@ -122,18 +121,6 @@ export function getUnreadCount(state: IState) {
return messagesCount - (lastReadIndex + 1) - reactionMessages;
}
/**
* Selector for calculating the number of unread chat messages.
*
* @param {IState} state - The redux state.
* @returns {number} The number of unread messages.
*/
export function getUnreadMessagesCount(state: IState) {
const { nbUnreadMessages } = state['features/chat'];
return nbUnreadMessages;
}
/**
* Get whether the chat smileys are disabled or not.
*

View File

@ -21,7 +21,7 @@ const CarModeFooter = (): JSX.Element => {
pointerEvents = 'box-none'
style = { styles.bottomContainer }>
<Text style = { styles.videoStoppedLabel }>
{t('carmode.labels.videoStopped')}
{ t('carmode.labels.videoStopped') }
</Text>
<SoundDeviceButton />
<EndMeetingButton />

View File

@ -24,10 +24,7 @@ export default {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
bottom: BaseTheme.spacing[8],
left: 0,
right: 0,
position: 'absolute'
bottom: BaseTheme.spacing[8]
},
/**
@ -79,7 +76,7 @@ export default {
flexShrink: 1,
paddingHorizontal: 2,
justifyContent: 'center',
marginTop: 8
marginTop: BaseTheme.spacing[2]
},
roomTimer: {
@ -99,8 +96,8 @@ export default {
title: {
margin: 'auto',
textAlign: 'center',
paddingVertical: 4,
paddingHorizontal: 16,
paddingVertical: BaseTheme.spacing[1],
paddingHorizontal: BaseTheme.spacing[3],
color: BaseTheme.palette.text02
},
@ -141,7 +138,7 @@ export default {
roomNameWrapper: {
flexDirection: 'row',
marginRight: 10,
marginRight: BaseTheme.spacing[2],
flexShrink: 1,
flexGrow: 1
},
@ -150,7 +147,7 @@ export default {
backgroundColor: 'rgba(0,0,0,0.6)',
flexShrink: 1,
justifyContent: 'center',
paddingHorizontal: 5
paddingHorizontal: BaseTheme.spacing[2]
},
roomName: {
@ -166,7 +163,9 @@ export default {
videoStoppedLabel: {
...BaseTheme.typography.bodyShortRegularLarge,
color: BaseTheme.palette.text01,
marginBottom: BaseTheme.spacing[3]
marginBottom: BaseTheme.spacing[3],
textAlign: 'center',
width: '100%'
},
connectionIndicatorIcon: {

View File

@ -81,7 +81,7 @@ export default {
padding: 12,
fontSize: TITLE_BAR_BUTTON_SIZE
},
underlayColor: BaseTheme.spacing.underlay01
underlayColor: 'transparent'
},
lonelyButton: {
@ -116,7 +116,7 @@ export default {
padding: 12,
fontSize: TITLE_BAR_BUTTON_SIZE
},
underlayColor: BaseTheme.spacing.underlay01
underlayColor: 'transparent'
},
titleBarSafeViewColor: {

View File

@ -25,7 +25,7 @@ export function updateRemoteParticipants(store: Object, participantId: ?number)
const { remoteParticipants } = state['features/filmstrip'];
reorderedParticipants = [ ...remoteParticipants, participantId ];
store.dispatch(setRemoteParticipants(reorderedParticipants));
store.dispatch(setRemoteParticipants(Array.from(new Set(reorderedParticipants))));
}
return;
@ -92,7 +92,7 @@ export function updateRemoteParticipants(store: Object, participantId: ?number)
];
}
store.dispatch(setRemoteParticipants(reorderedParticipants));
store.dispatch(setRemoteParticipants(Array.from(new Set(reorderedParticipants))));
}
/**

View File

@ -1,9 +1,10 @@
// @flow
import { getCurrentConference } from '../base/conference/functions';
import { StateListenerRegistry } from '../base/redux';
import { shouldDisplayTileView } from '../video-layout';
import { setTileViewDimensions } from './actions';
import { setRemoteParticipants, setTileViewDimensions } from './actions';
import { getTileViewParticipantCount } from './functions.native';
import './subscriber.any';
@ -30,3 +31,14 @@ StateListenerRegistry.register(
store.dispatch(setTileViewDimensions());
}
});
/**
* Listens for changes in the current conference and clears remote participants from this feature.
*/
StateListenerRegistry.register(
state => getCurrentConference(state),
(conference, { dispatch }, previousConference) => {
if (conference !== previousConference) {
dispatch(setRemoteParticipants([]));
}
});

View File

@ -14,7 +14,7 @@ import {
IconDeviceSpeaker
} from '../../../base/icons';
import { connect } from '../../../base/redux';
import { ColorPalette } from '../../../base/styles';
import BaseTheme from '../../../base/ui/components/BaseTheme.native';
import styles from './styles';
@ -240,12 +240,18 @@ class AudioRoutePickerDialog extends Component<Props, State> {
_renderDevice(device: Device) {
const { icon, selected, text } = device;
const selectedStyle = selected ? styles.selectedText : {};
const borderRadiusHighlightStyles = {
borderTopLeftRadius: 16,
borderTopRightRadius: 16
};
const speakerDeviceIsNotSelected = device.type !== 'SPEAKER';
return (
<TouchableHighlight
key = { device.type }
onPress = { this._onSelectDeviceFn(device) }
underlayColor = { ColorPalette.overflowMenuItemUnderlay } >
style = { speakerDeviceIsNotSelected && borderRadiusHighlightStyles }
underlayColor = { BaseTheme.palette.underlay01 } >
<View style = { styles.deviceRow } >
<Icon
src = { icon }

View File

@ -1,7 +1,8 @@
// @flow
import { MD_ITEM_HEIGHT } from '../../../base/dialog';
import { ColorPalette, createStyleSheet } from '../../../base/styles';
import { createStyleSheet } from '../../../base/styles';
import BaseTheme from '../../../base/ui/components/BaseTheme.native';
/**
* The React {@code Component} styles of {@code AudioRoutePickerDialog}.
@ -18,30 +19,30 @@ export default createStyleSheet({
alignItems: 'center',
flexDirection: 'row',
height: MD_ITEM_HEIGHT,
marginLeft: 16
marginLeft: BaseTheme.spacing[3]
},
/**
* Style for the {@code Icon} element in a row.
*/
deviceIcon: {
color: ColorPalette.white,
fontSize: 24
color: BaseTheme.palette.icon01,
fontSize: BaseTheme.spacing[4]
},
/**
* Style for the {@code Text} element in a row.
*/
deviceText: {
color: ColorPalette.white,
color: BaseTheme.palette.text01,
fontSize: 16,
marginLeft: 32
marginLeft: BaseTheme.spacing[5]
},
/**
* Style for a row which is marked as selected.
*/
selectedText: {
color: ColorPalette.blue
color: BaseTheme.palette.action01
}
});

View File

@ -1,6 +1,6 @@
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import React from 'react';
import React, { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import HelpView from '../../../../../settings/components/native/HelpView';
@ -38,6 +38,14 @@ const SettingsNavigationContainer = ({ isInWelcomePage }: Props) => {
const baseSettingsScreenOptions = isInWelcomePage ? welcomeScreenOptions : settingsScreenOptions;
const { t } = useTranslation();
const SettingsScreen = useCallback(() =>
(
<SettingsView
addBottomInset = { !isInWelcomePage }
scrollBounces = { isInWelcomePage } />
)
);
return (
<NavigationContainer
independent = { true }
@ -46,12 +54,13 @@ const SettingsNavigationContainer = ({ isInWelcomePage }: Props) => {
<SettingsStack.Navigator
initialRouteName = { screen.settings.main }>
<SettingsStack.Screen
component = { SettingsView }
name = { screen.settings.main }
options = {{
...baseSettingsScreenOptions,
title: t('settings.title')
}} />
}}>
{ SettingsScreen }
</SettingsStack.Screen>
<SettingsStack.Screen
component = { HelpView }
name = { screen.settings.links.help }

View File

@ -199,7 +199,9 @@ export const preJoinScreenOptions = {
headerStyle: {
backgroundColor: BaseTheme.palette.screen02Header
},
headerTitle: ''
headerTitleStyle: {
color: BaseTheme.palette.text01
}
};
/**

View File

@ -125,7 +125,8 @@ const Prejoin: React.FC<PrejoinProps> = ({ navigation }: PrejoinProps) => {
useLayoutEffect(() => {
navigation.setOptions({
headerLeft
headerLeft,
headerTitle: t('prejoin.joinMeeting')
});
}, [ navigation ]);
@ -156,18 +157,17 @@ const Prejoin: React.FC<PrejoinProps> = ({ navigation }: PrejoinProps) => {
isFocused
&& <View style = { largeVideoContainerStyles }>
<LargeVideo />
<View style = { styles.displayRoomNameBackdrop }>
<Text
numberOfLines = { 1 }
style = { styles.preJoinRoomName as StyleProp<TextStyle> }>
{ roomName }
</Text>
</View>
</View>
}
<View style = { contentContainerStyles }>
<View style = { styles.formWrapper as StyleProp<ViewStyle> }>
<Text style = { styles.preJoinTitle as StyleProp<TextStyle> }>
{ t('prejoin.joinMeeting') }
</Text>
<Text
numberOfLines = { 1 }
style = { styles.preJoinRoomName as StyleProp<TextStyle> }>
{ roomName }
</Text>
<TextInput
onChangeText = { onChangeDisplayName }
placeholder = { t('dialog.enterDisplayName') }
@ -179,14 +179,13 @@ const Prejoin: React.FC<PrejoinProps> = ({ navigation }: PrejoinProps) => {
disabled = { joinButtonDisabled }
labelKey = 'prejoin.joinMeeting'
onClick = { onJoin }
style = { styles.prejoinButton }
style = { styles.joinButton }
type = { PRIMARY } />
<Button
accessibilityLabel = 'prejoin.joinMeetingInLowBandwidthMode'
disabled = { joinButtonDisabled }
labelKey = 'prejoin.joinMeetingInLowBandwidthMode'
onClick = { onJoinLowBandwidth }
style = { styles.prejoinButton }
type = { SECONDARY } />
</View>
<View style = { toolboxContainerStyles }>

View File

@ -2,15 +2,9 @@ import BaseTheme from '../../base/ui/components/BaseTheme.native';
const SECONDARY_COLOR = BaseTheme.palette.border04;
const preJoinText = {
...BaseTheme.typography.heading5,
color: BaseTheme.palette.text01,
textAlign: 'center'
};
export default {
prejoinButton: {
marginTop: BaseTheme.spacing[3]
joinButton: {
marginVertical: BaseTheme.spacing[3]
},
buttonStylesBorderless: {
@ -21,7 +15,7 @@ export default {
style: {
flexDirection: 'row',
justifyContent: 'center',
marginHorizontal: BaseTheme.spacing[3],
margin: BaseTheme.spacing[3],
height: 24,
width: 24
},
@ -38,47 +32,45 @@ export default {
},
largeVideoContainer: {
minHeight: '50%'
minHeight: '60%'
},
largeVideoContainerWide: {
height: '100%',
marginRight: 'auto',
position: 'absolute',
width: '50%'
width: '60%'
},
contentContainer: {
alignSelf: 'center',
display: 'flex',
justifyContent: 'center',
minHeight: '50%',
paddingHorizontal: BaseTheme.spacing[3],
minHeight: '40%',
padding: BaseTheme.spacing[3],
width: 400
},
contentContainerWide: {
alignItems: 'center',
alignSelf: 'center',
height: '100%',
justifyContent: 'center',
left: '50%',
paddingHorizontal: BaseTheme.spacing[3],
left: '60%',
padding: BaseTheme.spacing[3],
position: 'absolute',
width: '50%'
width: '40%'
},
toolboxContainer: {
alignSelf: 'center',
display: 'flex',
flexDirection: 'row',
justifyContent: 'center',
marginTop: BaseTheme.spacing[3]
justifyContent: 'center'
},
toolboxContainerWide: {
flexDirection: 'row',
justifyContent: 'center',
marginTop: BaseTheme.spacing[3]
justifyContent: 'center'
},
formWrapper: {
@ -94,15 +86,23 @@ export default {
borderWidth: 2,
color: BaseTheme.palette.text06,
height: BaseTheme.spacing[7],
marginTop: BaseTheme.spacing[3],
textAlign: 'center'
},
preJoinTitle: {
...preJoinText
preJoinRoomName: {
...BaseTheme.typography.heading5,
color: BaseTheme.palette.text01,
textAlign: 'center'
},
preJoinRoomName: {
...preJoinText
displayRoomNameBackdrop: {
alignSelf: 'center',
backgroundColor: BaseTheme.palette.ui16,
bottom: BaseTheme.spacing[3],
borderRadius: 4,
margin: BaseTheme.spacing[3],
paddingHorizontal: BaseTheme.spacing[3],
paddingVertical: BaseTheme.spacing[1],
position: 'absolute'
}
};

View File

@ -8,6 +8,7 @@ import {
Alert,
NativeModules,
Platform,
ScrollView,
Text,
View
} from 'react-native';
@ -151,6 +152,11 @@ interface Props extends WithTranslation {
*/
_visible: boolean;
/**
* Add bottom padding to the screen.
*/
addBottomInset?: boolean;
/**
* Redux store dispatch function.
*/
@ -160,6 +166,11 @@ interface Props extends WithTranslation {
* Default prop for navigating between screen components(React Navigation).
*/
navigation: Object;
/**
* Bounce when scrolling.
*/
scrollBounces?: boolean;
}
/**
@ -259,7 +270,11 @@ class SettingsView extends Component<Props, State> {
startWithVideoMuted
} = this.state;
const { t } = this.props;
const {
addBottomInset = false,
scrollBounces = false,
t
} = this.props;
const textInputTheme = {
colors: {
@ -273,157 +288,159 @@ class SettingsView extends Component<Props, State> {
return (
<JitsiScreen
safeAreaInsets = { [ 'bottom', 'left', 'right' ] }
scrollEnabled = { true }
disableForcedKeyboardDismiss = { true }
safeAreaInsets = { [ addBottomInset && 'bottom', 'left', 'right' ].filter(Boolean) }
style = { styles.settingsViewContainer }>
<View style = { styles.avatarContainer }>
<Avatar
participantId = { this.props._localParticipantId }
size = { AVATAR_SIZE } />
</View>
<FormSectionAccordion
label = 'settingsView.profileSection'>
<TextInput
autoCorrect = { false }
label = { t('settingsView.displayName') }
mode = 'outlined'
onChangeText = { this._onChangeDisplayName }
placeholder = { t('settingsView.displayNamePlaceholderText') }
placeholderTextColor = { PLACEHOLDER_TEXT_COLOR }
spellCheck = { false }
style = { styles.textInputContainer }
textContentType = { 'name' } // iOS only
theme = { textInputTheme }
value = { displayName } />
<Divider style = { styles.fieldSeparator } />
<TextInput
autoCapitalize = 'none'
autoCorrect = { false }
keyboardType = { 'email-address' }
label = { t('settingsView.email') }
mode = 'outlined'
onChangeText = { this._onChangeEmail }
placeholder = 'email@example.com'
placeholderTextColor = { PLACEHOLDER_TEXT_COLOR }
spellCheck = { false }
style = { styles.textInputContainer }
textContentType = { 'emailAddress' } // iOS only
theme = { textInputTheme }
value = { email } />
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.conferenceSection'>
<TextInput
autoCapitalize = 'none'
autoCorrect = { false }
editable = { this.props._serverURLChangeEnabled }
keyboardType = { 'url' }
label = { t('settingsView.serverURL') }
mode = 'outlined'
onBlur = { this._onBlurServerURL }
onChangeText = { this._onChangeServerURL }
placeholder = { this.props._serverURL }
placeholderTextColor = { PLACEHOLDER_TEXT_COLOR }
spellCheck = { false }
style = { styles.textInputContainer }
textContentType = { 'URL' } // iOS only
theme = { textInputTheme }
value = { serverURL } />
<Divider style = { styles.fieldSeparator } />
<FormRow label = 'settingsView.startCarModeInLowBandwidthMode'>
<Switch
checked = { startCarMode }
// @ts-ignore
onChange = { this._onStartCarmodeInLowBandwidthMode } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
<FormRow
label = 'settingsView.startWithAudioMuted'>
<Switch
checked = { startWithAudioMuted }
// @ts-ignore
onChange = { this._onStartAudioMutedChange } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
<FormRow label = 'settingsView.startWithVideoMuted'>
<Switch
checked = { startWithVideoMuted }
// @ts-ignore
onChange = { this._onStartVideoMutedChange } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
<FormRow label = 'videothumbnail.hideSelfView'>
<Switch
checked = { disableSelfView }
// @ts-ignore
onChange = { this._onDisableSelfView } />
</FormRow>
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.links'>
<Link
style = { styles.sectionLink }
// @ts-ignore
to = {{ screen: screen.settings.links.help }}>
{ t('settingsView.help') }
</Link>
<Divider style = { styles.fieldSeparator } />
<Link
style = { styles.sectionLink }
// @ts-ignore
to = {{ screen: screen.settings.links.terms }}>
{ t('settingsView.terms') }
</Link>
<Divider style = { styles.fieldSeparator } />
<Link
style = { styles.sectionLink }
// @ts-ignore
to = {{ screen: screen.settings.links.privacy }}>
{ t('settingsView.privacy') }
</Link>
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.buildInfoSection'>
<FormRow
label = 'settingsView.version'>
<Text style = { styles.text }>
{`${AppInfo.version} build ${AppInfo.buildNumber}`}
</Text>
</FormRow>
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.advanced'>
{ Platform.OS === 'android' && (
<>
<FormRow
label = 'settingsView.disableCallIntegration'>
<Switch
checked = { disableCallIntegration }
// @ts-ignore
onChange = { this._onDisableCallIntegration } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
</>
)}
<FormRow
label = 'settingsView.disableP2P'>
<Switch
checked = { disableP2P }
// @ts-ignore
onChange = { this._onDisableP2P } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
{AppInfo.GOOGLE_SERVICES_ENABLED && (
<FormRow
fieldSeparator = { true }
label = 'settingsView.disableCrashReporting'>
<ScrollView bounces = { scrollBounces }>
<View style = { styles.avatarContainer }>
<Avatar
participantId = { this.props._localParticipantId }
size = { AVATAR_SIZE } />
</View>
<FormSectionAccordion
label = 'settingsView.profileSection'>
<TextInput
autoCorrect = { false }
label = { t('settingsView.displayName') }
mode = 'outlined'
onChangeText = { this._onChangeDisplayName }
placeholder = { t('settingsView.displayNamePlaceholderText') }
placeholderTextColor = { PLACEHOLDER_TEXT_COLOR }
spellCheck = { false }
style = { styles.textInputContainer }
textContentType = { 'name' } // iOS only
theme = { textInputTheme }
value = { displayName } />
<Divider style = { styles.fieldSeparator } />
<TextInput
autoCapitalize = 'none'
autoCorrect = { false }
keyboardType = { 'email-address' }
label = { t('settingsView.email') }
mode = 'outlined'
onChangeText = { this._onChangeEmail }
placeholder = 'email@example.com'
placeholderTextColor = { PLACEHOLDER_TEXT_COLOR }
spellCheck = { false }
style = { styles.textInputContainer }
textContentType = { 'emailAddress' } // iOS only
theme = { textInputTheme }
value = { email } />
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.conferenceSection'>
<TextInput
autoCapitalize = 'none'
autoCorrect = { false }
editable = { this.props._serverURLChangeEnabled }
keyboardType = { 'url' }
label = { t('settingsView.serverURL') }
mode = 'outlined'
onBlur = { this._onBlurServerURL }
onChangeText = { this._onChangeServerURL }
placeholder = { this.props._serverURL }
placeholderTextColor = { PLACEHOLDER_TEXT_COLOR }
spellCheck = { false }
style = { styles.textInputContainer }
textContentType = { 'URL' } // iOS only
theme = { textInputTheme }
value = { serverURL } />
<Divider style = { styles.fieldSeparator } />
<FormRow label = 'settingsView.startCarModeInLowBandwidthMode'>
<Switch
checked = { disableCrashReporting }
checked = { startCarMode }
// @ts-ignore
onChange = { this._onDisableCrashReporting } />
onChange = { this._onStartCarmodeInLowBandwidthMode } />
</FormRow>
)}
</FormSectionAccordion>
<Divider style = { styles.fieldSeparator } />
<FormRow
label = 'settingsView.startWithAudioMuted'>
<Switch
checked = { startWithAudioMuted }
// @ts-ignore
onChange = { this._onStartAudioMutedChange } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
<FormRow label = 'settingsView.startWithVideoMuted'>
<Switch
checked = { startWithVideoMuted }
// @ts-ignore
onChange = { this._onStartVideoMutedChange } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
<FormRow label = 'videothumbnail.hideSelfView'>
<Switch
checked = { disableSelfView }
// @ts-ignore
onChange = { this._onDisableSelfView } />
</FormRow>
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.links'>
<Link
style = { styles.sectionLink }
// @ts-ignore
to = {{ screen: screen.settings.links.help }}>
{ t('settingsView.help') }
</Link>
<Divider style = { styles.fieldSeparator } />
<Link
style = { styles.sectionLink }
// @ts-ignore
to = {{ screen: screen.settings.links.terms }}>
{ t('settingsView.terms') }
</Link>
<Divider style = { styles.fieldSeparator } />
<Link
style = { styles.sectionLink }
// @ts-ignore
to = {{ screen: screen.settings.links.privacy }}>
{ t('settingsView.privacy') }
</Link>
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.buildInfoSection'>
<FormRow
label = 'settingsView.version'>
<Text style = { styles.text }>
{`${AppInfo.version} build ${AppInfo.buildNumber}`}
</Text>
</FormRow>
</FormSectionAccordion>
<FormSectionAccordion
label = 'settingsView.advanced'>
{ Platform.OS === 'android' && (
<>
<FormRow
label = 'settingsView.disableCallIntegration'>
<Switch
checked = { disableCallIntegration }
// @ts-ignore
onChange = { this._onDisableCallIntegration } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
</>
)}
<FormRow
label = 'settingsView.disableP2P'>
<Switch
checked = { disableP2P }
// @ts-ignore
onChange = { this._onDisableP2P } />
</FormRow>
<Divider style = { styles.fieldSeparator } />
{AppInfo.GOOGLE_SERVICES_ENABLED && (
<FormRow
fieldSeparator = { true }
label = 'settingsView.disableCrashReporting'>
<Switch
checked = { disableCrashReporting }
// @ts-ignore
onChange = { this._onDisableCrashReporting } />
</FormRow>
)}
</FormSectionAccordion>
</ScrollView>
</JitsiScreen>
);
}

View File

@ -126,7 +126,8 @@ ColorSchemeRegistry.register('Toolbox', {
style: {
...toolbarButton,
backgroundColor: 'transparent'
}
},
underlayColor: 'transparent'
},
backgroundToggle: {
@ -199,6 +200,7 @@ ColorSchemeRegistry.register('Toolbox', {
iconStyle: whiteToolbarButtonIcon,
style: {
...toolbarButton
}
},
underlayColor: 'transparent'
}
});