mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-09-10 16:28:41 +00:00
Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d41da9358 | ||
|
|
0936a64d3f | ||
|
|
c6eccb1a5a | ||
|
|
0c042ca720 | ||
|
|
feb1b93ce6 | ||
|
|
75d80ad879 | ||
|
|
8bb5c114f8 | ||
|
|
936d9b41f1 | ||
|
|
5d68a53f79 | ||
|
|
7f8c43d477 | ||
|
|
c30038236a | ||
|
|
577d62ea53 | ||
|
|
c35473d5e4 | ||
|
|
c69fdd766c | ||
|
|
389d455daa | ||
|
|
1ab086247b | ||
|
|
f62dc44f3e | ||
|
|
06800f88bf | ||
|
|
c9ea193d04 | ||
|
|
c8895b2d04 | ||
|
|
a1337dff38 | ||
|
|
ebe16af809 | ||
|
|
d018d19874 | ||
|
|
be152b12d7 | ||
|
|
c2a3d29353 | ||
|
|
1d275e1976 | ||
|
|
fea59e472a | ||
|
|
c16c6688b8 | ||
|
|
2dda749b1f | ||
|
|
fde33b72d0 | ||
|
|
011fe40853 | ||
|
|
34d8843a35 | ||
|
|
05dc018671 | ||
|
|
fa65a54f50 | ||
|
|
20fd671b68 | ||
|
|
fd9d19a951 | ||
|
|
f9384fdc87 | ||
|
|
0945d373b6 | ||
|
|
9651229a17 | ||
|
|
0826ec16c2 | ||
|
|
e0881502d3 | ||
|
|
c84e6eecdd | ||
|
|
e61ccc956f | ||
|
|
6aa0e3902a | ||
|
|
eaba4798db | ||
|
|
08f388e17a | ||
|
|
2c68817f4c | ||
|
|
e8e62a0213 | ||
|
|
85581266e4 | ||
|
|
a2155aad7f | ||
|
|
59e51f107e | ||
|
|
40353cf762 | ||
|
|
a1d0111c1b | ||
|
|
b1be511d67 | ||
|
|
c4ddaa8b87 | ||
|
|
2d61b564a1 | ||
|
|
9062c91d77 | ||
|
|
387af2db20 | ||
|
|
75fd61eed6 | ||
|
|
d655acdc30 |
@@ -7,6 +7,7 @@
|
||||
android:extractNativeLibs="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:name=".MainApplication"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:theme="@style/AppTheme">
|
||||
<meta-data
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import com.facebook.react.ReactApplication;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
|
||||
import org.jitsi.meet.sdk.JitsiReactNativeHost;
|
||||
|
||||
/**
|
||||
* Application class for Jitsi Meet. The only reason why this exists is for Detox
|
||||
* to believe our app is a "greenfield" app. SDK users need not use this.
|
||||
*/
|
||||
public class MainApplication extends Application implements ReactApplication {
|
||||
private final ReactNativeHost mReactNativeHost = new JitsiReactNativeHost(this);
|
||||
|
||||
@Override
|
||||
public ReactNativeHost getReactNativeHost() {
|
||||
return mReactNativeHost;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
// Initialize RN
|
||||
Log.d(this.getClass().getCanonicalName(), "app onCreate");
|
||||
getReactNativeHost().getReactInstanceManager();
|
||||
}
|
||||
}
|
||||
@@ -16,13 +16,14 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.startup.Initializer;
|
||||
|
||||
import com.facebook.soloader.SoLoader;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class JitsiInitializer implements Initializer<Boolean> {
|
||||
@@ -30,13 +31,18 @@ public class JitsiInitializer implements Initializer<Boolean> {
|
||||
@NonNull
|
||||
@Override
|
||||
public Boolean create(@NonNull Context context) {
|
||||
Log.d(this.getClass().getCanonicalName(), "create");
|
||||
|
||||
SoLoader.init(context, /* native exopackage */ false);
|
||||
|
||||
// Register our uncaught exception handler.
|
||||
JitsiMeetUncaughtExceptionHandler.register();
|
||||
return true;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public List<Class<? extends Initializer<?>>> dependencies() {
|
||||
return new ArrayList<>();
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
import com.facebook.react.ReactPackage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is the minimal implementation of ReactNativeHost that will make things like the
|
||||
* Detox testing framework believe we are a "greenfield" app.
|
||||
*
|
||||
* Generally speaking, apps using the SDK (other than the Jitsi Meet app itself) should not
|
||||
* need to use this because the
|
||||
*/
|
||||
public class JitsiReactNativeHost extends ReactNativeHost {
|
||||
public JitsiReactNativeHost(Application application) {
|
||||
super(application);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getUseDeveloperSupport() {
|
||||
// Unused since we override `createReactInstanceManager`.
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
// Unused since we override `createReactInstanceManager`.
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReactInstanceManager createReactInstanceManager() {
|
||||
ReactInstanceManagerHolder.initReactInstanceManager(this.getApplication());
|
||||
|
||||
return ReactInstanceManagerHolder.getReactInstanceManager();
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,8 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
@@ -99,6 +101,69 @@ class ReactInstanceManagerHolder {
|
||||
);
|
||||
}
|
||||
|
||||
static List<ReactPackage> getReactNativePackages() {
|
||||
List<ReactPackage> packages
|
||||
= new ArrayList<>(Arrays.asList(
|
||||
new com.reactnativecommunity.asyncstorage.AsyncStoragePackage(),
|
||||
new com.ocetnik.timer.BackgroundTimerPackage(),
|
||||
new com.calendarevents.RNCalendarEventsPackage(),
|
||||
new com.corbt.keepawake.KCKeepAwakePackage(),
|
||||
new com.facebook.react.shell.MainReactPackage(),
|
||||
new com.reactnativecommunity.clipboard.ClipboardPackage(),
|
||||
new com.reactnativecommunity.netinfo.NetInfoPackage(),
|
||||
new com.reactnativepagerview.PagerViewPackage(),
|
||||
new com.oblador.performance.PerformancePackage(),
|
||||
new com.reactnativecommunity.slider.ReactSliderPackage(),
|
||||
new com.brentvatne.react.ReactVideoPackage(),
|
||||
new com.swmansion.reanimated.ReanimatedPackage(),
|
||||
new org.reactnative.maskedview.RNCMaskedViewPackage(),
|
||||
new com.reactnativecommunity.webview.RNCWebViewPackage(),
|
||||
new com.kevinresol.react_native_default_preference.RNDefaultPreferencePackage(),
|
||||
new com.learnium.RNDeviceInfo.RNDeviceInfo(),
|
||||
new com.swmansion.gesturehandler.react.RNGestureHandlerPackage(),
|
||||
new org.linusu.RNGetRandomValuesPackage(),
|
||||
new com.rnimmersive.RNImmersivePackage(),
|
||||
new com.swmansion.rnscreens.RNScreensPackage(),
|
||||
new com.zmxv.RNSound.RNSoundPackage(),
|
||||
new com.th3rdwave.safeareacontext.SafeAreaContextPackage(),
|
||||
new com.horcrux.svg.SvgPackage(),
|
||||
new ReactPackageAdapter() {
|
||||
@Override
|
||||
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
||||
return ReactInstanceManagerHolder.createNativeModules(reactContext);
|
||||
}
|
||||
@Override
|
||||
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||
return ReactInstanceManagerHolder.createViewManagers(reactContext);
|
||||
}
|
||||
}));
|
||||
|
||||
// AmplitudeReactNativePackage
|
||||
try {
|
||||
Class<?> amplitudePackageClass = Class.forName("com.amplitude.reactnative.AmplitudeReactNativePackage");
|
||||
Constructor constructor = amplitudePackageClass.getConstructor();
|
||||
packages.add((ReactPackage)constructor.newInstance());
|
||||
} catch (Exception e) {
|
||||
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
||||
}
|
||||
|
||||
// RNGoogleSignInPackage
|
||||
try {
|
||||
Class<?> googlePackageClass = Class.forName("com.reactnativegooglesignin.RNGoogleSigninPackage");
|
||||
Constructor constructor = googlePackageClass.getConstructor();
|
||||
packages.add((ReactPackage)constructor.newInstance());
|
||||
} catch (Exception e) {
|
||||
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
||||
}
|
||||
|
||||
return packages;
|
||||
}
|
||||
|
||||
static JSCExecutorFactory getReactNativeJSFactory() {
|
||||
// Keep on using JSC, the jury is out on Hermes.
|
||||
return new JSCExecutorFactory("", "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to send an event to JavaScript.
|
||||
*
|
||||
@@ -159,6 +224,35 @@ class ReactInstanceManagerHolder {
|
||||
return reactInstanceManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to initialize the React Native instance manager. We
|
||||
* create a single instance in order to load the JavaScript bundle a single
|
||||
* time. All {@code ReactRootView} instances will be tied to the one and
|
||||
* only {@code ReactInstanceManager}.
|
||||
*
|
||||
* This method is only meant to be called when integrating with {@code JitsiReactNativeHost}.
|
||||
*
|
||||
* @param app {@code Application} current running Application.
|
||||
*/
|
||||
static void initReactInstanceManager(Application app) {
|
||||
if (reactInstanceManager != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.d(ReactInstanceManagerHolder.class.getCanonicalName(), "initializing RN with Application");
|
||||
|
||||
reactInstanceManager
|
||||
= ReactInstanceManager.builder()
|
||||
.setApplication(app)
|
||||
.setBundleAssetName("index.android.bundle")
|
||||
.setJSMainModulePath("index.android")
|
||||
.setJavaScriptExecutorFactory(getReactNativeJSFactory())
|
||||
.addPackages(getReactNativePackages())
|
||||
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
||||
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to initialize the React Native instance manager. We
|
||||
* create a single instance in order to load the JavaScript bundle a single
|
||||
@@ -172,63 +266,7 @@ class ReactInstanceManagerHolder {
|
||||
return;
|
||||
}
|
||||
|
||||
List<ReactPackage> packages
|
||||
= new ArrayList<>(Arrays.asList(
|
||||
new com.reactnativecommunity.asyncstorage.AsyncStoragePackage(),
|
||||
new com.ocetnik.timer.BackgroundTimerPackage(),
|
||||
new com.calendarevents.RNCalendarEventsPackage(),
|
||||
new com.corbt.keepawake.KCKeepAwakePackage(),
|
||||
new com.facebook.react.shell.MainReactPackage(),
|
||||
new com.reactnativecommunity.clipboard.ClipboardPackage(),
|
||||
new com.reactnativecommunity.netinfo.NetInfoPackage(),
|
||||
new com.reactnativepagerview.PagerViewPackage(),
|
||||
new com.oblador.performance.PerformancePackage(),
|
||||
new com.reactnativecommunity.slider.ReactSliderPackage(),
|
||||
new com.brentvatne.react.ReactVideoPackage(),
|
||||
new com.swmansion.reanimated.ReanimatedPackage(),
|
||||
new org.reactnative.maskedview.RNCMaskedViewPackage(),
|
||||
new com.reactnativecommunity.webview.RNCWebViewPackage(),
|
||||
new com.kevinresol.react_native_default_preference.RNDefaultPreferencePackage(),
|
||||
new com.learnium.RNDeviceInfo.RNDeviceInfo(),
|
||||
new com.swmansion.gesturehandler.react.RNGestureHandlerPackage(),
|
||||
new org.linusu.RNGetRandomValuesPackage(),
|
||||
new com.rnimmersive.RNImmersivePackage(),
|
||||
new com.swmansion.rnscreens.RNScreensPackage(),
|
||||
new com.zmxv.RNSound.RNSoundPackage(),
|
||||
new com.th3rdwave.safeareacontext.SafeAreaContextPackage(),
|
||||
new com.horcrux.svg.SvgPackage(),
|
||||
new ReactPackageAdapter() {
|
||||
@Override
|
||||
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
||||
return ReactInstanceManagerHolder.createNativeModules(reactContext);
|
||||
}
|
||||
@Override
|
||||
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||
return ReactInstanceManagerHolder.createViewManagers(reactContext);
|
||||
}
|
||||
}));
|
||||
|
||||
// AmplitudeReactNativePackage
|
||||
try {
|
||||
Class<?> amplitudePackageClass = Class.forName("com.amplitude.reactnative.AmplitudeReactNativePackage");
|
||||
Constructor constructor = amplitudePackageClass.getConstructor();
|
||||
packages.add((ReactPackage)constructor.newInstance());
|
||||
} catch (Exception e) {
|
||||
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
||||
}
|
||||
|
||||
// RNGoogleSigninPackage
|
||||
try {
|
||||
Class<?> googlePackageClass = Class.forName("com.reactnativegooglesignin.RNGoogleSigninPackage");
|
||||
Constructor constructor = googlePackageClass.getConstructor();
|
||||
packages.add((ReactPackage)constructor.newInstance());
|
||||
} catch (Exception e) {
|
||||
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
||||
}
|
||||
|
||||
// Keep on using JSC, the jury is out on Hermes.
|
||||
JSCExecutorFactory jsFactory
|
||||
= new JSCExecutorFactory("", "");
|
||||
Log.d(ReactInstanceManagerHolder.class.getCanonicalName(), "initializing RN with Activity");
|
||||
|
||||
reactInstanceManager
|
||||
= ReactInstanceManager.builder()
|
||||
@@ -236,13 +274,10 @@ class ReactInstanceManagerHolder {
|
||||
.setCurrentActivity(activity)
|
||||
.setBundleAssetName("index.android.bundle")
|
||||
.setJSMainModulePath("index.android")
|
||||
.setJavaScriptExecutorFactory(jsFactory)
|
||||
.addPackages(packages)
|
||||
.setJavaScriptExecutorFactory(getReactNativeJSFactory())
|
||||
.addPackages(getReactNativePackages())
|
||||
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
||||
.setInitialLifecycleState(LifecycleState.RESUMED)
|
||||
.build();
|
||||
|
||||
// Register our uncaught exception handler.
|
||||
JitsiMeetUncaughtExceptionHandler.register();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
/*
|
||||
* Copyright @ 2018-present Atlassian Pty Ltd
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet.sdk.incoming_call;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
public class IncomingCallInfo {
|
||||
/**
|
||||
* URL for the caller avatar.
|
||||
*/
|
||||
private final String callerAvatarURL;
|
||||
|
||||
/**
|
||||
* Caller's name.
|
||||
*/
|
||||
private final String callerName;
|
||||
|
||||
/**
|
||||
* Whether this is a regular call or a video call.
|
||||
*/
|
||||
private final boolean hasVideo;
|
||||
|
||||
public IncomingCallInfo(
|
||||
@NonNull String callerName,
|
||||
@NonNull String callerAvatarURL,
|
||||
boolean hasVideo) {
|
||||
this.callerName = callerName;
|
||||
this.callerAvatarURL = callerAvatarURL;
|
||||
this.hasVideo = hasVideo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the caller's avatar URL.
|
||||
*
|
||||
* @return - The URL as a string.
|
||||
*/
|
||||
public String getCallerAvatarURL() {
|
||||
return callerAvatarURL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the caller's name.
|
||||
*
|
||||
* @return - The caller's name.
|
||||
*/
|
||||
public String getCallerName() {
|
||||
return callerName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets whether the call is a video call or not.
|
||||
*
|
||||
* @return - {@code true} if this call has video; {@code false}, otherwise.
|
||||
*/
|
||||
public boolean hasVideo() {
|
||||
return hasVideo;
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
/*
|
||||
* Copyright @ 2018-present Atlassian Pty Ltd
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet.sdk.incoming_call;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
|
||||
import org.jitsi.meet.sdk.BaseReactView;
|
||||
import org.jitsi.meet.sdk.ListenerUtils;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Map;
|
||||
|
||||
public class IncomingCallView
|
||||
extends BaseReactView<IncomingCallViewListener> {
|
||||
|
||||
/**
|
||||
* The {@code Method}s of {@code JitsiMeetViewListener} by event name i.e.
|
||||
* redux action types.
|
||||
*/
|
||||
private static final Map<String, Method> LISTENER_METHODS
|
||||
= ListenerUtils.mapListenerMethods(IncomingCallViewListener.class);
|
||||
|
||||
public IncomingCallView(@NonNull Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for {@link ExternalAPIModule} events.
|
||||
*
|
||||
* @param name The name of the event.
|
||||
* @param data The details/specifics of the event to send determined
|
||||
* by/associated with the specified {@code name}.
|
||||
*/
|
||||
@Override
|
||||
protected void onExternalAPIEvent(String name, ReadableMap data) {
|
||||
onExternalAPIEvent(LISTENER_METHODS, name, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the information for the incoming call this {@code IncomingCallView}
|
||||
* represents.
|
||||
*
|
||||
* @param callInfo - {@link IncomingCallInfo} object representing the caller
|
||||
* information.
|
||||
*/
|
||||
public void setIncomingCallInfo(IncomingCallInfo callInfo) {
|
||||
Bundle props = new Bundle();
|
||||
|
||||
props.putString("callerAvatarURL", callInfo.getCallerAvatarURL());
|
||||
props.putString("callerName", callInfo.getCallerName());
|
||||
props.putBoolean("hasVideo", callInfo.hasVideo());
|
||||
|
||||
createReactRootView("IncomingCallApp", props);
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright @ 2018-present Atlassian Pty Ltd
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet.sdk.incoming_call;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Interface for listening to events coming from Jitsi Meet, related to
|
||||
* {@link IncomingCallView}.
|
||||
*/
|
||||
public interface IncomingCallViewListener {
|
||||
/**
|
||||
* Called when the user presses the "Answer" button on the
|
||||
* {@link IncomingCallView}.
|
||||
*
|
||||
* @param data - Unused at the moment.
|
||||
*/
|
||||
void onIncomingCallAnswered(Map<String, Object> data);
|
||||
|
||||
/**
|
||||
* Called when the user presses the "Decline" button on the
|
||||
* {@link IncomingCallView}.
|
||||
*
|
||||
* @param data - Unused at the moment.
|
||||
*/
|
||||
void onIncomingCallDeclined(Map<String, Object> data);
|
||||
}
|
||||
@@ -148,6 +148,7 @@ import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/Au
|
||||
import { createPresenterEffect } from './react/features/stream-effects/presenter';
|
||||
import { createRnnoiseProcessor } from './react/features/stream-effects/rnnoise';
|
||||
import { endpointMessageReceived } from './react/features/subtitles';
|
||||
import { muteLocal } from './react/features/video-menu/actions.any';
|
||||
import UIEvents from './service/UI/UIEvents';
|
||||
|
||||
const logger = Logger.getLogger(__filename);
|
||||
@@ -1144,7 +1145,8 @@ export default {
|
||||
* Used by Jibri to detect when it's alone and the meeting should be terminated.
|
||||
*/
|
||||
get membersCount() {
|
||||
return room.getParticipants().filter(p => !p.isHidden()).length + 1;
|
||||
return room.getParticipants()
|
||||
.filter(p => !p.isHidden() || !(config.iAmRecorder && p.isHiddenFromRecorder())).length + 1;
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -1610,32 +1612,29 @@ export default {
|
||||
|
||||
APP.store.dispatch(setScreenAudioShareState(false));
|
||||
|
||||
if (didHaveVideo && !ignoreDidHaveVideo) {
|
||||
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
|
||||
.then(([ stream ]) => {
|
||||
logger.debug(`_turnScreenSharingOff using ${stream} for useVideoStream`);
|
||||
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
|
||||
.then(([ stream ]) => {
|
||||
logger.debug(`_turnScreenSharingOff using ${stream} for useVideoStream`);
|
||||
|
||||
return this.useVideoStream(stream);
|
||||
})
|
||||
.catch(error => {
|
||||
logger.error('failed to switch back to local video', error);
|
||||
return this.useVideoStream(stream);
|
||||
})
|
||||
.catch(error => {
|
||||
logger.error('failed to switch back to local video', error);
|
||||
|
||||
return this.useVideoStream(null).then(() =>
|
||||
return this.useVideoStream(null).then(() =>
|
||||
|
||||
// Still fail with the original err
|
||||
Promise.reject(error)
|
||||
);
|
||||
});
|
||||
} else {
|
||||
promise = promise.then(() => {
|
||||
logger.debug('_turnScreenSharingOff using null for useVideoStream');
|
||||
|
||||
return this.useVideoStream(null);
|
||||
// Still fail with the original err
|
||||
Promise.reject(error)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
return promise.then(
|
||||
() => {
|
||||
// Mute the video if camera video needs to be ignored or if video was muted before switching to screen
|
||||
// share.
|
||||
if (ignoreDidHaveVideo || !didHaveVideo) {
|
||||
APP.store.dispatch(setVideoMuted(true, MEDIA_TYPE.VIDEO));
|
||||
}
|
||||
this.videoSwitchInProgress = false;
|
||||
sendAnalytics(createScreenSharingEvent('stopped',
|
||||
duration === 0 ? null : duration));
|
||||
@@ -1659,9 +1658,12 @@ export default {
|
||||
* toggles between screen sharing and camera video.
|
||||
* @param {Object} [options] - Screen sharing options that will be passed to
|
||||
* createLocalTracks.
|
||||
* @param {boolean} [options.audioOnly] - Whether or not audioOnly is enabled.
|
||||
* @param {Array<string>} [options.desktopSharingSources] - Array with the
|
||||
* sources that have to be displayed in the desktop picker window ('screen',
|
||||
* 'window', etc.).
|
||||
* @param {Object} [options.desktopStream] - An existing desktop stream to
|
||||
* use instead of creating a new desktop stream.
|
||||
* @param {boolean} ignoreDidHaveVideo - if true ignore if video was on when sharing started.
|
||||
* @return {Promise.<T>}
|
||||
*/
|
||||
@@ -1674,10 +1676,6 @@ export default {
|
||||
return Promise.reject('Cannot toggle screen sharing: not supported.');
|
||||
}
|
||||
|
||||
if (this.isAudioOnly()) {
|
||||
return Promise.reject('No screensharing in audio only mode');
|
||||
}
|
||||
|
||||
if (toggle) {
|
||||
try {
|
||||
await this._switchToScreenSharing(options);
|
||||
@@ -2063,6 +2061,10 @@ export default {
|
||||
APP.store.dispatch(updateRemoteParticipantFeatures(user));
|
||||
});
|
||||
room.on(JitsiConferenceEvents.USER_JOINED, (id, user) => {
|
||||
if (config.iAmRecorder && user.isHiddenFromRecorder()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The logic shared between RN and web.
|
||||
commonUserJoinedHandling(APP.store, room, user);
|
||||
|
||||
@@ -2112,6 +2114,14 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
if (config.iAmRecorder) {
|
||||
const participant = room.getParticipantById(track.getParticipantId());
|
||||
|
||||
if (participant.isHiddenFromRecorder()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
APP.store.dispatch(trackAdded(track));
|
||||
});
|
||||
|
||||
@@ -2599,13 +2609,24 @@ export default {
|
||||
* @returns {void}
|
||||
*/
|
||||
_onConferenceJoined() {
|
||||
const { dispatch } = APP.store;
|
||||
|
||||
APP.UI.initConference();
|
||||
|
||||
if (!config.disableShortcuts) {
|
||||
APP.keyboardshortcut.init();
|
||||
}
|
||||
|
||||
APP.store.dispatch(conferenceJoined(room));
|
||||
dispatch(conferenceJoined(room));
|
||||
|
||||
const jwt = APP.store.getState()['features/base/jwt'];
|
||||
|
||||
if (jwt?.user?.hiddenFromRecorder) {
|
||||
dispatch(muteLocal(true, MEDIA_TYPE.AUDIO));
|
||||
dispatch(muteLocal(true, MEDIA_TYPE.VIDEO));
|
||||
dispatch(setAudioUnmutePermissions(true, true));
|
||||
dispatch(setVideoUnmutePermissions(true, true));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
17
config.js
17
config.js
@@ -473,6 +473,7 @@ var config = {
|
||||
// If Lobby is enabled starts knocking automatically.
|
||||
// autoKnockLobby: false,
|
||||
|
||||
// DEPRECATED! Use `breakoutRooms.hideAddRoomButton` instead.
|
||||
// Hides add breakout room button
|
||||
// hideAddRoomButton: false,
|
||||
|
||||
@@ -1048,6 +1049,14 @@ var config = {
|
||||
*/
|
||||
// dynamicBrandingUrl: '',
|
||||
|
||||
// Options related to the breakout rooms feature.
|
||||
// breakoutRooms: {
|
||||
// // Hides the add breakout room button. This replaces `hideAddRoomButton`.
|
||||
// hideAddRoomButton: false,
|
||||
// // Hides the join breakout room button.
|
||||
// hideJoinRoomButton: false
|
||||
// },
|
||||
|
||||
// When true the user cannot add more images to be used as virtual background.
|
||||
// Only the default ones from will be available.
|
||||
// disableAddingBackgroundImages: false,
|
||||
@@ -1167,6 +1176,7 @@ var config = {
|
||||
forceJVB121Ratio
|
||||
forceTurnRelay
|
||||
hiddenDomain
|
||||
hiddenFromRecorderFeatureEnabled
|
||||
ignoreStartMuted
|
||||
websocketKeepAlive
|
||||
websocketKeepAliveUrl
|
||||
@@ -1255,6 +1265,13 @@ var config = {
|
||||
// Prevent the filmstrip from autohiding when screen width is under a certain threshold
|
||||
// disableFilmstripAutohiding: false,
|
||||
|
||||
// filmstrip: {
|
||||
// // Disables user resizable filmstrip. Also, allows configuration of the filmstrip
|
||||
// // (width, tiles aspect ratios) through the interfaceConfig options.
|
||||
// disableResizable: false,
|
||||
// }
|
||||
|
||||
|
||||
// Specifies whether the chat emoticons are disabled or not
|
||||
// disableChatSmileys: false,
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
.subject {
|
||||
color: #fff;
|
||||
transition: opacity .6s ease-in-out;
|
||||
z-index: $zindex3;
|
||||
z-index: $toolbarZ + 2;
|
||||
margin-top: 20px;
|
||||
opacity: 0;
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
.video-preview {
|
||||
background: none;
|
||||
display: inline-block;
|
||||
max-height: 344px;
|
||||
|
||||
&-container {
|
||||
max-height: 344px;
|
||||
background: $menuBG;
|
||||
border-radius: 3px;
|
||||
overflow: auto;
|
||||
|
||||
@@ -78,6 +78,10 @@
|
||||
#largeVideoContainer {
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
|
||||
&.transition {
|
||||
transition: width 1s, height 1s, top 1s;
|
||||
}
|
||||
}
|
||||
|
||||
#largeVideoContainer {
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
flex-direction: column-reverse;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
padding: ($desktopAppDragBarHeight - 5px) 5px calc(env(safe-area-inset-bottom, 0) + 10px);
|
||||
padding: 0;
|
||||
/**
|
||||
* fixed positioning is necessary for remote menus and tooltips to pop
|
||||
* out of the scrolling filmstrip. AtlasKit dialogs and tooltips use
|
||||
@@ -40,6 +40,10 @@
|
||||
right: 0;
|
||||
z-index: $filmstripVideosZ;
|
||||
|
||||
&.no-vertical-padding {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide videos by making them slight to the right.
|
||||
*/
|
||||
@@ -58,7 +62,10 @@
|
||||
&#remoteVideos {
|
||||
border: $thumbnailsBorder solid transparent;
|
||||
padding-left: 0;
|
||||
border-left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,11 +74,12 @@
|
||||
*/
|
||||
#filmstripLocalVideo {
|
||||
align-self: initial;
|
||||
bottom: 5px;
|
||||
margin-bottom: 5px;
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
height: auto;
|
||||
justify-content: flex-start;
|
||||
width: 100%;
|
||||
|
||||
#filmstripLocalVideoThumbnail {
|
||||
width: calc(100% - 15px);
|
||||
@@ -100,15 +108,27 @@
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.resizable-filmstrip #remoteVideos .videocontainer {
|
||||
border-left: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
&.reduce-height {
|
||||
height: calc(100% - calc(#{$newToolbarSizeWithPadding} + #{$scrollHeight}));
|
||||
}
|
||||
|
||||
.remote-videos {
|
||||
display: flex;
|
||||
transition: height .3s ease-in;
|
||||
overscroll-behavior: contain;
|
||||
|
||||
&.height-transition {
|
||||
transition: height .3s ease-in;
|
||||
}
|
||||
|
||||
&.vertical-grid-margin > div {
|
||||
margin-right: $scrollHeight;
|
||||
}
|
||||
|
||||
& > div {
|
||||
position: absolute;
|
||||
transition: opacity 1s;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
z-index: $toolbarZ + 1;
|
||||
z-index: $toolbarZ + 2;
|
||||
|
||||
.action-btn {
|
||||
border-radius: 6px;
|
||||
|
||||
@@ -83,6 +83,7 @@ Component "breakout.jitmeet.example.com" "muc"
|
||||
"muc_domain_mapper";
|
||||
--"token_verification";
|
||||
"muc_rate_limit";
|
||||
"polls";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com" }
|
||||
muc_room_locking = false
|
||||
|
||||
@@ -91,7 +91,7 @@ var interfaceConfig = {
|
||||
|
||||
LANG_DETECTION: true, // Allow i18n to detect the system language
|
||||
LIVE_STREAMING_HELP_LINK: 'https://jitsi.org/live', // Documentation reference for the live streaming feature.
|
||||
LOCAL_THUMBNAIL_RATIO: 1, // 1:1
|
||||
LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9
|
||||
|
||||
/**
|
||||
* Maximum coefficient of the ratio of the large video to the visible area
|
||||
|
||||
14
ios/Podfile
14
ios/Podfile
@@ -29,8 +29,8 @@ target 'JitsiMeetSDK' do
|
||||
# Native pod dependencies
|
||||
#
|
||||
|
||||
pod 'CocoaLumberjack', '~>3.5.3'
|
||||
pod 'ObjectiveDropboxOfficial', '~>6.1.0'
|
||||
pod 'CocoaLumberjack', '3.7.2'
|
||||
pod 'ObjectiveDropboxOfficial', '6.2.3'
|
||||
end
|
||||
|
||||
post_install do |installer|
|
||||
@@ -41,12 +41,8 @@ post_install do |installer|
|
||||
config.build_settings['SUPPORTS_MACCATALYST'] = 'NO'
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
|
||||
end
|
||||
# https://github.com/facebook/react-native/issues/32351#issuecomment-939157955
|
||||
case target.name
|
||||
when 'RCT-Folly'
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
|
||||
end
|
||||
end
|
||||
end
|
||||
# https://github.com/facebook/react-native/blob/d7f748a944a9a9324e485ccbe214098e6c8645fc/scripts/react_native_pods.rb#L630
|
||||
time_header = "#{Pod::Config.instance.installation_root.to_s}/Pods/RCT-Folly/folly/portability/Time.h"
|
||||
`sed -i -e $'s/ && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)//' #{time_header}`
|
||||
end
|
||||
|
||||
@@ -9,9 +9,9 @@ PODS:
|
||||
- AppAuth/Core (1.4.0)
|
||||
- AppAuth/ExternalUserAgent (1.4.0)
|
||||
- boost (1.76.0)
|
||||
- CocoaLumberjack (3.5.3):
|
||||
- CocoaLumberjack/Core (= 3.5.3)
|
||||
- CocoaLumberjack/Core (3.5.3)
|
||||
- CocoaLumberjack (3.7.2):
|
||||
- CocoaLumberjack/Core (= 3.7.2)
|
||||
- CocoaLumberjack/Core (3.7.2)
|
||||
- DoubleConversion (1.1.6)
|
||||
- FBLazyVector (0.66.4)
|
||||
- FBReactNativeSpec (0.66.4):
|
||||
@@ -107,7 +107,7 @@ PODS:
|
||||
- nanopb/encode (= 1.30906.0)
|
||||
- nanopb/decode (1.30906.0)
|
||||
- nanopb/encode (1.30906.0)
|
||||
- ObjectiveDropboxOfficial (6.1.0)
|
||||
- ObjectiveDropboxOfficial (6.2.3)
|
||||
- PromisesObjC (1.2.12)
|
||||
- RCT-Folly (2021.06.28.00-v2):
|
||||
- boost
|
||||
@@ -330,7 +330,7 @@ PODS:
|
||||
- react-native-video/Video (= 5.2.0)
|
||||
- react-native-video/Video (5.2.0):
|
||||
- React-Core
|
||||
- react-native-webrtc (1.94.1):
|
||||
- react-native-webrtc (1.94.2):
|
||||
- React-Core
|
||||
- react-native-webview (11.15.1):
|
||||
- React-Core
|
||||
@@ -435,7 +435,7 @@ PODS:
|
||||
DEPENDENCIES:
|
||||
- "amplitude-react-native (from `../node_modules/@amplitude/react-native`)"
|
||||
- boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
|
||||
- CocoaLumberjack (~> 3.5.3)
|
||||
- CocoaLumberjack (= 3.7.2)
|
||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
||||
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
|
||||
@@ -443,7 +443,7 @@ DEPENDENCIES:
|
||||
- Firebase/Crashlytics (~> 6.33.0)
|
||||
- Firebase/DynamicLinks (~> 6.33.0)
|
||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||
- ObjectiveDropboxOfficial (~> 6.1.0)
|
||||
- ObjectiveDropboxOfficial (= 6.2.3)
|
||||
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
||||
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
|
||||
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
|
||||
@@ -639,7 +639,7 @@ SPEC CHECKSUMS:
|
||||
amplitude-react-native: 0ed8cab759aafaa94961b82122bf56297da607ad
|
||||
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
|
||||
boost: a7c83b31436843459a1961bfd74b96033dc77234
|
||||
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
|
||||
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
|
||||
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
|
||||
FBLazyVector: e5569e42a1c79ca00521846c223173a57aca1fe1
|
||||
FBReactNativeSpec: fe08c1cd7e2e205718d77ad14b34957cce949b58
|
||||
@@ -659,7 +659,7 @@ SPEC CHECKSUMS:
|
||||
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
|
||||
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
|
||||
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
|
||||
ObjectiveDropboxOfficial: b4765572e334d6fc6214b43a7595510324bbbbaa
|
||||
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
|
||||
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
|
||||
RCT-Folly: a21c126816d8025b547704b777a2ba552f3d9fa9
|
||||
RCTRequired: 4bf86c70714490bca4bf2696148638284622644b
|
||||
@@ -683,7 +683,7 @@ SPEC CHECKSUMS:
|
||||
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
|
||||
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
|
||||
react-native-video: a4c2635d0802f983594b7057e1bce8f442f0ad28
|
||||
react-native-webrtc: 2f20515f3ebb9dbf1f2aad638cc7573396cf948f
|
||||
react-native-webrtc: 1856ac061df94b1bd6037f1f3b56d1b8bc2b50e7
|
||||
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
|
||||
React-perflogger: 93075d8931c32cd1fce8a98c15d2d5ccc4d891bd
|
||||
React-RCTActionSheet: 7d3041e6761b4f3044a37079ddcb156575fb6d89
|
||||
@@ -712,6 +712,6 @@ SPEC CHECKSUMS:
|
||||
RNWatch: 99637948ec9b5c9ec5a41920642594ad5ba07e80
|
||||
Yoga: e7dc4e71caba6472ff48ad7d234389b91dadc280
|
||||
|
||||
PODFILE CHECKSUM: 93620e428bb16cc7fb8fd7314c0402e26929b5bf
|
||||
PODFILE CHECKSUM: 7fafb3480e45473da539aa09d06374868b021f90
|
||||
|
||||
COCOAPODS: 1.11.2
|
||||
|
||||
@@ -821,6 +821,7 @@
|
||||
baseConfigurationReference = 756FCE06C08D9B947653C98A /* Pods-JitsiMeet.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDebug;
|
||||
CODE_SIGN_ENTITLEMENTS = app.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
@@ -829,6 +830,7 @@
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEVELOPMENT_TEAM = FC967L3QRG;
|
||||
ENABLE_BITCODE = NO;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
INFOPLIST_FILE = src/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -851,6 +853,7 @@
|
||||
baseConfigurationReference = 3E0F4ED943C0B12BE77F6B45 /* Pods-JitsiMeet.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconRelease;
|
||||
CODE_SIGN_ENTITLEMENTS = app.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
@@ -858,6 +861,7 @@
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = FC967L3QRG;
|
||||
ENABLE_BITCODE = YES;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
INFOPLIST_FILE = src/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -977,7 +981,7 @@
|
||||
ENABLE_BITCODE = YES;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 ";
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
@@ -1038,7 +1042,7 @@
|
||||
ENABLE_BITCODE = YES;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 ";
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
|
||||
@@ -35,7 +35,6 @@ xcodebuild archive \
|
||||
-sdk iphonesimulator \
|
||||
-destination='generic/platform=iOS Simulator' \
|
||||
-archivePath ios/sdk/out/ios-simulator \
|
||||
VALID_ARCHS=x86_64 \
|
||||
ENABLE_BITCODE=NO \
|
||||
SKIP_INSTALL=NO \
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||||
@@ -46,7 +45,6 @@ xcodebuild archive \
|
||||
-sdk iphoneos \
|
||||
-destination='generic/platform=iOS' \
|
||||
-archivePath ios/sdk/out/ios-device \
|
||||
VALID_ARCHS=arm64 \
|
||||
ENABLE_BITCODE=NO \
|
||||
SKIP_INSTALL=NO \
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||||
|
||||
@@ -518,7 +518,7 @@
|
||||
ENABLE_BITCODE = YES;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 ";
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
@@ -581,7 +581,7 @@
|
||||
ENABLE_BITCODE = YES;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 ";
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
@@ -606,6 +606,7 @@
|
||||
baseConfigurationReference = 09A78016288AF50ACD28A10D /* Pods-JitsiMeetSDK.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
@@ -615,6 +616,7 @@
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
ENABLE_BITCODE = NO;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
INFOPLIST_FILE = src/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
|
||||
@@ -633,6 +635,7 @@
|
||||
baseConfigurationReference = 891FE43DAD30BC8976683100 /* Pods-JitsiMeetSDK.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
@@ -642,6 +645,7 @@
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
ENABLE_BITCODE = YES;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
INFOPLIST_FILE = src/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
|
||||
|
||||
@@ -141,7 +141,6 @@
|
||||
"Share": "Deel",
|
||||
"Submit": "Dien in",
|
||||
"WaitForHostMsg": "",
|
||||
"WaitForHostMsgWOk": "",
|
||||
"WaitingForHost": "Wag tans vir die gasheer …",
|
||||
"Yes": "Ja",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "أزل",
|
||||
"Share": "شارك",
|
||||
"Submit": "أرسل",
|
||||
"WaitForHostMsg": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فنرجو تأكيد ذلك عبر الاستيثاق أو انتظر وصول المضيف رجاءً. ",
|
||||
"WaitForHostMsgWOk": "لم يبدأ المؤتمر <b>{{room}}</b> بعد. إن كنت المضيف والراعي، فاضغط على «تمام» للاستيثاق أو انتظر وصول المضيف رجاءً.",
|
||||
"WaitForHostMsg": "لم يبدأ المؤتمر بعد. إن كنت المضيف والراعي، فنرجو تأكيد ذلك عبر الاستيثاق أو انتظر وصول المضيف رجاءً. ",
|
||||
"WaitingForHostTitle": "في انتظار المضيف ...",
|
||||
"Yes": "نعم",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -160,8 +160,7 @@
|
||||
"Remove": "Выдаліць",
|
||||
"Share": "Падзяліцца",
|
||||
"Submit": "Адправіць",
|
||||
"WaitForHostMsg": "Канферэнцыя <b>{{room}}</b> яшчэ не пачалася. Калі вы з'яўляецеся гаспадаром, калі ласка, падтвердіце сапраўднасць. У адваротным выпадку, калі ласка, пачакайце з'яўлення гаспадара.",
|
||||
"WaitForHostMsgWOk": "Канферэнцыя <b>{{room}}</b> яшчэ не пачалася. Калі Вы арганізатар, калі ласка, націсніце Ok для аўтэнтыфікацыі. У адваротным выпадку, дачакайцеся арганізатара.",
|
||||
"WaitForHostMsg": "Канферэнцыя яшчэ не пачалася. Калі вы з'яўляецеся гаспадаром, калі ласка, падтвердіце сапраўднасць. У адваротным выпадку, калі ласка, пачакайце з'яўлення гаспадара.",
|
||||
"WaitingForHost": "Чакаем арганізатара …",
|
||||
"Yes": "Так",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -167,8 +167,7 @@
|
||||
"Remove": "Премахване",
|
||||
"Share": "Споделяне",
|
||||
"Submit": "Изпращане",
|
||||
"WaitForHostMsg": "Конференцията <b>{{room}}</b> все още не е започнала. Ако сте домакинът, тогава се идентифицирайте. В противен случай изчакайте докато домакинът пристигне.",
|
||||
"WaitForHostMsgWOk": "Конференцията <b>{{room}}</b> все още не е започнала. Ако сте домакинът, тогава натиснете бутона, за да се идентифицирате. В противен случай изчакайте докато домакинът пристигне.",
|
||||
"WaitForHostMsg": "Конференцията все още не е започнала. Ако сте домакинът, тогава се идентифицирайте. В противен случай изчакайте докато домакинът пристигне.",
|
||||
"WaitingForHost": "Чакаме домакина...",
|
||||
"Yes": "Да",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Elimina",
|
||||
"Share": "Comparteix",
|
||||
"Submit": "Tramet",
|
||||
"WaitForHostMsg": "La conferència <b>{{room}}</b> encara no ha començat. Si en sou l'amfitrió autentiqueu-vos. Altrament, espereu que arribi l'amfitrió.",
|
||||
"WaitForHostMsgWOk": "La conferència <b>{{room}}</b> encara no ha començat. Si sou l'amfitrió, aleshores pitgeu «D'acord» per a autenticar-vos. Altrament, espereu que arribi l'amfitrió.",
|
||||
"WaitForHostMsg": "La conferència encara no ha començat. Si en sou l'amfitrió autentiqueu-vos. Altrament, espereu que arribi l'amfitrió.",
|
||||
"WaitingForHostTitle": "S'està esperant l'amfitrió...",
|
||||
"Yes": "Sí",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -196,8 +196,7 @@
|
||||
"Remove": "Odstranit",
|
||||
"Share": "Sdílet",
|
||||
"Submit": "Potvrdit",
|
||||
"WaitForHostMsg": "Konference <b>{{room}}</b> ještě nezačala. Pokud jste hostitel, přihlaste se. Jinak prosím počkejte, až hostitel dorazí.",
|
||||
"WaitForHostMsgWOk": "Konference <b>{{room}}</b> ještě nezačala. Pokud jste hostitel, prosím přihlaste se kliknutím na OK. Jinak prosím počkejte, až hostitel dorazí.",
|
||||
"WaitForHostMsg": "Konference ještě nezačala. Pokud jste hostitel, přihlaste se. Jinak prosím počkejte, až hostitel dorazí.",
|
||||
"WaitingForHost": "Čeká se na hostitele…",
|
||||
"Yes": "Ano",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -156,8 +156,7 @@
|
||||
"Remove": "Fjern",
|
||||
"Share": "Del",
|
||||
"Submit": "Gem",
|
||||
"WaitForHostMsg": "Mødet <b>{{room}}</b> er ikke startet endnu. Hvis du er værten, log venligst ind. Ellers vent på at værten kommer",
|
||||
"WaitForHostMsgWOk": "Mødet <b>{{room}}</b> er ikke startet endnu. Hvis du er værten, tryk venligst på OK for at logge ind. Ellers vent på at værten kommer.",
|
||||
"WaitForHostMsg": "Mødet er ikke startet endnu. Hvis du er værten, log venligst ind. Ellers vent på at værten kommer",
|
||||
"WaitingForHost": "Venter på vært …",
|
||||
"Yes": "Ja",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Entfernen",
|
||||
"Share": "Teilen",
|
||||
"Submit": "OK",
|
||||
"WaitForHostMsg": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Falls Sie die Konferenz leiten, authentifizieren Sie sich bitte. Warten Sie andernfalls, bis die Konferenz gestartet wird.",
|
||||
"WaitForHostMsgWOk": "Die Konferenz <b>{{room}}</b> wurde noch nicht gestartet. Falls Sie die Konferenz leiten, authentifizieren Sie sich bitte. Warten Sie andernfalls, bis die Konferenz gestartet wird.",
|
||||
"WaitForHostMsg": "Die Konferenz wurde noch nicht gestartet. Falls Sie die Konferenz leiten, authentifizieren Sie sich bitte. Warten Sie andernfalls, bis die Konferenz gestartet wird.",
|
||||
"WaitingForHostTitle": "Warten auf den Beginn der Konferenz …",
|
||||
"Yes": "Ja",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -172,8 +172,7 @@
|
||||
"Remove": "Αφαίρεση",
|
||||
"Share": "Μοιραστείτε",
|
||||
"Submit": "Υποβολή",
|
||||
"WaitForHostMsg": "Η διάσκεψη <b>{{room}}</b> δεν έχει ακόμη αρχίσει. Αν είστε ο οικοδεσπότης, τότε παρακαλούμε να πιστοποιήσετε τον εαυτό σας. Διαφορετικά, σας παρακαλώ να περιμένετε να συνδεθεί ο οικοδεσπότης.",
|
||||
"WaitForHostMsgWOk": "Η διάσκεψη <b>{{room}}</b> δεν έχει ακόμη αρχίσει. Αν είστε ο οικοδεσπότης, τότε παρακαλούμε πατήστε ΟΚ για να πιστοποιήσετε τον εαυτό σας. Διαφορετικά, σας παρακαλώ να περιμένετε να συνδεθεί ο οικοδεσπότης.",
|
||||
"WaitForHostMsg": "Η διάσκεψη δεν έχει ακόμη αρχίσει. Αν είστε ο οικοδεσπότης, τότε παρακαλούμε να πιστοποιήσετε τον εαυτό σας. Διαφορετικά, σας παρακαλώ να περιμένετε να συνδεθεί ο οικοδεσπότης.",
|
||||
"WaitingForHost": "Αναμονή για τον οικοδεσπότη ...",
|
||||
"Yes": "Ναι",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -160,8 +160,7 @@
|
||||
"Remove": "Remove",
|
||||
"Share": "Share",
|
||||
"Submit": "Submit",
|
||||
"WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsg": "The conference has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitingForHost": "Waiting for the host …",
|
||||
"Yes": "Yes",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Forigi",
|
||||
"Share": "Kundividi",
|
||||
"Submit": "Sendi",
|
||||
"WaitForHostMsg": "La kunveno <b>{{room}}</b> ankoraŭ ne komencis. Se vi estas la gastiganto, bonvolu aŭtentiĝi. Alikaze atendu, ĝis la gastiganto venos.",
|
||||
"WaitForHostMsgWOk": "La kunveno <b>{{room}}</b> ankoraŭ ne komencis. Se vi estas la gastiganto, bonvolu puŝi “Bone” por aŭtentiĝi. Alikaze atendu, ĝis la gastiganto venos.",
|
||||
"WaitForHostMsg": "La kunveno ankoraŭ ne komencis. Se vi estas la gastiganto, bonvolu aŭtentiĝi. Alikaze atendu, ĝis la gastiganto venos.",
|
||||
"WaitingForHost": "Atendo de la gastiga komputilo…",
|
||||
"Yes": "Jes",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -185,8 +185,7 @@
|
||||
"Remove": "Eliminar",
|
||||
"Share": "Compartir",
|
||||
"Submit": "Enviar",
|
||||
"WaitForHostMsg": "La conferencia <b>{{room}}</b> aún no ha comenzado. Si eres el anfitrión, inicia sesión. De lo contrario, espera a que llegue el anfitrión.",
|
||||
"WaitForHostMsgWOk": "La conferencia <b>{{room}}</b> aún no ha comenzado. Si eres el anfitrión, presiona Aceptar para autenticar. De lo contrario, espera a que llegue el anfitrión.",
|
||||
"WaitForHostMsg": "La conferencia aún no ha comenzado. Si eres el anfitrión, inicia sesión. De lo contrario, espera a que llegue el anfitrión.",
|
||||
"WaitingForHostTitle": "Esperando al anfitrión...",
|
||||
"Yes": "Sí",
|
||||
"accessibilityLabel": {
|
||||
@@ -650,7 +649,7 @@
|
||||
"waitingLobby": "Esperando en el vestíbulo ({{count}})"
|
||||
}
|
||||
},
|
||||
"passwordDigitsOnly": "Hasta {{number]] cifras",
|
||||
"passwordDigitsOnly": "Hasta {{number}} cifras",
|
||||
"passwordSetRemotely": "Definida por otro participante",
|
||||
"polls": {
|
||||
"answer": {
|
||||
|
||||
@@ -194,8 +194,7 @@
|
||||
"Remove": "Eliminar",
|
||||
"Share": "Compartir",
|
||||
"Submit": "Enviar",
|
||||
"WaitForHostMsg": "La conferencia <b>{{room}}</b> aún no ha comenzado. Si eres el anfitrión, inicia sesión. De lo contrario, espera a que llegue el anfitrión.",
|
||||
"WaitForHostMsgWOk": "La conferencia <b>{{room}}</b> aún no ha comenzado. Si eres el anfitrión, presiona Aceptar para autenticar. De lo contrario, espera a que llegue el anfitrión.",
|
||||
"WaitForHostMsg": "La conferencia aún no ha comenzado. Si eres el anfitrión, inicia sesión. De lo contrario, espera a que llegue el anfitrión.",
|
||||
"WaitingForHost": "Esperando al anfitrión…",
|
||||
"WaitingForHostTitle": "Esperando al anfitrión...",
|
||||
"Yes": "Sí",
|
||||
@@ -674,7 +673,7 @@
|
||||
"waitingLobby": "Esperando en el vestíbulo ({{count}})"
|
||||
}
|
||||
},
|
||||
"passwordDigitsOnly": "Hasta {{number]] cifras",
|
||||
"passwordDigitsOnly": "Hasta {{number}} cifras",
|
||||
"passwordSetRemotely": "definida por otro participante",
|
||||
"polls": {
|
||||
"answer": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Eemalda",
|
||||
"Share": "Jaga",
|
||||
"Submit": "Esita",
|
||||
"WaitForHostMsg": "Kõne <b>{{room}}</b> ei ole veel alanud. Autendi ennast, kui oled võõrustaja. Külalisena oota, kuni võõrustaja saabub.",
|
||||
"WaitForHostMsgWOk": "Kõne <b>{{room}}</b> ei ole veel alanud. Kui oled võõrustaja, vajuta OK, et ennast autentida. Külalisena oota, kuni võõrustaja saabub.",
|
||||
"WaitForHostMsg": "Kõne ei ole veel alanud. Autendi ennast, kui oled võõrustaja. Külalisena oota, kuni võõrustaja saabub.",
|
||||
"WaitingForHost": "Võõrustaja ootamine…",
|
||||
"Yes": "Jah",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -181,8 +181,7 @@
|
||||
"Remove": "Kendu",
|
||||
"Share": "Partekatu",
|
||||
"Submit": "Bidali",
|
||||
"WaitForHostMsg": "<b>{{room}}</b> konferentzia oraindik ez da hasi. Ostalaria bazara, autentifikatu. Bestela, itxaron ostalaria iritsi arte.",
|
||||
"WaitForHostMsgWOk": "<b>{{room}}</b> konferentzia oraindik ez da hasi. Ostalaria bazara, sakatu Ados autentifikatu ahal izateko. Bestela, itxaron ostalaria iritsi arte.",
|
||||
"WaitForHostMsg": "Konferentzia oraindik ez da hasi. Ostalaria bazara, autentifikatu. Bestela, itxaron ostalaria iritsi arte.",
|
||||
"WaitingForHostTitle": "Antolatzailearen zain...",
|
||||
"Yes": "Bai",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "حذف کردن",
|
||||
"Share": "به اشتراک گذاری",
|
||||
"Submit": "ارسال",
|
||||
"WaitForHostMsg": "کنفرانس <b>{{room}}</b> هنوز شروع نشده است، اگر میزبان هستید وارد شوید، در غیر اینصورت تا رسیدن میزبان و شروع جلسه منتظر بمانید",
|
||||
"WaitForHostMsgWOk": "کنفرانس <b>{{room}}</b> هنوز شروع نشده است، اگر میزبان هستید برای احراز هویت تایید را بزنید، در غیر اینصورت تا رسیدن میزبان و شروع جلسه منتظر بمانید",
|
||||
"WaitForHostMsg": "کنفرانس هنوز شروع نشده است، اگر میزبان هستید وارد شوید، در غیر اینصورت تا رسیدن میزبان و شروع جلسه منتظر بمانید",
|
||||
"WaitingForHostTitle": "در حال انتظار برای میزبان...",
|
||||
"Yes": "بله",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -140,8 +140,7 @@
|
||||
"Remove": "Poista",
|
||||
"Share": "Jaa",
|
||||
"Submit": "Lähetä",
|
||||
"WaitForHostMsg": "Kokous <b>{{room}}</b> ei ole vielä alkanut. Jos olet vetäjä, todenna henkilöllisyytesi. Muussa tapauksessa odota vetäjän saapumista.",
|
||||
"WaitForHostMsgWOk": "Kokous <b>{{room}}</b> ei ole vielä alkanut. Jos olet vetäjä, todenna henkilöllisyytesi OK-painikkeella. Muussa tapauksessa odota vetäjän saapumista.",
|
||||
"WaitForHostMsg": "Kokous ei ole vielä alkanut. Jos olet vetäjä, todenna henkilöllisyytesi. Muussa tapauksessa odota vetäjän saapumista.",
|
||||
"WaitingForHost": "Odotetaan vetäjää…",
|
||||
"Yes": "Kyllä",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Supprimer",
|
||||
"Share": "Partager",
|
||||
"Submit": "Soumettre",
|
||||
"WaitForHostMsg": "La conférence <b>{{room}}</b> n'a pas encore commencé. Si vous en êtes l'hôte, veuillez vous authentifier. Sinon, veuillez attendre son arrivée.",
|
||||
"WaitForHostMsgWOk": "La conférence <b>{{room}}</b> n'a pas encore commencé. Si vous en êtes l'hôte, veuillez appuyer sur Ok pour vous authentifier. Sinon, veuillez attendre son arrivée.",
|
||||
"WaitForHostMsg": "La conférence n'a pas encore commencé. Si vous en êtes l'hôte, veuillez vous authentifier. Sinon, veuillez attendre son arrivée.",
|
||||
"WaitingForHostTitle": "En attente de l'hôte ...",
|
||||
"Yes": "Oui",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -146,8 +146,7 @@
|
||||
"Remove": "Supprimer",
|
||||
"Share": "Oui",
|
||||
"Submit": "Envoyer",
|
||||
"WaitForHostMsg": "La conférence <b>{{room}}</b> n'a pas encore démarré. Si vous êtes l'hôte, veuillez vous authentifier. Sinon, veuillez attendre que l'hôte arrive.",
|
||||
"WaitForHostMsgWOk": "La conférence <b>{{room}}</b> n'a pas encore démarré. Si vous êtes l'hôte, veuillez appuyer sur OK pour vous authentifier. Sinon, veuillez attendre que l'hôte arrive.",
|
||||
"WaitForHostMsg": "La conférence n'a pas encore démarré. Si vous êtes l'hôte, veuillez vous authentifier. Sinon, veuillez attendre que l'hôte arrive.",
|
||||
"WaitingForHost": "En attente de l'hôte…",
|
||||
"Yes": "Oui",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -151,8 +151,7 @@
|
||||
"Remove": "Retirar",
|
||||
"Share": "Compartir",
|
||||
"Submit": "Enviar",
|
||||
"WaitForHostMsg": "A sala <b>{{room}}</b> aínda non comezou. Se vostede é o anfitrión, autentíquese. Se non, agarde a que o anfitrión chegue.",
|
||||
"WaitForHostMsgWOk": "A sala <b>{{room}}</b> aínda non comezou. Se vostede é o anfitrión, prema en Aceptar para autenticar. Se non, agarde a que o anfitrión chegue.",
|
||||
"WaitForHostMsg": "A sala aínda non comezou. Se vostede é o anfitrión, autentíquese. Se non, agarde a que o anfitrión chegue.",
|
||||
"WaitingForHost": "Agardando polo anfitrión…",
|
||||
"Yes": "Si",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "הסר",
|
||||
"Share": "שתף",
|
||||
"Submit": "שלח",
|
||||
"WaitForHostMsg": "הועידה <b>{{room}}</b> טרם החלה. אם אתה המארח אז בצע אימות. אחרת, אנא המתן שהמארח יגיע.",
|
||||
"WaitForHostMsgWOk": "הועידה <b>{{room}}</b> טרם החלה. אם אתה המארח אז לחץ אישור לביצוע אימות. אחרת, אנא המתן שהמארח יגיע.",
|
||||
"WaitForHostMsg": "הועידה טרם החלה. אם אתה המארח אז בצע אימות. אחרת, אנא המתן שהמארח יגיע.",
|
||||
"WaitingForHost": "ממתין למארח ...",
|
||||
"Yes": "כן",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -180,8 +180,7 @@
|
||||
"Remove": "निकालें",
|
||||
"Share": "Share",
|
||||
"Submit": "सबमिट करें",
|
||||
"WaitForHostMsg": "सम्मेलन <b>{{room}}</b> अभी तक शुरू नहीं हुआ है। यदि आप मेजबान हैं तो कृपया प्रमाणित करें। अन्यथा, कृपया मेजबान के आने की प्रतीक्षा करें।",
|
||||
"WaitForHostMsgWOk": "सम्मेलन <b>{{room}}</b> अभी तक शुरू नहीं हुआ है। यदि आप मेजबान हैं तो कृपया प्रमाणित करने के लिए ओके दबाएं। अन्यथा, कृपया मेजबान के आने की प्रतीक्षा करें।",
|
||||
"WaitForHostMsg": "सम्मेलन अभी तक शुरू नहीं हुआ है। यदि आप मेजबान हैं तो कृपया प्रमाणित करें। अन्यथा, कृपया मेजबान के आने की प्रतीक्षा करें।",
|
||||
"WaitingForHostTitle": "होस्ट की प्रतीक्षा कर रहा है ...",
|
||||
"Yes": "हाँ",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -146,7 +146,6 @@
|
||||
"Share": "",
|
||||
"Submit": "Pošalji",
|
||||
"WaitForHostMsg": "",
|
||||
"WaitForHostMsgWOk": "",
|
||||
"WaitingForHost": "",
|
||||
"Yes": "Da",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -156,8 +156,7 @@
|
||||
"Remove": "Eltávolítás",
|
||||
"Share": "Megosztás",
|
||||
"Submit": "Elküldés",
|
||||
"WaitForHostMsg": "A <b>{{room}}</b> konferencia még nem kezdődött meg. Ha Ön a házigazda, akkor hitelesítse magát. Ellenkező esetben, kérjük várjon a házigazda érkezésére.",
|
||||
"WaitForHostMsgWOk": "A <b>{{room}}</b> konferencia még nem kezdődött meg. Ha Ön a házigazda, kérjük az „OK” gombra kattintva hitelesítse magát. Ellenkező esetben, kérjük várjon a házigazda érkezésére.",
|
||||
"WaitForHostMsg": "A konferencia még nem kezdődött meg. Ha Ön a házigazda, akkor hitelesítse magát. Ellenkező esetben, kérjük várjon a házigazda érkezésére.",
|
||||
"WaitingForHost": "Várakozás a házigazdára…",
|
||||
"Yes": "Igen",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -136,7 +136,6 @@
|
||||
"Share": "Տարածել",
|
||||
"Submit": "Ներմուծել",
|
||||
"WaitForHostMsg": "",
|
||||
"WaitForHostMsgWOk": "",
|
||||
"WaitingForHost": "Սպասում է հյուրընկալողի …",
|
||||
"Yes": "Այո",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Remove",
|
||||
"Share": "Share",
|
||||
"Submit": "Submit",
|
||||
"WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsg": "The conference has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitingForHost": "Waiting for the host ...",
|
||||
"Yes": "Yes",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Fjarlægja",
|
||||
"Share": "Deila",
|
||||
"Submit": "Senda inn",
|
||||
"WaitForHostMsg": "Fjarfundurinn <b>{{room}}</b> er ekki byrjaður. Ef þú ert gestgjafinn skaltu auðkenna þig. Annars ættiðu að bíða eftir að gestgjafinn skrái sig inn.",
|
||||
"WaitForHostMsgWOk": "Fjarfundurinn <b>{{room}}</b> er ekki byrjaður. Ef þú ert gestgjafinn skaltu ýta á 'Í lagi' til að auðkenna þig. Annars ættiðu að bíða eftir að gestgjafinn skrái sig inn.",
|
||||
"WaitForHostMsg": "Fjarfundurinn er ekki byrjaður. Ef þú ert gestgjafinn skaltu auðkenna þig. Annars ættiðu að bíða eftir að gestgjafinn skrái sig inn.",
|
||||
"WaitingForHost": "Bíð eftir að gestgjafanum ...",
|
||||
"Yes": "Já",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -185,8 +185,7 @@
|
||||
"Remove": "Rimuovi",
|
||||
"Share": "Condividi",
|
||||
"Submit": "Invia",
|
||||
"WaitForHostMsg": "La riunione <b>{{room}}</b> non è ancora cominciata. Se sei l'organizzatore, per favore autenticati. Altrimenti, aspetta l'arrivo dell'organizzatore.",
|
||||
"WaitForHostMsgWOk": "La riunione <b>{{room}}</b> non è ancora cominciata. Se sei l'organizzatore, allora premi OK per autenticarti. Altrimenti, aspetta l'arrivo dell'organizzatore.",
|
||||
"WaitForHostMsg": "La riunione non è ancora cominciata. Se sei l'organizzatore, per favore autenticati. Altrimenti, aspetta l'arrivo dell'organizzatore.",
|
||||
"WaitingForHost": "In attesa dell'organizzatore...",
|
||||
"Yes": "Sì",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "除去",
|
||||
"Share": "共有",
|
||||
"Submit": "投稿",
|
||||
"WaitForHostMsg": "ミーティング <b>{{room}}</b> はまだ開始されていません。あなたがホストの場合は、認証を行ってください。それ以外の場合は、ホストの到着をお待ちください。",
|
||||
"WaitForHostMsgWOk": "ミーティング <b>{{room}}</b> はまだ開始されていません。あなたがホストの場合は、OKを押して認証を行ってください。それ以外の場合は、ホストの到着をお待ちください。",
|
||||
"WaitForHostMsg": "ミーティング はまだ開始されていません。あなたがホストの場合は、認証を行ってください。それ以外の場合は、ホストの到着をお待ちください。",
|
||||
"WaitingForHostTitle": "ホストの到着を待っています...",
|
||||
"Yes": "はい",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -185,8 +185,7 @@
|
||||
"Remove": "Sfeḍ",
|
||||
"Share": "Bḍu",
|
||||
"Submit": "Azen",
|
||||
"WaitForHostMsg": "Asarag <b>{{room}}</b> mazal ur yebdi ara. Ma yella d kečč·kemm i d asenneftaɣ, ttxil-k·m ilaq usesteb. Ma yella xaṭi, ttxil-k·m rǧu asenneftaɣ ad d-yaweḍ.",
|
||||
"WaitForHostMsgWOk": "Asarag <b>{{room}}</b> mazal ur yebdi ara. Ma yella d kečč·kemm i d asenneftaɣ, ttxil-k·m sit ɣef Ih i usesteb. Ma yella xaṭi, ttxil-k·m rǧu asenneftaɣ ad d-yaweḍ.",
|
||||
"WaitForHostMsg": "Asarag mazal ur yebdi ara. Ma yella d kečč·kemm i d asenneftaɣ, ttxil-k·m ilaq usesteb. Ma yella xaṭi, ttxil-k·m rǧu asenneftaɣ ad d-yaweḍ.",
|
||||
"WaitingForHostTitle": "Aṛaǧu n usenneftaɣ ...",
|
||||
"Yes": "Ih",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -168,8 +168,7 @@
|
||||
"Remove": "제거",
|
||||
"Share": "공유",
|
||||
"Submit": "제출",
|
||||
"WaitForHostMsg": "<b>{{room}}</b> 회의가 시작되지 않았습니다. 호스트인 경우 인증하십시오. 그렇지 않으면 호스트가 도착할 때까지 기다리십시오.",
|
||||
"WaitForHostMsgWOk": "<b>{{room}}</b> 회의가 아직 시작되지 않았습니다. 호스트인 경우 확인을 눌러 인증하십시오. 그렇지 않으면 호스트가 도착할 때까지 기다리십시오.",
|
||||
"WaitForHostMsg": "회의가 시작되지 않았습니다. 호스트인 경우 인증하십시오. 그렇지 않으면 호스트가 도착할 때까지 기다리십시오.",
|
||||
"WaitingForHost": "호스트를 기다리는 중입니다…",
|
||||
"Yes": "예",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Pašalinti",
|
||||
"Share": "Dalintis",
|
||||
"Submit": "Pateikti",
|
||||
"WaitForHostMsg": "Konferencija <b>{{room}}</b> dar neprasidėjo. Jei jūs organizatorius, prašome tai patvirtinti. Jei ne, prašome palaukti organizatoriaus.",
|
||||
"WaitForHostMsgWOk": "Konferencija <b>{{room}}</b> dar neprasidėjo. Jei jūs organizatorius, prašome tai patvirtinti. Jei ne, prašome palaukti organizatoriaus.",
|
||||
"WaitForHostMsg": "Konferencija dar neprasidėjo. Jei jūs organizatorius, prašome tai patvirtinti. Jei ne, prašome palaukti organizatoriaus.",
|
||||
"WaitingForHost": "Laukiama organizatoriaus ...",
|
||||
"Yes": "Taip",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Noņemt",
|
||||
"Share": "Kopīgot",
|
||||
"Submit": "ОК",
|
||||
"WaitForHostMsg": "Sapulce <b>{{room}}</b> vēl nav sākusies. Ja esat sapulces rīkotājs, lūdzu autorizējaties. Ja nē, sagaidiet rīkotāju.",
|
||||
"WaitForHostMsgWOk": "Sapulce <b>{{room}}</b> vēl nav sākusies. Ja esat sapulces rīkotājs, lūdzu nospiediet |Ok|, lai autentificētos. Ja nē, sagaidiet rīkotāju.",
|
||||
"WaitForHostMsg": "Sapulce vēl nav sākusies. Ja esat sapulces rīkotājs, lūdzu autorizējaties. Ja nē, sagaidiet rīkotāju.",
|
||||
"WaitingForHost": "Gaidām rīkotāju...",
|
||||
"Yes": "Jā",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -174,8 +174,7 @@
|
||||
"Remove": "നീക്കംചെയ്യുക",
|
||||
"Share": "പങ്കിടുക",
|
||||
"Submit": "സമർപ്പിക്കുക",
|
||||
"WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsg": "The conference has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitingForHost": "ഹോസ്റ്റിനായി കാത്തിരിക്കുന്നു ...",
|
||||
"Yes": "അതെ",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Устгах",
|
||||
"Share": "Хуваалцах",
|
||||
"Submit": "Илгээх",
|
||||
"WaitForHostMsg": "<b>{{room}}</b> хурал хараахан эхлээгүй байна. Хэрэв та хост байгаа бол нэвтэрнэ үү. Үгүй бол хост ирэхийг хүлээнэ үү.",
|
||||
"WaitForHostMsgWOk": "<b>{{room}}</b> хурал хараахан эхлээгүй байна. Хэрэв та хост эзэмшигч бол баталгаажуулахын тулд Ok дээр дарна уу. Үгүй бол хост ирэхийг хүлээнэ үү.",
|
||||
"WaitForHostMsg": "Xурал хараахан эхлээгүй байна. Хэрэв та хост байгаа бол нэвтэрнэ үү. Үгүй бол хост ирэхийг хүлээнэ үү.",
|
||||
"WaitingForHost": "Хостыг хүлээж байна ...",
|
||||
"Yes": "Тийм",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "काढा",
|
||||
"Share": "सामायिक करा",
|
||||
"Submit": "प्रस्तुत करणे",
|
||||
"WaitForHostMsg": "परिषद <b>{{room}}</b>अद्याप सुरू झाले नाही. आपण होस्ट असल्यास कृपया अधिकृत करा. अन्यथा, कृपया होस्ट येण्याची प्रतीक्षा करा.",
|
||||
"WaitForHostMsgWOk": "परिषद <b>{{room}}</b> अद्याप सुरू झाले नाही. आपण होस्ट असल्यास कृपया प्रमाणीकरणासाठी ओके दाबा. अन्यथा, कृपया होस्ट येण्याची प्रतीक्षा करा.",
|
||||
"WaitForHostMsg": "परिषद अद्याप सुरू झाले नाही. आपण होस्ट असल्यास कृपया अधिकृत करा. अन्यथा, कृपया होस्ट येण्याची प्रतीक्षा करा.",
|
||||
"WaitingForHost": " होस्टची प्रतीक्षा करीत आहे ...",
|
||||
"Yes": "होय",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -135,7 +135,6 @@
|
||||
"Share": "Del",
|
||||
"Submit": "Send inn",
|
||||
"WaitForHostMsg": "",
|
||||
"WaitForHostMsgWOk": "",
|
||||
"WaitingForHost": "",
|
||||
"Yes": "Ja",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -206,8 +206,7 @@
|
||||
"Remove": "Verwijderen",
|
||||
"Share": "Delen",
|
||||
"Submit": "Verzenden",
|
||||
"WaitForHostMsg": "De vergadering <b>{{room}}</b> is nog niet gestart. Authenticeer uzelf als u de host bent. Anders wacht u tot de host aanwezig is.",
|
||||
"WaitForHostMsgWOk": "De vergadering <b>{{room}}</b> is nog niet gestart. Als u de host bent, drukt u op 'OK' om uzelf te authenticeren. Anders wacht u tot de host aanwezig is.",
|
||||
"WaitForHostMsg": "De vergadering is nog niet gestart. Authenticeer uzelf als u de host bent. Anders wacht u tot de host aanwezig is.",
|
||||
"Yes": "Ja",
|
||||
"accessibilityLabel": {
|
||||
"liveStreaming": "Livestream"
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Suprimir",
|
||||
"Share": "Partejar",
|
||||
"Submit": "Validar",
|
||||
"WaitForHostMsg": "La conferéncia <b>{{room}}</b> a pas encara començat. Se sètz l’òst volgatz ben vos identificar. Autrament esperatz qu’arribe l’òste.",
|
||||
"WaitForHostMsgWOk": "La conferéncia <b>{{room}}</b> a pas encara començat. Se sètz l’òst volgatz ben clicar Ok per vos identificar. Autrament esperatz qu’arribe l’òste.",
|
||||
"WaitForHostMsg": "La conferéncia a pas encara començat. Se sètz l’òst volgatz ben vos identificar. Autrament esperatz qu’arribe l’òste.",
|
||||
"WaitingForHostTitle": "En espèra de l’òste...",
|
||||
"Yes": "Òc",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Usuń",
|
||||
"Share": "Udostępnij",
|
||||
"Submit": "Wyślij",
|
||||
"WaitForHostMsg": "Spotkanie <b>{{room}}</b> jeszcze się nie rozpoczęło. Jeśli jesteś gospodarzem, prosimy o uwierzytelnienie. Jeśli nie, prosimy czekać na przybycie gospodarza.",
|
||||
"WaitForHostMsgWOk": "Spotkanie <b>{{room}}</b> jeszcze się nie rozoczęło. Jeśli jesteś jej gospodarzem, wybierz Ok, aby się uwierzytelnić. Jeśli nie, prosimy czekać na przybycie gospodarza.",
|
||||
"WaitForHostMsg": "Spotkanie jeszcze się nie rozpoczęło. Jeśli jesteś gospodarzem, prosimy o uwierzytelnienie. Jeśli nie, prosimy czekać na przybycie gospodarza.",
|
||||
"WaitingForHostTitle": "Oczekiwanie na gospodarza...",
|
||||
"Yes": "Tak",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Remover",
|
||||
"Share": "Partilhar",
|
||||
"Submit": "Submeter",
|
||||
"WaitForHostMsg": "A conferência <b>{{room}}</b> ainda não começou. Se for o anfitrião, por favor autentique. Caso contrário, por favor aguarde que o anfitrião chegue.",
|
||||
"WaitForHostMsgWOk": "A conferência <b>{{room}}</b> ainda não começou. Se for o anfitrião, por favor prima Ok para autenticar. Caso contrário, por favor aguarde que o anfitrião chegue.",
|
||||
"WaitForHostMsg": "A conferência ainda não começou. Se for o anfitrião, por favor autentique. Caso contrário, por favor aguarde que o anfitrião chegue.",
|
||||
"WaitingForHostTitle": "À espera do anfitrião ...",
|
||||
"Yes": "Sim",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -185,8 +185,7 @@
|
||||
"Remove": "Remover",
|
||||
"Share": "Compartilhar",
|
||||
"Submit": "Enviar",
|
||||
"WaitForHostMsg": "A conferência <b>{{room}}</b> ainda não começou. Se você é o anfitrião, faça a autenticação. Do contrário, aguarde a chegada do anfitrião.",
|
||||
"WaitForHostMsgWOk": "A conferência <b>{{room}}</b> ainda não começou. Se você é o anfitrião, pressione OK para autenticar. Do contrário, aguarde a chegada do anfitrião.",
|
||||
"WaitForHostMsg": "A conferência ainda não começou. Se você é o anfitrião, faça a autenticação. Do contrário, aguarde a chegada do anfitrião.",
|
||||
"WaitingForHostTitle": "Esperando o anfitrião...",
|
||||
"Yes": "Sim",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -159,8 +159,7 @@
|
||||
"Remove": "Eliminați",
|
||||
"Share": "Partajare",
|
||||
"Submit": "Trimiteți",
|
||||
"WaitForHostMsg": "Conferința {{room}} nu a început. Daca sunteți moderatorul conferinței, vă rugăm să vă autentificați. Dacă nu, așteptați ca moderatorul să înceapă conferința.",
|
||||
"WaitForHostMsgWOk": "Conferința {{room}} nu a început. Daca sunteți moderatorul, apăsați butonul OK pentru autentificare. Dacă nu, așteptați ca moderatorul să înceapă conferința.",
|
||||
"WaitForHostMsg": "Conferința nu a început. Daca sunteți moderatorul conferinței, vă rugăm să vă autentificați. Dacă nu, așteptați ca moderatorul să înceapă conferința.",
|
||||
"WaitingForHost": "Așteptare moderator conferință ...",
|
||||
"Yes": "Da",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -185,8 +185,7 @@
|
||||
"Remove": "Удалить",
|
||||
"Share": "Поделиться",
|
||||
"Submit": "ОК",
|
||||
"WaitForHostMsg": "Конференция <b>{{room}}</b> еще не началась. Если вы организатор, пожалуйста, авторизируйтесь. В противном случае дождитесь организатора.",
|
||||
"WaitForHostMsgWOk": "Конференция <b>{{room}}</b> еще не началась. Если вы организатор, пожалуйста, нажмите Ok для аутентификации. В противном случае, дождитесь организатора.",
|
||||
"WaitForHostMsg": "Конференция еще не началась. Если вы организатор, пожалуйста, авторизируйтесь. В противном случае дождитесь организатора.",
|
||||
"WaitingForHost": "Ждем организатора...",
|
||||
"Yes": "Да",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -155,8 +155,7 @@
|
||||
"Remove": "Boga",
|
||||
"Share": "Cumpartzi",
|
||||
"Submit": "Imbia",
|
||||
"WaitForHostMsg": "Sa cunferèntzia <b>{{room}}</b> no est cumintzada. Si ses mere de custa cunferèntzia, autèntica·ti. Si nono, iseta chi arribet.",
|
||||
"WaitForHostMsgWOk": "Sa cunferèntzia <b>{{room}}</b> no est cumintzada. Si ses mere, incarca AB pro ti autenticare. Si nono, iseta chi arribet.",
|
||||
"WaitForHostMsg": "Sa cunferèntzia no est cumintzada. Si ses mere de custa cunferèntzia, autèntica·ti. Si nono, iseta chi arribet.",
|
||||
"WaitingForHost": "Isetende mere...",
|
||||
"Yes": "Eja",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -174,8 +174,7 @@
|
||||
"Remove": "Odstrániť",
|
||||
"Share": "Zdieľať",
|
||||
"Submit": "OK",
|
||||
"WaitForHostMsg": "Konferencia <b>{{room}}</b> sa ešte nezačala. Autorizujte sa prosím ak ste hostiteľ. V opačnom prípade čakajte na hostiteľa.",
|
||||
"WaitForHostMsgWOk": "Konferencia <b>{{room}}</b> sa ešte nezačala. Ak ste hostiteľ autorizujte sa stlačením Ok. V opačnom prípade čakajte na hostiteľa.",
|
||||
"WaitForHostMsg": "Konferencia sa ešte nezačala. Autorizujte sa prosím ak ste hostiteľ. V opačnom prípade čakajte na hostiteľa.",
|
||||
"WaitingForHost": "Čakám na hostiteľa ...",
|
||||
"Yes": "Áno",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -185,8 +185,7 @@
|
||||
"Remove": "Odstrani",
|
||||
"Share": "Deli",
|
||||
"Submit": "Pošlji",
|
||||
"WaitForHostMsg": "Konferenca v sobi <b>{{room}}</b> se še ni začela. Če ste gostitelj, se prosimo prijavite, sicer pa počakajte na gostitelja srečanja.",
|
||||
"WaitForHostMsgWOk": "Konferenca v sobi <b>{{room}}</b> se še ni začela. Če ste gostitelj, prisisnite OK in se prijavite, sicer pa počakajte na gostitelja srečanja.",
|
||||
"WaitForHostMsg": "Konferenca v sobi se še ni začela. Če ste gostitelj, se prosimo prijavite, sicer pa počakajte na gostitelja srečanja.",
|
||||
"WaitingForHostTitle": "Čakanje gostitelja ...",
|
||||
"Yes": "Da",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Hiqe",
|
||||
"Share": "Ndaje",
|
||||
"Submit": "Parashtroje",
|
||||
"WaitForHostMsg": "Konferenca <b>{{room}}</b> s’ka nisur ende. Nëse jeni organizatori, ju lutemi, bëni mirëfilltësimin. Përndryshe, ju lutemi, pritni që të mbërrijë organizatori.",
|
||||
"WaitForHostMsgWOk": "Konferenca <b>{{room}}</b> s’ka nisur ende. Nëse jeni organizatori, ju lutemi, shtypni OK që të bëhet mirëfilltësimi. Përndryshe, ju lutemi, pritni që të mbërrijë organizatori.",
|
||||
"WaitForHostMsg": "Konferenca s’ka nisur ende. Nëse jeni organizatori, ju lutemi, bëni mirëfilltësimin. Përndryshe, ju lutemi, pritni që të mbërrijë organizatori.",
|
||||
"WaitingForHostTitle": "Po pritet për organizatorin…",
|
||||
"Yes": "Po",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -144,7 +144,6 @@
|
||||
"Share": "",
|
||||
"Submit": "Пошаљи",
|
||||
"WaitForHostMsg": "",
|
||||
"WaitForHostMsgWOk": "",
|
||||
"WaitingForHost": "",
|
||||
"Yes": "Да",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"noResults": "Inga sökträffar",
|
||||
"noValidNumbers": "Ange ett telefonnummer",
|
||||
"outlookEmail": "Outlook email",
|
||||
"phoneNumbers": "telefonnummer",
|
||||
"phoneNumbers": "Telefonnummer",
|
||||
"searchNumbers": "Lägg till telefonnummer",
|
||||
"searchPeople": "Sök efter personer",
|
||||
"searchPeopleAndNumbers": "Sök efter personer eller lägg till deras telefonnummer",
|
||||
@@ -195,8 +195,7 @@
|
||||
"Remove": "Ta bort",
|
||||
"Share": "Dela",
|
||||
"Submit": "Skicka",
|
||||
"WaitForHostMsg": "Konferensen <b>{{room}}</b> har inte börjat än. Autentisera konferensen om du är värd. Vänta annars på att värden startar konferensen.",
|
||||
"WaitForHostMsgWOk": "Konferensen <b>{{room}}</b> har inte börjat än. Om du är värd, autentisera konferensen genom att trycka på Ok. Vänta annars på att värden startar konferensen.",
|
||||
"WaitForHostMsg": "Konferensen har inte börjat än. Autentisera konferensen om du är värd. Vänta annars på att värden startar konferensen.",
|
||||
"WaitingForHost": "Väntar på värden ...",
|
||||
"WaitingForHostTitle": "Väntar på värden ...",
|
||||
"Yes": "Ja",
|
||||
@@ -234,7 +233,7 @@
|
||||
"dismiss": "Förkasta",
|
||||
"displayNameRequired": "Hej, vad heter du?",
|
||||
"done": "Klar",
|
||||
"e2eeDescription": "???",
|
||||
"e2eeDescription": "Stödet för End-to-End kryptering är EXPERIMENTELLT. Notera att om du aktiverar det kommer vissa funktioner som t.ex. telefondeltagande försvinna. Mötet kommer även att begränsas till deltagare med webbläsare som har stöd för insertable streams.",
|
||||
"e2eeLabel": "Aktivera \"end-to-end\" kryptering",
|
||||
"e2eeWarning": "Varning, alla deltagare i mötet har ej stöd för \"end-to-end\" kryptering",
|
||||
"embedMeeting": "Bädda in möte",
|
||||
@@ -294,7 +293,7 @@
|
||||
"muteParticipantDialog": "Vill du tysta den här deltagaren? Du kan inte aktivera mikrofonen igen, men deltagaren kan när som helst göra det själv.",
|
||||
"muteParticipantTitle": "Tysta deltagaren?",
|
||||
"muteParticipantsVideoBody": "Du kommer inte att kunna aktivera kameran igen. Däremot kan deltagaren kunna aktivera sin egen kamera när som.",
|
||||
"muteParticipantsVideoButton": "Inkativera kamera",
|
||||
"muteParticipantsVideoButton": "Inaktivera kamera",
|
||||
"muteParticipantsVideoDialog": "Är du säker du vill inaktivera denna deltagares kamera. Du kommer inte att kunna aktivera den igen. Däremot kan deltagaren kunna aktivera sin egen kamera när som.",
|
||||
"muteParticipantsVideoTitle": "Inaktivera denna deltagares kamera?",
|
||||
"noDropboxToken": "Ingen giltig dropbox tecken",
|
||||
@@ -303,14 +302,14 @@
|
||||
"passwordNotSupported": "Att sätta ett $t(lockRoomPassword) för mötesrummet stöds ej.",
|
||||
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) stöds inte",
|
||||
"passwordRequired": "$t(lockRoomPasswordUppercase) krävs",
|
||||
"permissionCameraRequiredError": "Tillåtelese krävs för att delta med kamera i denna möte. Var god skaffa detta i \"inställningar\".",
|
||||
"permissionCameraRequiredError": "Tillåtelse krävs för att delta med kamera i denna möte. Var god skaffa detta i \"inställningar\".",
|
||||
"permissionErrorTitle": "Tillåtelse krävs",
|
||||
"permissionMicRequiredError": "Tillåtelese krävs för att delta med mikrofon i denna möte. Var god skaffa detta i \"inställningar\".",
|
||||
"permissionMicRequiredError": "Tillåtelse krävs för att delta med mikrofon i denna möte. Var god skaffa detta i \"inställningar\".",
|
||||
"popupError": "Din webbläsare blockerar pop-up-fönster från sajten. Tillåt pop-up-fönster från den här sajten i inställningarna och försök igen.",
|
||||
"popupErrorTitle": "Pop-up blockerad",
|
||||
"readMore": "Mer",
|
||||
"recording": "Inspelning",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Ej möjligt medan live streaming pågår.",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Ej möjligt medan livestreaming pågår.",
|
||||
"recordingDisabledForGuestTooltip": "Gäster kan inte starta inspelningar.",
|
||||
"recordingDisabledTooltip": "Starta inspelning har inaktiverats.",
|
||||
"rejoinNow": "Återanslut nu",
|
||||
@@ -374,8 +373,8 @@
|
||||
"transcribing": "Transkriberar",
|
||||
"unlockRoom": "Ta bort möte $t(lockRoomPassword)",
|
||||
"user": "Användare",
|
||||
"userIdentifier": "Användar indentifierare",
|
||||
"userPassword": "användarlösenord",
|
||||
"userIdentifier": "Användar-ID",
|
||||
"userPassword": "Lösenord",
|
||||
"videoLink": "Videolänk",
|
||||
"viewUpgradeOptions": "Se uppgraderings alternativ",
|
||||
"viewUpgradeOptionsContent": "För att få obegränsad tillgång till premiumfunktioner som inspelning, transkriptioner, RTMP -streaming och mer måste du uppgradera din plan.",
|
||||
@@ -622,7 +621,7 @@
|
||||
"newDeviceAction": "Använd",
|
||||
"newDeviceAudioTitle": "Ny ljudenhet hittad",
|
||||
"newDeviceCameraTitle": "Ny kamera hittad",
|
||||
"oldElectronClientDescription1": "Den version av Jitis meet som används är gammal och har säkerhetsluckor. Var god uppdatera till den senaste versionen.",
|
||||
"oldElectronClientDescription1": "Den version av Jitsi meet som används är gammal och har säkerhetsluckor. Var god uppdatera till den senaste versionen.",
|
||||
"oldElectronClientDescription2": "senast build",
|
||||
"oldElectronClientDescription3": "nu!",
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) togs bort av en annan deltagare",
|
||||
@@ -813,8 +812,8 @@
|
||||
"pullToRefresh": "Dra för att uppdatera"
|
||||
},
|
||||
"security": {
|
||||
"about": "Du kan lägga till en $t(lockRoomPassword) till ditt möte. Deltagarna måste ange $t(lockRoomPassword) innan de får gå med i mötet.",
|
||||
"aboutReadOnly": "Moderatorn kan lägga till en $t(lockRoomPassword) till mötet. Deltagarna måste ange $t(lockRoomPassword) innan de får gå med i mötet.",
|
||||
"about": "Du kan lägga till ett $t(lockRoomPassword) till ditt möte. Deltagarna måste ange $t(lockRoomPassword) innan de får gå med i mötet.",
|
||||
"aboutReadOnly": "Moderatorn kan lägga till ett $t(lockRoomPassword) till mötet. Deltagarna måste ange $t(lockRoomPassword) innan de får gå med i mötet.",
|
||||
"insecureRoomNameWarning": "Rummets namn är osäkert. Oönskade deltagare kan gå med i din konferens. Överväg att säkra ditt möte med hjälp av säkerhetsknappen.",
|
||||
"securityOptions": "Säkerhetsalternativ"
|
||||
},
|
||||
@@ -1156,8 +1155,8 @@
|
||||
"getHelp": "Få hjälp",
|
||||
"go": "KÖR",
|
||||
"goSmall": "BÖRJA",
|
||||
"headerSubtitle": "Säkra- och högkvalitet möten",
|
||||
"headerTitle": "Jitisi Meet",
|
||||
"headerSubtitle": "Säkra möten med hög kvalitet",
|
||||
"headerTitle": "Jitsi Meet",
|
||||
"info": "Info",
|
||||
"jitsiOnMobile": "Jitsi på mobilen - ladda ner våra appar och starta ett möte var som helst",
|
||||
"join": "Gå med",
|
||||
@@ -1165,7 +1164,7 @@
|
||||
"calendar": "Kalender logotyp",
|
||||
"desktopPreviewThumbnail": "Miniatyrbild av skrivbordsförhandsgranskning",
|
||||
"googleLogo": "Google logotyp",
|
||||
"logoDeepLinking": "Jitisi logotyp",
|
||||
"logoDeepLinking": "Jitsi logotyp",
|
||||
"microsoftLogo": "Microsoft logotyp",
|
||||
"policyLogo": "Policy-logotyp"
|
||||
},
|
||||
|
||||
@@ -180,8 +180,7 @@
|
||||
"Remove": "తీసివేయి",
|
||||
"Share": "పంచుకోండి",
|
||||
"Submit": "దాఖలుచేయి",
|
||||
"WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsg": "The conference has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitingForHostTitle": "అతిథేయి కోసం వేచివున్నాం ...",
|
||||
"Yes": "అవును",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -195,8 +195,7 @@
|
||||
"Remove": "Kaldır",
|
||||
"Share": "Paylaş",
|
||||
"Submit": "Gönder",
|
||||
"WaitForHostMsg": "<b>{{room}}</b> toplantısı henüz başlamadı. Toplantı sahibi sizseniz, lütfen kimlik doğrulaması yapın. Değilseniz lütfen toplantı sahibinin gelmesini bekleyin.",
|
||||
"WaitForHostMsgWOk": "<b>{{room}}</b> toplantısı henüz başlamadı. Toplantı sahibi sizseniz, kimlik doğrulaması için Tamam butonuna basın. Değilseniz lütfen toplantı sahibinin gelmesini bekleyin.",
|
||||
"WaitForHostMsg": "Toplantısı henüz başlamadı. Toplantı sahibi sizseniz, lütfen kimlik doğrulaması yapın. Değilseniz lütfen toplantı sahibinin gelmesini bekleyin.",
|
||||
"WaitingForHost": "Toplantı sahibi bekleniyor...",
|
||||
"WaitingForHostTitle": "Toplantı sahibi bekleniyor ...",
|
||||
"Yes": "Evet",
|
||||
|
||||
@@ -177,8 +177,7 @@
|
||||
"Remove": "Вилучити",
|
||||
"Share": "Поділитися",
|
||||
"Submit": "Гаразд",
|
||||
"WaitForHostMsg": "Конференція <b>{{room}}</b> ще не почалася. Якщо ви є організатором, будь ласка, авторизуйтеся або дочекайтеся організатора.",
|
||||
"WaitForHostMsgWOk": "Конференція <b>{{room}}</b> ще не почалася. Якщо ви є організатором, будь ласка, клацніть на кнопку \"Гаразд\" для авторизації або дочекайтеся організатора.",
|
||||
"WaitForHostMsg": "Конференція ще не почалася. Якщо ви є організатором, будь ласка, авторизуйтеся або дочекайтеся організатора.",
|
||||
"WaitingForHost": "Чекаємо на організатора...",
|
||||
"Yes": "Так",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -146,8 +146,7 @@
|
||||
"Remove": "Xóa",
|
||||
"Share": "Chia sẻ",
|
||||
"Submit": "Đăng ký",
|
||||
"WaitForHostMsg": "Cuộc họp <b>{{room}}</b> chưa được khởi tạo. Nếu bạn là chủ nghị vui lòng xác thực. Nếu không, vui lòng đợi chủ nghị.",
|
||||
"WaitForHostMsgWOk": "Cuộc họp <b>{{room}}</b> chưa được khởi tạo. Nếu bạn là chủ nghị vui lòng nhấn OK để xác thực. Nếu không, vui lòng đợi chủ nghị.",
|
||||
"WaitForHostMsg": "Cuộc họp chưa được khởi tạo. Nếu bạn là chủ nghị vui lòng xác thực. Nếu không, vui lòng đợi chủ nghị.",
|
||||
"WaitingForHost": "Đang đợi chủ nghị …",
|
||||
"Yes": "Có",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -174,8 +174,7 @@
|
||||
"Remove": "移除",
|
||||
"Share": "分享",
|
||||
"Submit": "提交",
|
||||
"WaitForHostMsg": "会议<b>{{room}}</b>尚未开始。如果您是主持人,请进行身份验证。否则,请等待主持人的到来。",
|
||||
"WaitForHostMsgWOk": "会议<b>{{room}}</b>尚未开始。如果您是主持人,请进行身份验证。否则,请等待主持人的到来。",
|
||||
"WaitForHostMsg": "会议 尚未开始。如果您是主持人,请进行身份验证。否则,请等待主持人的到来。",
|
||||
"WaitingForHost": "等待主持人。。。",
|
||||
"Yes": "是",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -207,8 +207,7 @@
|
||||
"Remove": "移除",
|
||||
"Share": "分享",
|
||||
"Submit": "提交",
|
||||
"WaitForHostMsg": "此會議 <b>{{room}}</b> 尚未啟動。如果您是會議主人,請進行認證;否則,請等待會議主人到達。",
|
||||
"WaitForHostMsgWOk": "此會議 <b>{{room}}</b> 尚未啟動。如果您是會議主人,請按 [確定] 進行認證;否則,請等待會議主人到達。",
|
||||
"WaitForHostMsg": "此會議 尚未啟動。如果您是會議主人,請進行認證;否則,請等待會議主人到達。",
|
||||
"WaitingForHost": "等侯主辦人...",
|
||||
"Yes": "是的",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -208,8 +208,7 @@
|
||||
"Remove": "Remove",
|
||||
"Share": "Share",
|
||||
"Submit": "Submit",
|
||||
"WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitForHostMsg": "The conference has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
|
||||
"WaitingForHostTitle": "Waiting for the host ...",
|
||||
"Yes": "Yes",
|
||||
"accessibilityLabel": {
|
||||
|
||||
@@ -72,7 +72,7 @@ import {
|
||||
captureLargeVideoScreenshot,
|
||||
resizeLargeVideo
|
||||
} from '../../react/features/large-video/actions.web';
|
||||
import { toggleLobbyMode, setKnockingParticipantApproval } from '../../react/features/lobby/actions';
|
||||
import { toggleLobbyMode, answerKnockingParticipant } from '../../react/features/lobby/actions';
|
||||
import {
|
||||
close as closeParticipantsPane,
|
||||
open as openParticipantsPane
|
||||
@@ -140,7 +140,7 @@ function initCommands() {
|
||||
APP.store.dispatch(createBreakoutRoom(name));
|
||||
},
|
||||
'answer-knocking-participant': (id, approved) => {
|
||||
APP.store.dispatch(setKnockingParticipantApproval(id, approved));
|
||||
APP.store.dispatch(answerKnockingParticipant(id, approved));
|
||||
},
|
||||
'approve-video': participantId => {
|
||||
if (!isLocalParticipantModerator(APP.store.getState())) {
|
||||
|
||||
@@ -9,10 +9,8 @@ import { Provider } from 'react-redux';
|
||||
import { createScreenSharingIssueEvent, sendAnalytics } from '../../../react/features/analytics';
|
||||
import { Avatar } from '../../../react/features/base/avatar';
|
||||
import theme from '../../../react/features/base/components/themes/participantsPaneTheme.json';
|
||||
import { getSourceNameSignalingFeatureFlag } from '../../../react/features/base/config';
|
||||
import { i18next } from '../../../react/features/base/i18n';
|
||||
import {
|
||||
JitsiParticipantConnectionStatus
|
||||
} from '../../../react/features/base/lib-jitsi-meet';
|
||||
import { MEDIA_TYPE, VIDEO_TYPE } from '../../../react/features/base/media';
|
||||
import {
|
||||
getParticipantById,
|
||||
@@ -20,6 +18,15 @@ import {
|
||||
} from '../../../react/features/base/participants';
|
||||
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
|
||||
import { CHAT_SIZE } from '../../../react/features/chat';
|
||||
import {
|
||||
isParticipantConnectionStatusActive,
|
||||
isParticipantConnectionStatusInactive,
|
||||
isParticipantConnectionStatusInterrupted,
|
||||
isTrackStreamingStatusActive,
|
||||
isTrackStreamingStatusInactive,
|
||||
isTrackStreamingStatusInterrupted
|
||||
} from '../../../react/features/connection-indicator/functions';
|
||||
import { FILMSTRIP_BREAKPOINT, isFilmstripResizable } from '../../../react/features/filmstrip';
|
||||
import {
|
||||
updateKnownLargeVideoResolution
|
||||
} from '../../../react/features/large-video/actions';
|
||||
@@ -226,8 +233,20 @@ export default class LargeVideoManager {
|
||||
const state = APP.store.getState();
|
||||
const participant = getParticipantById(state, id);
|
||||
const connectionStatus = participant?.connectionStatus;
|
||||
const isVideoRenderable = !isVideoMuted
|
||||
&& (APP.conference.isLocalId(id) || connectionStatus === JitsiParticipantConnectionStatus.ACTIVE);
|
||||
|
||||
let isVideoRenderable;
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
|
||||
|
||||
isVideoRenderable = !isVideoMuted
|
||||
&& (APP.conference.isLocalId(id) || isTrackStreamingStatusActive(videoTrack));
|
||||
} else {
|
||||
isVideoRenderable = !isVideoMuted
|
||||
&& (APP.conference.isLocalId(id) || isParticipantConnectionStatusActive(participant));
|
||||
}
|
||||
|
||||
const isAudioOnly = APP.conference.isAudioOnly();
|
||||
const showAvatar
|
||||
= isVideoContainer
|
||||
@@ -278,8 +297,16 @@ export default class LargeVideoManager {
|
||||
this.updateLargeVideoAudioLevel(0);
|
||||
}
|
||||
|
||||
const messageKey
|
||||
= connectionStatus === JitsiParticipantConnectionStatus.INACTIVE ? 'connection.LOW_BANDWIDTH' : null;
|
||||
let messageKey;
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
|
||||
|
||||
messageKey = isTrackStreamingStatusInactive(videoTrack) ? 'connection.LOW_BANDWIDTH' : null;
|
||||
} else {
|
||||
messageKey = isParticipantConnectionStatusInactive(participant) ? 'connection.LOW_BANDWIDTH' : null;
|
||||
}
|
||||
|
||||
// Do not show connection status message in the audio only mode,
|
||||
// because it's based on the video playback status.
|
||||
@@ -375,7 +402,9 @@ export default class LargeVideoManager {
|
||||
let widthToUse = this.preferredWidth || window.innerWidth;
|
||||
const state = APP.store.getState();
|
||||
const { isOpen } = state['features/chat'];
|
||||
const { width: filmstripWidth, visible } = state['features/filmstrip'];
|
||||
const isParticipantsPaneOpen = getParticipantsPaneOpen(state);
|
||||
const resizableFilmstrip = isFilmstripResizable(state);
|
||||
|
||||
if (isParticipantsPaneOpen) {
|
||||
widthToUse -= theme.participantsPaneWidth;
|
||||
@@ -389,6 +418,10 @@ export default class LargeVideoManager {
|
||||
widthToUse -= CHAT_SIZE;
|
||||
}
|
||||
|
||||
if (resizableFilmstrip && visible && filmstripWidth.current >= FILMSTRIP_BREAKPOINT) {
|
||||
widthToUse -= filmstripWidth.current;
|
||||
}
|
||||
|
||||
this.width = widthToUse;
|
||||
this.height = this.preferredHeight || window.innerHeight;
|
||||
}
|
||||
@@ -505,13 +538,22 @@ export default class LargeVideoManager {
|
||||
showRemoteConnectionMessage(show) {
|
||||
if (typeof show !== 'boolean') {
|
||||
const participant = getParticipantById(APP.store.getState(), this.id);
|
||||
const connStatus = participant?.connectionStatus;
|
||||
const state = APP.store.getState();
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
show = !APP.conference.isLocalId(this.id)
|
||||
&& (connStatus === JitsiParticipantConnectionStatus.INTERRUPTED
|
||||
|| connStatus
|
||||
=== JitsiParticipantConnectionStatus.INACTIVE);
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, this.id);
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
show = !APP.conference.isLocalId(this.id)
|
||||
&& (isTrackStreamingStatusInterrupted(videoTrack)
|
||||
|| isTrackStreamingStatusInactive(videoTrack));
|
||||
} else {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
show = !APP.conference.isLocalId(this.id)
|
||||
&& (isParticipantConnectionStatusInterrupted(participant)
|
||||
|| isParticipantConnectionStatusInactive(participant));
|
||||
}
|
||||
}
|
||||
|
||||
if (show) {
|
||||
|
||||
12762
package-lock.json
generated
12762
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
14
package.json
14
package.json
@@ -72,8 +72,8 @@
|
||||
"jquery-i18next": "1.2.1",
|
||||
"js-md5": "0.6.1",
|
||||
"jwt-decode": "2.2.0",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1353.0.0+f23372dd/lib-jitsi-meet.tgz",
|
||||
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1389.0.0+313e0dd3/lib-jitsi-meet.tgz",
|
||||
"libflacjs": "https://git@github.com/mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
||||
"lodash": "4.17.21",
|
||||
"moment": "2.29.1",
|
||||
"moment-duration-format": "2.2.2",
|
||||
@@ -91,9 +91,9 @@
|
||||
"react-native-calendar-events": "2.2.0",
|
||||
"react-native-callstats": "3.73.7",
|
||||
"react-native-collapsible": "1.6.0",
|
||||
"react-native-default-preference": "github:kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
|
||||
"react-native-default-preference": "https://git@github.com/kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
|
||||
"react-native-device-info": "8.4.8",
|
||||
"react-native-dialog": "9.2.0",
|
||||
"react-native-dialog": "9.2.1",
|
||||
"react-native-gesture-handler": "2.1.0",
|
||||
"react-native-get-random-values": "1.7.2",
|
||||
"react-native-immersive": "2.0.0",
|
||||
@@ -110,9 +110,9 @@
|
||||
"react-native-svg-transformer": "1.0.0",
|
||||
"react-native-tab-view": "3.1.1",
|
||||
"react-native-url-polyfill": "1.3.0",
|
||||
"react-native-video": "github:jitsi/react-native-video#4f6dad990d17ce42894df993780b5386a9c11b85",
|
||||
"react-native-video": "https://git@github.com/jitsi/react-native-video#4f6dad990d17ce42894df993780b5386a9c11b85",
|
||||
"react-native-watch-connectivity": "1.0.4",
|
||||
"react-native-webrtc": "1.94.1",
|
||||
"react-native-webrtc": "1.94.2",
|
||||
"react-native-webview": "11.15.1",
|
||||
"react-native-youtube-iframe": "2.2.1",
|
||||
"react-redux": "7.1.0",
|
||||
@@ -123,7 +123,7 @@
|
||||
"redux": "4.0.4",
|
||||
"redux-thunk": "2.2.0",
|
||||
"resemblejs": "4.0.0",
|
||||
"rnnoise-wasm": "github:jitsi/rnnoise-wasm#566a16885897704d6e6d67a1d5ac5d39781db2af",
|
||||
"rnnoise-wasm": "https://git@github.com/jitsi/rnnoise-wasm#566a16885897704d6e6d67a1d5ac5d39781db2af",
|
||||
"styled-components": "3.4.9",
|
||||
"util": "0.12.1",
|
||||
"uuid": "8.3.2",
|
||||
|
||||
@@ -31,3 +31,111 @@ index 70f0543..d43a4be 100644
|
||||
- (void)stopTimers
|
||||
{
|
||||
if (_inBackground) {
|
||||
diff --git a/node_modules/react-native/scripts/react_native_pods.rb b/node_modules/react-native/scripts/react_native_pods.rb
|
||||
index df31139..061ded9 100644
|
||||
--- a/node_modules/react-native/scripts/react_native_pods.rb
|
||||
+++ b/node_modules/react-native/scripts/react_native_pods.rb
|
||||
@@ -125,20 +125,49 @@ def exclude_architectures(installer)
|
||||
.uniq{ |p| p.path }
|
||||
.push(installer.pods_project)
|
||||
|
||||
- arm_value = `/usr/sbin/sysctl -n hw.optional.arm64 2>&1`.to_i
|
||||
-
|
||||
# Hermes does not support `i386` architecture
|
||||
excluded_archs_default = has_pod(installer, 'hermes-engine') ? "i386" : ""
|
||||
|
||||
projects.each do |project|
|
||||
project.build_configurations.each do |config|
|
||||
- if arm_value == 1 then
|
||||
- config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = excluded_archs_default
|
||||
- else
|
||||
- config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64 " + excluded_archs_default
|
||||
+ config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = excluded_archs_default
|
||||
+ end
|
||||
+
|
||||
+ project.save()
|
||||
+ end
|
||||
+end
|
||||
+
|
||||
+def fix_library_search_paths(installer)
|
||||
+ def fix_config(config)
|
||||
+ lib_search_paths = config.build_settings["LIBRARY_SEARCH_PATHS"]
|
||||
+ if lib_search_paths
|
||||
+ if lib_search_paths.include?("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)") || lib_search_paths.include?("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"")
|
||||
+ # $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) causes problem with Xcode 12.5 + arm64 (Apple M1)
|
||||
+ # since the libraries there are only built for x86_64 and i386.
|
||||
+ lib_search_paths.delete("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)")
|
||||
+ lib_search_paths.delete("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"")
|
||||
+ if !(lib_search_paths.include?("$(SDKROOT)/usr/lib/swift") || lib_search_paths.include?("\"$(SDKROOT)/usr/lib/swift\""))
|
||||
+ # however, $(SDKROOT)/usr/lib/swift is required, at least if user is not running CocoaPods 1.11
|
||||
+ lib_search_paths.insert(0, "$(SDKROOT)/usr/lib/swift")
|
||||
+ end
|
||||
end
|
||||
end
|
||||
+ end
|
||||
+
|
||||
+ projects = installer.aggregate_targets
|
||||
+ .map{ |t| t.user_project }
|
||||
+ .uniq{ |p| p.path }
|
||||
+ .push(installer.pods_project)
|
||||
|
||||
+ projects.each do |project|
|
||||
+ project.build_configurations.each do |config|
|
||||
+ fix_config(config)
|
||||
+ end
|
||||
+ project.native_targets.each do |target|
|
||||
+ target.build_configurations.each do |config|
|
||||
+ fix_config(config)
|
||||
+ end
|
||||
+ end
|
||||
project.save()
|
||||
end
|
||||
end
|
||||
@@ -149,6 +178,7 @@ def react_native_post_install(installer)
|
||||
end
|
||||
|
||||
exclude_architectures(installer)
|
||||
+ fix_library_search_paths(installer)
|
||||
end
|
||||
|
||||
def use_react_native_codegen!(spec, options={})
|
||||
@@ -218,36 +248,8 @@ end
|
||||
# See https://github.com/facebook/react-native/issues/31480#issuecomment-902912841 for more context.
|
||||
# Actual fix was authored by https://github.com/mikehardy.
|
||||
# New app template will call this for now until the underlying issue is resolved.
|
||||
+#
|
||||
+# It's not needed anymore and will be removed later
|
||||
def __apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||
- # Apple Silicon builds require a library path tweak for Swift library discovery to resolve Swift-related "symbol not found".
|
||||
- # Note: this was fixed via https://github.com/facebook/react-native/commit/eb938863063f5535735af2be4e706f70647e5b90
|
||||
- # Keeping this logic here but commented out for future reference.
|
||||
- #
|
||||
- # installer.aggregate_targets.each do |aggregate_target|
|
||||
- # aggregate_target.user_project.native_targets.each do |target|
|
||||
- # target.build_configurations.each do |config|
|
||||
- # config.build_settings['LIBRARY_SEARCH_PATHS'] = ['$(SDKROOT)/usr/lib/swift', '$(inherited)']
|
||||
- # end
|
||||
- # end
|
||||
- # aggregate_target.user_project.save
|
||||
- # end
|
||||
-
|
||||
- # Flipper podspecs are still targeting an older iOS deployment target, and may cause an error like:
|
||||
- # "error: thread-local storage is not supported for the current target"
|
||||
- # The most reliable known workaround is to bump iOS deployment target to match react-native (iOS 11 now).
|
||||
- installer.pods_project.targets.each do |target|
|
||||
- target.build_configurations.each do |config|
|
||||
- # ensure IPHONEOS_DEPLOYMENT_TARGET is at least 11.0
|
||||
- should_upgrade = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].split('.')[0].to_i < 11
|
||||
- if should_upgrade
|
||||
- config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
|
||||
- end
|
||||
- end
|
||||
- end
|
||||
-
|
||||
- # But... doing so caused another issue in Flipper:
|
||||
- # "Time.h:52:17: error: typedef redefinition with different types"
|
||||
- # We need to make a patch to RCT-Folly - remove the `__IPHONE_OS_VERSION_MIN_REQUIRED` check.
|
||||
- # See https://github.com/facebook/flipper/issues/834 for more details.
|
||||
- `sed -i -e $'s/ && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)//' Pods/RCT-Folly/folly/portability/Time.h`
|
||||
+ puts "__apply_Xcode_12_5_M1_post_install_workaround() is not needed anymore"
|
||||
end
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
diff --git a/node_modules/react-native-dialog/lib/Description.js b/node_modules/react-native-dialog/lib/Description.js
|
||||
index 7eb97bb..2da9ed3 100644
|
||||
--- a/node_modules/react-native-dialog/lib/Description.js
|
||||
+++ b/node_modules/react-native-dialog/lib/Description.js
|
||||
@@ -23,7 +23,7 @@ const buildStyles = (isDark) => StyleSheet.create({
|
||||
text: Platform.select({
|
||||
ios: {
|
||||
textAlign: "center",
|
||||
- color: PlatformColor("secondaryLabel"),
|
||||
+ color: PlatformColor("label"),
|
||||
fontSize: 13,
|
||||
marginTop: 4,
|
||||
},
|
||||
22
patches/react-native-dialog+9.2.1.patch
Normal file
22
patches/react-native-dialog+9.2.1.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
diff --git a/node_modules/react-native-dialog/lib/Container.js b/node_modules/react-native-dialog/lib/Container.js
|
||||
index 69e3764..109126f 100644
|
||||
--- a/node_modules/react-native-dialog/lib/Container.js
|
||||
+++ b/node_modules/react-native-dialog/lib/Container.js
|
||||
@@ -82,7 +82,7 @@ DialogContainer.propTypes = {
|
||||
useNativeDriver: PropTypes.bool,
|
||||
children: PropTypes.node.isRequired,
|
||||
};
|
||||
-const buildStyles = () => StyleSheet.create({
|
||||
+const buildStyles = (isDark) => StyleSheet.create({
|
||||
centeredView: {
|
||||
marginTop: 22,
|
||||
},
|
||||
@@ -103,7 +103,7 @@ const buildStyles = () => StyleSheet.create({
|
||||
overflow: "hidden",
|
||||
},
|
||||
android: {
|
||||
- backgroundColor: PlatformColor("?attr/colorBackgroundFloating"),
|
||||
+ backgroundColor: PlatformColor(`@android:color/${isDark ? "background_dark" : "background_light"}`),
|
||||
flexDirection: "column",
|
||||
borderRadius: 3,
|
||||
padding: 16,
|
||||
@@ -11,6 +11,9 @@ module.exports = {
|
||||
'react/jsx-indent-props': 0
|
||||
},
|
||||
'settings': {
|
||||
'flowtype': {
|
||||
'onlyFilesWithFlowAnnotation': true
|
||||
},
|
||||
'react': {
|
||||
'version': 'detect'
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ import '../mobile/background/middleware';
|
||||
import '../mobile/call-integration/middleware';
|
||||
import '../mobile/external-api/middleware';
|
||||
import '../mobile/full-screen/middleware';
|
||||
import '../mobile/incoming-call/middleware';
|
||||
import '../mobile/navigation/middleware';
|
||||
import '../mobile/permissions/middleware';
|
||||
import '../mobile/proximity/middleware';
|
||||
|
||||
@@ -5,7 +5,6 @@ import '../mobile/background/reducer';
|
||||
import '../mobile/call-integration/reducer';
|
||||
import '../mobile/external-api/reducer';
|
||||
import '../mobile/full-screen/reducer';
|
||||
import '../mobile/incoming-call/reducer';
|
||||
import '../mobile/watchos/reducer';
|
||||
import '../shared-video/reducer';
|
||||
|
||||
|
||||
@@ -13,11 +13,6 @@ import { openLoginDialog, cancelWaitForOwner } from '../../actions.native';
|
||||
*/
|
||||
type Props = {
|
||||
|
||||
/**
|
||||
* The name of the conference room (without the domain part).
|
||||
*/
|
||||
_room: string,
|
||||
|
||||
/**
|
||||
* Redux store dispatch function.
|
||||
*/
|
||||
@@ -57,20 +52,11 @@ class WaitForOwnerDialog extends Component<Props> {
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
render() {
|
||||
const {
|
||||
_room: room
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<ConfirmDialog
|
||||
cancelLabel = 'dialog.Cancel'
|
||||
confirmLabel = 'dialog.IamHost'
|
||||
descriptionKey = {
|
||||
{
|
||||
key: 'dialog.WaitForHostMsgWOk',
|
||||
params: { room }
|
||||
}
|
||||
}
|
||||
descriptionKey = 'dialog.WaitForHostMsg'
|
||||
onCancel = { this._onCancel }
|
||||
onSubmit = { this._onLogin } />
|
||||
);
|
||||
@@ -101,20 +87,4 @@ class WaitForOwnerDialog extends Component<Props> {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps (parts of) the Redux state to the associated props for the
|
||||
* {@code WaitForOwnerDialog} component.
|
||||
*
|
||||
* @param {Object} state - The Redux state.
|
||||
* @private
|
||||
* @returns {Props}
|
||||
*/
|
||||
function _mapStateToProps(state) {
|
||||
const { authRequired } = state['features/base/conference'];
|
||||
|
||||
return {
|
||||
_room: authRequired && authRequired.getName()
|
||||
};
|
||||
}
|
||||
|
||||
export default translate(connect(_mapStateToProps)(WaitForOwnerDialog));
|
||||
export default translate(connect()(WaitForOwnerDialog));
|
||||
|
||||
@@ -4,9 +4,8 @@ import React, { PureComponent } from 'react';
|
||||
import type { Dispatch } from 'redux';
|
||||
|
||||
import { Dialog } from '../../../base/dialog';
|
||||
import { translate, translateToHTML } from '../../../base/i18n';
|
||||
import { translate } from '../../../base/i18n';
|
||||
import { connect } from '../../../base/redux';
|
||||
import { safeDecodeURIComponent } from '../../../base/util';
|
||||
import { cancelWaitForOwner } from '../../actions.web';
|
||||
|
||||
/**
|
||||
@@ -14,11 +13,6 @@ import { cancelWaitForOwner } from '../../actions.web';
|
||||
*/
|
||||
type Props = {
|
||||
|
||||
/**
|
||||
* The name of the conference room (without the domain part).
|
||||
*/
|
||||
_room: string,
|
||||
|
||||
/**
|
||||
* Redux store dispatch method.
|
||||
*/
|
||||
@@ -89,7 +83,6 @@ class WaitForOwnerDialog extends PureComponent<Props> {
|
||||
*/
|
||||
render() {
|
||||
const {
|
||||
_room: room,
|
||||
t
|
||||
} = this.props;
|
||||
|
||||
@@ -103,30 +96,11 @@ class WaitForOwnerDialog extends PureComponent<Props> {
|
||||
titleKey = { t('dialog.WaitingForHostTitle') }
|
||||
width = { 'small' }>
|
||||
<span>
|
||||
{
|
||||
translateToHTML(
|
||||
t, 'dialog.WaitForHostMsg', { room })
|
||||
}
|
||||
{ t('dialog.WaitForHostMsg') }
|
||||
</span>
|
||||
</Dialog>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps (parts of) the Redux state to the associated props for the
|
||||
* {@code WaitForOwnerDialog} component.
|
||||
*
|
||||
* @param {Object} state - The Redux state.
|
||||
* @private
|
||||
* @returns {Props}
|
||||
*/
|
||||
function mapStateToProps(state) {
|
||||
const { authRequired } = state['features/base/conference'];
|
||||
|
||||
return {
|
||||
_room: authRequired && safeDecodeURIComponent(authRequired.getName())
|
||||
};
|
||||
}
|
||||
|
||||
export default translate(connect(mapStateToProps)(WaitForOwnerDialog));
|
||||
export default translate(connect()(WaitForOwnerDialog));
|
||||
|
||||
@@ -67,6 +67,8 @@ type Props = {
|
||||
onMouseLeave?: Function
|
||||
};
|
||||
|
||||
const MAX_HEIGHT = 400;
|
||||
|
||||
const useStyles = makeStyles(theme => {
|
||||
return {
|
||||
contextMenu: {
|
||||
@@ -80,7 +82,9 @@ const useStyles = makeStyles(theme => {
|
||||
position: 'absolute',
|
||||
right: `${participantsPaneTheme.panePadding}px`,
|
||||
top: 0,
|
||||
zIndex: 2
|
||||
zIndex: 2,
|
||||
maxHeight: `${MAX_HEIGHT}px`,
|
||||
overflowY: 'auto'
|
||||
},
|
||||
|
||||
contextMenuHidden: {
|
||||
@@ -136,8 +140,9 @@ const ContextMenu = ({
|
||||
const { current: container } = containerRef;
|
||||
const { offsetTop, offsetParent: { offsetHeight, scrollTop } } = offsetTarget;
|
||||
const outerHeight = getComputedOuterHeight(container);
|
||||
const height = Math.min(MAX_HEIGHT, outerHeight);
|
||||
|
||||
container.style.top = offsetTop + outerHeight > offsetHeight + scrollTop
|
||||
container.style.top = offsetTop + height > offsetHeight + scrollTop
|
||||
? `${offsetTop - outerHeight}`
|
||||
: `${offsetTop}`;
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ export default [
|
||||
'apiLogLevels',
|
||||
'avgRtpStatsN',
|
||||
'backgroundAlpha',
|
||||
'breakoutRooms',
|
||||
'buttonsWithNotifyClick',
|
||||
|
||||
/**
|
||||
@@ -154,6 +155,7 @@ export default [
|
||||
'failICE',
|
||||
'feedbackPercentage',
|
||||
'fileRecordingsEnabled',
|
||||
'filmstrip',
|
||||
'firefox_fake_device',
|
||||
'forceJVB121Ratio',
|
||||
'forceTurnRelay',
|
||||
|
||||
@@ -342,6 +342,14 @@ function _translateLegacyConfig(oldValue: Object) {
|
||||
newValue.defaultRemoteDisplayName = interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME;
|
||||
}
|
||||
|
||||
if (oldValue.hideAddRoomButton) {
|
||||
newValue.breakoutRooms = {
|
||||
/* eslint-disable-next-line no-extra-parens */
|
||||
...(newValue.breakoutRooms || {}),
|
||||
hideAddRoomButton: oldValue.hideAddRoomButton
|
||||
};
|
||||
}
|
||||
|
||||
newValue.defaultRemoteDisplayName
|
||||
= newValue.defaultRemoteDisplayName || 'Fellow Jitster';
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
import { toState } from '../redux';
|
||||
import { toURLString } from '../util';
|
||||
|
||||
import { getURLWithoutParams } from './utils';
|
||||
|
||||
/**
|
||||
* Figures out what's the current conference URL which is supposed to indicate what conference is currently active.
|
||||
* When not currently in any conference and not trying to join any then 'undefined' is returned.
|
||||
@@ -79,56 +81,6 @@ export function isInviteURLReady(stateOrGetState: Function | Object): boolean {
|
||||
return Boolean(state['features/base/connection'].locationURL || state['features/base/config'].locationURL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a {@link URL} without hash and query/search params from a specific
|
||||
* {@code URL}.
|
||||
*
|
||||
* @param {URL} url - The {@code URL} which may have hash and query/search
|
||||
* params.
|
||||
* @returns {URL}
|
||||
*/
|
||||
export function getURLWithoutParams(url: URL): URL {
|
||||
const { hash, search } = url;
|
||||
|
||||
if ((hash && hash.length > 1) || (search && search.length > 1)) {
|
||||
url = new URL(url.href); // eslint-disable-line no-param-reassign
|
||||
url.hash = '';
|
||||
url.search = '';
|
||||
|
||||
// XXX The implementation of URL at least on React Native appends ? and
|
||||
// # at the end of the href which is not desired.
|
||||
let { href } = url;
|
||||
|
||||
if (href) {
|
||||
href.endsWith('#') && (href = href.substring(0, href.length - 1));
|
||||
href.endsWith('?') && (href = href.substring(0, href.length - 1));
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
url.href === href || (url = new URL(href));
|
||||
}
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a URL string without hash and query/search params from a specific
|
||||
* {@code URL}.
|
||||
*
|
||||
* @param {URL} url - The {@code URL} which may have hash and query/search
|
||||
* params.
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getURLWithoutParamsNormalized(url: URL): string {
|
||||
const urlWithoutParams = getURLWithoutParams(url).href;
|
||||
|
||||
if (urlWithoutParams) {
|
||||
return urlWithoutParams.toLowerCase();
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a specific id to jid if it's not jid yet.
|
||||
*
|
||||
|
||||
@@ -4,3 +4,4 @@ export * from './actions';
|
||||
export * from './actionTypes';
|
||||
export * from './constants';
|
||||
export * from './functions';
|
||||
export * from './utils';
|
||||
|
||||
51
react/features/base/connection/utils.js
Normal file
51
react/features/base/connection/utils.js
Normal file
@@ -0,0 +1,51 @@
|
||||
/* @flow */
|
||||
|
||||
/**
|
||||
* Gets a {@link URL} without hash and query/search params from a specific
|
||||
* {@code URL}.
|
||||
*
|
||||
* @param {URL} url - The {@code URL} which may have hash and query/search
|
||||
* params.
|
||||
* @returns {URL}
|
||||
*/
|
||||
export function getURLWithoutParams(url: URL): URL {
|
||||
const { hash, search } = url;
|
||||
|
||||
if ((hash && hash.length > 1) || (search && search.length > 1)) {
|
||||
url = new URL(url.href); // eslint-disable-line no-param-reassign
|
||||
url.hash = '';
|
||||
url.search = '';
|
||||
|
||||
// XXX The implementation of URL at least on React Native appends ? and
|
||||
// # at the end of the href which is not desired.
|
||||
let { href } = url;
|
||||
|
||||
if (href) {
|
||||
href.endsWith('#') && (href = href.substring(0, href.length - 1));
|
||||
href.endsWith('?') && (href = href.substring(0, href.length - 1));
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
url.href === href || (url = new URL(href));
|
||||
}
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a URL string without hash and query/search params from a specific
|
||||
* {@code URL}.
|
||||
*
|
||||
* @param {URL} url - The {@code URL} which may have hash and query/search
|
||||
* params.
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getURLWithoutParamsNormalized(url: URL): string {
|
||||
const urlWithoutParams = getURLWithoutParams(url).href;
|
||||
|
||||
if (urlWithoutParams) {
|
||||
return urlWithoutParams.toLowerCase();
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
@@ -263,11 +263,12 @@ ColorSchemeRegistry.register('Dialog', {
|
||||
},
|
||||
|
||||
text: {
|
||||
...brandedDialogText
|
||||
...brandedDialogText,
|
||||
color: BaseTheme.palette.text01
|
||||
},
|
||||
|
||||
topBorderContainer: {
|
||||
borderTopColor: schemeColor('border'),
|
||||
borderTopColor: BaseTheme.palette.dividerColor,
|
||||
borderTopWidth: 1
|
||||
}
|
||||
});
|
||||
|
||||
@@ -5,6 +5,7 @@ declare var APP: Object;
|
||||
import COUNTRIES_RESOURCES from 'i18n-iso-countries/langs/en.json';
|
||||
import i18next from 'i18next';
|
||||
import I18nextXHRBackend from 'i18next-xhr-backend';
|
||||
import _ from 'lodash';
|
||||
|
||||
import LANGUAGES_RESOURCES from '../../../../lang/languages.json';
|
||||
import MAIN_RESOURCES from '../../../../lang/main.json';
|
||||
@@ -12,6 +13,20 @@ import MAIN_RESOURCES from '../../../../lang/main.json';
|
||||
import { I18NEXT_INITIALIZED, LANGUAGE_CHANGED } from './actionTypes';
|
||||
import languageDetector from './languageDetector';
|
||||
|
||||
/**
|
||||
* Override certain country names.
|
||||
*/
|
||||
const COUNTRIES_RESOURCES_OVERRIDES = {
|
||||
countries: {
|
||||
TW: 'Taiwan'
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Merged country names.
|
||||
*/
|
||||
const COUNTRIES = _.merge({}, COUNTRIES_RESOURCES, COUNTRIES_RESOURCES_OVERRIDES);
|
||||
|
||||
/**
|
||||
* The available/supported languages.
|
||||
*
|
||||
@@ -68,7 +83,7 @@ i18next
|
||||
i18next.addResourceBundle(
|
||||
DEFAULT_LANGUAGE,
|
||||
'countries',
|
||||
COUNTRIES_RESOURCES,
|
||||
COUNTRIES,
|
||||
/* deep */ true,
|
||||
/* overwrite */ true);
|
||||
i18next.addResourceBundle(
|
||||
|
||||
@@ -220,10 +220,11 @@ function _undoOverwriteLocalParticipant(
|
||||
* avatarURL: ?string,
|
||||
* email: ?string,
|
||||
* id: ?string,
|
||||
* name: ?string
|
||||
* name: ?string,
|
||||
* hidden-from-recorder: ?boolean
|
||||
* }}
|
||||
*/
|
||||
function _user2participant({ avatar, avatarUrl, email, id, name }) {
|
||||
function _user2participant({ avatar, avatarUrl, email, id, name, 'hidden-from-recorder': hiddenFromRecorder }) {
|
||||
const participant = {};
|
||||
|
||||
if (typeof avatarUrl === 'string') {
|
||||
@@ -241,5 +242,9 @@ function _user2participant({ avatar, avatarUrl, email, id, name }) {
|
||||
participant.name = name.trim();
|
||||
}
|
||||
|
||||
if (hiddenFromRecorder === 'true' || hiddenFromRecorder === true) {
|
||||
participant.hiddenFromRecorder = true;
|
||||
}
|
||||
|
||||
return Object.keys(participant).length ? participant : undefined;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user