Compare commits

..

2 Commits

Author SHA1 Message Date
Horatiu Muresan
8ca786ce74 Address review 2023-01-04 12:53:27 +02:00
Horatiu Muresan
2e353eb51d feat(prejoin) Disable join buttons during joining 2023-01-04 11:49:57 +02:00
1645 changed files with 34172 additions and 37297 deletions

View File

@@ -9,8 +9,5 @@ indent_style = space
max_line_length = 80
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab

View File

@@ -1,25 +0,0 @@
name: Lua CI
on: [pull_request]
jobs:
luacheck:
name: Luacheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install luarocks
run: sudo apt-get --install-recommends -y install luarocks
- name: Install luacheck
run: sudo luarocks install luacheck
- name: Check lua codes
run: |
set -o pipefail && luacheck . | awk -F: '
{
print $0
printf "::warning file=%s,line=%s,col=%s::%s\n", $1, $2, $3, $4
}
'

View File

@@ -42,25 +42,3 @@ jobs:
cache: 'npm'
- run: npm install
- run: make
android-build:
name: Build mobile bundle (Android)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
cache: 'npm'
- run: npm install
- run: npx react-native bundle --entry-file react/index.native.js --platform android --bundle-output /tmp/android.bundle --reset-cache
ios-build:
name: Build mobile bundle (iOS)
runs-on: macOS-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
cache: 'npm'
- run: npm install
- run: npx react-native bundle --entry-file react/index.native.js --platform ios --bundle-output /tmp/ios.bundle --reset-cache

View File

@@ -1,8 +0,0 @@
global = false
unused = false
redefined = false
ignore = { "581" }
max_line_length = false
color = false
formatter = "plain"
quiet = 1

View File

@@ -44,8 +44,12 @@ deploy-appbundle:
cp \
$(BUILD_DIR)/app.bundle.min.js \
$(BUILD_DIR)/app.bundle.min.js.map \
$(BUILD_DIR)/do_external_connect.min.js \
$(BUILD_DIR)/do_external_connect.min.js.map \
$(BUILD_DIR)/external_api.min.js \
$(BUILD_DIR)/external_api.min.js.map \
$(BUILD_DIR)/dial_in_info_bundle.min.js \
$(BUILD_DIR)/dial_in_info_bundle.min.js.map \
$(BUILD_DIR)/alwaysontop.min.js \
$(BUILD_DIR)/alwaysontop.min.js.map \
$(OUTPUT_DIR)/analytics-ga.js \
@@ -63,7 +67,11 @@ deploy-appbundle:
deploy-lib-jitsi-meet:
cp \
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.* \
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.js \
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.map \
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.e2ee-worker.js \
$(LIBJITSIMEET_DIR)/connection_optimization/external_connect.js \
$(LIBJITSIMEET_DIR)/modules/browser/capabilities.json \
$(DEPLOY_DIR)
deploy-olm:
@@ -123,7 +131,7 @@ dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-mode
source-package:
mkdir -p source_package/jitsi-meet/css && \
cp -r *.js *.html resources/*.txt favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
cp -r *.js *.html resources/*.txt connection_optimization favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
cp css/all.css source_package/jitsi-meet/css && \
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
rm -rf source_package

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -1,70 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="262.91376dp"
android:height="262.91376dp"
android:viewportWidth="262.91376"
android:viewportHeight="262.91376">
<group android:scaleX="0.75" android:scaleY="0.75" android:translateX="35" android:translateY="35">
<clip-path
android:pathData="m0,0 l262.914,-0L262.914,262.914 0,262.914 0,0Z"/>
<path
android:pathData="m142.646,105.099c0.117,0.026 0.255,0.036 0.406,0.036 3.186,-0 10.297,-4.615 11.617,-6.721l0.1,-0.17 0.153,-0.135c0.451,-0.441 1.746,-2.773 2.374,-4.17 -6.751,-2.023 -7.49,-5.677 -8.153,-8.919 -0.069,-0.376 -0.138,-0.717 -0.204,-1.019 -0.074,-0.397 -0.153,-0.8 -0.226,-1.112C138.668,86.221 135.593,88.094 133.921,89.483 133.056,90.201 132.542,92.251 135.042,97.926 136.323,100.816 140.727,104.733 142.646,105.099"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m115.413,146.042c5.934,-0 18.464,-3.543 26.748,-5.887 1.21,-0.336 2.33,-0.66 3.351,-0.944 0.166,-0.046 0.321,-0.091 0.472,-0.124 -0.463,-0.461 -1.239,-1.159 -2.497,-2.216 -5.521,-3.741 -10.736,-5.484 -16.403,-5.484 -1.237,-0 -2.522,0.071 -3.923,0.231 -4.801,0.55 -8.8,1.69 -10.722,2.237 -0.967,0.284 -1.263,0.366 -1.567,0.366 -0.58,-0 -1.079,-0.341 -1.273,-0.878 -0.194,-0.534 -0.027,-1.121 0.425,-1.507l0.024,-0.011c3.316,-2.784 9.489,-7.951 21.198,-10.256 2.027,-0.401 4.202,-0.605 6.454,-0.605 5.242,-0 10.67,1.086 16.125,3.219 7.436,2.899 12.521,6.625 16.602,9.62 2.199,1.609 4.105,3.007 5.755,3.771 0.421,0.2 0.637,0.255 0.746,0.265 0.074,-0.095 0.23,-0.365 0.474,-1.069 0.066,-0.185 0.529,-2.161 -2.806,-13.374 -1.931,-6.51 -4.264,-13.156 -5.479,-16.104 -2.356,-5.711 -1.778,-9.76 -1.051,-12.125 -1.999,0.735 -4.033,1.87 -6.174,3.446L161.758,98.711C160.694,99.506 159.599,100.404 158.426,101.454 151.517,107.64 146.344,110.864 143.035,111.04l-0.093,0.004 -0.093,-0.009c-2.912,-0.245 -7.324,-4.489 -9.133,-6.634 -0.373,-0.251 -0.8,-0.366 -1.366,-0.366 -0.564,-0 -1.202,0.116 -1.82,0.235C130.086,104.354 129.623,104.441 129.167,104.489 127.708,104.632 125.668,105.106 123.694,105.561 122.746,105.777 121.762,106.005 120.864,106.189 120.851,106.19 120.463,106.272 119.774,106.454 114.903,107.891 111.228,109.55 109.432,111.111 109.414,111.127 109.352,111.174 109.266,111.242 108.048,112.105 105.124,114.567 104.248,118.762L104.237,118.795C102.398,126.516 105.187,136.087 108.892,141.554 110.636,144.125 112.513,145.727 114.048,145.959 114.437,146.015 114.891,146.042 115.413,146.042"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m90.093,173.175c-1.252,-1.472 -1.783,-3.324 -1.574,-5.521 0.884,-10.642 -0.329,-13.215 -0.891,-13.829 -0.131,-0.144 -0.207,-0.144 -0.265,-0.144 -0.022,-0 -0.041,0.003 -0.064,0.003 -1.044,0.248 -8.066,5.002 -9.615,19.171 -0.749,6.845 0.561,15.63 1.679,20.974 0.897,-3.155 2.314,-6.624 5.057,-10.204 2.556,-3.326 5.345,-5.955 8.801,-8.253C92.143,174.93 90.991,174.235 90.093,173.175"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m94.906,156.389c-0.03,2.229 -0.326,4.36 -0.61,6.445 -0.151,1.119 -0.314,2.286 -0.434,3.46 -0.161,2.341 0.346,3.166 0.571,3.406 0.127,0.136 0.326,0.287 0.76,0.287 0.339,-0 0.741,-0.091 1.161,-0.268 4.202,-1.756 8.195,-4.815 10.115,-6.515C103.522,161.892 98.995,159.058 94.906,156.389"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m154.002,81.595c-0.031,0.074 -0.065,0.148 -0.101,0.216 -0.821,2.403 0.306,5.664 2.419,6.898 0.561,0.327 1.106,0.526 1.624,0.596 0.072,0.006 0.148,0.009 0.219,0.009 1.645,-0 2.971,-1.199 3.961,-3.561C162.752,83.959 162.836,81.827 162.37,79.904 162.003,78.409 161.057,76.627 160.453,75.738 159.332,76.509 157.111,78.207 155.585,79.553 154.518,80.582 154.136,81.229 154.002,81.595"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="M148.97,77.699C153.957,73.194 156.988,65.754 158.253,61.334 153.915,65.513 148.633,67.758 145.25,69.198 144.084,69.695 143.08,70.124 142.477,70.476 142.224,70.623 141.965,70.77 141.708,70.919 139.654,72.109 136.55,73.905 136.1,75.011l-0.012,0.036 -0.012,0.034c-1.406,2.956 -2.199,7.401 -2.457,9.95 3.266,-1.99 6.625,-3.322 9.416,-4.42C145.628,79.585 147.863,78.703 148.97,77.699"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m164.464,51.921c-0.84,5.539 -2.205,10.799 -4.751,16.347 2.781,-3.144 4.396,-6.568 4.941,-10.401C164.886,56.275 165.097,54.756 164.464,51.921"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="M148.749,142.639C148.718,142.598 148.684,142.56 148.658,142.519 148.523,142.539 148.307,142.584 147.972,142.683l-0.14,0.04c-1.726,0.644 -4.899,1.708 -8.556,2.946 -4.396,1.479 -9.365,3.154 -13.526,4.649 -5.297,1.975 -7.021,2.755 -7.557,3.024 -0.098,0.266 -0.203,0.599 -0.327,0.965 -1.254,3.816 -4.125,12.541 -18.276,18.653 2.928,2.956 9.289,8.27 21.809,8.27 1.082,-0 2.21,-0.036 3.341,-0.12 9.451,-0.666 18.342,-4.855 25.026,-11.78 6.087,-6.291 9.538,-14.136 9.585,-21.7C157.876,147.509 155.367,147.135 153.043,146.033 153.014,146.02 150.361,144.745 148.749,142.639"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m189.478,117.853c-0.523,9.749 -2.122,18.424 -4.744,25.8 -2.128,5.988 -4.94,11.134 -8.356,15.316 -5.676,6.931 -11.555,9.256 -12.804,9.304 -0.866,-0 -1.313,-0.309 -3.046,-1.528 -0.17,-0.114 -0.37,-0.252 -0.581,-0.4 -3.313,5.953 -8.505,11.097 -15.065,14.959 -7.079,4.144 -15.297,6.423 -23.157,6.423 -9.078,-0 -17.13,-2.924 -23.341,-8.456 -7.467,4.799 -12.31,9.074 -16.267,27.005l-1.363,6.17 -2.971,-5.564c-0.424,-0.786 -1.929,-3.731 -3.332,-8.887 -1.934,-7.104 -2.86,-15.181 -2.758,-24.01 0.117,-10.049 3.154,-16.526 5.68,-20.186 2.98,-4.314 6.837,-6.994 10.076,-6.994 0.216,-0 0.428,0.006 0.616,0.035 5.159,0.575 8.435,2.75 14.396,6.686l1.899,1.252c2.059,1.344 4.481,2.7 5.259,2.989 0.54,-0.284 1.749,-2.3 2.155,-5.271l0.069,-0.451c0.005,-0.045 0.009,-0.091 0.014,-0.131 -0.036,-0.02 -0.065,-0.029 -0.094,-0.041 -4.008,-1.375 -9.539,-7.7 -12.364,-17.134 -2.684,-9.382 -2.129,-17.185 1.644,-23.193 6.12,-9.736 19.198,-11.974 23.466,-12.702 1.331,-0.266 2.716,-0.511 4.041,-0.717 0.255,-0.061 0.469,-0.121 0.642,-0.168 -0.031,-0.126 -0.071,-0.265 -0.114,-0.43 -0.108,-0.417 -0.23,-0.891 -0.354,-1.447 -1.345,-6.035 -0.664,-11.069 0.181,-15.193 0.928,-4.546 1.489,-7.287 3.747,-9.936 3.029,-4.165 8.319,-5.936 11.479,-6.991 0.746,-0.249 1.511,-0.509 1.894,-0.689 8.988,-4.31 11.82,-8.739 12.615,-11.694 0.656,-2.451 1.699,-8.884 1.251,-13.335 -0.085,-0.805 0.129,-1.521 0.621,-2.065 0.45,-0.505 1.101,-0.794 1.778,-0.794 1.515,-0 2.82,-0 7.511,14.598 2.481,7.698 0.645,14.903 -5.45,21.424l-0.226,0.231c0.024,0.044 0.049,0.09 0.08,0.144 2.57,4.236 3.963,9.54 3.553,13.51 -0.099,0.906 -0.265,1.775 -0.419,2.549 -0.003,0.01 -0.003,0.016 -0.004,0.029 0.516,-0.032 1.119,-0.055 1.775,-0.055 3.052,-0 7.435,0.474 10.989,2.735 2.135,1.352 4.845,3.439 6.835,7.615C189.223,102.942 190.076,109.575 189.478,117.853m4.77,-23.191c-2.916,-6.1 -6.989,-9.177 -9.793,-10.96 -2.355,-1.494 -5.064,-2.584 -8.077,-3.24l-0.676,-0.146 -0.111,-0.689c-0.339,-2.119 -0.918,-4.275 -1.715,-6.406l-0.185,-0.49 0.292,-0.434c5.095,-7.594 6.323,-16.17 3.54,-24.802 -2.191,-6.824 -3.895,-11.211 -5.341,-13.799 -2.954,-5.305 -7.006,-6.417 -9.891,-6.417 -2.964,-0 -5.8,1.261 -7.789,3.457 -2.043,2.254 -2.993,5.207 -2.678,8.31 0.316,3.134 -0.494,8.516 -1.014,10.439 -0.04,0.117 -0.975,2.929 -8.201,6.428 -0.162,0.056 -0.512,0.179 -1.053,0.359 -3.729,1.246 -10.666,3.571 -15.258,9.64 -3.465,4.205 -4.332,8.441 -5.338,13.346 -0.586,2.865 -1.236,6.744 -1.079,11.344l0.026,0.841 -0.824,0.188c-11.646,2.585 -20.025,7.835 -24.909,15.605 -5.054,8.04 -5.919,18.055 -2.543,29.853 0.063,0.204 0.126,0.407 0.189,0.615l0.527,1.608 -1.665,-0.286c-0.561,-0.101 -1.135,-0.18 -1.729,-0.241 -0.493,-0.06 -1.001,-0.082 -1.509,-0.082 -5.633,-0 -11.663,3.585 -16.128,9.592 -3.451,4.641 -7.588,12.849 -7.735,25.601 -0.114,9.573 0.906,18.401 3.038,26.228 1.581,5.795 3.326,9.329 4.004,10.577l13.306,24.94 6.096,-27.619c2.454,-11.09 4.864,-15.262 7.725,-18.111l0.561,-0.563 0.679,0.411c6.605,3.977 14.466,6.084 22.73,6.084 9.286,-0 18.965,-2.682 27.259,-7.551 5.38,-3.16 9.974,-7.036 13.649,-11.531l0.45,-0.369 0.85,-0.02c2.156,-0.068 5.16,-1.164 8.222,-3.004 2.6,-1.555 6.543,-4.428 10.501,-9.262 3.997,-4.884 7.274,-10.854 9.716,-17.734 2.876,-8.073 4.625,-17.489 5.204,-28.004 0.689,-9.668 -0.434,-17.641 -3.327,-23.704"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m180.026,98.414c-1.67,-2.596 -3.771,-4.206 -5.475,-4.206 -0.313,-0 -0.613,0.051 -0.895,0.161 -0.911,0.361 -2.356,4.532 -1.714,7.566 0.434,2.066 2.938,9.04 4.151,12.394 0.456,1.281 0.68,1.91 0.754,2.142 0.064,0.183 0.145,0.448 0.256,0.774 0.97,2.971 3.467,10.586 4.206,16.761 1.549,-6.579 2.424,-14.512 2.085,-23.997C183.235,105.662 182.04,101.538 180.026,98.414"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="M168.088,142.604C169.896,142.111 171.33,141.705 172.398,141.395 170.213,139.874 167.689,137.979 164.247,135.304c-8.418,-6.546 -17.449,-9.87 -26.839,-9.87 -5.135,-0 -9.611,0.991 -13.156,2.186 0.882,-0.05 1.779,-0.079 2.7,-0.079 1.1,-0 2.247,0.04 3.411,0.119 3.652,0.246 13.061,1.901 21.565,12.047 1.714,2.039 3.559,3.73 8.794,3.73 1.873,-0 4.051,-0.207 6.662,-0.645C167.544,142.751 167.793,142.678 168.088,142.604"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m164.3,147.583c-0.122,1.563 -0.376,4.509 -0.782,6.76 -0.495,2.719 -1.31,5.02 -1.791,6.226 0.85,0.786 1.694,1.553 2.247,2.043 2.214,-1.447 9.47,-6.96 14.483,-19.474C176.847,144.229 174.59,145.178 171.671,146.018 168.701,146.861 165.82,147.357 164.3,147.583"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
</group>
</vector>

View File

@@ -2,5 +2,4 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
</adaptive-icon>

View File

@@ -2,5 +2,4 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
</adaptive-icon>

View File

@@ -19,7 +19,7 @@ buildscript {
ext {
buildToolsVersion = "31.0.0"
compileSdkVersion = 32
minSdkVersion = 24
minSdkVersion = 23
targetSdkVersion = 32
supportLibVersion = "28.0.0"

View File

@@ -76,6 +76,7 @@ dependencies {
implementation project(':react-native-get-random-values')
implementation project(':react-native-immersive')
implementation project(':react-native-keep-awake')
implementation project(':react-native-masked-view_masked-view')
implementation project(':react-native-orientation-locker')
implementation project(':react-native-pager-view')
implementation project(':react-native-performance')

View File

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

View File

@@ -16,7 +16,6 @@
package org.jitsi.meet.sdk;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -178,11 +177,8 @@ public class JitsiMeetActivity extends AppCompatActivity
}
protected void leave() {
if (this.jitsiView != null) {
this.jitsiView.abort();
} else {
JitsiMeetLogger.w("Cannot leave, view is null");
}
Intent hangupBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent();
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(hangupBroadcastIntent);
}
private @Nullable
@@ -299,7 +295,6 @@ public class JitsiMeetActivity extends AppCompatActivity
JitsiMeetActivityDelegate.requestPermissions(this, permissions, requestCode, listener);
}
@SuppressLint("MissingSuperCall")
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);

View File

@@ -157,14 +157,6 @@ public class JitsiMeetView extends FrameLayout {
setProps(options != null ? options.asProps() : new Bundle());
}
/**
* Internal method which aborts running RN by passing empty props.
* This is only meant to be used from the enclosing Activity's onDestroy.
*/
public void abort() {
setProps(new Bundle());
}
/**
* Creates the {@code ReactRootView} for the given app name with the given
* props. Once created it's set as the view of this {@code FrameLayout}.

View File

@@ -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();
}
}

View File

@@ -17,6 +17,7 @@
package org.jitsi.meet.sdk;
import android.app.Activity;
import android.app.Application;
import android.util.Log;
import androidx.annotation.Nullable;
@@ -31,17 +32,17 @@ import com.facebook.react.jscexecutor.JSCExecutorFactory;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.uimanager.ViewManager;
import com.oney.WebRTCModule.EglUtils;
import com.oney.WebRTCModule.WebRTCModuleOptions;
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoDecoderFactory;
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoEncoderFactory;
import com.oney.WebRTCModule.RTCVideoViewManager;
import com.oney.WebRTCModule.WebRTCModule;
import org.devio.rn.splashscreen.SplashScreenModule;
import org.webrtc.EglBase;
import org.webrtc.audio.AudioDeviceModule;
import org.webrtc.audio.JavaAudioDeviceModule;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
class ReactInstanceManagerHolder {
@@ -72,17 +73,37 @@ class ReactInstanceManagerHolder {
new SplashScreenModule(reactContext),
new PictureInPictureModule(reactContext),
new ProximityModule(reactContext),
new WiFiStatsModule(reactContext),
new org.jitsi.meet.sdk.net.NAT64AddrInfoModule(reactContext)));
if (AudioModeModule.useConnectionService()) {
nativeModules.add(new RNConnectionService(reactContext));
}
// Initialize the WebRTC module by hand, since we want to override some
// initialization options.
WebRTCModule.Options options = new WebRTCModule.Options();
AudioDeviceModule adm = JavaAudioDeviceModule.builder(reactContext)
.setEnableVolumeLogger(false)
.createAudioDeviceModule();
options.setAudioDeviceModule(adm);
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
options.setVideoDecoderFactory(new WebRTCVideoDecoderFactory(eglContext));
options.setVideoEncoderFactory(new WebRTCVideoEncoderFactory(eglContext));
nativeModules.add(new WebRTCModule(reactContext, options));
return nativeModules;
}
private static List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
return Arrays.<ViewManager>asList(
// WebRTC, see createNativeModules for details.
new RTCVideoViewManager()
);
}
static List<ReactPackage> getReactNativePackages() {
@@ -99,11 +120,11 @@ class ReactInstanceManagerHolder {
new com.oblador.performance.PerformancePackage(),
new com.reactnativecommunity.slider.ReactSliderPackage(),
new com.brentvatne.react.ReactVideoPackage(),
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.oney.WebRTCModule.WebRTCModulePackage(),
new com.swmansion.gesturehandler.RNGestureHandlerPackage(),
new com.swmansion.gesturehandler.react.RNGestureHandlerPackage(),
new org.linusu.RNGetRandomValuesPackage(),
new com.rnimmersive.RNImmersivePackage(),
new com.swmansion.rnscreens.RNScreensPackage(),
@@ -220,6 +241,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(TAG, "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
@@ -233,15 +283,7 @@ class ReactInstanceManagerHolder {
return;
}
// Initialize the WebRTC module options.
WebRTCModuleOptions options = WebRTCModuleOptions.getInstance();
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
options.videoDecoderFactory = new H264AndSoftwareVideoDecoderFactory(eglContext);
options.videoEncoderFactory = new H264AndSoftwareVideoEncoderFactory(eglContext);
Log.d(TAG, "initializing RN with Activity");
Log.d(ReactInstanceManagerHolder.class.getCanonicalName(), "initializing RN with Activity");
reactInstanceManager
= ReactInstanceManager.builder()

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,203 @@
/*
* Copyright @ 2017-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;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import org.json.JSONArray;
import org.json.JSONObject;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Module exposing WiFi statistics.
*
* Gathers rssi, signal in percentage, timestamp and the addresses of the wifi
* device.
*/
@ReactModule(name = WiFiStatsModule.NAME)
class WiFiStatsModule
extends ReactContextBaseJavaModule {
public static final String NAME = "WiFiStats";
/**
* The {@code Log} tag {@code WiFiStatsModule} is to log messages with.
*/
static final String TAG = NAME;
/**
* The scale used for the signal value. A level of the signal, given in the
* range of 0 to SIGNAL_LEVEL_SCALE-1 (both inclusive).
*/
public final static int SIGNAL_LEVEL_SCALE = 101;
/**
* {@link ExecutorService} for running all operations on a dedicated thread.
*/
private static final ExecutorService executor
= Executors.newSingleThreadExecutor();
/**
* Initializes a new module instance. There shall be a single instance of
* this module throughout the lifetime of the application.
*
* @param reactContext the {@link ReactApplicationContext} where this module
* is created.
*/
public WiFiStatsModule(ReactApplicationContext reactContext) {
super(reactContext);
}
/**
* Gets the name for this module to be used in the React Native bridge.
*
* @return a string with the module name.
*/
@Override
public String getName() {
return NAME;
}
/**
* Returns the {@link InetAddress} represented by this int.
*
* @param value the int representation of the ip address.
* @return the {@link InetAddress}.
* @throws UnknownHostException - if IP address is of illegal length.
*/
public static InetAddress toInetAddress(int value)
throws UnknownHostException {
return InetAddress.getByAddress(
new byte[] {
(byte) value,
(byte) (value >> 8),
(byte) (value >> 16),
(byte) (value >> 24)
});
}
/**
* Public method to retrieve WiFi stats.
*
* @param promise a {@link Promise} which will be resolved if WiFi stats are
* retrieved successfully, and it will be rejected otherwise.
*/
@ReactMethod
public void getWiFiStats(final Promise promise) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
Context context
= getReactApplicationContext().getApplicationContext();
WifiManager wifiManager
= (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) {
promise.reject(new Exception("Wifi not enabled"));
return;
}
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getNetworkId() == -1) {
promise.reject(new Exception("Wifi not connected"));
return;
}
int rssi = wifiInfo.getRssi();
int signalLevel
= WifiManager.calculateSignalLevel(
rssi, SIGNAL_LEVEL_SCALE);
JSONObject result = new JSONObject();
result.put("rssi", rssi)
.put("signal", signalLevel)
.put("timestamp", System.currentTimeMillis());
JSONArray addresses = new JSONArray();
InetAddress wifiAddress
= toInetAddress(wifiInfo.getIpAddress());
try {
Enumeration<NetworkInterface> e
= NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface networkInterface = e.nextElement();
boolean found = false;
// first check whether this is the desired interface
Enumeration<InetAddress> as
= networkInterface.getInetAddresses();
while (as.hasMoreElements()) {
InetAddress a = as.nextElement();
if(a.equals(wifiAddress)) {
found = true;
break;
}
}
if (found) {
// interface found let's put addresses
// to the result object
as = networkInterface.getInetAddresses();
while (as.hasMoreElements()) {
InetAddress a = as.nextElement();
if (a.isLinkLocalAddress())
continue;
addresses.put(a.getHostAddress());
}
}
}
} catch (SocketException e) {
JitsiMeetLogger.e(e, TAG + " Unable to NetworkInterface.getNetworkInterfaces()");
}
result.put("addresses", addresses);
promise.resolve(result.toString());
JitsiMeetLogger.d(TAG + " WiFi stats: " + result.toString());
} catch (Throwable e) {
JitsiMeetLogger.e(e, TAG + " Failed to obtain wifi stats");
promise.reject(
new Exception("Failed to obtain wifi stats"));
}
}
};
executor.execute(r);
}
}

View File

@@ -31,6 +31,8 @@ include ':react-native-immersive'
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
include ':react-native-keep-awake'
project(':react-native-keep-awake').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keep-awake/android')
include ':react-native-masked-view_masked-view'
project(':react-native-masked-view_masked-view').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-masked-view/masked-view/android')
include ':react-native-orientation-locker'
project(':react-native-orientation-locker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-orientation-locker/android')
include ':react-native-pager-view'

13
app.js
View File

@@ -18,6 +18,7 @@ import './react/features/base/jitsi-local-storage/setup';
import conference from './conference';
import API from './modules/API';
import UI from './modules/UI/UI';
import keyboardshortcut from './modules/keyboardshortcut/keyboardshortcut';
import translation from './modules/translation/translation';
// Initialize Olm as early as possible.
@@ -32,11 +33,23 @@ window.APP = {
API,
conference,
// Used by do_external_connect.js if we receive the attach data after
// connect was already executed. status property can be 'initialized',
// 'ready', or 'connecting'. We are interested in 'ready' status only which
// means that connect was executed but we have to wait for the attach data.
// In status 'ready' handler property will be set to a function that will
// finish the connect process when the attach data or error is received.
connect: {
handler: null,
status: 'initialized'
},
// Used for automated performance tests.
connectionTimes: {
'index.loaded': window.indexLoadedTime
},
keyboardshortcut,
translation,
UI
};

View File

@@ -17,9 +17,9 @@ import {
createDeviceChangedEvent,
createScreenSharingEvent,
createStartSilentEvent,
createTrackMutedEvent
} from './react/features/analytics/AnalyticsEvents';
import { sendAnalytics } from './react/features/analytics/functions';
createTrackMutedEvent,
sendAnalytics
} from './react/features/analytics';
import {
maybeRedirectToWelcomePage,
redirectToStaticPage,
@@ -28,8 +28,13 @@ import {
import { showModeratedNotification } from './react/features/av-moderation/actions';
import { shouldShowModeratedNotification } from './react/features/av-moderation/functions';
import {
AVATAR_URL_COMMAND,
CONFERENCE_LEAVE_REASONS,
EMAIL_COMMAND,
_conferenceWillJoin,
authStatusChanged,
commonUserJoinedHandling,
commonUserLeftHandling,
conferenceFailed,
conferenceJoinInProgress,
conferenceJoined,
@@ -42,26 +47,15 @@ import {
dataChannelClosed,
dataChannelOpened,
e2eRttChanged,
generateVisitorConfig,
getConferenceOptions,
kickedOut,
lockStateChanged,
nonParticipantMessageReceived,
onStartMutedPolicyChanged,
p2pStatusChanged
} from './react/features/base/conference/actions';
import {
AVATAR_URL_COMMAND,
CONFERENCE_LEAVE_REASONS,
EMAIL_COMMAND
} from './react/features/base/conference/constants';
import {
commonUserJoinedHandling,
commonUserLeftHandling,
getConferenceOptions,
getVisitorOptions,
restoreConferenceOptions,
p2pStatusChanged,
sendLocalParticipant
} from './react/features/base/conference/functions';
import { overwriteConfig } from './react/features/base/config/actions';
} from './react/features/base/conference';
import { getReplaceParticipant } from './react/features/base/config/functions';
import {
checkAndNotifyForNewDevice,
@@ -87,83 +81,77 @@ import {
} from './react/features/base/lib-jitsi-meet';
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
import {
MEDIA_TYPE,
getStartWithAudioMuted,
getStartWithVideoMuted,
isVideoMutedByUser,
setAudioAvailable,
setAudioMuted,
setAudioUnmutePermissions,
setVideoAvailable,
setVideoMuted,
setVideoUnmutePermissions
} from './react/features/base/media/actions';
import { MEDIA_TYPE } from './react/features/base/media/constants';
import {
getStartWithAudioMuted,
getStartWithVideoMuted,
isVideoMutedByUser
} from './react/features/base/media/functions';
} from './react/features/base/media';
import {
dominantSpeakerChanged,
getLocalParticipant,
getNormalizedDisplayName,
getVirtualScreenshareParticipantByOwnerId,
localParticipantAudioLevelChanged,
localParticipantRoleChanged,
participantKicked,
participantMutedUs,
participantPresenceChanged,
participantRoleChanged,
participantSourcesUpdated,
participantUpdated,
screenshareParticipantDisplayNameChanged,
updateRemoteParticipantFeatures
} from './react/features/base/participants/actions';
import {
getLocalParticipant,
getNormalizedDisplayName,
getVirtualScreenshareParticipantByOwnerId
} from './react/features/base/participants/functions';
import { updateSettings } from './react/features/base/settings/actions';
} from './react/features/base/participants';
import { updateSettings } from './react/features/base/settings';
import {
addLocalTrack,
destroyLocalTracks,
replaceLocalTrack,
toggleScreensharing as toggleScreensharingA,
trackAdded,
trackRemoved
} from './react/features/base/tracks/actions';
import {
createLocalTracksF,
destroyLocalTracks,
getLocalJitsiAudioTrack,
getLocalJitsiVideoTrack,
getLocalTracks,
getLocalVideoTrack,
isLocalTrackMuted,
isUserInteractionRequiredForUnmute
} from './react/features/base/tracks/functions';
isUserInteractionRequiredForUnmute,
replaceLocalTrack,
toggleScreensharing as toggleScreensharingA,
trackAdded,
trackRemoved
} from './react/features/base/tracks';
import { downloadJSON } from './react/features/base/util/downloadJSON';
import { showDesktopPicker } from './react/features/desktop-picker/actions';
import { appendSuffix } from './react/features/display-name/functions';
import { maybeOpenFeedbackDialog, submitFeedback } from './react/features/feedback/actions';
import { initKeyboardShortcuts } from './react/features/keyboard-shortcuts/actions';
import { showDesktopPicker } from './react/features/desktop-picker';
import { appendSuffix } from './react/features/display-name';
import {
maybeOpenFeedbackDialog,
submitFeedback
} from './react/features/feedback';
import { maybeSetLobbyChatMessageListener } from './react/features/lobby/actions.any';
import { setNoiseSuppressionEnabled } from './react/features/noise-suppression/actions';
import { hideNotification, showNotification, showWarningNotification } from './react/features/notifications/actions';
import {
DATA_CHANNEL_CLOSED_NOTIFICATION_ID,
NOTIFICATION_TIMEOUT_TYPE
} from './react/features/notifications/constants';
import { isModerationNotificationDisplayed } from './react/features/notifications/functions';
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay/actions';
import { suspendDetected } from './react/features/power-monitor/actions';
NOTIFICATION_TIMEOUT_TYPE,
hideNotification,
isModerationNotificationDisplayed,
showNotification,
showWarningNotification
} from './react/features/notifications';
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay';
import { suspendDetected } from './react/features/power-monitor';
import { initPrejoin, makePrecallTest, setJoiningInProgress } from './react/features/prejoin/actions';
import { isPrejoinPageVisible } from './react/features/prejoin/functions';
import { disableReceiver, stopReceiver } from './react/features/remote-control/actions';
import { setScreenAudioShareState } from './react/features/screen-share/actions.web';
import { isScreenAudioShared } from './react/features/screen-share/functions';
import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capture/actions';
import { disableReceiver, stopReceiver } from './react/features/remote-control';
import { isScreenAudioShared, setScreenAudioShareState } from './react/features/screen-share/';
import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capture';
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
import { createRnnoiseProcessor } from './react/features/stream-effects/rnnoise';
import { endpointMessageReceived } from './react/features/subtitles/actions.any';
import { endpointMessageReceived } from './react/features/subtitles';
import { handleToggleVideoMuted } from './react/features/toolbox/actions.any';
import { muteLocal } from './react/features/video-menu/actions.any';
import { setIAmVisitor } from './react/features/visitors/actions';
import { iAmVisitor } from './react/features/visitors/functions';
import UIEvents from './service/UI/UIEvents';
const logger = Logger.getLogger(__filename);
@@ -351,30 +339,21 @@ class ConferenceConnector {
}
case JitsiConferenceErrors.REDIRECTED: {
const newConfig = getVisitorOptions(APP.store.getState(), params);
generateVisitorConfig(APP.store.getState(), params);
if (!newConfig) {
logger.warn('Not redirected missing params');
break;
}
connection.disconnect().then(() => {
connect(this._conference.roomName).then(con => {
const localTracks = getLocalTracks(APP.store.getState()['features/base/tracks']);
const [ vnode ] = params;
const jitsiTracks = localTracks.map(t => t.jitsiTrack);
APP.store.dispatch(overwriteConfig(newConfig))
.then(this._conference.leaveRoom())
.then(APP.store.dispatch(setIAmVisitor(Boolean(vnode))))
// visitors connect muted
jitsiTracks.forEach(t => t.mute());
// we do not clear local tracks on error, so we need to manually clear them
.then(APP.store.dispatch(destroyLocalTracks()))
.then(() => {
// Reset VideoLayout. It's destroyed in features/video-layout/middleware.web.js so re-initialize it.
VideoLayout.initLargeVideo();
VideoLayout.resizeVideoArea();
connect(this._conference.roomName).then(con => {
this._conference.startConference(con, []);
});
// TODO disable option to unmute audio or video
this._conference.startConference(con, jitsiTracks);
});
});
break;
}
@@ -409,28 +388,10 @@ class ConferenceConnector {
room.leave(CONFERENCE_LEAVE_REASONS.UNRECOVERABLE_ERROR).then(() => connection.disconnect());
break;
case JitsiConferenceErrors.CONFERENCE_MAX_USERS: {
case JitsiConferenceErrors.CONFERENCE_MAX_USERS:
APP.UI.notifyMaxUsersLimitReached();
// in case of max users(it can be from a visitor node), let's restore
// oldConfig if any as we will be back to the main prosody
const newConfig = restoreConferenceOptions(APP.store.getState());
if (newConfig) {
APP.store.dispatch(overwriteConfig(newConfig))
.then(this._conference.leaveRoom())
.then(() => {
_connectionPromise = connect(this._conference.roomName);
return _connectionPromise;
})
.then(con => {
APP.connection = connection = con;
});
}
break;
}
case JitsiConferenceErrors.INCOMPATIBLE_SERVER_VERSIONS:
APP.store.dispatch(reloadWithStoredParams());
break;
@@ -806,14 +767,13 @@ export default {
* @returns {Promise}
*/
async init({ roomName }) {
const state = APP.store.getState();
const initialOptions = {
startAudioOnly: config.startAudioOnly,
startScreenSharing: config.startScreenSharing,
startWithAudioMuted: getStartWithAudioMuted(state)
|| isUserInteractionRequiredForUnmute(state),
startWithVideoMuted: getStartWithVideoMuted(state)
|| isUserInteractionRequiredForUnmute(state)
startWithAudioMuted: getStartWithAudioMuted(APP.store.getState())
|| isUserInteractionRequiredForUnmute(APP.store.getState()),
startWithVideoMuted: getStartWithVideoMuted(APP.store.getState())
|| isUserInteractionRequiredForUnmute(APP.store.getState())
};
this.roomName = roomName;
@@ -843,7 +803,7 @@ export default {
return tracks;
};
if (isPrejoinPageVisible(state)) {
if (isPrejoinPageVisible(APP.store.getState())) {
_connectionPromise = connect(roomName).then(c => {
// we want to initialize it early, in case of errors to be able
// to gather logs
@@ -866,7 +826,7 @@ export default {
// they may remain as empty strings.
this._initDeviceList(true);
if (isPrejoinPageVisible(state)) {
if (isPrejoinPageVisible(APP.store.getState())) {
return APP.store.dispatch(initPrejoin(tracks, errors));
}
@@ -876,7 +836,7 @@ export default {
let localTracks = handleStartAudioMuted(initialOptions, tracks);
// In case where gUM is slow and resolves after the startAudio/VideoMuted coming from jicofo, we can be
// in case where gum is slow and resolves after the startAudio/VideoMuted coming from jicofo, we can be
// join unmuted even though jicofo had instruct us to mute, so let's respect that before passing the tracks
if (!browser.isWebKitBased()) {
if (room?.isStartAudioMuted()) {
@@ -888,11 +848,6 @@ export default {
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.VIDEO);
}
// Do not add the tracks if the user has joined the call as a visitor.
if (iAmVisitor(state)) {
return Promise.resolve();
}
return this._setLocalAudioVideoStreams(localTracks);
}
@@ -1078,20 +1033,13 @@ export default {
return;
}
const state = APP.store.getState();
if (!mute
&& isUserInteractionRequiredForUnmute(state)) {
&& isUserInteractionRequiredForUnmute(APP.store.getState())) {
logger.error('Unmuting video requires user interaction');
return;
}
// check for A/V Moderation when trying to unmute and return early
if (!mute && shouldShowModeratedNotification(MEDIA_TYPE.VIDEO, state)) {
return;
}
// If not ready to modify track's state yet adjust the base/media
if (!this._localTracksInitialized) {
// This will only modify base/media.video.muted which is then synced
@@ -1105,7 +1053,7 @@ export default {
return;
}
const localVideo = getLocalJitsiVideoTrack(state);
const localVideo = getLocalJitsiVideoTrack(APP.store.getState());
if (!localVideo && !mute && !this.isCreatingLocalTrack) {
const maybeShowErrorDialog = error => {
@@ -1496,7 +1444,7 @@ export default {
logger.debug(`useVideoStream: Replacing ${oldTrack} with ${newTrack}`);
if (oldTrack === newTrack || (!oldTrack && !newTrack)) {
if (oldTrack === newTrack) {
resolve();
onFinish();
@@ -2039,11 +1987,6 @@ export default {
APP.store.dispatch(participantKicked(kicker, kicked));
});
room.on(JitsiConferenceEvents.PARTICIPANT_SOURCE_UPDATED,
jitsiParticipant => {
APP.store.dispatch(participantSourcesUpdated(jitsiParticipant));
});
room.on(JitsiConferenceEvents.SUSPEND_DETECTED, () => {
APP.store.dispatch(suspendDetected());
});
@@ -2309,7 +2252,10 @@ export default {
APP.UI.initConference();
dispatch(initKeyboardShortcuts());
if (!config.disableShortcuts) {
APP.keyboardshortcut.init();
}
dispatch(conferenceJoined(room));
const jwt = APP.store.getState()['features/base/jwt'];

127
config.js
View File

@@ -46,9 +46,9 @@ var config = {
},
// BOSH URL. FIXME: use XEP-0156 to discover it.
bosh: 'https://jitsi-meet.example.com/' + subdir + 'http-bind',
bosh: '//jitsi-meet.example.com/' + subdir + 'http-bind',
// Websocket URL (XMPP)
// Websocket URL
// websocket: 'wss://jitsi-meet.example.com/' + subdir + 'xmpp-websocket',
// The real JID of focus participant - can be overridden here
@@ -56,19 +56,6 @@ var config = {
// https://github.com/jitsi/jitsi-meet/issues/7376
// focusUserJid: 'focus@auth.jitsi-meet.example.com',
// Options related to the bridge (colibri) data channel
bridgeChannel: {
// If the backend advertises multiple colibri websockets, this options allows
// to filter some of them out based on the domain name. We use the first URL
// which does not match ignoreDomain, falling back to the first one that matches
// ignoreDomain. Has no effect if undefined.
// ignoreDomain: 'example.com',
// Prefer SCTP (WebRTC data channels over the media path) over a colibri websocket.
// If SCTP is available in the backend it will be used instead of a WS. Defaults to
// false (SCTP is used only if available and no WS are available).
// preferSctp: false
},
// Testing / experimental features.
//
@@ -92,6 +79,11 @@ var config = {
// This is useful when the client runs on a host with limited resources.
// noAutoPlayVideo: false,
// Whether to use fake constraints (height: 99999, width: 99999) when calling getDisplayMedia on
// Chromium based browsers. This is intended as a workaround for
// https://bugs.chromium.org/p/chromium/issues/detail?id=1056311
// setScreenSharingResolutionConstraints: true,
// Enable callstats only for a percentage of users.
// This takes a value between 0 and 100 which determines the probability for
// the callstats to be enabled.
@@ -139,6 +131,9 @@ var config = {
// Media
//
// Enable unified plan implementation support on Chromium based browsers.
// enableUnifiedOnChrome: false,
// Audio
// Disable measuring of audio levels.
@@ -194,22 +189,6 @@ var config = {
// enableOpusDtx: false,
// },
// Noise suppression configuration. By default rnnoise is used. Optionally Krisp
// can be used by enabling it below, but the Krisp JS SDK files must be supplied in your
// installation. Specifically, these files are needed:
// - https://meet.example.com/libs/krisp/krisp.mjs
// - https://meet.example.com/libs/krisp/models/model_8.kw
// - https://meet.example.com/libs/krisp/models/model_16.kw
// - https://meet.example.com/libs/krisp/models/model_32.kw
// NOTE: Krisp JS SDK v1.0.9 was tested.
// noiseSuppression: {
// krisp: {
// enabled: false,
// logProcessStats: false,
// debugLogs: false,
// },
// },
// Video
// Sets the preferred resolution (height) for local video. Defaults to 720.
@@ -270,6 +249,12 @@ var config = {
// Enable / disable simulcast support.
// disableSimulcast: false,
// Enable / disable layer suspension. If enabled, endpoints whose HD layers are not in use will be suspended
// (no longer sent) until they are requested again. This is enabled by default. This must be enabled for screen
// sharing to work as expected on Chrome. Disabling this might result in low resolution screenshare being sent
// by the client.
// enableLayerSuspension: false,
// Every participant after the Nth will start video muted.
// startVideoMuted: 10,
@@ -422,6 +407,28 @@ var config = {
// value will be used when the quality level is selected using "Manage Video Quality" slider.
// startLastN: 1,
// Provides a way to use different "last N" values based on the number of participants in the conference.
// The keys in an Object represent number of participants and the values are "last N" to be used when number of
// participants gets to or above the number.
//
// For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than
// 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN'
// will be used as default until the first threshold is reached.
//
// lastNLimits: {
// 5: 20,
// 30: 15,
// 50: 10,
// 70: 5,
// 90: 2,
// },
// Provides a way to translate the legacy bridge signaling messages, 'LastNChangedEvent',
// 'SelectedEndpointsChangedEvent' and 'ReceiverVideoConstraint' into the new 'ReceiverVideoConstraints' message
// that invokes the new bandwidth allocation algorithm in the bridge which is described here
// - https://github.com/jitsi/jitsi-videobridge/blob/master/doc/allocation.md.
// useNewBandwidthAllocationStrategy: false,
// Specify the settings for video quality optimizations on the client.
// videoQuality: {
// // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified
@@ -546,15 +553,12 @@ var config = {
// Disables responsive tiles.
// disableResponsiveTiles: false,
// DEPRECATED. Please use `securityUi?.hideLobbyButton` instead.
// Hides lobby button.
// Hides lobby button
// hideLobbyButton: false,
// DEPRECATED. Please use `lobby?.autoKnock` instead.
// If Lobby is enabled starts knocking automatically.
// autoKnockLobby: false,
// DEPRECATED. Please use `lobby?.enableChat` instead.
// Enable lobby chat.
// enableLobbyChat: true,
@@ -565,9 +569,6 @@ var config = {
// Require users to always specify a display name.
// requireDisplayName: true,
// Enables webhid functionality for Audio.
// enableWebHIDFeature: false,
// DEPRECATED! Use 'welcomePage.disabled' instead.
// Whether to use a welcome page or not. In case it's false a random room
// will be joined when no room is specified.
@@ -582,22 +583,6 @@ var config = {
// customUrl: ''
// },
// Configs for the lobby screen.
// lobby {
// // If Lobby is enabled, it starts knocking automatically. Replaces `autoKnockLobby`.
// autoKnock: false,
// // Enables the lobby chat. Replaces `enableLobbyChat`.
// enableChat: true,
// },
// Configs for the security related UI elements.
// securityUi: {
// // Hides the lobby button. Replaces `hideLobbyButton`.
// hideLobbyButton: false,
// // Hides the possibility to set and enter a lobby password.
// disableLobbyPassword: false,
// },
// Disable app shortcuts that are registered upon joining a conference
// disableShortcuts: false,
@@ -825,14 +810,6 @@ var config = {
// 'microphone', 'camera', 'select-background', 'invite', 'settings'
// hiddenPremeetingButtons: [],
// An array with custom option buttons for the participant context menu
// type: Array<{ icon: string; id: string; text: string; }>
// customParticipantMenuButtons: [],
// An array with custom option buttons for the toolbar
// type: Array<{ icon: string; id: string; text: string; }>
// customToolbarButtons: [],
// Stats
//
@@ -924,6 +901,9 @@ var config = {
// connection.
enabled: true,
// Enable unified plan implementation support on Chromium for p2p connection.
// enableUnifiedOnChrome: false,
// Sets the ICE transport policy for the p2p connection. At the time
// of this writing the list of possible values are 'all' and 'relay',
// but that is subject to change in the future. The enum is defined in
@@ -1114,6 +1094,9 @@ var config = {
// // whether to hide the logo on the deep linking pages.
// hideLogo: false,
// // whether to show deeplinking image.
// showImage: false,
// // The ios deeplinking config.
// ios: {
// appName: 'Jitsi Meet',
@@ -1150,13 +1133,6 @@ var config = {
// }
// },
// // The terms, privacy and help centre URL's.
// legalUrls: {
// helpCentre: 'https://web-cdn.jitsi.net/faq/meet-faq.html',
// privacy: 'https://jitsi.org/meet/privacy',
// terms: 'https://jitsi.org/meet/terms'
// },
// A property to disable the right click context menu for localVideo
// the menu has option to flip the locally seen video for local presentations
// disableLocalVideoFlip: false,
@@ -1249,6 +1225,7 @@ var config = {
ui03: "violet",
ui04: "magenta",
ui05: "blueviolet",
field02Hover: 'red',
action01: 'green',
action01Hover: 'lightgreen',
disabled01: 'beige',
@@ -1372,9 +1349,9 @@ var config = {
deploymentInfo
dialOutAuthUrl
dialOutCodesUrl
dialOutRegionUrl
disableRemoteControl
displayJids
externalConnectUrl
e2eeLabels
firefox_fake_device
googleApiApplicationClientID
@@ -1398,6 +1375,7 @@ var config = {
/**
_peerConnStatusOutOfLastNTimeout
_peerConnStatusRtcMuteTimeout
abTesting
avgRtpStatsN
callStatsConfIDNamespace
callStatsCustomScriptUrl
@@ -1406,7 +1384,6 @@ var config = {
disableAGC
disableAP
disableHPF
disableLocalStats
disableNS
enableTalkWhileMuted
forceJVB121Ratio
@@ -1552,8 +1529,6 @@ var config = {
// tileTime: 5000,
// // Limit results by rating: g, pg, pg-13, r. Default value: g.
// rating: 'pg',
// // The proxy server url for giphy requests in the web app.
// proxyUrl: 'https://giphy-proxy.example.com',
// },
// Logging
@@ -1583,12 +1558,6 @@ var config = {
// },
};
// Temporary backwards compatibility with old mobile clients.
config.flags = config.flags || {};
config.flags.sourceNameSignaling = true;
config.flags.sendMultipleVideoStreams = true;
config.flags.receiveMultipleVideoStreams = true;
// Set the default values for JaaS customers
if (enableJaaS) {
config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids';

View File

@@ -12,7 +12,7 @@ import {
constructOptions
} from './react/features/base/connection/actions.web';
import { openDialog } from './react/features/base/dialog/actions';
import { setJWT } from './react/features/base/jwt/actions';
import { setJWT } from './react/features/base/jwt';
import {
JitsiConnectionErrors,
JitsiConnectionEvents
@@ -32,6 +32,54 @@ const logger = Logger.getLogger(__filename);
*/
export const DISCO_JIBRI_FEATURE = 'http://jitsi.org/protocol/jibri';
/**
* Checks if we have data to use attach instead of connect. If we have the data
* executes attach otherwise check if we have to wait for the data. If we have
* to wait for the attach data we are setting handler to APP.connect.handler
* which is going to be called when the attach data is received otherwise
* executes connect.
*
* @param {string} [id] user id
* @param {string} [password] password
* @param {string} [roomName] the name of the conference.
*/
function checkForAttachParametersAndConnect(id, password, connection) {
if (window.XMPPAttachInfo) {
APP.connect.status = 'connecting';
// When connection optimization is not deployed or enabled the default
// value will be window.XMPPAttachInfo.status = "error"
// If the connection optimization is deployed and enabled and there is
// a failure the value will be window.XMPPAttachInfo.status = "error"
if (window.XMPPAttachInfo.status === 'error') {
connection.connect({
id,
password
});
return;
}
const attachOptions = window.XMPPAttachInfo.data;
if (attachOptions) {
connection.attach(attachOptions);
delete window.XMPPAttachInfo.data;
} else {
connection.connect({
id,
password
});
}
} else {
APP.connect.status = 'ready';
APP.connect.handler
= checkForAttachParametersAndConnect.bind(
null,
id, password, connection);
}
}
/**
* Try to open connection using provided credentials.
* @param {string} [id]
@@ -134,10 +182,7 @@ export async function connect(id, password) {
APP.store.dispatch(setPrejoinDisplayNameRequired());
}
connection.connect({
id,
password
});
checkForAttachParametersAndConnect(id, password, connection);
});
}
@@ -167,7 +212,7 @@ export function openConnection({ id, password, retry, roomName }) {
password = passwordOverride; // eslint-disable-line no-param-reassign
}
return connect(id, password).catch(err => {
return connect(id, password, roomName).catch(err => {
if (retry) {
const { jwt } = APP.store.getState()['features/base/jwt'];

View File

@@ -0,0 +1,3 @@
module.exports = {
'extends': '../react/.eslintrc.js'
};

View File

@@ -0,0 +1,86 @@
/* global config, createConnectionExternally */
import getRoomName from '../react/features/base/config/getRoomName';
import { parseURLParams } from '../react/features/base/util/parseURLParams';
/**
* Implements external connect using createConnectionExternally function defined
* in external_connect.js for Jitsi Meet. Parses the room name and JSON Web
* Token (JWT) from the URL and executes createConnectionExternally.
*
* NOTE: If you are using lib-jitsi-meet without Jitsi Meet, you should use this
* file as reference only because the implementation is Jitsi Meet-specific.
*
* NOTE: For optimal results this file should be included right after
* external_connect.js.
*/
if (typeof createConnectionExternally === 'function') {
// URL params have higher priority than config params.
// Do not use external connect if websocket is enabled.
let url
= parseURLParams(window.location, true, 'hash')[
'config.externalConnectUrl']
|| config.websocket ? undefined : config.externalConnectUrl;
const isRecorder
= parseURLParams(window.location, true, 'hash')['config.iAmRecorder'];
let roomName;
if (url && (roomName = getRoomName()) && !isRecorder) {
url += `?room=${roomName}`;
const token = parseURLParams(window.location, true, 'search').jwt;
if (token) {
url += `&token=${token}`;
}
createConnectionExternally(
url,
connectionInfo => {
// Sets that global variable to be used later by connect method
// in connection.js.
window.XMPPAttachInfo = {
status: 'success',
data: connectionInfo
};
checkForConnectHandlerAndConnect();
},
errorCallback);
} else {
errorCallback();
}
} else {
errorCallback();
}
/**
* Check if connect from connection.js was executed and executes the handler
* that is going to finish the connect work.
*
* @returns {void}
*/
function checkForConnectHandlerAndConnect() {
window.APP
&& window.APP.connect.status === 'ready'
&& window.APP.connect.handler();
}
/**
* Implements a callback to be invoked if anything goes wrong.
*
* @param {Error} error - The specifics of what went wrong.
* @returns {void}
*/
function errorCallback(error) {
// The value of error is undefined if external connect is disabled.
error && console.warn(error);
// Sets that global variable to be used later by connect method in
// connection.js.
window.XMPPAttachInfo = {
status: 'error'
};
checkForConnectHandlerAndConnect();
}

View File

@@ -0,0 +1,117 @@
/**
* Mixins that mimic the way Atlaskit fills the screen with modals at low screen widths.
*/
@mixin full-size-modal-positioner() {
height: 100%;
left: 0;
position: fixed;
top: 0;
max-width: 100%;
width: 100%;
}
@mixin full-size-modal-dialog() {
height: 100%;
max-height: 100%;
border-radius: 0;
}
/**
* Move the @atlaskit/flag container up a little bit so it does not cover the
* toolbar with the first notification.
*/
.atlaskit-portal > #notifications-container {
bottom: calc(#{$newToolbarSizeWithPadding}) !important;
}
/**
* Keep overflow menu within screen vertical bounds and make it scrollable.
*/
.toolbox-button-wth-dialog > div:nth-child(2) {
background: $menuBG;
max-height: calc(100vh - #{$newToolbarSizeWithPadding} - 46px);
margin-bottom: 4px;
padding: 0;
overflow-y: auto;
}
/**
* Remove background color and box-shadow for the context menu container.
*/
.toolbox-button-wth-dialog.context-menu > div:nth-child(2) {
background: transparent;
box-shadow: none;
overflow-y: initial;
}
.audio-preview > div:nth-child(2),
.video-preview > div:nth-child(2) {
margin-bottom: 4px;
outline: none;
padding: 0;
}
/**
* The following selectors keep the chat modal full-size anywhere between 100px
* and 580px for desktop or 680px for mobile.
*/
@media (min-width: 100px) and (max-width: 320px) {
.smiley-input {
display: none;
}
.shift-right .focus-lock > div > div {
@include full-size-modal-positioner();
}
.shift-right .focus-lock [role="dialog"] {
@include full-size-modal-dialog();
}
}
@media (min-width: 480px) and (max-width: 580px) {
.shift-right .focus-lock > div > div {
@include full-size-modal-positioner();
}
.shift-right .focus-lock [role="dialog"] {
@include full-size-modal-dialog();
}
}
@media (max-width: 580px) {
// Override Atlaskit inline style for the modal background.
// Important is unfortunately needed for that.
.shift-right .focus-lock [role="dialog"][style] {
background-color: $chatBackgroundColor !important;
}
// Remove Atlaskit padding from the chat dialog.
.shift-right .focus-lock [role="dialog"] > div:first-child > div:nth-child(2) {
padding: 0;
}
}
div.Tooltip {
color: #fff;
font-size: 12px;
line-height: 14px;
padding: 8px;
}
// make modal full screen on landscape orientation
@media (max-height: 420px) {
.atlaskit-portal {
.css-1oc7v0j {
height: 100%;
padding: 0;
max-width: 100%;
top: 0;
width: 100%;
&> div {
height: 100%;
}
}
}
}

192
css/_audio-preview.scss Normal file
View File

@@ -0,0 +1,192 @@
.audio-preview {
display: inline-block;
&-content {
background: $menuBG;
border-radius: 3px;
font-size: 14px;
line-height: 24px;
max-height: 456px;
overflow: auto;
width: 300px;
&-ul {
margin:0;
padding:0;
list-style-type: none;
}
}
&-header {
color: #fff;
align-items: center;
display: flex;
margin-top: 8px;
padding: 8px 16px;
&-icon {
display: inline-block;
svg {
fill: #fff;
}
}
&--bordered {
border-bottom: 1px solid #4C4D50;
}
&-text {
margin-left: 12px;
}
}
&-entry {
align-items: center;
color: #fff;
cursor: pointer;
display: flex;
padding: 8px 0;
margin-left: 48px;
&--selected {
background: #131519;
cursor: initial;
margin-left: 0;
padding-left: 18px;
}
&-text {
color: #fff;
display: inline-block;
line-height: 24px;
text-overflow: ellipsis;
max-width: 213px;
overflow: hidden;
white-space: nowrap;
}
}
&-speaker {
position: relative;
&-ul {
margin:0;
padding:0;
list-style-type: none;
}
&:hover, &:focus-within, &:focus {
.audio-preview-entry {
background: #36383C;
margin-left: 0;
padding-left: 48px;
&--selected {
padding-left: 18px;
background: $newToolbarBackgroundColor;
}
}
.audio-preview-test-button {
display: inline-block;
}
.audio-preview-entry-text {
max-width: 178px;
}
}
&:last-child {
padding-bottom: 8px;
}
.audio-preview-entry-text {
max-width: 238px;
}
}
&-microphone {
position: relative;
&:hover {
.audio-preview-entry {
background: #36383C;
margin-left: 0;
padding-left: 48px;
&--selected {
background: $newToolbarBackgroundColor;
padding-left: 18px;
}
}
}
&--nometer {
.audio-preview-entry-text {
max-width: 238px;
}
}
&--withmeter {
.audio-preview-entry-text {
max-width: 178px;
}
}
}
&-icon {
border-radius: 50%;
display: inline-block;
width: 14px;
& svg {
fill: #1C2025;
}
&--check {
background: #31B76A;
margin-right: 16px;
}
&--exclamation {
margin-left: 6px;
& svg {
fill: #E54B4B;
}
}
}
&-hr {
border-top: 1px solid #4C4D50;
border-bottom: 0;
}
&-test-button {
display: none;
background: #FFF;
border: 1px solid #D1DBE8;
border-radius: 3px;
color: #1C2025;
cursor: pointer;
font-weight: 600;
font-size: 0.8rem;
line-height: 24px;
padding: 2px 8px;
position: absolute;
right: 16px;
top: 5px;
}
&-meter-mic {
position: absolute;
right: 16px;
top: 14px;
}
// Override @atlaskit/InlineDialog container which is made with styled components
& > div:nth-child(2) {
outline: none;
padding: 0;
}
}

View File

@@ -32,7 +32,7 @@
#chat-conversation-container {
// extract message input height
height: calc(100% - 64px);
height: calc(100% - 68px);
overflow: hidden;
position: relative;
}
@@ -74,9 +74,31 @@
a:active {
color: black;
}
}
&::-webkit-scrollbar-corner {
background: #3a3a3a;
#chat-recipient {
align-items: center;
background-color: $chatPrivateMessageBackgroundColor;
display: flex;
flex-direction: row;
font-weight: 100;
padding: 10px;
span {
color: white;
display: flex;
flex: 1;
}
div {
svg {
cursor: pointer;
fill: white;
}
}
&.lobby-chat-recipient {
background-color: $chatLobbyMessageBackgroundColor;
}
}
@@ -102,12 +124,13 @@
}
.chat-input-container {
padding: 0 16px 24px;
padding: 0 16px 16px;
}
#chat-input {
display: flex;
align-items: flex-end;
padding: 4px;
position: relative;
}
@@ -240,6 +263,15 @@
-webkit-user-select: text;
user-select: text;
}
.display-name {
font-size: 12px;
font-weight: 600;
margin-bottom: 5px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
}
.sr-only {
@@ -256,11 +288,24 @@
}
.chatmessage {
background-color: $chatRemoteMessageBackgroundColor;
border-radius: 0px 6px 6px 6px;
box-sizing: border-box;
color: white;
margin-top: 3px;
max-width: 100%;
position: relative;
&.localuser {
background-color: $chatLocalMessageBackgroundColor;
border-radius: 6px 0px 6px 6px;
}
.usermessage {
white-space: pre-wrap;
font-size: 14px;
}
&.error {
border-radius: 0px;
@@ -275,12 +320,22 @@
}
}
.privatemessagenotice {
font-size: 11px;
font-weight: 100;
}
.messagecontent {
margin: 8px;
max-width: 100%;
overflow: hidden;
}
}
.timestamp {
color: #757575;
}
#smileys {
font-size: 20pt;
margin: auto;
@@ -354,9 +409,24 @@
}
.chat-message-group {
display: flex;
flex-direction: column;
&.local {
align-items: flex-end;
.chatmessage {
background-color: $chatLocalMessageBackgroundColor;
border-radius: 6px 0px 6px 6px;
&.privatemessage {
background-color: $chatPrivateMessageBackgroundColor;
}
&.lobbymessage {
background-color: $chatLobbyMessageBackgroundColor;
}
}
.display-name {
display: none;
}
@@ -367,10 +437,58 @@
}
&.error {
.chatmessage {
background-color: $defaultWarningColor;
border-radius: 0px;
font-weight: 100;
}
.display-name {
display: none;
}
}
.chatmessage-wrapper {
max-width: 100%;
.replywrapper {
display: flex;
flex-direction: row;
align-items: center;
.messageactions {
align-self: stretch;
border-left: 1px solid $chatActionsSeparatorColor;
display: flex;
flex-direction: column;
justify-content: center;
padding: 5px;
&.lobbychatmessageactions {
border-left-color: $chatLobbyActionsSeparatorColor;
}
.toolbox-icon {
cursor: pointer;
}
}
}
}
.chatmessage {
background-color: $chatRemoteMessageBackgroundColor;
border-radius: 0px 6px 6px 6px;
display: inline-block;
margin-top: 3px;
color: white;
&.privatemessage {
background-color: $chatPrivateMessageBackgroundColor;
}
&.lobbymessage {
background-color: $chatLobbyMessageBackgroundColor;
}
}
}
.chat-dialog {

75
css/_country-picker.scss Normal file
View File

@@ -0,0 +1,75 @@
.cpick {
border: 1px solid #A4B8D1;
color: #fff;
display: flex;
font-size: 15px;
height: 38px;
line-height: 24px;
&-selector {
align-items: center;
background-color: #283447;
border-right: 1px solid #A4B8D1;
cursor: pointer;
display: flex;
padding: 8px 10px;
position: relative;
width: 88px;
}
&-icon {
margin-right: 8px;
position: absolute;
right: 0;
top: 12px;
& > svg {
fill: #fff;
}
}
&-input {
padding: 8px;
background: #1C2025;
border: 0;
margin: 0;
color: #fff;
caret-color: #0376DA;
flex-grow: 1;
}
&-dropdown {
height: 190px;
overflow-y: auto;
width: 343px;
}
&-dropdown-entry {
align-items: center;
cursor: pointer;
display: flex;
height: 40px;
padding: 0 10px;
&:hover {
background-color: #66768b;
}
&-text {
color: #fff;
flex-grow: 1;
font-size: 15px;
line-height: 24px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
// Override @Atlaskit/inline-dialog styles
.cpick-container > div:nth-child(2) {
outline: none;
padding: 8px 0 0 0;
}

View File

@@ -82,7 +82,6 @@
}
.left-column {
order: -1;
display: flex;
flex-direction: column;
flex-grow: 0;
@@ -93,7 +92,6 @@
.right-column {
display: flex;
flex-direction: column;
align-items: flex-start;
flex-grow: 1;
padding-left: 16px;
padding-top: 13px;
@@ -101,11 +99,11 @@
}
.title {
font-size: 12px;
font-weight: 600;
line-height: 16px;
margin-bottom: 4px;
}
font-size: 12px;
font-weight: 600;
line-height: 16px;
padding-bottom: 4px;
}
.subtitle {
color: #5E6D7A;
@@ -127,7 +125,8 @@
cursor: pointer;
}
&.with-click-handler:hover {
&.with-click-handler:hover,
&.with-click-handler:focus {
background-color: #c7ddff;
}

View File

@@ -3,28 +3,28 @@
display: inline-block;
& > svg {
fill: #525252;
fill: #4E5E6C;
width: 38px;
}
}
&.metr--disabled {
& > svg {
fill: #525252;
fill: #4E5E6C;
}
}
}
.metr-l-0 {
rect:first-child {
fill: #1EC26A;
fill: #31B76A;
}
}
@for $i from 1 through 7 {
.metr-l-#{$i} {
rect:nth-child(-n+#{$i+1}) {
fill: #1EC26A;
fill: #31B76A;
}
}
}

23
css/_notifications.scss Normal file
View File

@@ -0,0 +1,23 @@
.notification-appear, .notification-enter {
opacity: 0;
position: relative;
left: -200px;
transition: all .2s !important; // !important needed to overwrite atlaskit default style
&-active {
opacity: 1;
left: 0;
}
}
.notification-exit {
opacity: 1;
position: relative;
left: 0;
transition: all .2s !important; // !important needed to overwrite atlaskit default style
&-active {
opacity: 0;
left: -200px;
}
}

View File

@@ -1,3 +1,353 @@
.polls-panel {
.poll-dialog {
font-size: 14px;
font-weight: 400;
line-height: 20px;
h1, span, li, strong {
color: #bce;
}
ol {
margin: 0;
}
}
.poll-question-field {
padding: 8px 16px;
padding-bottom: 24px;
border-bottom: 1px solid #525252;
}
.poll-header {
margin-bottom: 8px;
}
.poll-creator {
color: #C2C2C2;
font-weight: 600;
margin: 4px 0 16px 0;
}
.poll-answer-container {
display: flex;
padding: 4px;
background: #3D3D3D;
border-radius: 3px;
margin-bottom: 8px;
@media (max-width: 580px) {
&> span {
padding: 8px 0;
}
svg {
margin-top: 6px;
}
}
}
.poll-answer-field-list, .poll-answer-list, .poll-result-list {
list-style-type: none;
padding: 0;
margin: 0;
}
.poll-answer-field-list {
padding: 0 16px;
}
ol.poll-result-list {
margin-bottom: 1.5em;
}
.poll-result-list > li {
margin-bottom: 16px;
}
.poll-answer-field {
flex-direction: column;
align-items: stretch;
margin-bottom: 16;
}
.poll-answer-field:last-child {
margin-bottom: 0;
}
.poll-create-option-row {
display: flex;
margin-bottom: 4;
}
// Needed to override atlaskit default blue color
.poll-create-container .jsYMHu {
background: #292929;
border-color: #808090;
color: #fff // #808090
}
.poll-add-button {
display: flex;
justify-content: center;
padding: 8px 16px;
}
.poll-remove-option-button {
background: 0 0;
border: none;
color: #E04757;
padding-left: 0;
}
.poll-create-add-option {
border: none;
background-color: #292929;
padding: 3px;
width: 100%;
}
.poll-icon-button, .poll-drag-handle {
.jitsi-icon svg {
fill: #929292;
}
}
.poll-drag-handle {
background-color: transparent;
border: none;
cursor: grab;
padding-left: 8;
padding-top: 8px;
display: flex;
}
.poll-question {
font-size: 16px;
font-weight: 600;
line-height: 26px;
}
.poll-answer-voters {
font-weight: lighter;
list-style-type: none;
border: #616161 solid 1px;
border-radius: 3px;
padding: 2px 6px;
margin: 4px 0px 12px;
background-color: #616161;
}
.poll-answer-header {
display: flex;
justify-content: space-between;
}
.poll-answer-vote-name {
flex-shrink: 1;
overflow-wrap: anywhere
}
.poll-answer-vote-count-container{
display: flex;
}
.poll-answer-vote-count {
margin-left: 10px;
white-space: nowrap;
flex: 1;
text-align: right;
}
.poll-answer-short-results{
display: flex;
min-width: 10em;
justify-content: space-between;
align-items: center;
}
.poll-bar-container, .poll-bar {
border-radius: 3px;
height: 6px;
}
.poll-bar-container {
background-color: #616161;
max-width: 160px;
margin-top: 3px;
flex: 1;
}
.poll-bar {
background-color: #246FE5;
}
.poll-message-footer {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
margin-top: 5px;
}
.poll-notice {
font-weight: 100;
margin-right: 10px;
}
.poll-show-details {
background-color: transparent;
border: none;
&:hover {
text-decoration: underline;
}
}
.poll-result-links {
display: flex;
flex-direction: row;
justify-content: space-between;
a.poll-detail-link, a.poll-change-vote-link {
color: #669AEC;
cursor: pointer;
font-weight: 600;
text-decoration: none;
&:hover {
color: #669AEC;
}
&:visited {
color: #669AEC;
}
}
}
.polls-pane-content {
height: 100%;
position: relative;
}
.pane-content{
display: flex;
flex-direction: column;
height: 100%;
justify-content: center;
align-items: center;
width: 100%;
}
.empty-pane-icon {
width: 50%;
padding: 24px;
}
.empty-pane-icon svg {
fill: #3D3D3D;
width: 100%;
height: auto;
}
.empty-pane-message {
color: #fff;
padding: 0 16px;
text-align: center;
}
.poll-results, .poll-answer {
background: #292929;
border-radius: 8px;
border: 1px solid #666666;
margin: 16px;
padding: 16px;
word-break: break-word;
}
.poll-results {
color: #fff;
}
.poll-answer {
h1, strong ,span {
color: #fff;
}
button > span {
color: inherit;
}
}
.poll-create-label {
color: #C2C2C2;
display: flex;
font-weight: 400;
margin-bottom: 4;
}
.expandable-input{
line-height: 18px;
resize: none;
width: 100%;
height: 40px;
box-sizing: border-box;
overflow: hidden;
border: 1px solid #666666;
background-color: #141414;
color: #FFF;
border-radius: 6px;
padding: 10px 16px;
}
#polls-panel {
height: calc(100% - 119px);
}
.poll-container {
font-size: 14px;
font-weight: 600;
height: calc(100% - 88px);
line-height: 20px;
overflow-y: auto;
position: relative;
& > * + *:not(.ignore-child) {
margin-top: 16px;
}
@media (max-width: 580px) {
height: calc(100% - 102px);
}
}
.poll-create-header {
color: #fff;
font-size: 20px;
line-height: 28px;
margin: 20px 16px;
font-weight: 600;
}
.poll-create-container {
padding: 8px 0;
}
.poll-create-footer {
background-color: #141414;
bottom: 0;
position: absolute;
width: calc(100% - 32px);
}
.poll-footer {
display: flex;
justify-content: space-between;
padding: 0 16px 16px 16px;
}
.poll-answer-footer {
padding: 8px 0 0 0;
}

View File

@@ -1,33 +1,49 @@
/**
* Mousemove padding styles are used to add invisible elements to the popover
* to allow mouse movement from the popover trigger to the popover itself
* without triggering a mouseleave event.
*/
%vertical-popover-padding {
height: 100%;
position: absolute;
top: 0;
width: 20px;
padding: 20px 0;
top: -20px;
}
%horizontal-popover-padding {
height: 25px;
position: absolute;
right: 0;
width: 100%;
padding: 0 35px;
left: -35px;
}
.popover-mousemove-padding-left {
@extend %vertical-popover-padding;
left: -35px;
}
.popover-mousemove-padding-right {
@extend %vertical-popover-padding;
right: -35px;
}
.popover-mousemove-padding-bottom {
@extend %horizontal-popover-padding;
bottom: -40px;
}
.popover-mousemove-padding-top {
@extend %horizontal-popover-padding;
top: -40px;
}
.popover {
margin: -16px -24px;
z-index: $popoverZ;
.popover-content {
position: relative;
}
&.hover {
margin: -16px -24px;
.popover-content {
margin: 16px 24px;
&.top {
bottom: 8px;
}
&.bottom {
top: 4px;
}
&.left {
right: 4px;
}
&.right {
left: 4px;
}
}
}
}
.excalidraw .popover {

View File

@@ -5,15 +5,15 @@
.popupmenu__contents {
.popupmenu__volume-slider {
&::-webkit-slider-runnable-track {
background-color: #246FE5;
background-color: $popupSliderColor;
}
&::-moz-range-track {
background-color: #246FE5;
background-color: $popupSliderColor;
}
&::-ms-fill-lower {
background-color: #246FE5;
background-color: $popupSliderColor;
}
}
}

View File

@@ -4,7 +4,7 @@
width: 280px;
background: $menuBG;
box-shadow: 0px 3px 16px rgba(0, 0, 0, 0.6), 0px 0px 4px 1px rgba(0, 0, 0, 0.25);
border-radius: 6px;
border-radius: 3px;
padding: 16px;
&.with-gif {
@@ -104,6 +104,10 @@
}
}
.reactions-menu-container {
padding-bottom: 6px;
}
.reactions-animations-container {
position: absolute;
width: 20%;

View File

@@ -18,7 +18,6 @@
align-items: center;
font-size: 14px;
margin-left: 16px;
max-width: 70%;
}
&.space-top {
@@ -83,7 +82,7 @@
background-color: #FFFFFF;
border-radius: 4px;
height: 40px;
width: 40px;
width: 56px;
}
.jitsi-content-recording-icon-container-without-switch {
@@ -197,6 +196,14 @@
padding-bottom: 10px;
}
.helper-link {
cursor: pointer;
font-weight: bold;
display: inline-block;
flex-shrink: 0;
margin-left: auto;
}
.warning-text {
color:#FFD740;
font-size: 12px;

View File

@@ -3,37 +3,38 @@
display: block;
#enter_room {
position: relative;
height: 42px;
.welcome-page-button {
font-size: 16px;
left: 0;
text-align: center;
width: 100%;
font-size: 16px;
left: 0;
position: absolute;
top: 68px;
text-align: center;
width: 100%;
}
}
.header {
background-color: #002637;
.insecure-room-name-warning {
width: 100%;
}
#enter_room {
width: 100%;
.join-meeting-container {
padding: 0;
flex-direction: column;
background: transparent;
}
.enter-room-input-container {
padding-right: 0;
margin-bottom: 10px;
}
.warning-without-link,
.warning-with-link {
top: 120px;
}
}
}
.welcome-tabs {
display: none;
}
.header-text-title {
text-align: center;
}
@@ -55,6 +56,13 @@
.welcome-footer-row-block {
display: block;
}
.welcome-badge {
margin-right: 16px;
}
.welcome-footer {
display: none;
}
}
}

View File

@@ -30,24 +30,24 @@
right: -4px;
top: -3px;
&:hover {
&:hover {
background: #F2F3F4;
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
& svg {
fill: #040404;
&> svg {
fill: #000;
}
&.settings-button-small-icon--disabled {
background: #36383C;
& svg {
fill: #929292;
}
&> svg {
fill: #929292;
}
}
}
& svg {
&> svg {
fill: #fff;
}
@@ -55,7 +55,7 @@
background-color: #36383c;
cursor: default;
& svg {
&> svg {
fill: #929292;
}
}

View File

@@ -12,6 +12,7 @@
&#autoHide.with-always-on {
overflow: hidden;
animation: hideSubject forwards .6s ease-out;
margin-left: 4px;
& > .subject-info-container {
justify-content: flex-start;
@@ -42,6 +43,42 @@
height: 28px;
}
.subject-text {
background: rgba(0, 0, 0, 0.6);
border-radius: 3px 0px 0px 3px;
box-sizing: border-box;
font-size: 14px;
line-height: 28px;
padding: 0 16px;
height: 28px;
max-width: 324px;
@media (max-width: 300px) {
display: none;
}
&--content {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.subject-timer {
background: rgba(0, 0, 0, 0.8);
border-radius: 0px 3px 3px 0px;
box-sizing: border-box;
font-size: 12px;
line-height: 28px;
min-width: 34px;
padding: 0 8px;
height: 28px;
@media (max-width: 300px) {
display: none;
}
}
.details-container {
width: 100%;
display: flex;

View File

@@ -120,16 +120,12 @@
margin: 8px 0;
}
div.hangup-button {
background-color: #CB2233;
.hangup-button {
background-color: $hangupColor;
@media (hover: hover) and (pointer: fine) {
&:hover {
background-color: #E04757;
}
&:active {
background-color: #A21B29;
background-color: $hangupHoverColor;
}
}
@@ -138,16 +134,12 @@ div.hangup-button {
}
}
div.hangup-menu-button {
background-color: #CB2233;
.hangup-menu-button {
background-color: $hangupMenuButtonColor;
@media (hover: hover) and (pointer: fine) {
&:hover {
background-color: #E04757;
}
&:active {
background-color: #A21B29;
background-color: $hangupMenuButtonHoverColor;
}
}

View File

@@ -4,6 +4,10 @@
* Style variables
*/
$baseFontFamily: -apple-system, BlinkMacSystemFont, 'open_sanslight', 'Helvetica Neue', Helvetica, Arial, sans-serif;
$hangupColor:#DD3849;
$hangupHoverColor: #F25363;
$hangupMenuButtonColor:#0056E0;;
$hangupMenuButtonHoverColor: #246FE5;
/**
* Size variables.
@@ -75,6 +79,7 @@ $modalTextColor: #333;
$chatActionsSeparatorColor: rgb(173, 105, 112);
$chatBackgroundColor: #131519;
$chatInputSeparatorColor: #A4B8D1;
$chatLobbyMessageBackgroundColor: #6A50D3;
$chatLobbyActionsSeparatorColor: #6A50D3;
$chatLocalMessageBackgroundColor: #484A4F;
$chatPrivateMessageBackgroundColor: rgb(153, 69, 77);
@@ -161,7 +166,7 @@ $welcomePageHeaderBackground: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(0,
$welcomePageHeaderBackgroundPosition: center;
$welcomePageHeaderBackgroundRepeat: none;
$welcomePageHeaderBackgroundSize: cover;
$welcomePageHeaderPaddingBottom: 15px;
$welcomePageHeaderPaddingBottom: 0px;
$welcomePageHeaderTitleMaxWidth: initial;
$welcomePageHeaderTextAlign: center;
@@ -201,6 +206,11 @@ $deepLinkingDialInConferenceIdPadding: inherit;
$deepLinkingDialInConferenceIdBackgroundColor: inherit;
$deepLinkingDialInConferenceIdBorderRadius: inherit;
$deepLinkingDialInConferenceNameFontSize: inherit;
$deepLinkingDialInConferenceNameLineHeight: inherit;
$deepLinkingDialInConferenceNameMarginBottom: none;
$deepLinkingDialInConferenceNameFontWeight: inherit;
$deepLinkingDialInConferenceDescriptionFontSize: 0.8em;
$deepLinkingDialInConferenceDescriptionLineHeight: inherit;
$deepLinkingDialInConferenceDescriptionMarginBottom: none;

87
css/_video-preview.scss Normal file
View File

@@ -0,0 +1,87 @@
.video-preview {
background: none;
display: inline-block;
&-container {
max-height: 344px;
background: $menuBG;
border-radius: 3px;
overflow: auto;
padding: 8px;
margin-bottom: 8px;
}
&-entry {
cursor: pointer;
height: 168px;
margin-bottom: 8px;
position: relative;
width: 284px;
&:last-child {
margin-bottom: 0;
}
&--selected {
border: 3px solid #31B76A;
border-radius: 3px;
cursor: default;
height: 162px;
width: 278px;
}
}
&-video {
border-radius: 3px;
height: 100%;
object-fit: cover;
width: 100%;
}
&-overlay {
background: rgba(42, 58, 75, 0.6);
height: 100%;
position: absolute;
width: 100%;
z-index: 1;
}
&-error {
align-items: center;
display: flex;
height: 100%;
justify-content: center;
position: absolute;
width: 100%;
}
&-label {
bottom: 8px;
color: #fff;
position: absolute;
width: 100%;
z-index: 2;
&-container {
margin: 0 16px;
}
&-text {
background-color: #131519;
border-radius: 3px;
padding: 2px 8px;
font-size: 13px;
line-height: 20px;
margin: 0 auto;
max-width: calc(100% - 16px);
overflow: hidden;
text-overflow: ellipsis;
width: fit-content;
white-space: nowrap;
}
}
// Override @atlaskit/InlineDialog container which is made with styled components
& > div:nth-child(2) {
padding: 0;
}
}

View File

@@ -76,42 +76,9 @@
}
}
.animatedFadeIn {
opacity: 0;
animation: fadeInAnimation 0.3s ease forwards;
}
@keyframes fadeInAnimation {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.animatedFadeOut {
opacity: 1;
animation: fadeOutAnimation 0.3s ease forwards;
}
@keyframes fadeOutAnimation {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
#largeVideoContainer {
height: 100%;
width: 100%;
position: absolute;
top: 0;
left: 0;
margin: 0 !important;
}
#largeVideoWrapper {

View File

@@ -20,6 +20,7 @@ body.welcome-page {
background-size: $welcomePageHeaderBackgroundSize;
padding-bottom: $welcomePageHeaderPaddingBottom;
background-color: #131519;
height: 400px;
overflow: hidden;
position: relative;
@@ -61,58 +62,26 @@ body.welcome-page {
}
.insecure-room-name-warning {
align-items: center;
color: $defaultWarningColor;
font-weight: 600;
display: flex;
flex-direction: row;
margin-top: 15px;
max-width: 480px;
width: $welcomePageEnterRoomWidth;
.jitsi-icon {
margin-right: 15px;
svg {
fill: $defaultWarningColor;
& > *:first-child {
fill: none !important;
}
}
}
}
::placeholder {
color: #253858;
}
#enter_room {
display: $welcomePageEnterRoomDisplay;
align-items: center;
max-width: 480px;
width: $welcomePageEnterRoomWidth;
z-index: $zindex2;
height: fit-content;
.join-meeting-container {
margin: $welcomePageEnterRoomMargin;
padding: $welcomePageEnterRoomPadding;
border-radius: 4px;
background-color: #fff;
display: flex;
width: 100%;
text-align: left;
color: #253858;
}
background-color: #fff;
padding: $welcomePageEnterRoomPadding;
border-radius: 4px;
margin: $welcomePageEnterRoomMargin;
.enter-room-input-container {
text-align: left;
color: #253858;
flex-grow: 1;
height: fit-content;
padding-right: 4px;
position: relative;
.enter-room-input {
border-radius: 4px;
border: 0;
background: #fff;
display: inline-block;
@@ -121,17 +90,48 @@ body.welcome-page {
font-size: 14px;
padding-left: 10px;
&.focus-visible {
&:focus {
outline: auto 2px #005fcc;
}
}
.insecure-room-name-warning {
align-items: center;
color: $defaultWarningColor;
display: flex;
flex-direction: row;
margin-top: 15px;
.jitsi-icon {
margin-right: 15px;
svg {
fill: $defaultWarningColor
}
}
}
::placeholder {
color: #253858;
}
}
.warning-without-link {
position: absolute;
top: 44px;
left: -10px;
}
.warning-with-link {
position: absolute;
top: 84px;
}
}
#moderated-meetings {
max-width: calc(100% - 40px);
padding: 16px 0 0;
padding: 16px 0 39px 0;
width: $welcomePageEnterRoomWidth;
text-align: center;
@@ -167,7 +167,7 @@ body.welcome-page {
margin: 4px;
display: $welcomePageTabButtonsDisplay;
[role="tab"] {
.tab {
background-color: #c7ddff;
border-radius: 7px;
cursor: pointer;
@@ -176,10 +176,8 @@ body.welcome-page {
margin: 2px;
padding: 7px 0;
text-align: center;
color: inherit;
border: 0;
&[aria-selected="true"] {
&.selected {
background-color: #FFF;
}
}

View File

@@ -0,0 +1,101 @@
.button-control {
box-sizing: border-box;
display: inline-block;
border: 1px solid $buttonBorder;
vertical-align: baseline;
height: 30px;
min-width: 60px;
padding: 4px 10px;
margin: 0;
line-height: 1.5em;
outline: none;
background-color: transparent;
float: right;
font-size: 14px;
margin-left: 10px;
color: $buttonColor;
font-weight: $buttonFontWeight;
@include transition(background-color .1s ease-out);
&[disabled] {
color: #666;
cursor: default;
}
&_full-width {
margin: 0;
width: 100%;
}
&:hover {
border: 1px solid $buttonHoverBorder;
background-color: $buttonHoverBackground;
@include transition(background-color .1s ease-in);
}
&:active {
@include box-shadow(0, 0, 1px, $buttonShadowColor, true);
}
&_light {
color: $defaultDarkColor;
background-color: $buttonLightBackground;
border: 1px solid $buttonLightBorder;
&:hover {
border: 1px solid $buttonLightHoverBorder;
background-color: $buttonLightHoverBackground;
}
}
&_link {
color: $buttonLinkColor;
background-color: $buttonLinkBackground;
&:hover {
background-color: $buttonLinkBackground;
}
}
&_overlay {
color: $primaryButtonColor;
background-color: $overlayButtonBg;
border-radius: 2px;
border: none;
&:hover {
background-color: $primaryButtonBackground;
border: none;
}
}
&_primary {
background-color: $primaryButtonBackground;
border: 1px solid $primaryButtonBackground;
color: $primaryButtonColor !important;
font-weight: $primaryButtonFontWeight;
&:hover {
border: 1px solid $primaryButtonHoverBackground;
background-color: $primaryButtonHoverBackground;
}
&[disabled] {
color: $primaryButtonColor;
}
}
&_close {
color: $defaultFontColor;
}
&_submit {
color: $linkFontColor;
&:hover {
color: $linkHoverFontColor;
}
}
&_center {
float: none !important;
}
}

View File

@@ -0,0 +1,49 @@
.form-control {
padding: $formPadding 0;
&:first-child {
padding-top: 0;
}
&:last-child {
padding-bottom: 0;
}
&__text {
margin: 8px 0;
font-size: 1em
}
&__label {
font-size: 1em;
font-weight: $labelFontWeight;
}
&__em {
color: $inputControlEmColor;
}
&__container {
position: relative;
width: 100%;
margin-top: 5px;
margin-bottom: 5px;
@include flex();
.button-control {
margin: 1px 0 1px 10px;
}
}
&__right {
position: absolute;
right: 0;
}
}
/**
* Set a specific color for read only style.
*/
input:read-only {
color: $readOnlyInputColor;
}

View File

@@ -0,0 +1,29 @@
.input-control {
@include transition(all .2s ease-in);
display: inline-block;
width: 100%;
padding: 5px 7px;
border-radius: $borderRadius;
line-height: 32px;
height: 32px;
text-align: left;
margin-bottom: 8px;
&:last-child {
margin-bottom: inherit;
}
&::selection {
background-color: $defaultDarkSelectionColor;
}
&.error {
color: $errorColor;
border-color: $errorColor;
}
}
@include placeholder {
color: $placeHolderColor;
}

20
css/components/_link.scss Normal file
View File

@@ -0,0 +1,20 @@
.link {
cursor: pointer;
color: $linkFontColor;
@include transition(color .1s ease-out);
&:hover {
color: $linkHoverFontColor;
text-decoration: underline;
@include transition(color .1s ease-in);
}
}
/**
* Helper links are links that are meant to open a documentation page or more
* detailed info.
*/
.helper-link {
@extend .link;
font-size: 12px;
}

View File

@@ -67,13 +67,6 @@
font-size: 1em;
}
.dial-in-conference-id {
text-align: center;
min-width: 200px;
margin-top: 40px;
}
.dial-in-conference-id {
margin: $deepLinkingDialInConferenceIdMargin;
padding: $deepLinkingDialInConferenceIdPadding;
@@ -81,12 +74,24 @@
border-radius: $deepLinkingDialInConferenceIdBorderRadius;
}
.dial-in-conference-name {
font-size: $deepLinkingDialInConferenceNameFontSize;
line-height: $deepLinkingDialInConferenceNameLineHeight;
margin-bottom: $deepLinkingDialInConferenceNameMarginBottom;
font-weight: $deepLinkingDialInConferenceNameFontWeight;
}
.dial-in-conference-description {
font-size: $deepLinkingDialInConferenceDescriptionFontSize;
line-height: $deepLinkingDialInConferenceDescriptionLineHeight;
margin-bottom: $deepLinkingDialInConferenceDescriptionMarginBottom;
}
.dial-in-conference-pin {
font-size: $deepLinkingDialInConferencePinFontSize;
line-height: $deepLinkingDialInConferencePinLineHeight;
}
.toll-free-list {
min-width: 80px;
}

View File

@@ -25,6 +25,7 @@ $flagsImagePath: "../images/";
/* Modules BEGIN */
@import 'reset';
@import 'atlaskit_overrides';
@import 'base';
@import 'utils';
@import 'overlay/overlay';
@@ -32,7 +33,10 @@ $flagsImagePath: "../images/";
@import 'reload_overlay/reload_overlay';
@import 'mini_toolbox';
@import 'modals/desktop-picker/desktop-picker';
@import 'modals/device-selection/device-selection';
@import 'modals/dialog';
@import 'modals/embed-meeting/embed-meeting';
@import 'modals/feedback/feedback';
@import 'modals/invite/info';
@import 'modals/screen-share/share-audio';
@import 'modals/screen-share/share-screen-warning';
@@ -49,6 +53,10 @@ $flagsImagePath: "../images/";
@import 'welcome_page_settings_toolbar';
@import 'toolbars';
@import 'redirect_page';
@import 'components/form-control';
@import 'components/link';
@import 'components/button-control';
@import 'components/input-control';
@import 'components/input-slider';
@import '404';
@import 'policy';
@@ -60,6 +68,7 @@ $flagsImagePath: "../images/";
@import 'filmstrip/vertical_filmstrip';
@import 'filmstrip/vertical_filmstrip_overrides';
@import 'unsupported-browser/main';
@import 'modals/invite/add-people';
@import 'deep-linking/main';
@import 'transcription-subtitles';
@import '_meetings_list.scss';
@@ -70,7 +79,10 @@ $flagsImagePath: "../images/";
@import 'chrome-extension-banner';
@import 'settings-button';
@import 'meter';
@import 'audio-preview';
@import 'video-preview';
@import 'premeeting/main';
@import 'country-picker';
@import 'modals/invite/invite_more';
@import 'modals/security/security';
@import 'e2ee';
@@ -80,5 +92,6 @@ $flagsImagePath: "../images/";
@import 'reactions-menu';
@import 'plan-limit';
@import 'polls';
@import 'notifications';
/* Modules END */

View File

@@ -12,6 +12,24 @@
}
}
/**
* Styling inline dialog errors.
*/
.inline-dialog-error {
margin-top: 16px;
&-text {
color: $dialogErrorText;
margin-bottom: 8px;
text-align: center;
}
&-button {
display: block;
margin: 16px auto 0 auto;
}
}
/**
* Styling shared video dialog errors.
*/

View File

@@ -63,8 +63,3 @@
.desktop-source-preview-image-container {
padding: 10px;
}
.desktop-picker-tabs-container {
width: 65%;
margin-top: 3px;
}

View File

@@ -0,0 +1,148 @@
.device-selection {
.device-selectors {
font-size: 14px;
> div {
display: block;
margin-bottom: 4px;
}
.device-selector-icon {
align-self: center;
color: inherit;
font-size: 20px;
margin-left: 3px;
}
.device-selector-label {
margin-bottom: 1px;
}
/* device-selector-trigger stylings attempt to mimic AtlasKit button */
.device-selector-trigger {
background-color: #0E1624;
border: 1px solid #455166;
border-radius: 5px;
display: flex;
height: 2.3em;
justify-content: space-between;
line-height: 2.3em;
overflow: hidden;
padding: 0 8px;
}
.device-selector-trigger-disabled {
.device-selector-trigger {
color: #a5adba;
cursor: default;
}
}
.device-selector-trigger-text {
overflow: hidden;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
}
}
.device-selection-column {
box-sizing: border-box;
display: inline-block;
vertical-align: top;
&.column-selectors {
margin-left: 15px;
width: 45%;
}
&.column-video {
width: 50%;
}
}
.device-selection-video-container {
border-radius: 3px;
margin-bottom: 5px;
.video-input-preview {
margin-top: 2px;
position: relative;
> video {
border-radius: 3px;
}
.video-input-preview-error {
color: $participantNameColor;
display: none;
left: 0;
position: absolute;
right: 0;
text-align: center;
top: 50%;
}
&.video-preview-has-error {
background: black;
.video-input-preview-error {
display: block;
}
}
.video-input-preview-display {
height: auto;
overflow: hidden;
width: 100%;
}
}
}
.audio-output-preview {
font-size: 14px;
a {
color: #6FB1EA;
cursor: pointer;
text-decoration: none;
}
a:hover {
color: #B3D4FF;
}
}
.audio-input-preview {
background: #1B2638;
border-radius: 5px;
height: 8px;
.audio-input-preview-level {
background: #75B1FF;
border-radius: 5px;
height: 100%;
-webkit-transition: width .1s ease-in-out;
-moz-transition: width .1s ease-in-out;
-o-transition: width .1s ease-in-out;
transition: width .1s ease-in-out;
}
}
}
.device-selection.video-hidden {
display: flex;
flex-direction: column;
width: 100%;
.column-selectors {
width: 100%;
margin-left: 0;
}
.column-video {
order: 1;
width: 100%;
margin-top: 8px;
}
}

View File

@@ -0,0 +1,42 @@
.embed-meeting {
&-dialog {
display: flex;
flex-direction: column;
}
&-copy {
color: white;
font-size: 15px;
margin-left: auto;
margin-top: 16px;
}
&-code {
background: transparent;
border: 1px solid #A4B8D1;
color: white;
font-size: 15px;
height: 165px;
line-height: 24px;
padding: 8px;
width: 100%;
resize: vertical;
}
&-trigger {
display: flex;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 24px;
width: calc(100% - 24px);
height: 24px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
border-radius: 4px;
cursor: pointer;
.jitsi-icon {
margin-right: 20px;
}
}
}

View File

@@ -0,0 +1,104 @@
@-webkit-keyframes shake-rotate {
0% {
-webkit-transform:scale(1) rotate(0deg);
transform:scale(1) rotate(0deg)
}
50% {
-webkit-transform:scale(.8) rotate(-5deg);
transform:scale(.8) rotate(-5deg)
}
to {
-webkit-transform:scale(1) rotate(3deg);
transform:scale(1) rotate(3deg)
}
}
@keyframes shake-rotate {
0% {
-webkit-transform:scale(1) rotate(0deg);
transform:scale(1) rotate(0deg)
}
50% {
-webkit-transform:scale(.8) rotate(-5deg);
transform:scale(.8) rotate(-5deg)
}
to {
-webkit-transform:scale(1) rotate(3deg);
transform:scale(1) rotate(3deg)
}
}
.shake-rotate {
display: inline-block;
-webkit-animation-duration: .4s;
animation-duration: .4s;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-webkit-animation-name: shake-rotate;
animation-name: shake-rotate;
-webkit-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out
}
.feedback-dialog {
margin-bottom: 5px;
.details {
textarea {
min-height: 100px;
}
}
.input-control {
background-color: $feedbackInputBg;
color: $feedbackInputTextColor;
&::-webkit-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $feedbackInputPlaceholderColor;
}
&:-ms-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
}
.rating {
line-height: 1.2;
margin-top: 10px;
text-align: center;
.star-label {
font-size: 14px;
height: 16px;
}
.star-btn {
color: inherit;
cursor: pointer;
display: inline-block;
font-size: 34px;
outline: none;
position: relative;
text-decoration: none;
@include transition(all .2s ease);
&.active,
&:hover,
&.starHover {
color: #36B37E;
};
}
.star-btn:focus,
.star-btn:active {
outline: 1px solid #B8C7E0;
}
}
}

View File

@@ -41,3 +41,10 @@
}
}
}
/**
* Styles errors in the MultiSelectAutocomplete.
*/
.autocomplete-error {
min-width: 260px;
}

View File

@@ -50,21 +50,19 @@
}
.dial-in-numbers-list {
max-width: 334px;
width: 100%;
margin-top: 20px;
font-size: 12px;
line-height: 24px;
border-collapse: collapse;
* {
user-select: text;
}
thead {
text-align: left;
}
tr {
border-bottom: 1px solid #d1dbe8;
}
.flag-cell {
vertical-align: top;
width: 30px;
@@ -93,7 +91,6 @@
font-weight: bold;
list-style: none;
vertical-align: top;
text-align: right;
}
li.toll-free:empty:before {
@@ -122,6 +119,11 @@
margin-top: 40px;
}
.dial-in-conference-name,
.dial-in-conference-pin {
font-size: 18px;
}
.dial-in-conference-description {
margin: 12px;
}

View File

@@ -1,4 +1,57 @@
.invite-more {
&-container {
margin-bottom: 8px;
transition: margin-bottom 0.3s;
&.elevated {
margin-bottom: 36px;
}
}
&-content {
display: flex;
flex-direction: column;
align-items: center;
padding: 16px;
background: rgba(0, 0, 0, 0.7);
border-radius: 8px;
color: #fff;
font-size: 14px;
line-height: 24px;
font-weight: 600;
}
&-header {
max-width: 100%;
margin-bottom: 16px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
&-button {
display: flex;
max-width: 100%;
height: 40px;
box-sizing: border-box;
padding: 8px 16px;
background: #0376DA;
border-radius: 3px;
cursor: pointer;
@media (hover: hover) and (pointer: fine) {
&:hover {
background: #278ADF;
}
}
&-text {
margin-left: 8px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
}
&-dialog {
color: #fff;
font-size: 15px;
@@ -12,6 +65,59 @@
background: #5E6D7A;
}
&.email-container {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 24px;
width: calc(100% - 26px);
height: 22px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
border-radius: 3px;
cursor: pointer;
&.active {
border-radius: 3px 3px 0 0;
}
}
&.invite-buttons {
width: 100%;
text-align: right;
margin-top: 8px;
& > a {
display: inline-block;
height: 24px;
min-width: 48px;
border-radius: 3px;
text-align: center;
text-decoration: none;
cursor: pointer;
}
&-cancel {
margin-right: 16px;
padding: 7px 15px;
background: #2A3A4B;
border: 1px solid #5E6D7A;
}
&-add {
padding: 8px 16px;
background: #0376DA;
}
&.disabled {
& > a {
pointer-events: none;
}
}
}
&.stream {
display: flex;
justify-content: space-between;
@@ -52,3 +158,14 @@
}
}
}
.mobile-browser {
.invite-more-content {
font-size: 16px;
}
.invite-more-button {
height: 48px;
padding: 12px 16px;
}
}

View File

@@ -1,3 +1,7 @@
.share-audio-dialog-container {
max-height: none;
}
.share-audio-dialog {
.share-audio-animation {
width: 100%;

View File

@@ -208,26 +208,3 @@
.lobby-button-margin {
margin-bottom: 16px;
}
.lobby-prejoin-error {
background-color: #E04757;
border-radius: 6px;
box-sizing: border-box;
color: white;
font-size: 12px;
line-height: 16px;
margin-bottom: 16px;
margin-top: -8px;
padding: 4px;
text-align: center;
width: 100%;
}
.lobby-prejoin-input {
margin-bottom: 16px;
width: 100%;
& input {
text-align: center;
}
}

View File

@@ -1,3 +1,4 @@
@import 'lobby';
@import 'premeeting-screens';
@import 'prejoin';
@import 'prejoin-third-party';

View File

@@ -3,7 +3,6 @@ $sidePanelWidth: 300px;
.prejoin-third-party {
flex-direction: column-reverse;
z-index: auto;
align-items: center;
.content {
height: auto;

View File

@@ -0,0 +1,60 @@
.prejoin {
&-input-area {
width: 100%;
}
&-avatar {
margin: 8px auto 16px;
&-name {
color: white;
font-size: 16px;
font-weight: 600;
line-height: 26px;
margin-bottom: 32px;
text-align: center;
}
&-container {
align-items: center;
display: flex;
flex-direction: column;
}
}
&-error {
background-color: #E04757;
border-radius: 6px;
box-sizing: border-box;
color: white;
font-size: 12px;
line-height: 16px;
margin-bottom: 16px;
margin-top: -8px;
padding: 4px;
text-align: center;
width: 100%;
}
}
.prejoin-preview {
&-dropdown-btns {
padding: 8px 0;
}
&-dropdown-container {
position: relative;
width: 100%;
/**
* Override default InlineDialog behaviour, since it does not play nicely with relative widths
*/
& > div:nth-child(2) {
background: #E0E0E0;
padding: 0;
position: absolute !important;
width: 100%;
}
}
}

View File

@@ -1,4 +1,14 @@
.premeeting-screen {
.premeeting-screen {
background: #292929;
bottom: 0;
display: flex;
font-size: 1.3em;
left: 0;
position: absolute;
right: 0;
top: 0;
z-index: $toolbarZ + 2;
.action-btn {
border-radius: 6px;
box-sizing: border-box;
@@ -65,44 +75,139 @@
}
}
#new-toolbox {
bottom: 0;
.content {
align-items: center;
box-sizing: border-box;
display: flex;
flex-direction: column;
flex-shrink: 0;
height: 100%;
margin: 0 30px;
padding: 24px 0 16px;
position: relative;
transition: none;
width: $prejoinDefaultContentWidth;
z-index: $toolbarZ + 2;
.toolbox-content {
margin-bottom: 4px;
}
.toolbox-content-items {
@include ltr;
background: transparent;
box-shadow: none;
&-controls {
align-items: center;
display: flex;
justify-content: space-between;
padding: 8px 0;
}
flex-direction: column;
margin: auto;
width: 100%;
.toolbox-content,
.toolbox-content-wrapper,
.toolbox-content-items {
box-sizing: border-box;
width: auto;
.title {
color: #fff;
font-size: 28px;
font-weight: 600;
letter-spacing: -0.015;
line-height: 36px;
margin-bottom: 16px;
text-align: center;
}
input.field {
background-color: white;
border: none;
outline: none;
border-radius: 6px;
font-size: 14px;
line-height: 20px;
margin-bottom: 16px;
color: #1C2025;
padding: 10px 16px;
text-align: center;
width: 100%;
&.error {
border: 1px solid #E04757;
}
&.focused {
box-shadow: 0px 0px 1px 1.5px black, 0px 0px 1.3px 4px white;
}
}
#new-toolbox {
bottom: 0;
position: relative;
transition: none;
.toolbox-content {
margin-bottom: 4px;
}
.toolbox-content-items {
@include ltr;
background: transparent;
box-shadow: none;
display: flex;
justify-content: space-evenly;
padding: 8px 0;
}
.toolbox-content,
.toolbox-content-wrapper,
.toolbox-content-items {
box-sizing: border-box;
width: 100%;
}
}
}
}
@media (max-width: 720px) {
flex-direction: column-reverse;
.content {
height: auto;
margin: 0 auto;
}
}
// mobile phone landscape
@media (max-height: 420px) {
div.content {
padding: 16px 16px 0 16px;
}
}
@media (max-width: 400px) {
.content {
padding: 16px;
width: 100%;
&-controls {
input.field {
font-size: 16px;
padding: 14px 16px;
}
}
.title {
display: none;
}
}
.device-status-error {
border-radius: 0;
margin: 0 -16px;
}
input.field {
font-size: 16px;
padding: 14px 16px;
}
.action-btn {
font-size: 16px;
margin-bottom: 8px;
padding: 11px 16px;
}
}
input::placeholder {
color: #040404;
}
}
#preview {

View File

@@ -65,6 +65,7 @@ $errorColor: #c61600;
// Popover colors
$popoverFontColor: #ffffff !important;
$popupSliderColor: #0376da;
// Toolbar
$toolbarBackground: rgba(0, 0, 0, 0.5);

View File

@@ -44,7 +44,12 @@ case "$1" in
fi
JVB_SECRET="$RET"
JICOFO_AUTH_USER="focus"
db_get jicofo/jicofo-authuser
if [ -z "$RET" ] ; then
db_input critical jicofo/jicofo-authuser || true
db_go
fi
JICOFO_AUTH_USER="$RET"
db_get jicofo/jicofo-authpassword
if [ -z "$RET" ] ; then

View File

@@ -13,6 +13,12 @@ Type: password
_Description: Jitsi Videobridge Component secret:
The secret used by Jitsi Videobridge to connect to xmpp server as component.
Template: jicofo/jicofo-authuser
Type: string
Default: focus
_Description: Jicofo username:
The jicofo needs an authenticated admin user to connect to xmpp server.
Template: jicofo/jicofo-authpassword
Type: password
_Description: Jicofo user password:

View File

@@ -176,10 +176,9 @@ case "$1" in
fi
# Fixes multi-stream flags to workaround problem with mobile joining a multi-stream call with multi-stream disabled
FIX_MSG="// Temporary backwards compatibility with old mobile clients."
FIX_MSG="//Enables multi-stream, do not delete me"
if ! grep -q "^${FIX_MSG}" $JITSI_MEET_CONFIG; then
echo $FIX_MSG >> $JITSI_MEET_CONFIG
echo "config.flags = config.flags || {};" >> $JITSI_MEET_CONFIG
sed -i "s#config.flags.sourceNameSignaling#${FIX_MSG}\nconfig.flags = config.flags || {};\nconfig.flags.sourceNameSignaling#g" $JITSI_MEET_CONFIG
fi
if ! grep -q "^config.flags.sourceNameSignaling*" $JITSI_MEET_CONFIG; then
echo "config.flags.sourceNameSignaling = true;" >> $JITSI_MEET_CONFIG

View File

@@ -8,6 +8,7 @@ sounds /usr/share/jitsi-meet/
fonts /usr/share/jitsi-meet/
images /usr/share/jitsi-meet/
lang /usr/share/jitsi-meet/
connection_optimization /usr/share/jitsi-meet/
resources/robots.txt /usr/share/jitsi-meet/
resources/*.sh /usr/share/jitsi-meet/scripts/
pwa-worker.js /usr/share/jitsi-meet/

View File

@@ -78,18 +78,13 @@ Component "conference.jitmeet.example.com" "muc"
restrict_room_creation = true
storage = "memory"
modules_enabled = {
"muc_hide_all";
"muc_meeting_id";
"muc_domain_mapper";
"polls";
--"token_verification";
"muc_rate_limit";
"muc_password_whitelist";
}
admins = { "focusUser@auth.jitmeet.example.com" }
muc_password_whitelist = {
"focusUser@auth.jitmeet.example.com"
}
muc_room_locking = false
muc_room_default_public_jids = true
@@ -97,7 +92,6 @@ Component "breakout.jitmeet.example.com" "muc"
restrict_room_creation = true
storage = "memory"
modules_enabled = {
"muc_hide_all";
"muc_meeting_id";
"muc_domain_mapper";
"muc_rate_limit";
@@ -111,7 +105,6 @@ Component "breakout.jitmeet.example.com" "muc"
Component "internal.auth.jitmeet.example.com" "muc"
storage = "memory"
modules_enabled = {
"muc_hide_all";
"ping";
}
admins = { "focusUser@auth.jitmeet.example.com", "jvb@auth.jitmeet.example.com" }
@@ -146,7 +139,6 @@ Component "lobby.jitmeet.example.com" "muc"
muc_room_locking = false
muc_room_default_public_jids = true
modules_enabled = {
"muc_hide_all";
"muc_rate_limit";
"polls";
}

View File

@@ -93,7 +93,7 @@ server {
}
# ensure all static content can always be found first
location ~ ^/(libs|css|static|images|fonts|lang|sounds|.well-known)/(.*)$
location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$
{
add_header 'Access-Control-Allow-Origin' '*';
alias /usr/share/jitsi-meet/$1/$2;
@@ -157,13 +157,6 @@ server {
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
}
# Matches /(TENANT)/pwa-worker.js or /(TENANT)/manifest.json to rewrite to / and look for file
location ~ ^/([^/?&:'"]+)/(pwa-worker.js|manifest.json)$ {
set $subdomain "$1.";
set $subdir "$1/";
rewrite ^/([^/?&:'"]+)/(pwa-worker.js|manifest.json)$ /$2;
}
# BOSH for subdomains
location ~ ^/([^/?&:'"]+)/http-bind {
set $subdomain "$1.";

18
globals.d.ts vendored
View File

@@ -10,6 +10,12 @@ declare global {
API: any;
conference: any;
debugLogs: any;
keyboardshortcut: {
registerShortcut: Function;
unregisterShortcut: Function;
openDialog: Function;
enable: Function;
}
};
const interfaceConfig: any;
@@ -19,21 +25,9 @@ declare global {
interfaceConfig?: any;
JitsiMeetJS?: any;
JitsiMeetElectron?: any;
// selenium tests handler
_sharedVideoPlayer: any;
}
interface Document {
mozCancelFullScreen?: Function;
webkitExitFullscreen?: Function;
}
const config: IConfig;
const JitsiMeetJS: any;
interface HTMLMediaElement {
setSinkId: (id: string) => Promise<undefined>;
stop: () => void;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -13,19 +13,10 @@
<link rel="manifest" id="manifest-placeholder">
<script>
function contextRoot(pathname) {
const contextRootEndIndex = pathname.lastIndexOf('/');
return (
contextRootEndIndex === -1
? '/'
: pathname.substring(0, contextRootEndIndex + 1)
);
}
window.EXCALIDRAW_ASSET_PATH = 'libs/';
// Dynamically generate the manifest location URL. It must be served from the document origin, and we may have
// the base pointing to the CDN. This way we can generate a full URL which will bypass the base.
document.querySelector('#manifest-placeholder').setAttribute('href', window.location.origin + contextRoot(window.location.pathname) + 'manifest.json');
document.querySelector('#manifest-placeholder').setAttribute('href', window.location.origin + '/manifest.json');
document.addEventListener('DOMContentLoaded', () => {
if (!JitsiMeetJS.app) {
@@ -49,7 +40,7 @@
if (shouldRegisterWorker) {
navigator.serviceWorker
.register(window.location.origin + contextRoot(window.location.pathname) + 'pwa-worker.js')
.register(window.location.origin + '/pwa-worker.js')
.then(reg => {
console.log('Service worker registered.', reg);
})
@@ -191,6 +182,8 @@
'error', loadErrHandler, true /* capture phase type of listener */);
</script>
<script><!--#include virtual="/config.js" --></script><!-- adapt to your needs, i.e. set hosts and bosh path -->
<!--#include virtual="connection_optimization/connection_optimization.html" -->
<script src="libs/do_external_connect.min.js?v=1"></script>
<script><!--#include virtual="/interface_config.js" --></script>
<script src="libs/lib-jitsi-meet.min.js?v=139"></script>
<script src="libs/app.bundle.min.js?v=139"></script>

View File

@@ -70,8 +70,7 @@ var interfaceConfig = {
ENABLE_DIAL_OUT: true,
// DEPRECATED. Animation no longer supported.
// ENABLE_FEEDBACK_ANIMATION: false,
ENABLE_FEEDBACK_ANIMATION: false, // Enables feedback star animation.
FILM_STRIP_MAX_HEIGHT: 120,
@@ -196,6 +195,8 @@ var interfaceConfig = {
*/
// MOBILE_DOWNLOAD_LINK_ANDROID: 'https://play.google.com/store/apps/details?id=org.jitsi.meet',
// SHOW_DEEP_LINKING_IMAGE: false,
/**
* Specify mobile app scheme for opening the app from the mobile browser.
*/

View File

@@ -42,7 +42,7 @@ target 'JitsiMeetSDK' do
pod 'CocoaLumberjack', '3.7.2'
pod 'ObjectiveDropboxOfficial', '6.2.3'
pod 'JitsiWebRTC', '~> 111.0.0'
pod 'JitsiWebRTC', '~> 106.0.0'
end
target 'JitsiMeetSDKLite' do

View File

@@ -3,25 +3,24 @@ PODS:
- amplitude-react-native (2.7.0):
- Amplitude (= 8.7.1)
- React-Core
- AppAuth (1.6.1):
- AppAuth/Core (= 1.6.1)
- AppAuth/ExternalUserAgent (= 1.6.1)
- AppAuth/Core (1.6.1)
- AppAuth/ExternalUserAgent (1.6.1):
- AppAuth/Core
- AppAuth (1.4.0):
- AppAuth/Core (= 1.4.0)
- AppAuth/ExternalUserAgent (= 1.4.0)
- AppAuth/Core (1.4.0)
- AppAuth/ExternalUserAgent (1.4.0)
- boost (1.76.0)
- CocoaLumberjack (3.7.2):
- CocoaLumberjack/Core (= 3.7.2)
- CocoaLumberjack/Core (3.7.2)
- DoubleConversion (1.1.6)
- FBLazyVector (0.68.6)
- FBReactNativeSpec (0.68.6):
- FBLazyVector (0.68.5)
- FBReactNativeSpec (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.6)
- RCTTypeSafety (= 0.68.6)
- React-Core (= 0.68.6)
- React-jsi (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- RCTRequired (= 0.68.5)
- RCTTypeSafety (= 0.68.5)
- React-Core (= 0.68.5)
- React-jsi (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- Firebase/Analytics (8.15.0):
- Firebase/Core
- Firebase/Core (8.15.0):
@@ -103,56 +102,56 @@ PODS:
- GoogleUtilities/Network (~> 7.7)
- "GoogleUtilities/NSData+zlib (~> 7.7)"
- nanopb (~> 2.30908.0)
- GoogleDataTransport (9.2.2):
- GoogleDataTransport (9.1.4):
- GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleSignIn (6.2.4):
- AppAuth (~> 1.5)
- GTMAppAuth (~> 1.3)
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
- GoogleUtilities/AppDelegateSwizzler (7.11.1):
- GoogleSignIn (6.0.2):
- AppAuth (~> 1.4)
- GTMAppAuth (~> 1.0)
- GTMSessionFetcher/Core (~> 1.1)
- GoogleUtilities/AppDelegateSwizzler (7.7.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (7.11.1):
- GoogleUtilities/Environment (7.7.0):
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.11.1):
- GoogleUtilities/Logger (7.7.0):
- GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (7.11.1):
- GoogleUtilities/MethodSwizzler (7.7.0):
- GoogleUtilities/Logger
- GoogleUtilities/Network (7.11.1):
- GoogleUtilities/Network (7.7.0):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.11.1)"
- GoogleUtilities/Reachability (7.11.1):
- "GoogleUtilities/NSData+zlib (7.7.0)"
- GoogleUtilities/Reachability (7.7.0):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.11.1):
- GoogleUtilities/UserDefaults (7.7.0):
- GoogleUtilities/Logger
- GTMAppAuth (1.3.1):
- AppAuth/Core (~> 1.6)
- GTMSessionFetcher/Core (< 3.0, >= 1.5)
- GTMSessionFetcher/Core (2.3.0)
- JitsiWebRTC (111.0.1)
- libwebp (1.2.4):
- libwebp/demux (= 1.2.4)
- libwebp/mux (= 1.2.4)
- libwebp/webp (= 1.2.4)
- libwebp/demux (1.2.4):
- GTMAppAuth (1.2.2):
- AppAuth/Core (~> 1.4)
- GTMSessionFetcher/Core (~> 1.5)
- GTMSessionFetcher/Core (1.7.0)
- JitsiWebRTC (106.0.0)
- libwebp (1.2.1):
- libwebp/demux (= 1.2.1)
- libwebp/mux (= 1.2.1)
- libwebp/webp (= 1.2.1)
- libwebp/demux (1.2.1):
- libwebp/webp
- libwebp/mux (1.2.4):
- libwebp/mux (1.2.1):
- libwebp/demux
- libwebp/webp (1.2.4)
- libwebp/webp (1.2.1)
- nanopb (2.30908.0):
- nanopb/decode (= 2.30908.0)
- nanopb/encode (= 2.30908.0)
- nanopb/decode (2.30908.0)
- nanopb/encode (2.30908.0)
- ObjectiveDropboxOfficial (6.2.3)
- PromisesObjC (2.2.0)
- PromisesSwift (2.2.0):
- PromisesObjC (= 2.2.0)
- PromisesObjC (2.1.1)
- PromisesSwift (2.1.1):
- PromisesObjC (= 2.1.1)
- RCT-Folly (2021.06.28.00-v2):
- boost
- DoubleConversion
@@ -164,201 +163,201 @@ PODS:
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- RCTRequired (0.68.6)
- RCTTypeSafety (0.68.6):
- FBLazyVector (= 0.68.6)
- RCTRequired (0.68.5)
- RCTTypeSafety (0.68.5):
- FBLazyVector (= 0.68.5)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.6)
- React-Core (= 0.68.6)
- React (0.68.6):
- React-Core (= 0.68.6)
- React-Core/DevSupport (= 0.68.6)
- React-Core/RCTWebSocket (= 0.68.6)
- React-RCTActionSheet (= 0.68.6)
- React-RCTAnimation (= 0.68.6)
- React-RCTBlob (= 0.68.6)
- React-RCTImage (= 0.68.6)
- React-RCTLinking (= 0.68.6)
- React-RCTNetwork (= 0.68.6)
- React-RCTSettings (= 0.68.6)
- React-RCTText (= 0.68.6)
- React-RCTVibration (= 0.68.6)
- React-callinvoker (0.68.6)
- React-Codegen (0.68.6):
- FBReactNativeSpec (= 0.68.6)
- RCTRequired (= 0.68.5)
- React-Core (= 0.68.5)
- React (0.68.5):
- React-Core (= 0.68.5)
- React-Core/DevSupport (= 0.68.5)
- React-Core/RCTWebSocket (= 0.68.5)
- React-RCTActionSheet (= 0.68.5)
- React-RCTAnimation (= 0.68.5)
- React-RCTBlob (= 0.68.5)
- React-RCTImage (= 0.68.5)
- React-RCTLinking (= 0.68.5)
- React-RCTNetwork (= 0.68.5)
- React-RCTSettings (= 0.68.5)
- React-RCTText (= 0.68.5)
- React-RCTVibration (= 0.68.5)
- React-callinvoker (0.68.5)
- React-Codegen (0.68.5):
- FBReactNativeSpec (= 0.68.5)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.68.6)
- RCTTypeSafety (= 0.68.6)
- React-Core (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-Core (0.68.6):
- RCTRequired (= 0.68.5)
- RCTTypeSafety (= 0.68.5)
- React-Core (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-Core (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.6)
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-Core/Default (= 0.68.5)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/CoreModulesHeaders (0.68.6):
- React-Core/CoreModulesHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/Default (0.68.6):
- React-Core/Default (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/DevSupport (0.68.6):
- React-Core/DevSupport (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.6)
- React-Core/RCTWebSocket (= 0.68.6)
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-jsinspector (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-Core/Default (= 0.68.5)
- React-Core/RCTWebSocket (= 0.68.5)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-jsinspector (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTActionSheetHeaders (0.68.6):
- React-Core/RCTActionSheetHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTAnimationHeaders (0.68.6):
- React-Core/RCTAnimationHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTBlobHeaders (0.68.6):
- React-Core/RCTBlobHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTImageHeaders (0.68.6):
- React-Core/RCTImageHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTLinkingHeaders (0.68.6):
- React-Core/RCTLinkingHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTNetworkHeaders (0.68.6):
- React-Core/RCTNetworkHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTSettingsHeaders (0.68.6):
- React-Core/RCTSettingsHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTTextHeaders (0.68.6):
- React-Core/RCTTextHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTVibrationHeaders (0.68.6):
- React-Core/RCTVibrationHeaders (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-Core/RCTWebSocket (0.68.6):
- React-Core/RCTWebSocket (0.68.5):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.68.6)
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsiexecutor (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-Core/Default (= 0.68.5)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsiexecutor (= 0.68.5)
- React-perflogger (= 0.68.5)
- Yoga
- React-CoreModules (0.68.6):
- React-CoreModules (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.6)
- React-Codegen (= 0.68.6)
- React-Core/CoreModulesHeaders (= 0.68.6)
- React-jsi (= 0.68.6)
- React-RCTImage (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-cxxreact (0.68.6):
- RCTTypeSafety (= 0.68.5)
- React-Codegen (= 0.68.5)
- React-Core/CoreModulesHeaders (= 0.68.5)
- React-jsi (= 0.68.5)
- React-RCTImage (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-cxxreact (0.68.5):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.68.6)
- React-jsi (= 0.68.6)
- React-jsinspector (= 0.68.6)
- React-logger (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-runtimeexecutor (= 0.68.6)
- React-jsi (0.68.6):
- React-callinvoker (= 0.68.5)
- React-jsi (= 0.68.5)
- React-jsinspector (= 0.68.5)
- React-logger (= 0.68.5)
- React-perflogger (= 0.68.5)
- React-runtimeexecutor (= 0.68.5)
- React-jsi (0.68.5):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsi/Default (= 0.68.6)
- React-jsi/Default (0.68.6):
- React-jsi/Default (= 0.68.5)
- React-jsi/Default (0.68.5):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsiexecutor (0.68.6):
- React-jsiexecutor (0.68.5):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-jsinspector (0.68.6)
- React-logger (0.68.6):
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-perflogger (= 0.68.5)
- React-jsinspector (0.68.5)
- React-logger (0.68.5):
- glog
- react-native-background-timer (2.4.1):
- React-Core
@@ -374,12 +373,8 @@ PODS:
- React-Core
- react-native-performance (2.1.0):
- React-Core
- react-native-safe-area-context (4.4.1):
- RCT-Folly
- RCTRequired
- RCTTypeSafety
- react-native-safe-area-context (3.3.2):
- React-Core
- ReactCommon/turbomodule/core
- react-native-slider (4.1.12):
- React-Core
- react-native-splash-screen (3.3.0):
@@ -390,90 +385,92 @@ PODS:
- react-native-video/Video (6.0.0-alpha.1):
- PromisesSwift
- React-Core
- react-native-webrtc (111.0.0):
- JitsiWebRTC (~> 111.0.0)
- react-native-webrtc (106.0.1):
- JitsiWebRTC (~> 106.0.0)
- React-Core
- react-native-webview (11.15.1):
- React-Core
- React-perflogger (0.68.6)
- React-RCTActionSheet (0.68.6):
- React-Core/RCTActionSheetHeaders (= 0.68.6)
- React-RCTAnimation (0.68.6):
- React-perflogger (0.68.5)
- React-RCTActionSheet (0.68.5):
- React-Core/RCTActionSheetHeaders (= 0.68.5)
- React-RCTAnimation (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.6)
- React-Codegen (= 0.68.6)
- React-Core/RCTAnimationHeaders (= 0.68.6)
- React-jsi (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-RCTBlob (0.68.6):
- RCTTypeSafety (= 0.68.5)
- React-Codegen (= 0.68.5)
- React-Core/RCTAnimationHeaders (= 0.68.5)
- React-jsi (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-RCTBlob (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Codegen (= 0.68.6)
- React-Core/RCTBlobHeaders (= 0.68.6)
- React-Core/RCTWebSocket (= 0.68.6)
- React-jsi (= 0.68.6)
- React-RCTNetwork (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-RCTImage (0.68.6):
- React-Codegen (= 0.68.5)
- React-Core/RCTBlobHeaders (= 0.68.5)
- React-Core/RCTWebSocket (= 0.68.5)
- React-jsi (= 0.68.5)
- React-RCTNetwork (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-RCTImage (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.6)
- React-Codegen (= 0.68.6)
- React-Core/RCTImageHeaders (= 0.68.6)
- React-jsi (= 0.68.6)
- React-RCTNetwork (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-RCTLinking (0.68.6):
- React-Codegen (= 0.68.6)
- React-Core/RCTLinkingHeaders (= 0.68.6)
- React-jsi (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-RCTNetwork (0.68.6):
- RCTTypeSafety (= 0.68.5)
- React-Codegen (= 0.68.5)
- React-Core/RCTImageHeaders (= 0.68.5)
- React-jsi (= 0.68.5)
- React-RCTNetwork (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-RCTLinking (0.68.5):
- React-Codegen (= 0.68.5)
- React-Core/RCTLinkingHeaders (= 0.68.5)
- React-jsi (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-RCTNetwork (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.6)
- React-Codegen (= 0.68.6)
- React-Core/RCTNetworkHeaders (= 0.68.6)
- React-jsi (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-RCTSettings (0.68.6):
- RCTTypeSafety (= 0.68.5)
- React-Codegen (= 0.68.5)
- React-Core/RCTNetworkHeaders (= 0.68.5)
- React-jsi (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-RCTSettings (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.68.6)
- React-Codegen (= 0.68.6)
- React-Core/RCTSettingsHeaders (= 0.68.6)
- React-jsi (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-RCTText (0.68.6):
- React-Core/RCTTextHeaders (= 0.68.6)
- React-RCTVibration (0.68.6):
- RCTTypeSafety (= 0.68.5)
- React-Codegen (= 0.68.5)
- React-Core/RCTSettingsHeaders (= 0.68.5)
- React-jsi (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-RCTText (0.68.5):
- React-Core/RCTTextHeaders (= 0.68.5)
- React-RCTVibration (0.68.5):
- RCT-Folly (= 2021.06.28.00-v2)
- React-Codegen (= 0.68.6)
- React-Core/RCTVibrationHeaders (= 0.68.6)
- React-jsi (= 0.68.6)
- ReactCommon/turbomodule/core (= 0.68.6)
- React-runtimeexecutor (0.68.6):
- React-jsi (= 0.68.6)
- ReactCommon/turbomodule/core (0.68.6):
- React-Codegen (= 0.68.5)
- React-Core/RCTVibrationHeaders (= 0.68.5)
- React-jsi (= 0.68.5)
- ReactCommon/turbomodule/core (= 0.68.5)
- React-runtimeexecutor (0.68.5):
- React-jsi (= 0.68.5)
- ReactCommon/turbomodule/core (0.68.5):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.68.6)
- React-Core (= 0.68.6)
- React-cxxreact (= 0.68.6)
- React-jsi (= 0.68.6)
- React-logger (= 0.68.6)
- React-perflogger (= 0.68.6)
- React-callinvoker (= 0.68.5)
- React-Core (= 0.68.5)
- React-cxxreact (= 0.68.5)
- React-jsi (= 0.68.5)
- React-logger (= 0.68.5)
- React-perflogger (= 0.68.5)
- RNCalendarEvents (2.2.0):
- React
- RNCAsyncStorage (1.17.3):
- React-Core
- RNCClipboard (1.5.1):
- React-Core
- RNCMaskedView (0.2.6):
- React-Core
- RNDefaultPreference (1.4.4):
- React-Core
- RNDeviceInfo (8.4.8):
- React-Core
- RNGestureHandler (2.9.0):
- RNGestureHandler (2.1.0):
- React-Core
- RNGoogleSignin (9.0.2):
- GoogleSignIn (~> 6.2)
- RNGoogleSignin (7.0.4):
- GoogleSignIn (~> 6.0.0)
- React-Core
- RNScreens (3.13.1):
- React-Core
@@ -501,7 +498,7 @@ DEPENDENCIES:
- Firebase/DynamicLinks (~> 8.0)
- "giphy-react-native-sdk (from `../node_modules/@giphy/react-native-sdk`)"
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
- JitsiWebRTC (~> 111.0.0)
- JitsiWebRTC (~> 106.0.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`)
@@ -546,6 +543,7 @@ DEPENDENCIES:
- RNCalendarEvents (from `../node_modules/react-native-calendar-events`)
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
- "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)"
- RNDefaultPreference (from `../node_modules/react-native-default-preference`)
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
@@ -680,6 +678,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-async-storage/async-storage"
RNCClipboard:
:path: "../node_modules/@react-native-community/clipboard"
RNCMaskedView:
:path: "../node_modules/@react-native-masked-view/masked-view"
RNDefaultPreference:
:path: "../node_modules/react-native-default-preference"
RNDeviceInfo:
@@ -702,12 +702,12 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
Amplitude: 834c7332dfb9640a751e21c13efb22a07c0c12d4
amplitude-react-native: 0ed8cab759aafaa94961b82122bf56297da607ad
AppAuth: e48b432bb4ba88b10cb2bcc50d7f3af21e78b9c2
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
boost: a7c83b31436843459a1961bfd74b96033dc77234
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
FBLazyVector: 74b042924fe14da854ac4e87cefc417f583b22b1
FBReactNativeSpec: cc0037b9914b9b1d92a15f179bc3e2e2c7cc0c6f
FBLazyVector: 2b47ff52037bd9ae07cc9b051c9975797814b736
FBReactNativeSpec: 0e0d384ef17a33b385f13f0c7f97702c7cd17858
Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d
FirebaseAnalytics: 7761cbadb00a717d8d0939363eb46041526474fa
FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1
@@ -720,30 +720,30 @@ SPEC CHECKSUMS:
giphy-react-native-sdk: 7abccf2b52123a0f30ce99da895ab6288023680c
glog: 476ee3e89abb49e07f822b48323c51c57124b572
GoogleAppMeasurement: 4c19f031220c72464d460c9daa1fb5d1acce958e
GoogleDataTransport: 8378d1fa8ac49753ea6ce70d65a7cb70ce5f66e6
GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749
GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
JitsiWebRTC: 9619c1f71cc16eeca76df68aa2d213c6d63274a8
libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
GoogleDataTransport: 5fffe35792f8b96ec8d6775f5eccd83c998d5a3b
GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
JitsiWebRTC: f441eb0e2d67f0588bf24e21c5162e97342714fb
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
PromisesSwift: 99fddfe4a0ec88a56486644c0da106694c92a604
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
RCTRequired: 92cbd71369a2de6add25fd2403ac39838f1b694f
RCTTypeSafety: 494e8af41d7410ed0b877210859ee3984f37e6b4
React: 59989499c0e8926a90d34a9ae0bdb2d1b5b53406
React-callinvoker: 8187db1c71cf2c1c66e8f7328a0cf77a2b255d94
React-Codegen: e806dc2f10ddae645d855cb58acf73ce41eb8ea5
React-Core: fc7339b493e368ae079850a4721bdf716cf3dba2
React-CoreModules: 2f54f6bbf2764044379332089fcbdaf79197021e
React-cxxreact: ee119270006794976e1ab271f0111a5a88b16bcf
React-jsi: ec691b2a475d13b1fd39f697145a526eeeb6661c
React-jsiexecutor: b4ce4afc5dd9c8fdd2ac59049ccf420f288ecef7
React-jsinspector: e396d5e56af08fce39f50571726b68a40f1e302d
React-logger: cec52b3f8fb0be0d47b2cb75dec69de60f2de3b6
RCTRequired: 0f06b6068f530932d10e1a01a5352fad4eaacb74
RCTTypeSafety: b0ee81f10ef1b7d977605a2b266823dabd565e65
React: 3becd12bd51ea8a43bdde7e09d0f40fba7820e03
React-callinvoker: 11abfff50e6bf7a55b3a90b4dc2187f71f224593
React-Codegen: f8946ce0768fb8e92e092e30944489c4b2955b2d
React-Core: 203cdb6ee2657b198d97d41031c249161060e6ca
React-CoreModules: 6eb0c06a4a223fde2cb6a8d0f44f58b67e808942
React-cxxreact: afb0c6c07d19adbd850747fedeac20c6832d40b9
React-jsi: 14d37a6db2af2c1a49f6f5c2e4ee667c364ae45c
React-jsiexecutor: 45c0496ca8cef6b02d9fa0274c25cf458fe91a56
React-jsinspector: eb202e43b3879aba9a14f3f65788aec85d4e1ea9
React-logger: 98f663b292a60967ebbc6d803ae96c1381183b6d
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
@@ -751,37 +751,38 @@ SPEC CHECKSUMS:
react-native-orientation-locker: 851f6510d8046ea2f14aa169b1e01fcd309a94ba
react-native-pager-view: 3ee7d4c7697fb3ef788346e834a60cca97ed8540
react-native-performance: f4b6604a9d5a8a7407e34a82fab6c641d9a3ec12
react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
react-native-safe-area-context: 584dc04881deb49474363f3be89e4ca0e854c057
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
react-native-video: bb6f12a7198db53b261fefb5d609dc77417acc8b
react-native-webrtc: a9d4d8ef61adb634e006ffd956c494ad8318d95c
react-native-webrtc: aa3a0fdc4c410813892b97d18947f223d3e50f0c
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
React-perflogger: 46620fc6d1c3157b60ed28434e08f7fd7f3f3353
React-RCTActionSheet: b1f7e72a0ba760ec684df335c61f730b5179f5ff
React-RCTAnimation: d73b62d42867ab608dfb10e100d8b91106275b18
React-RCTBlob: b5f59693721d50967c35598158e6ca01b474c7de
React-RCTImage: 37cf34d0c2fbef2e0278d42a7c5e8ea06a9fed6b
React-RCTLinking: a11dced20019cf1c2ec7fd120f18b08f2851f79e
React-RCTNetwork: ba097188e5eac42e070029e7cedd9b978940833a
React-RCTSettings: 147073708a1c1bde521cf3af045a675682772726
React-RCTText: 23f76ebfb2717d181476432e5ecf1c6c4a104c5e
React-RCTVibration: be5f18ffc644f96f904e0e673ab639ca5d673ee8
React-runtimeexecutor: d5498cfb7059bf8397b6416db4777843f3f4c1e7
ReactCommon: 1974dab5108c79b40199f12a4833d2499b9f6303
React-perflogger: 0458a87ea9a7342079e7a31b0d32b3734fb8415f
React-RCTActionSheet: 22538001ea2926dea001111dd2846c13a0730bc9
React-RCTAnimation: 732ce66878d4aa151d56a0d142b1105aa12fd313
React-RCTBlob: 9cb9e3e9a41d27be34aaf89b0e0f52c7ca415d57
React-RCTImage: 6bd16627eb9c4bb79903c4cdec7c551266ee1a5b
React-RCTLinking: e9edfc8919c8fa9a3f3c7b34362811f58a2ebba4
React-RCTNetwork: 880eccd21bbe2660a0b63da5ccba75c46eceeaa6
React-RCTSettings: 8c85d8188c97d6c6bd470af6631a6c4555b79bb3
React-RCTText: bbd275ee287730c5acbab1aadc0db39c25c5c64e
React-RCTVibration: 9819a3bf6230e4b2a99877c21268b0b2416157a1
React-runtimeexecutor: b1f1995089b90696dbc2a7ffe0059a80db5c8eb1
ReactCommon: 149e2c0acab9bac61378da0db5b2880a1b5ff59b
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
RNCAsyncStorage: 005c0e2f09575360f142d0d1f1f15e4ec575b1af
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
RNDeviceInfo: 0400a6d0c94186d1120c3cbd97b23abc022187a9
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
RNGoogleSignin: 22e468a9474dbcb8618d8847205ad4f0b2575d13
RNGestureHandler: e5c7cab5f214503dcefd6b2b0cefb050e1f51c4a
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
RNScreens: 40a2cb40a02a609938137a1e0acfbf8fc9eebf19
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
RNSVG: f3b60aeeaa81960e2e0536c3a9eef50b667ef3a9
RNWatch: dae6c858a2051dbdcfb00b9a86cf4d90400263b4
Yoga: 7929b92b1828675c1bebeb114dae8cb8fa7ef6a3
Yoga: c4d61225a466f250c35c1ee78d2d0b3d41fe661c
PODFILE CHECKSUM: d9116cb59cd7e921956e45de7cbbd75bef3862c1
PODFILE CHECKSUM: e671cdcdb80fab67e305861c36bfae8ed5a5b0ef
COCOAPODS: 1.11.3

View File

@@ -39,11 +39,6 @@
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
[builder setFeatureFlag:@"ios.recording.enabled" withBoolean:YES];
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
#if TARGET_IPHONE_SIMULATOR
// CallKit has started to create problems starting with the iOS 16 simulator.
// Disable it since it never worked in the simulator anyway.
[builder setFeatureFlag:@"call-integration.enabled" withBoolean:NO];
#endif
}];
[jitsiMeet application:application didFinishLaunchingWithOptions:launchOptions];

View File

@@ -15,7 +15,7 @@
*/
#import <Intents/Intents.h>
#import <WebRTC/RTCLogging.h>
#import "Orientation.h"
#import "JitsiMeet+Private.h"
@@ -26,8 +26,6 @@
#import "RNSplashScreen.h"
#import "ScheenshareEventEmiter.h"
#import <react-native-webrtc/WebRTCModuleOptions.h>
#if !defined(JITSI_MEET_SDK_LITE)
#import <RNGoogleSignin/RNGoogleSignin.h>
#import "Dropbox.h"
@@ -54,12 +52,6 @@
- (instancetype)init {
if (self = [super init]) {
#if 0
// Initialize WebRTC options.
WebRTCModuleOptions *options = [WebRTCModuleOptions sharedInstance];
options.loggingSeverity = RTCLoggingSeverityInfo;
#endif
// Initialize the one and only bridge for interfacing with React Native.
_bridgeWrapper = [[RCTBridgeWrapper alloc] init];
@@ -71,6 +63,11 @@
// Register a log handler for React.
registerReactLogHandler();
#if 0
// Enable WebRTC logs
RTCSetMinDebugLogLevel(RTCLoggingSeverityInfo);
#endif
}
return self;

View File

@@ -40,10 +40,19 @@ static NSString *const PiPEnabledFeatureFlag = @"pip.enabled";
#pragma mark Initializers
- (instancetype)init {
self = [super init];
if (self) {
[self initWithXXX];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
[self doInitialize];
[self initWithXXX];
}
return self;
@@ -52,7 +61,7 @@ static NSString *const PiPEnabledFeatureFlag = @"pip.enabled";
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self doInitialize];
[self initWithXXX];
}
return self;
@@ -62,9 +71,9 @@ static NSString *const PiPEnabledFeatureFlag = @"pip.enabled";
* Internal initialization:
*
* - sets the background color
* - registers necessary observers
* - initializes the external API scope
*/
- (void)doInitialize {
- (void)initWithXXX {
// Set a background color which is in accord with the JavaScript and Android
// parts of the application and causes less perceived visual flicker than
// the default background color.

View File

@@ -7,7 +7,6 @@
"cs": "Čeština",
"da": "Dansk",
"de": "Deutsch",
"dsb": "Dolnoserbšćina",
"el": "Ελληνικά",
"en": "English",
"enGB": "English (United Kingdom)",

View File

@@ -58,7 +58,7 @@
"today": "Днес"
},
"chat": {
"error": "Грешка: вашето съобщение не бе изпратено, поради: {{error}}",
"error": "Грешка: вашето съобщение не бе изпратено, пради: {{error}}",
"fieldPlaceHolder": "Въведете съобщението",
"messageTo": "Лично съобщение до {{recipient}}",
"messagebox": "Въведете съобщение",

View File

@@ -11,6 +11,7 @@
"defaultEmail": "La vostra adreça de correu electrònic predeterminada",
"disabled": "No podeu convidar-hi persones.",
"failedToAdd": "No s'han pogut afegir-hi participants",
"footerText": "La marcació està desactivada.",
"googleEmail": "Correu de Google",
"inviteMoreHeader": "Sou l'única persona en la reunió",
"inviteMoreMailSubject": "Entra a la reunió {{appName}}",
@@ -96,7 +97,6 @@
"messageAccessibleTitleMe": "jo dic:",
"messageTo": "Missatge privat per a {{recipient}}",
"messagebox": "Escriviu un missatge",
"newMessages": "Missatges nous",
"nickname": {
"popover": "Trieu un sobrenom",
"title": "Introduïu un sobrenom per a usar el xat",
@@ -116,7 +116,6 @@
},
"chromeExtensionBanner": {
"buttonText": "Instal·la l'extensió de Chrome",
"buttonTextEdge": "Instal·la l'extensió d'Edge",
"close": "Tanca",
"dontShowAgain": "No m'ho mostris més",
"installExtensionText": "Instal·la l'extensió per a la integració amb Google Calendar i Office 365"
@@ -207,9 +206,6 @@
"selectADevice": "Seleccioneu un aparell",
"testAudio": "Reprodueix un so de prova"
},
"dialIn": {
"screenTitle": "Resum de la trucada"
},
"dialOut": {
"statusMessage": "ara és {{status}}"
},
@@ -271,7 +267,6 @@
"gracefulShutdown": "El nostre servei ara mateix és en manteniment. Torneu-ho a intentar més tard.",
"grantModeratorDialog": "Esteu segur que voleu concedir drets de moderador a {{participantName}}?",
"grantModeratorTitle": "Concedeix drets de moderador",
"hide": "Amaga",
"hideShareAudioHelper": "No tornis a mostrar aquest diàleg",
"incorrectPassword": "El nom o la contrasenya no són correctes",
"incorrectRoomLockPassword": "La contrasenya no és correcta",
@@ -286,6 +281,7 @@
"linkMeetingTitle": "Enllaça la reunió a Salesforce",
"liveStreaming": "Transmissió en directe",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No és possible mentre l'enregistrament estigui actiu",
"liveStreamingDisabledTooltip": "No es pot iniciar la transmissió en directe.",
"localUserControls": "Controls locals d'usuari",
"lockMessage": "No s'ha pogut blocar la conferència.",
"lockRoom": "Afegeix una $t(lockRoomPassword) de reunió",
@@ -340,6 +336,7 @@
"recentlyUsedObjects": "Els objectes que heu usat recentment",
"recording": "Enregistrament",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No és possible mentre hi ha una transmissió en directe activa",
"recordingDisabledTooltip": "No es pot enregistrar.",
"rejoinNow": "Torna a entrar ara",
"remoteControlAllowedMessage": "{{user}} ha acceptat la petició de control remot!",
"remoteControlDeniedMessage": "{{user}} ha rebutjat la petició de control remot!",
@@ -389,7 +386,6 @@
"shareYourScreenDisabled": "S'ha inhabilitat la compartició de pantalla.",
"sharedVideoDialogError": "Error: URL no vàlid",
"sharedVideoLinkPlaceholder": "Enllaç de YouTube o enllaç directe del vídeo",
"show": "Mostra",
"start": "Inicia",
"startLiveStreaming": "Inicia la transmissió en directe",
"startRecording": "Inicia l'enregistrament",
@@ -480,11 +476,9 @@
"noRoom": "No s'ha indicat cap sala a què marcar.",
"numbers": "Números de marcatge",
"password": "$t(lockRoomPasswordUppercase): ",
"reachedLimit": "Heu arribat al límit del vostre pla.",
"sip": "Adreça SIP",
"title": "Comparteix",
"tooltip": "Comparteix l'enllaç i la informació de marcatge d'aquesta reunió",
"upgradeOptions": "Vegeu les opcions d'actualització"
"tooltip": "Comparteix l'enllaç i la informació de marcatge d'aquesta reunió"
},
"inlineDialogFailure": {
"msg": "Vam ensopegar una mica.",
@@ -519,10 +513,6 @@
"toggleShortcuts": "Mostra o amaga les dreceres de teclat",
"videoMute": "Inicia o atura la càmera"
},
"largeVideo": {
"screenIsShared": "Esteu compartint la pantalla",
"showMeWhatImSharing": "Mostra'm què estic compartint"
},
"liveStreaming": {
"busy": "Treballem per a alliberar recursos de transmissió. Torneu-ho a intentar en uns minuts.",
"busyTitle": "Ara mateix, tots els reproductors són ocupats",
@@ -626,7 +616,6 @@
"no": "No",
"participant": "Participant",
"participantStats": "Estadístiques del participant",
"selectTabTitle": "🎥 Trieu aquesta pestanya per a enregistrar",
"sessionToken": "Identificador de la sessió",
"start": "Inicia l'enregistrament",
"stop": "Atura l'enregistrament",
@@ -649,8 +638,6 @@
"connectedOneMember": "{{name}} s'ha unit a la reunió",
"connectedThreePlusMembers": "{{name}} i molts altres s'han unit a la reunió",
"connectedTwoMembers": "{{first}} i {{second}} s'han unit a la reunió",
"dataChannelClosed": "Qualitat del vídeo deteriorada",
"dataChannelClosedDescription": "El canal pont s'ha desconnectat i per la qualitat de vídeo està limitada al valor inferior.",
"disconnected": "desconnectat",
"displayNotifications": "Mostra les notificacions sobre",
"focus": "Focus de la conferència",
@@ -671,8 +658,6 @@
"linkToSalesforceKey": "Enllaça aquesta reunió",
"linkToSalesforceProgress": "S'està enllaçant la reunió a Salesforce...",
"linkToSalesforceSuccess": "La reunió s'ha enllaçat a Salesforce",
"localRecordingStarted": "{{name}} ha iniciat un enregistrament local.",
"localRecordingStopped": "{{name}} ha aturat has stopped a local recording.",
"me": "Jo",
"moderationInEffectCSDescription": "Aixequeu la mà si voleu compartir la pantalla.",
"moderationInEffectCSTitle": "El moderador ha blocat la compartició de pantalla",
@@ -693,10 +678,6 @@
"newDeviceAction": "Usa",
"newDeviceAudioTitle": "S'ha detectat un aparell d'àudio nou",
"newDeviceCameraTitle": "S'ha detectat una càmera nova",
"noiseSuppressionDesktopAudioDescription": "La supressió de soroll no es pot activar mentre es comparteix l'àudio de l'escriptori. Desactiveu-lo i proveu una altra vegada.",
"noiseSuppressionFailedTitle": "No s'ha pogut iniciar la supressió de soroll",
"noiseSuppressionNoTrackDescription": "Abans, activeu el vostre micròfon.",
"noiseSuppressionStereoDescription": "Ara per ara, no és possible la supressió de soroll d'àudio en estèreo",
"oldElectronClientDescription1": "Sembla que useu una versió antiga del client Jitsi Meet, que té vulnerabilitats de seguretat conegudes. Assegureu-vos d'actualitzar-lo",
"oldElectronClientDescription2": "última construcció",
"oldElectronClientDescription3": "ara!",
@@ -832,7 +813,6 @@
"initiated": "S'ha iniciat la trucada",
"joinAudioByPhone": "Entra amb àudio de telèfon",
"joinMeeting": "Entra a la reunió",
"joinMeetingInLowBandwidthMode": "Uneix-t'hi en mode de poca amplada de banda",
"joinWithoutAudio": "Entra sense àudio",
"keyboardShortcuts": "Activa les dreceres del teclat",
"linkCopied": "L'enllaç s'ha copiat al porta-retalls",
@@ -908,23 +888,13 @@
"limitNotificationDescriptionWeb": "A causa de la gran demanda, l'enregistrament es limitarà a {{limit}} min. Per a enregistraments il·limitats, proveu <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
"linkGenerated": "S'ha generat un enllaç a l'enregistrament.",
"live": "EN DIRECTE",
"localRecordingNoNotificationWarning": "L'enregistrament no s'anunciarà als altres participants. Els haureu d'informar que la reunió s'està enregistrant.",
"localRecordingNoVideo": "El vídeo no s'està enregistrant",
"localRecordingStartWarning": "Assegureu-vos que atureu l'enregistrament abans de sortir de la reunió per a poder-lo desar.",
"localRecordingStartWarningTitle": "Atura l'enregistrament per a desar-lo",
"localRecordingVideoStop": "Aturar el vídeo també aturarà l'enregistrament local. Segur que voleu continuar?",
"localRecordingVideoWarning": "Per a enregistrar el vostre vídeo, cal que ho feu en començar l'enregistrament",
"localRecordingWarning": "Assegureu-vos de triar la pestanya actual per a poder usar el vídeo i àudios correctes. L'enregistrament actualment està limitat a 1 GB. Això són, aproximadament, 100 minuts.",
"loggedIn": "Sessió iniciada com a {{userName}}",
"noStreams": "No s'ha detectat flux d'àudio ni vídeo.",
"off": "S'ha aturat l'enregistrament",
"offBy": "{{name}} ha aturat l'enregistrament",
"on": "L'enregistrament ha començat",
"onBy": "{{name}} ha iniciat l'enregistrament",
"onlyRecordSelf": "Enregistra només el meu àudio i vídeo",
"pending": "S'està preparant per a enregistrar la reunió...",
"rec": "ENREG",
"saveLocalRecording": "Desa el fitxer de l'enregistrament en local (beta)",
"serviceDescription": "El servei d'enregistrament desarà el vostre enregistrament",
"serviceDescriptionCloud": "Enregistrament al núvol",
"serviceDescriptionCloudInfo": "Les reunions enregistrades s'esborren automàticament 24 hores després de l'enregistrament.",
@@ -932,7 +902,6 @@
"sessionAlreadyActive": "Aquesta sessió ja s'està enregistrant o emetent en directe.",
"signIn": "Inicia la sessió",
"signOut": "Tanca la sessió",
"surfaceError": "Trieu la pestanya actual.",
"title": "Enregistrament",
"unavailable": "Vaja! El servei {{serviceName}} ara mateix no és disponible. Treballem per a resoldre el problema. Torneu-ho a intentar més tard.",
"unavailableTitle": "L'enregistrament no és disponible",
@@ -949,7 +918,6 @@
"title": "Opcions de seguretat"
},
"settings": {
"buttonLabel": "Paràmetres",
"calendar": {
"about": "La integració de l'agenda {{appName}} s'usa per a accedir de forma segura a la vostra agenda perquè pugui llegir els esdeveniments pròxims.",
"disconnect": "Desconnectat",
@@ -973,7 +941,6 @@
"name": "Nom",
"noDevice": "Cap",
"participantJoined": "S'ha unit un participant",
"participantKnocking": "El participant ha entrat a la sala d'espera",
"participantLeft": "Un participant ha sortit de la reunió",
"playSounds": "Reprodueix el so",
"reactions": "Reaccions de la reunió",
@@ -1003,21 +970,13 @@
"disableCrashReportingWarning": "Esteu segur que voleu desactivar l'informe de fallades? La configuració s'aplicarà després de reiniciar l'aplicació.",
"disableP2P": "Desactiva el mode d'igual a igual",
"displayName": "Nom visible",
"displayNamePlaceholderText": "P. ex.: Pere Cullera",
"email": "Adreça electrònica",
"emailPlaceholderText": "email@example.com",
"goTo": "Ves a",
"header": "Configuració",
"help": "Ajuda",
"links": "Enllaços",
"privacy": "Privadesa",
"profileSection": "Perfil",
"serverURL": "URL del servidor",
"showAdvanced": "Mostra la configuració avançada",
"startCarModeInLowBandwidthMode": "Inicia el mode cotxe en el mode d'amplada de banda baixa",
"startWithAudioMuted": "Comença amb l'àudio silenciat",
"startWithVideoMuted": "Comença amb el vídeo desactivat",
"terms": "Condicions",
"version": "Versió"
},
"share": {
@@ -1044,7 +1003,6 @@
},
"startupoverlay": {
"genericTitle": "La reunió requereix usar el micròfon i la càmera.",
"policyText": "",
"title": "{{app}} requereix usar el micròfon i la càmera."
},
"suspendedoverlay": {
@@ -1055,7 +1013,6 @@
"termsView": {
"title": "Condicions"
},
"toggleTopPanelLabel": "Mostra o amaga el panell superior",
"toolbar": {
"Settings": "Configuració",
"accessibilityLabel": {
@@ -1073,7 +1030,6 @@
"document": "Activa o desactiva el document compartit",
"download": "Baixeu les nostres aplicacions",
"embedMeeting": "Insereix la reunió",
"endConference": "Finalitza la reunió per a tothom",
"expand": "Expandeix",
"feedback": "Deixa comentaris",
"fullScreen": "Activa o desactiva la pantalla completa",
@@ -1098,7 +1054,6 @@
"muteEveryoneElse": "Silencia tots els altres participants",
"muteEveryoneElsesVideoStream": "Atura el vídeo a tots els altres",
"muteEveryonesVideoStream": "Atura el vídeo a tothom",
"noiseSuppression": "Supressió de soroll",
"participants": "Participants",
"pip": "Activa o desactiva el mode imatge en imatge",
"privateMessage": "Envia un missatge privat",
@@ -1124,8 +1079,7 @@
"toggleCamera": "Activa o desactiva la càmera",
"toggleFilmstrip": "Mostra o amaga la cinta",
"videoblur": "Activa o desactiva el desenfocament del vídeo",
"videomute": "Activa o desactiva la càmera",
"whiteboard": "Mostra o amaga la pissarra"
"videomute": "Activa o desactiva la càmera"
},
"addPeople": "Afegeix persones a la trucada",
"audioOnlyOff": "Desactiva el mode de poca amplada de banda",
@@ -1139,14 +1093,12 @@
"clap": "Picament de mans",
"closeChat": "Tanca el xat",
"closeReactionsMenu": "Tanca el menú de reaccions",
"disableNoiseSuppression": "Desactiva la supressió de soroll",
"disableReactionSounds": "Podeu desactivar els sons de reacció per a aquesta reunió",
"documentClose": "Tanca el document compartit",
"documentOpen": "Obre el document compartit",
"download": "Baixeu les nostres aplicacions",
"e2ee": "Xifratge d'extrem a extrem",
"embedMeeting": "Insereix la reunió",
"endConference": "Finalitza la reunió per a tothom",
"enterFullScreen": "Mostra en pantalla completa",
"enterTileView": "Mostra en mode mosaic",
"exitFullScreen": "Surt de la pantalla completa",
@@ -1155,7 +1107,6 @@
"giphy": "Mostra o amaga el menú GIPHY",
"hangup": "Surt la reunió",
"help": "Ajuda",
"hideWhiteboard": "Amaga la pissarra",
"invite": "Convida-hi persones",
"joinBreakoutRoom": "Entra a la sala de descans",
"laugh": "Riure",
@@ -1178,7 +1129,6 @@
"noAudioSignalDialInDesc": "També podeu marcar usant:",
"noAudioSignalDialInLinkDesc": "Números de marcatge",
"noAudioSignalTitle": "No entra cap so pel vostre micròfon!",
"noiseSuppression": "Supressió de soroll",
"noisyAudioInputDesc": "Sembla que el vostre micròfon fa soroll, considereu de silenciar-lo o canviar l'aparell.",
"noisyAudioInputTitle": "Sembla que el micròfon fa soroll!",
"openChat": "Obre el xat",
@@ -1201,7 +1151,6 @@
"shareaudio": "Comparteix l'àudio",
"sharedvideo": "Comparteix el vídeo",
"shortcuts": "Mostra les dreceres",
"showWhiteboard": "Mostra la pissarra",
"silence": "Silenci",
"speakerStats": "Estadístiques de l'interlocutor",
"startScreenSharing": "Atura la compartició de la pantalla",
@@ -1225,12 +1174,8 @@
"labelToolTip": "La reunió s'està transcrivint",
"off": "La transcripció s'ha aturat",
"pending": "S'està preparant per a enregistrar la reunió...",
"sourceLanguageDesc": "La llengua actual de la reunió és <b>{{sourceLanguage}}</b>. <br/> Podeu canviar-la",
"sourceLanguageHere": "aquí",
"start": "Activa els subtítols",
"stop": "Desactiva els subtítols",
"subtitles": "Subtítols",
"subtitlesOff": "Inactiu",
"tr": "TR"
},
"userMedia": {
@@ -1366,7 +1311,6 @@
"roomname": "Introduïu el nom de la sala",
"roomnameHint": "Introduïu el nom o l'URL de la sala on voleu entrar. Podeu crear un nom, només cal que les persones amb qui us reuniu el coneguin i introdueixin el mateix nom.",
"sendFeedback": "Envia comentaris",
"settings": "Paràmetres",
"startMeeting": "Inicia la reunió",
"terms": "Condicions",
"title": "Videoconferència segura, plena de funcionalitats i completament gratuïta i lliure"

View File

@@ -184,21 +184,13 @@
"deepLinking": {
"appNotInstalled": "Sie benötigen die „{{app}}“-App, um der Konferenz auf dem Smartphone beizutreten.",
"description": "Nichts passiert? Wir haben versucht, die Konferenz in {{app}} zu öffnen. Versuchen Sie es erneut oder treten Sie der Konferenz in {{app}} im Web bei.",
"descriptionNew": "Nichts passiert? Wir haben versucht, die Konferenz in {{app}} zu öffnen. <br /><br /> Versuchen Sie es erneut oder treten Sie der Konferenz im Web bei.",
"descriptionWithoutWeb": "Ist nichts passiert? Wir haben versucht, Ihre Besprechung in der „{{app}}“-Desktop-App zu starten.",
"downloadApp": "App herunterladen",
"downloadMobileApp": "Aus dem App Store herunterladen",
"ifDoNotHaveApp": "Wenn Sie die App noch nicht haben:",
"ifHaveApp": "Wenn Sie die App bereits haben:",
"joinInApp": "Mit der App am Meeting teilnehmen",
"joinInAppNew": "Mit der App",
"joinInBrowser": "Im Browser",
"launchMeetingLabel": "Wie möchten Sie an der Konferenz teilnehmen?",
"launchWebButton": "Im Web öffnen",
"noMobileApp": "Sie haben die App noch nicht installiert?",
"termsAndConditions": "Indem Sie fortfahren, stimmen Sie underen<a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>Nutzungsbedingungen</a> zu.",
"title": "Die Konferenz wird in {{app}} geöffnet …",
"titleNew": "Konferenz starten ...",
"tryAgainButton": "Erneut mit der nativen Applikation versuchen",
"unsupportedBrowser": "Sie verwenden einen Browser, der noch nicht unterstützt wird."
},
@@ -211,12 +203,6 @@
"microphonePermission": "Fehler beim Bezug der Mikrofon-Zugriffsberechtigungen"
},
"deviceSelection": {
"hid": {
"callControl": "Anrufsteuerung",
"connectedDevices": "Verbundene Geräte:",
"deleteDevice": "Gerät löschen",
"pairDevice": "Gerät verbinden"
},
"noPermission": "Berechtigungen nicht erteilt",
"previewUnavailable": "Keine Vorschau verfügbar",
"selectADevice": "Ein Gerät wählen",
@@ -240,9 +226,7 @@
"WaitingForHostTitle": "Warten auf den Beginn der Konferenz …",
"Yes": "Ja",
"accessibilityLabel": {
"close": "Popup schließen",
"liveStreaming": "Livestream",
"sharingTabs": "Optionen zum Teilen"
"liveStreaming": "Livestream"
},
"add": "Hinzufügen",
"addMeetingNote": "Notiz zu dieser Konferenz hinzufügen",
@@ -454,11 +438,6 @@
"veryBad": "Sehr schlecht",
"veryGood": "Sehr gut"
},
"filmstrip": {
"accessibilityLabel": {
"heading": "Videominiaturen"
}
},
"giphy": {
"noResults": "Keine Ergebnisse :(",
"search": "GIPHY durchsuchen"
@@ -675,7 +654,6 @@
"dataChannelClosedDescription": "Die Steuerungsverbindung (Bridge Channel) wurde unterbrochen, daher ist die Videoqulität auf die schlechteste Stufe limitiert.",
"disconnected": "getrennt",
"displayNotifications": "Benachrichtigungen anzeigen für",
"dontRemindMe": "Nicht erinnern",
"focus": "Konferenzleitung",
"focusFail": "{{component}} ist im Moment nicht verfügbar wiederholen in {{ms}} Sekunden",
"gifsMenu": "GIPHY",
@@ -684,7 +662,6 @@
"invitedOneMember": "{{name}} wurde eingeladen",
"invitedThreePlusMembers": "{{name}} und {{count}} andere wurden eingeladen",
"invitedTwoMembers": "{{first}} und {{second}} wurden eingeladen",
"joinMeeting": "Beitreten",
"kickParticipant": "{{kicked}} wurde von {{kicker}} ausgewiesen",
"leftOneMember": "{{name}} hat die Konferenz verlassen",
"leftThreePlusMembers": "{{name}} und Weitere haben die Konferenz verlassen",
@@ -774,7 +751,6 @@
"headings": {
"lobby": "Lobby ({{count}})",
"participantsList": "Anwesende ({{count}})",
"visitors": "Gäste ({{count}})",
"waitingLobby": "In der Lobby ({{count}})"
},
"search": "Suche Anwesende",
@@ -782,7 +758,6 @@
},
"passwordDigitsOnly": "Bis zu {{number}} Ziffern",
"passwordSetRemotely": "von einer anderen Person gesetzt",
"pinParticipant": "{{participantName}} - anheften",
"pinnedParticipant": "Die Person ist angeheftet",
"polls": {
"answer": {
@@ -941,7 +916,6 @@
"localRecordingVideoWarning": "Um Ihr eigenes Kamerabild aufzuzeichnen, müssen Sie Ihre Kamera beim Start der Aufnahme einschalten",
"localRecordingWarning": "Bitte prüfen Sie, dass das aktuelle Tab auswählen, um Bild und Ton aufzuzeichnen. Die Länge der Aufzeichnung ist aktuell auf 1GB beschränkt, was ungefähr 100 Minuten entspricht.",
"loggedIn": "Als {{userName}} angemeldet",
"noMicPermission": "Zugriff auf Mikrofon fehlgeschlagen. Bitte erlauben Sie den Zugriff auf das Mikrofon.",
"noStreams": "Kein Ton oder Video erkannt.",
"off": "Aufnahme gestoppt",
"offBy": "{{name}} stoppte die Aufnahme",
@@ -975,7 +949,6 @@
"title": "Sicherheitsoptionen"
},
"settings": {
"audio": "Audio",
"buttonLabel": "Einstellungen",
"calendar": {
"about": "Die Kalenderintegration von {{appName}} wird verwendet, um ein sicheres Zugreifen auf Ihren Kalender und Auslesen der bevorstehenden Termine zu ermöglichen.",
@@ -996,11 +969,9 @@
"maxStageParticipants": "Maximale Anzahl an Personen, die zur Hauptansicht angeheftet werden können",
"microphones": "Mikrofon",
"moderator": "Moderation",
"moderatorOptions": "Moderationseinstellungen",
"more": "Mehr",
"name": "Name",
"noDevice": "Kein",
"notifications": "Benachrichtigungen",
"participantJoined": "Neue Person nimmt teil",
"participantKnocking": "Person hat Lobby betreten",
"participantLeft": "Person verlässt die Konferenz",
@@ -1011,14 +982,13 @@
"selectCamera": "Kamera",
"selectMic": "Mikrofon",
"selfView": "Eigene Ansicht",
"shortcuts": "Tastaturkürzel",
"sounds": "Hinweistöne",
"speakers": "Lautsprecher",
"startAudioMuted": "Alle Personen treten stummgeschaltet bei",
"startReactionsMuted": "Interaktionstöne für alle deaktivieren",
"startVideoMuted": "Alle Personen treten ohne Video bei",
"talkWhileMuted": "Wenn bei Stummschaltung gesprochen wird",
"title": "Einstellungen",
"video": "Kamera"
"title": "Einstellungen"
},
"settingsView": {
"advanced": "Erweitert",
@@ -1099,29 +1069,18 @@
"cc": "Untertitel ein-/ausschalten",
"chat": "Chatfenster öffnen / schließen",
"clap": "Klatschen",
"closeChat": "Chat schließen",
"closeMoreActions": "„Weitere Einstellungen“ schließen",
"closeParticipantsPane": "Anwesendenliste schließen",
"collapse": "Einklappen",
"document": "Geteiltes Dokument schließen",
"documentClose": "Geteiltes Dokument schließen",
"documentOpen": "Geteiltes Dokument öffnen",
"download": "Unsere Apps herunterladen",
"embedMeeting": "Konferenz einbetten",
"endConference": "Konferenz für alle beenden",
"enterFullScreen": "Vollbildmodus einschalten",
"enterTileView": "Kachelansicht einschalten",
"exitFullScreen": "Vollbildansicht ausschalten",
"exitTileView": "Kachelansicht ausschalten",
"expand": "Ausklappen",
"feedback": "Feedback hinterlassen",
"fullScreen": "Vollbildmodus ein-/ausschalten",
"giphy": "GIPHY ein-/ausschalten",
"grantModerator": "Moderationsrechte vergeben",
"hangup": "Konferenz verlassen",
"heading": "Toolbar",
"help": "Hilfe",
"hideWhiteboard": "Whiteboard ausblenden",
"invite": "Person einladen",
"kick": "Person entfernen",
"laugh": "Lachen",
@@ -1131,7 +1090,6 @@
"lobbyButton": "Lobbymodus ein-/ausschalten",
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
"lockRoom": "Konferenzpasswort ein-/ausschalten",
"lowerHand": "Hand senken",
"moreActions": "Menü „Weitere Einstellungen“ ein-/ausschalten",
"moreActionsMenu": "Menü „Weitere Einstellungen“",
"moreOptions": "Menü „Weitere Optionen“",
@@ -1141,7 +1099,6 @@
"muteEveryoneElsesVideoStream": "Alle anderen Kameras ausschalten",
"muteEveryonesVideoStream": "Alle Kameras ausschalten",
"noiseSuppression": "Rauschunterdrückung",
"openChat": "Chat öffnen",
"participants": "Anwesende",
"pip": "Bild-in-Bild-Modus ein-/ausschalten",
"privateMessage": "Private Nachricht senden",
@@ -1160,19 +1117,15 @@
"sharedvideo": "Videofreigabe ein-/ausschalten",
"shortcuts": "Tastenkombinationen ein-/ausblenden",
"show": "Im Vordergrund anzeigen",
"showWhiteboard": "Whiteboard anzeigen",
"silence": "Stille",
"speakerStats": "Sprechstatistik ein-/ausblenden",
"stopScreenSharing": "Bildschirmfreigabe beenden",
"stopSharedVideo": "Videofreigabe beenden",
"surprised": "Überrascht",
"tileView": "Kachelansicht ein-/ausschalten",
"toggleCamera": "Kamera wechseln",
"toggleFilmstrip": "Miniaturansichten ein-/ausschalten",
"unmute": "Stummschaltung aufheben",
"videoblur": "Unscharfer Hintergrund ein-/ausschalten",
"videomute": "„Video stummschalten“ ein-/ausschalten",
"videounmute": "Kamera einschalten"
"whiteboard": "Whiteboard ein-/ausschalten"
},
"addPeople": "Personen zur Konferenz hinzufügen",
"audioOnlyOff": "Modus „Nur Audio“ deaktivieren",
@@ -1185,7 +1138,6 @@
"chat": "Chat öffnen / schließen",
"clap": "Klatschen",
"closeChat": "Chat schließen",
"closeParticipantsPane": "Anwesenheitsliste schließen",
"closeReactionsMenu": "Interaktionsmenü schließen",
"disableNoiseSuppression": "Rauschunterdrückung deaktivieren",
"disableReactionSounds": "Sie können die Interaktionstöne für diese Konferenz deaktivieren",
@@ -1194,7 +1146,6 @@
"download": "Unsere Apps herunterladen",
"e2ee": "Ende-zu-Ende-Verschlüsselung",
"embedMeeting": "Konferenz einbetten",
"enableNoiseSuppression": "Rauschunterdrückung einschalten",
"endConference": "Konferenz für alle beenden",
"enterFullScreen": "Vollbildmodus",
"enterTileView": "Kachelansicht einschalten",
@@ -1219,7 +1170,7 @@
"lowerYourHand": "Hand senken",
"moreActions": "Weitere Einstellungen",
"moreOptions": "Weitere Optionen",
"mute": "Stummschalten",
"mute": "Mikrofon aktivieren / deaktivieren",
"muteEveryone": "Alle stummschalten",
"muteEveryonesVideo": "Alle Kameras ausschalten",
"noAudioSignalDesc": "Wenn Sie das Gerät nicht absichtlich über die Systemeinstellungen oder die Hardware stumm geschaltet haben, sollten Sie einen Wechsel des Geräts in Erwägung ziehen.",
@@ -1263,10 +1214,8 @@
"talkWhileMutedPopup": "Versuchen Sie zu sprechen? Ihr Mikrofon ist stummgeschaltet.",
"tileViewToggle": "Kachelansicht ein-/ausschalten",
"toggleCamera": "Kamera wechseln",
"unmute": "Stummschaltung aufheben",
"videoSettings": "Kameraeinstellungen",
"videomute": "Kamera stoppen",
"videounmute": "Kamera einschalten"
"videomute": "Kamera starten / stoppen"
},
"transcribing": {
"ccButtonTooltip": "Untertitel ein-/ausschalten",
@@ -1284,7 +1233,6 @@
"subtitlesOff": "Ausschalten",
"tr": "TR"
},
"unpinParticipant": "{{participantName}} - Nicht mehr anheften",
"userMedia": {
"androidGrantPermissions": "Wählen Sie <b><i>Zulassen</i></b>, wenn der Browser um Berechtigungen bittet.",
"chromeGrantPermissions": "Wählen Sie <b><i>Zulassen</i></b>, wenn der Browser um Berechtigungen bittet.",
@@ -1323,11 +1271,9 @@
"ldTooltip": "Video wird in niedriger Auflösung angezeigt",
"lowDefinition": "Niedrige Auflösung",
"performanceSettings": "Qualitätseinstellungen",
"recording": "Aufnahme läuft",
"sd": "SD",
"sdTooltip": "Video wird in Standardauflösung angezeigt",
"standardDefinition": "Standardauflösung",
"streaming": "Streaming läuft"
"standardDefinition": "Standardauflösung"
},
"videothumbnail": {
"connectionInfo": "Verbindungsinformationen",
@@ -1339,7 +1285,6 @@
"grantModerator": "Moderationsrechte vergeben",
"hideSelfView": "Eigene Ansicht ausblenden",
"kick": "Hinauswerfen",
"mirrorVideo": "Mein Video spiegeln",
"moderator": "Moderation",
"mute": "Person ist stumm geschaltet",
"muted": "Stummgeschaltet",
@@ -1377,7 +1322,6 @@
"webAssemblyWarning": "WebAssembly wird nicht unterstützt",
"webAssemblyWarningDescription": "WebAssembly ist deaktiviert oder wird in diesem Browser nicht unterstützt"
},
"visitorsLabel": "Anzahl Gäste: {{count}}",
"volumeSlider": "Lautstärkeregler",
"welcomepage": {
"accessibilityLabel": {
@@ -1410,7 +1354,6 @@
"microsoftLogo": "Microsoft Logo",
"policyLogo": "Richtlinienlogo"
},
"meetingsAccessibilityLabel": "Konferenzen",
"mobileDownLoadLinkAndroid": "Android App Download",
"mobileDownLoadLinkFDroid": "F-Droid App Download",
"mobileDownLoadLinkIos": "iOS App Download",
@@ -1430,10 +1373,5 @@
"terms": "AGB",
"title": "Sichere, voll funktionale und komplett kostenlose Videokonferenzen",
"upcomingMeetings": "Ihre zukünftigen Konferenzen"
},
"whiteboard": {
"accessibilityLabel": {
"heading": "Whiteboard"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -46,15 +46,21 @@
"today": "Today"
},
"chat": {
"error": "Error: your message \"{{originalText}}\" was not sent. Reason: {{error}}",
"fieldPlaceHolder": "",
"messageTo": "",
"messagebox": "Type a message",
"nickname": {
"popover": "Choose a nickname",
"title": "Enter a nickname to use chat",
"titleWithPolls": "Enter a nickname to use chat"
},
"noMessagesMessage": "",
"privateNotice": "",
"sendButton": "Send",
"title": "Chat",
"titleWithPolls": "Chat"
"titleWithPolls": "Chat",
"you": ""
},
"chromeExtensionBanner": {
"buttonText": "",

File diff suppressed because it is too large Load Diff

View File

@@ -838,7 +838,7 @@
"selectCamera": "Cámara",
"selectMic": "Micrófono",
"sounds": "Sonidos",
"speakers": "Altavoces",
"speakers": "Parlantes",
"startAudioMuted": "Todos inician silenciados",
"startVideoMuted": "Todos inician con cámara desactivada",
"talkWhileMuted": "Hablar en silencio",

View File

@@ -429,12 +429,7 @@
"startSilentTitle": "",
"suboptimalExperienceDescription": "Valitettavasti {{appName}} ei taida toimia kovin hyvin täällä. Yritämme löytää parannuskeinoja, mutta sillä välin kannattaa käyttää jotain <a href='{{recommendedBrowserPageLink}}' target='_blank'>täysin tuettua selainta</a>.",
"suboptimalExperienceTitle": "Selainvaroitus",
"unmute": "Poista mykistys"
},
"participantsPane": {
"actions": {
"muteEveryoneElse": "Mykistä kaikki muut"
}
"unmute": ""
},
"passwordDigitsOnly": "",
"passwordSetRemotely": "",
@@ -568,13 +563,11 @@
"moreActions": "Säädä Lisää toimintoja -valikkoa",
"moreActionsMenu": "Lisää toimintoja -valikko",
"mute": "Säädä äänen mykistystä",
"muteEveryoneElse": "Mykistä kaikki muut",
"pip": "Säädä Kuva kuvassa (PiP) -tilaa",
"profile": "Muokkaa profiilia",
"raiseHand": "Säädä käden nostoa",
"recording": "Säädä nauhoitusta",
"remoteMute": "Mykistä osanottaja",
"selectBackground": "Valitse tausta",
"shareRoom": "Kutsu joku",
"shareYourScreen": "Säädä näytön jakoa",
"sharedvideo": "Säädä videon jakoa",
@@ -664,37 +657,29 @@
"pending": "{{displayName}} on kutsuttu"
},
"videoStatus": {
"adjustFor": "Muokkaa:",
"audioOnly": "ÄÄNI",
"audioOnlyExpanded": "Käytössäsi on Vain ääni -tila. Se säästää kaistanleveyttä, mutta et näe muiden videoita.",
"bestPerformance": "Paras suorituskyky",
"callQuality": "Videon laatu",
"callQuality": "",
"hd": "HD",
"highDefinition": "Teräväpiirto",
"highestQuality": "Korkein laatu",
"labelTooiltipNoVideo": "Ei videota",
"labelTooltipAudioOnly": "Vain ääni -tila käytössä",
"ld": "LD",
"lowDefinition": "Alhainen kuvanlaatu",
"onlyAudioAvailable": "Vain ääni -tila on käytettävissä",
"onlyAudioSupported": "Tässä selaimessa tuemme vain ääntä.",
"performanceSettings": "Suorituskykyasetukset",
"sd": "SD",
"standardDefinition": "Vakiopiirto"
},
"videothumbnail": {
"domute": "Mykistä",
"domuteOthers": "Mykistä kaikki muut",
"domuteVideoOfOthers": "Estä muiden kamera",
"flip": "Käännä",
"kick": "Poista",
"moderator": "Valvoja",
"mute": "Osallistuja on mykistetty",
"mute": "",
"muted": "Mykistetty",
"pinToStage": "Kiinnitä ruutuun",
"remoteControl": "Etäkäyttö",
"show": "Näytä ruudulla",
"unpinFromStage": "Irroita kiinnitys",
"show": "",
"videomute": ""
},
"welcomepage": {

View File

@@ -11,6 +11,7 @@
"defaultEmail": "Votre email par défaut",
"disabled": "Vous ne pouvez pas inviter quelqu'un.",
"failedToAdd": "Erreur lors de l'ajout des participants",
"footerText": "Appels sortants désactivés.",
"googleEmail": "Gmail",
"inviteMoreHeader": "Vous êtes seul(e) dans la réunion",
"inviteMoreMailSubject": "Rejoindre une réunion {{appName}}",
@@ -30,7 +31,6 @@
},
"audioDevices": {
"bluetooth": "Bluetooth",
"car": "Système audio du véhicule",
"headphones": "Écouteurs",
"none": "Aucune source audio n'est disponible",
"phone": "Téléphone",
@@ -76,16 +76,6 @@
"refresh": "Rafraîchir le calendrier",
"today": "Aujourd'hui"
},
"carmode": {
"actions": {
"selectSoundDevice": "Sélectionnez le dispositif audio"
},
"labels": {
"buttonLabel": "Mode voiture",
"title": "Mode voiture",
"videoStopped": "Votre vidéo est arrêtée"
}
},
"chat": {
"enter": "Entrez dans le salon",
"error": "Erreur : votre message n'a pas été envoyé. Raison : {{error}}",
@@ -96,7 +86,6 @@
"messageAccessibleTitleMe": "Je dis: ",
"messageTo": "Message privé à {{recipient}}",
"messagebox": "Saisissez un message",
"newMessages": "Nouveaux messages",
"nickname": {
"popover": "Choisissez un pseudonyme",
"title": "Entrez un pseudonyme pour utiliser le chat",
@@ -116,7 +105,6 @@
},
"chromeExtensionBanner": {
"buttonText": "Installer l'extension Chrome",
"buttonTextEdge": "Installer lextension Edge",
"close": "Fermer",
"dontShowAgain": "Ne plus me montrer ceci",
"installExtensionText": "Installer l'extension pour l'intégration de Google Calendar et Office 365"
@@ -147,7 +135,6 @@
"bridgeCount": "Nombre de serveurs :",
"codecs": "Codecs (A/V) :",
"connectedTo": "Connecté à :",
"e2eeVerified": "E2EE vérifié",
"framerate": "Images par seconde :",
"less": "Cacher les détails",
"localaddress": "Adresse locale :",
@@ -184,21 +171,13 @@
"deepLinking": {
"appNotInstalled": "Vous avez besoin de l'application mobile {{app}} pour participer à cette réunion avec votre téléphone.",
"description": "Rien ne s'est passé ? Nous avons essayé de lancer votre réunion dans l'application de bureau {{app}}. Essayez à nouveau ou lancez-la dans l'application web {{app}}.",
"descriptionNew": "Rien ne s'est passé ? Nous avons essayé de lancer votre réunion dans l'application de bureau {{app}}. <br /><br /> Vous pouvez essayer à nouveau ou la lancer dans l'application web.",
"descriptionWithoutWeb": "Rien ne s'est passé ? Nous avons essayé de démarrer votre réunion dans l'application bureau {{app}}.",
"downloadApp": "Télécharger l'application",
"downloadMobileApp": "Télécharger l'application depuis le Store",
"ifDoNotHaveApp": "Si vous n'avez pas encore l'application:",
"ifHaveApp": "Si vous avez déjà installé l'application:",
"joinInApp": "Rejoindre la réunion en utilisant l'application",
"joinInAppNew": "Rejoindre depuis lapplication",
"joinInBrowser": "Rejoindre depuis le navigateur",
"launchMeetingLabel": "Comment voulez-vous rejoindre la réunion ?",
"launchWebButton": "Lancer dans le navigateur",
"noMobileApp": "Vous navez pas lapplication ?",
"termsAndConditions": "En continuant, vous acceptez nos <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>conditions générales dutilisation.</a>",
"title": "Lancement de votre réunion dans {{app}} en cours ...",
"titleNew": "Lancement de votre réunion ...",
"tryAgainButton": "Réessayez sur le bureau",
"unsupportedBrowser": "Il semble que vous utilisez un navigateur non supporté."
},
@@ -211,20 +190,11 @@
"microphonePermission": "Erreur lors de l'obtention de la permission du microphone"
},
"deviceSelection": {
"hid": {
"callControl": "Contrôle des appels",
"connectedDevices": "Appareils connectés",
"deleteDevice": "Supprimer un appareil",
"pairDevice": "Connecter un appareil"
},
"noPermission": "Permission non accordée",
"previewUnavailable": "Aperçu non disponible",
"selectADevice": "Sélectionner un périphérique",
"testAudio": "Tester la sortie audio"
},
"dialIn": {
"screenTitle": "Bilan des appels"
},
"dialOut": {
"statusMessage": "est maintenant {{status}}"
},
@@ -240,9 +210,7 @@
"WaitingForHostTitle": "En attente de l'hôte ...",
"Yes": "Oui",
"accessibilityLabel": {
"close": "Fermer la popup",
"liveStreaming": "Diffusion en direct",
"sharingTabs": "Options de partage"
"liveStreaming": "Diffusion en direct"
},
"add": "Ajouter",
"addMeetingNote": "Ajouter une note à cette conférence",
@@ -288,7 +256,6 @@
"gracefulShutdown": "Notre service est actuellement en maintenance. Veuillez réessayer plus tard.",
"grantModeratorDialog": "Êtes-vous sûr de vouloir rendre ce participant modérateur ?",
"grantModeratorTitle": "Nommer modérateur",
"hide": "Cacher",
"hideShareAudioHelper": "Ne pas montrer ce dialogue à nouveau",
"incorrectPassword": "Nom d'utilisateur ou mot de passe incorrect",
"incorrectRoomLockPassword": "Mot de passe incorrect",
@@ -303,6 +270,7 @@
"linkMeetingTitle": "Relier la conférence à Salesforce",
"liveStreaming": "Direct",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Impossible durant l'enregistrement",
"liveStreamingDisabledTooltip": "La diffusion en direct est désactivée",
"localUserControls": "Contrôles de l'utilisateur local",
"lockMessage": "Impossible de verrouiller la conférence.",
"lockRoom": "Ajouter un $t(lockRoomPassword) à la réunion ",
@@ -357,6 +325,7 @@
"recentlyUsedObjects": "Vos objets récemment utilisés",
"recording": "Enregistrement",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Impossible durant le direct",
"recordingDisabledTooltip": "L'enregistrement est désactivé.",
"rejoinNow": "Rejoindre maintenant",
"remoteControlAllowedMessage": "{{user}} a accepté votre demande de prise en main à distance !",
"remoteControlDeniedMessage": "{{user}} a refusé votre demande de prise en main à distance !",
@@ -406,7 +375,6 @@
"shareYourScreenDisabled": "Le partage d'écran est désactivé.",
"sharedVideoDialogError": "Erreur: URL invalide",
"sharedVideoLinkPlaceholder": "lien YouTube ou lien vidéo direct",
"show": "Afficher",
"start": "Démarrer ",
"startLiveStreaming": "Démarrer la diffusion en direct",
"startRecording": "Commencer l'enregistrement",
@@ -425,10 +393,6 @@
"user": "Utilisateur",
"userIdentifier": "Identifiant utilisateur",
"userPassword": "mot de passe utilisateur",
"verifyParticipantConfirm": "Ils correspondent",
"verifyParticipantDismiss": "Ils ne correspondent pas",
"verifyParticipantQuestion": "EXPÉRIMENTAL: Demander au participant {{participantName}} s'il voit le même contenu dans le même ordre. ",
"verifyParticipantTitle": "Vérification utilisateur",
"videoLink": "Lien de la vidéo",
"viewUpgradeOptions": "Voir les options de mise à jour",
"viewUpgradeOptionsContent": "Pour obtenir un accès illimité à des capacités premium comme l'enregistrement, les transcriptions, diffusion RTMP et plus, vous devez mettre à jour votre plan.",
@@ -454,15 +418,13 @@
"veryBad": "Très mauvais",
"veryGood": "Très bon"
},
"filmstrip": {
"accessibilityLabel": {
"heading": "Vignettes vidéos"
}
},
"giphy": {
"noResults": "Aucun résultat de recherche :(",
"search": "Rechercher dans GIPHY"
},
"helpView": {
"title": "Centre d'aide"
},
"incomingCall": {
"answer": "Répondre",
"audioCallTitle": "Appel entrant",
@@ -503,11 +465,9 @@
"noRoom": "Aucune réunion n'a été spécifiée pour l'appel entrant.",
"numbers": "Numéros d'appel",
"password": "$t(lockRoomPasswordUppercase) :",
"reachedLimit": "Vous avez atteint la limite de votre abonnement.",
"sip": "adresse SIP",
"title": "Partager",
"tooltip": "Partager le lien et les informations de connexion pour cette conférence",
"upgradeOptions": "Veuillez vérifier les options de mise à niveau"
"tooltip": "Partager le lien et les informations de connexion pour cette conférence"
},
"inlineDialogFailure": {
"msg": "Il y a eu un petit problème.",
@@ -542,10 +502,6 @@
"toggleShortcuts": "Afficher / Masquer les raccourcis clavier",
"videoMute": "Démarrer / Arrêter votre caméra"
},
"largeVideo": {
"screenIsShared": "Vous êtes en train de partager votre écran",
"showMeWhatImSharing": "Me montrer ce que je partage"
},
"liveStreaming": {
"busy": "Nous tentons de libérer des ressources de diffusion. Veuillez réessayez dans quelques minutes.",
"busyTitle": "Tous les flux sont actuellement occupés",
@@ -586,6 +542,7 @@
"lobby": {
"admit": "Accepter",
"admitAll": "Tout accepter",
"allow": "Autoriser",
"backToKnockModeButton": "Aucun mot de passe, demander à rejoindre plutôt",
"chat": "Chat",
"dialogTitle": "Mode salle d'attente",
@@ -648,7 +605,6 @@
"no": "Non",
"participant": "Participant(e)",
"participantStats": "Statistiques du participant",
"selectTabTitle": "🎥 Veuillez sélectionner cet onglet pour enregistrer",
"sessionToken": "Token de la session",
"start": "Démarrer l'enregistrement",
"stop": "Arrêter l'enregistrement",
@@ -671,8 +627,6 @@
"connectedOneMember": "{{name}} a rejoint la réunion",
"connectedThreePlusMembers": "{{name}} et {{count}} autres personnes ont rejoint la réunion",
"connectedTwoMembers": "{{first}} et {{second}} ont rejoint la réunion",
"dataChannelClosed": "Qualité vidéo dégradée",
"dataChannelClosedDescription": "Le canal de communication avec le Bridge a été interrompu, la qualité vidéo se trouve limitée à sa valeur la plus faible.",
"disconnected": "déconnecté",
"displayNotifications": "Afficher les notifications pour",
"focus": "Focus de conférence",
@@ -693,8 +647,6 @@
"linkToSalesforceKey": "Relier cette conférence",
"linkToSalesforceProgress": "Liaison de la conférence à Salesforce...",
"linkToSalesforceSuccess": "La conférence a été reliée à Salesforce",
"localRecordingStarted": "{{name}} a commencé un enregistrement local.",
"localRecordingStopped": "{{name}} a arrêté un enregistrement local.",
"me": "Moi",
"moderationInEffectCSDescription": "Merci de lever la main si vous voulez partager votre écran.",
"moderationInEffectCSTitle": "Le partage d'écran est interdit par le modérateur",
@@ -715,10 +667,6 @@
"newDeviceAction": "Utiliser",
"newDeviceAudioTitle": "Nouveau périphérique audio détecté",
"newDeviceCameraTitle": "Nouvelle caméra détectée",
"noiseSuppressionDesktopAudioDescription": "La suppression de bruit ne peut pas être activée en même temps que la partage audio du système, veuillez le désactiver et réessayer.",
"noiseSuppressionFailedTitle": "Échec du démarrage de la suppression de bruit",
"noiseSuppressionNoTrackDescription": "Veuillez activer votre microphone d'abord.",
"noiseSuppressionStereoDescription": "La suppression de bruit dune source stéréo nest pas encore supportée.",
"oldElectronClientDescription1": "Vous semblez utiliser une ancienne version du client Jitsi Meet qui présente des failles de sécurité connues. Veuillez vous assurer de mettre à jour vers notre ",
"oldElectronClientDescription2": "dernière build",
"oldElectronClientDescription3": " rapidement !",
@@ -733,8 +681,6 @@
"reactionSoundsForAll": "Bloquer les réactions sonores pour tous",
"screenShareNoAudio": " La case Partager l'audio n'a pas été cochée dans l'écran de sélection de la fenêtre.",
"screenShareNoAudioTitle": "La case Partager l'audio n'a pas été cochée",
"screenSharingAudioOnlyDescription": "Veuillez noter quen partageant votre écran, vous impactez le mode “Meilleure Performance” et vous utilisez plus de bande passante.",
"screenSharingAudioOnlyTitle": "Mode \"Meilleure Performance\"",
"selfViewTitle": "Vous pouvez toujours rétablir l'affichage de votre propre vidéo dans les paramètres",
"somebody": "Quelqu'un",
"startSilentDescription": "Rejoignez la réunion de nouveau pour activer l'audio",
@@ -772,7 +718,6 @@
"headings": {
"lobby": "Salle d'attente ({{count}})",
"participantsList": "Participants de la réunion ({{count}})",
"visitors": "Visiteurs {{count}}",
"waitingLobby": "Dans la salle d'attente ({{count}})"
},
"search": "Rechercher des participants",
@@ -780,7 +725,6 @@
},
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
"passwordSetRemotely": "défini par un autre participant",
"pinParticipant": "Épingler - {{participantName}}",
"pinnedParticipant": "Participant toujours affiché",
"polls": {
"answer": {
@@ -858,7 +802,6 @@
"initiated": "Appel lancé",
"joinAudioByPhone": "Rejoindre avec l'audio du téléphone",
"joinMeeting": "Rejoindre la réunion",
"joinMeetingInLowBandwidthMode": "Rejoindre en mode bande passante réduite",
"joinWithoutAudio": "Rejoignez sans microphone",
"keyboardShortcuts": "Activer les raccourcis clavier",
"linkCopied": "Lien copié dans le presse-papiers",
@@ -886,6 +829,9 @@
"rejected": "Rejeté",
"ringing": "Appel en cours ..."
},
"privacyView": {
"title": "Confidentialité"
},
"profile": {
"avatar": "avatar",
"setDisplayNameLabel": "Choisissez un pseudo",
@@ -931,24 +877,13 @@
"limitNotificationDescriptionWeb": "En raison d'une forte demande, votre enregistrement sera limité à {{limit}} min. Pour des enregistrements illimités, essayez <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
"linkGenerated": "Nous avons généré un lien à votre enregistrement.",
"live": "DIRECT",
"localRecordingNoNotificationWarning": "Le démarrage de lenregistrement ne sera pas annoncé aux autres participants. Vous devrez les informer par vous-même que la réunion sera enregistrée.",
"localRecordingNoVideo": "La vidéo n'est pas en cours denregistrement",
"localRecordingStartWarning": "Assurez-vous darrêter lenregistrement vidéo avant de quitter la réunion afin de pouvoir le sauvegarder.",
"localRecordingStartWarningTitle": "Arrêter lenregistrement pour le sauvegarder",
"localRecordingVideoStop": "Arrêter votre vidéo va aussi arrêter votre enregistrement local. Êtes-vous sûrs de vouloir continuer ?",
"localRecordingVideoWarning": "Pour enregistrer votre vidéo, vous devez avoir celle-ci active au moment de commencer lenregistrement.",
"localRecordingWarning": "Assurez-vous de sélectionner longlet courant pour utiliser le bon son et la bonne vidéo. Lenregistrement est pour le moment limité à 1Go, soit approximativement 100 minutes.",
"loggedIn": "Connecté en tant que {{userName}}",
"noMicPermission": "La piste microphone ne peut pas être créée. Veuillez autoriser lutilisation du microphone.",
"noStreams": "Aucun flux audio ou vidéo détectés.",
"off": "Enregistrement arrêté",
"offBy": "{{name}} a arrêté l'enregistrement",
"on": "Enregistrement",
"onBy": "{{name}} a démarré l'enregistrement",
"onlyRecordSelf": "Enregistrer seulement mon audio et ma vidéo.",
"pending": "Préparation de l'enregistrement de la réunion ...",
"rec": "REC",
"saveLocalRecording": "Sauvegarder lenregistrement local (Beta)",
"serviceDescription": "Votre enregistrement sera enregistré par le service dédié",
"serviceDescriptionCloud": "Enregistrement Cloud",
"serviceDescriptionCloudInfo": "Les conférences enregistrées sont automatiquement supprimées 24h après leur heure d'enregistrement.",
@@ -956,13 +891,11 @@
"sessionAlreadyActive": "Cette session est déjà en cours d'enregistrement ou de diffusion.",
"signIn": "Se connecter",
"signOut": "Se déconnecter",
"surfaceError": "Veuillez sélectionner longlet courant.",
"title": "Enregistrement",
"unavailable": "Oups ! Le {{serviceName}} est actuellement indisponible. Nous tentons de résoudre le problème. Veuillez réessayer plus tard.",
"unavailableTitle": "Enregistrement indisponible",
"uploadToCloud": "Envoyer vers le cloud"
},
"screenshareDisplayName": "Écran {{name}}",
"sectionList": {
"pullToRefresh": "Tirer pour recharger"
},
@@ -973,8 +906,6 @@
"title": "Options de sécurité"
},
"settings": {
"audio": "Audio",
"buttonLabel": "Paramètres",
"calendar": {
"about": "L'intégration de {{appName}} avec votre calendrier permet d'accéder de manière sécurisée aux événements à venir.",
"disconnect": "Se déconnecter",
@@ -991,16 +922,12 @@
"incomingMessage": "un message arrive",
"language": "Langue",
"loggedIn": "Connecté en tant que {{name}}",
"maxStageParticipants": "Nombre maximum de participants pouvant être épinglé sur laffichage principal (EXPÉRIMENTAL)",
"microphones": "Microphones",
"moderator": "Modérateur",
"moderatorOptions": "Options de modérateur",
"more": "Plus",
"name": "Nom",
"noDevice": "Aucun",
"notifications": "Notifications",
"participantJoined": "un participant arrive",
"participantKnocking": "un participant en salle dattente",
"participantLeft": "un participant quitte",
"playSounds": "Jouer un son quand",
"reactions": "il y a une réaction à la réunion",
@@ -1009,14 +936,13 @@
"selectCamera": "Caméra",
"selectMic": "Microphone",
"selfView": "Affichage de votre propre vidéo",
"shortcuts": "Raccourcis",
"sounds": "Sons",
"speakers": "Haut-parleurs",
"startAudioMuted": "Tout le monde commence en muet",
"startReactionsMuted": "Tout le monde commence avec les réactions sonores bloquées",
"startVideoMuted": "Tout le monde commence sans vidéo",
"talkWhileMuted": "vous parlez en étant muet",
"title": "Paramètres",
"video": "Vidéo"
"title": "Paramètres"
},
"settingsView": {
"advanced": "Avancé",
@@ -1031,21 +957,13 @@
"disableCrashReportingWarning": "Etes-vous certain de vouloir désactiver les rapports de plantage ? Le paramètre sera effectif après le redémarrage de l'application.",
"disableP2P": "Désactiver le mode pair à pair",
"displayName": "Pseudo",
"displayNamePlaceholderText": "Ex : Jean Dupond",
"email": "Email",
"emailPlaceholderText": "email@example..com",
"goTo": "Aller à",
"header": "Paramètres",
"help": "Aide",
"links": "Liens",
"privacy": "Confidentialité",
"profileSection": "Profil",
"serverURL": "URL du serveur",
"showAdvanced": "Afficher les paramètres avancés",
"startCarModeInLowBandwidthMode": "Commencer le mode voiture en mode bande passante réduite",
"startWithAudioMuted": "Commencez avec l'audio en sourdine",
"startWithVideoMuted": "Commencez avec la vidéo en sourdine",
"terms": "Conditions dutilisations",
"version": "Version"
},
"share": {
@@ -1083,7 +1001,6 @@
"termsView": {
"title": "Conditions d'utilisation"
},
"toggleTopPanelLabel": "Basculer le panneau supérieur",
"toolbar": {
"Settings": "Paramètres",
"accessibilityLabel": {
@@ -1093,7 +1010,6 @@
"boo": "Hou",
"breakoutRoom": "Rejoindre/quitter une salle annexe",
"callQuality": "Ajuster la qualité vidéo",
"carmode": "Mode voiture",
"cc": "Activer / Désactiver les sous-titres",
"chat": "Afficher / Masquer la discussion instantanée",
"clap": "Applaudir",
@@ -1101,19 +1017,16 @@
"document": "Activer / Désactiver le document partagé",
"download": "Télécharger nos applications",
"embedMeeting": "Intégrer la réunion",
"endConference": "Terminer la réunion pour tout le monde",
"expand": "Développer",
"feedback": "Laisser des commentaires",
"fullScreen": "Activer / Désactiver le plein écran",
"giphy": "Activer/désactiver le menu GIPHY",
"grantModerator": "donner des droits de modérateur",
"hangup": "Quitter la conversation",
"heading": "Barre d'outils",
"help": "Aide",
"invite": "Inviter des participants",
"kick": "Expulser le participant",
"laugh": "Rire",
"leaveConference": "Quitter la réunion",
"like": "Approuver",
"linkToSalesforce": "Lien à Salesforce",
"lobbyButton": "Activer / Désactiver le mode salle d'attente",
@@ -1127,7 +1040,6 @@
"muteEveryoneElse": "Couper le micro de tous les autres",
"muteEveryoneElsesVideoStream": "Couper la caméra de tous les autres",
"muteEveryonesVideoStream": "Couper la caméra de tout le monde",
"noiseSuppression": "Suppression du bruit",
"participants": "Participants",
"pip": "Activer / Désactiver le mode Picture in Picture",
"privateMessage": "Envoyer un message privé",
@@ -1153,8 +1065,7 @@
"toggleCamera": "Changer de caméra",
"toggleFilmstrip": "Afficher ou masquer les vignettes vidéo",
"videoblur": "Activer / désactiver le floutage",
"videomute": "Activer / Couper la vidéo",
"whiteboard": "Afficher / Cacher le tableau blanc"
"videomute": "Activer / Couper la vidéo"
},
"addPeople": "Ajouter des personnes à votre appel",
"audioOnlyOff": "Désactiver le mode bande passante réduite",
@@ -1168,15 +1079,12 @@
"clap": "Applaudir",
"closeChat": "Fermer le chat",
"closeReactionsMenu": "Fermer le menu réactions",
"disableNoiseSuppression": "Arrêter la suppression du bruit",
"disableReactionSounds": "Vous pouvez interdire les réactions sonores à cette réunion",
"documentClose": "Fermer le document partagé",
"documentOpen": "Ouvrir le document partagé",
"download": "Télécharger nos applications",
"e2ee": "Chiffrement de Bout-en-Bout",
"embedMeeting": "Intégrer la réunion",
"enableNoiseSuppression": "Activer la suppression du bruit",
"endConference": "Terminer la réunion pour tout le monde",
"enterFullScreen": "Afficher en plein écran",
"enterTileView": "Accéder au mode mosaïque",
"exitFullScreen": "Quitter le mode plein écran",
@@ -1185,12 +1093,10 @@
"giphy": "Activer/désactiver le menu GIPHY",
"hangup": "Quitter",
"help": "Aide",
"hideWhiteboard": "Cacher le tableau blanc",
"invite": "Inviter des participants",
"joinBreakoutRoom": "Rejoindre salle annexe",
"laugh": "Rire",
"leaveBreakoutRoom": "Quitter salle annexe",
"leaveConference": "Quitter la réunion",
"like": "Approuver",
"linkToSalesforce": "Lien à Salesforce",
"lobbyButtonDisable": "Désactiver le mode salle d'attente / contrôle des participant(e)s",
@@ -1208,7 +1114,6 @@
"noAudioSignalDialInDesc": "Vous pouvez également appeler en utilisant :",
"noAudioSignalDialInLinkDesc": "Numéros d'appel",
"noAudioSignalTitle": "Il n'y a pas de signal provenant de votre micro !",
"noiseSuppression": "Suppression du bruit",
"noisyAudioInputDesc": "Il semble que votre microphone soit bruyant, veuillez le couper ou changer de périphérique.",
"noisyAudioInputTitle": "Votre microphone semble être bruyant !",
"openChat": "Ouvrir le chat",
@@ -1231,7 +1136,6 @@
"shareaudio": "Partager l'audio",
"sharedvideo": "Partager une vidéo",
"shortcuts": "Afficher les raccourcis",
"showWhiteboard": "Afficher le tableau blanc",
"silence": "Silence",
"speakerStats": "Statistiques de l'interlocuteur",
"startScreenSharing": "Démarrer le partage d'écran",
@@ -1255,15 +1159,10 @@
"labelToolTip": "La transcription de la réunion est en cours",
"off": "La transcription désactivée",
"pending": "Préparation de la transcription de la réunion ...",
"sourceLanguageDesc": "Actuellement, la langue de la réunion est sélectionnée à <b>{{sourceLanguage}}</b>. <br/> Vous pouvez la changer à partir de ",
"sourceLanguageHere": "ici",
"start": "Activer les sous-titres",
"stop": "Désactiver les sous-titres",
"subtitles": "sous-titres",
"subtitlesOff": "off",
"tr": "TR"
},
"unpinParticipant": "Désépingler - {{participantName}}",
"userMedia": {
"androidGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande votre autorisation.",
"chromeGrantPermissions": "Sélectionnez <b><i>Autoriser</i></b> lorsque votre navigateur demande votre autorisation.",
@@ -1302,11 +1201,9 @@
"ldTooltip": "Regardez la vidéo en basse définition",
"lowDefinition": "Basse définition",
"performanceSettings": "Paramètres de performance",
"recording": "Enregistrement en cours",
"sd": "MD",
"sdTooltip": "Regardez la vidéo en définition standard",
"standardDefinition": "Moyenne Définition",
"streaming": "Diffusion en direct en cours"
"standardDefinition": "Moyenne Définition"
},
"videothumbnail": {
"connectionInfo": "Informations de la connexion",
@@ -1318,7 +1215,6 @@
"grantModerator": "Donner des droits de modérateur",
"hideSelfView": "Cacher l'affichage de votre propre vidéo",
"kick": "Exclure",
"mirrorVideo": "Inverser ma vidéo",
"moderator": "Modérateur",
"mute": "Le participant a coupé son micro",
"muted": "Muet",
@@ -1328,7 +1224,6 @@
"show": "Afficher en premier plan",
"showSelfView": "Montrer votre propre vidéo",
"unpinFromStage": "Ne plus garder affiché",
"verify": "Vérifier le participant",
"videoMuted": "Caméra coupée",
"videomute": "Le participant a arrêté la caméra"
},
@@ -1356,7 +1251,6 @@
"webAssemblyWarning": "WebAssembly non supporté",
"webAssemblyWarningDescription": "WebAssembly invalidé ou non supporté par ce navigateur"
},
"visitorsLabel": "Nombre de visiteurs: {{count}}",
"volumeSlider": "Curseur de volume",
"welcomepage": {
"accessibilityLabel": {
@@ -1389,7 +1283,6 @@
"microsoftLogo": "Logo Microsoft",
"policyLogo": "Logo de la politique"
},
"meetingsAccessibilityLabel": "Réunions",
"mobileDownLoadLinkAndroid": "Télécharger l'application mobile sur Android",
"mobileDownLoadLinkFDroid": "Télécharger l'application mobile sur F-Droid",
"mobileDownLoadLinkIos": "Télécharger l'application mobile sur iOS",
@@ -1398,21 +1291,13 @@
"recentList": "Récent",
"recentListDelete": "Supprimer",
"recentListEmpty": "Votre liste récente est actuellement vide. Discuter avec votre équipe et vous trouverez toutes vos réunions récentes ici.",
"recentMeetings": "Vos réunions récentes",
"reducedUIText": "Bienvenue sur {{app}} !",
"roomNameAllowedChars": "Le nom de la réunion ne doit contenir aucun de ces caractères : ?, &, :, ', \", %, #.",
"roomname": "Saisissez un nom de salle",
"roomnameHint": "Entrez le nom ou l'URL de la salle que vous souhaitez rejoindre. Vous pouvez faire un nom, laissez les gens que vous rencontrerez le savoir afin qu'ils entrent le même nom.",
"sendFeedback": "Envoyer votre avis",
"settings": "Paramètres",
"startMeeting": "Démarrer la conférence",
"terms": "Termes",
"title": "Système de vidéoconférence sécurisé, riche en fonctionnalités et gratuit",
"upcomingMeetings": "Vos réunions à venir"
},
"whiteboard": {
"accessibilityLabel": {
"heading": "Tableau blanc"
}
"title": "Système de vidéoconférence sécurisé, riche en fonctionnalités et gratuit"
}
}

View File

@@ -828,34 +828,18 @@
"expandedPending": "録画の開始中です...",
"failedToStart": "録画の開始に失敗しました",
"fileSharingdescription": "録画をミーティングの参加者と共有する",
"highlight": "ハイライト",
"highlightMoment": "この瞬間をハイライト",
"highlightMomentDisabled": "録画が開始後にハイライトは利用可能になります。",
"highlightMomentSuccess": "ハイライトされました",
"highlightMomentSucessDescription": "ハイライトされた瞬間は議事録に追加されます。",
"inProgress": "録画またはライブ配信中です",
"limitNotificationDescriptionNative": "利用者が多いため、あなたの録画は {{limit}} 分に制限されます。無制限に録画するには<3>{{app}}</3>をお試しください。",
"limitNotificationDescriptionWeb": "利用者が多いため、あなたの録画は {{limit}} 分に制限されます。 無制限に録画するには<a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>をお試しください。",
"linkGenerated": "あなたの録画へのリンクを生成しました。",
"live": "LIVE",
"localRecordingNoNotificationWarning": "この録画は他の参加者に通知されません。このミーティングが録画されていることを他の参加者に伝えてください。",
"localRecordingNoVideo": "ビデオは録画されません。",
"localRecordingStartWarning": "録画を保存するためにはミーティング退出前に録画を停止してください。",
"localRecordingStartWarningTitle": "録画を停止して保存",
"localRecordingVideoStop": "ビデオを停止すると録画も停止されます。停止してもよろしいですか?",
"localRecordingVideoWarning": "ビデオを録画するためには録画開始前に有効化しておく必要があります",
"localRecordingWarning": "正しく録画をするために必ず現在のタブを選択してください。現在録画は1GBまで、約100分に制限されています。",
"loggedIn": "{{userName}} としてログイン",
"noMicPermission": "マイクが認識できませんでした。マイクへのアクセス権を確認してください。",
"noStreams": "音声・映像が検出されませんでした。",
"off": "録画を停止しました",
"offBy": "{{name}} が録画を停止しました",
"on": "録画を開始しました",
"onBy": "{{name}} が録画を開始しました",
"onlyRecordSelf": "自身の音声・映像のみを録画する",
"pending": "ミーティングの録画準備中...",
"rec": "REC",
"saveLocalRecording": "ローカルに録画を保存 (Beta)",
"serviceDescription": "ビデオは録画サービスで録画されます",
"serviceDescriptionCloud": "クラウドレコーディング",
"serviceName": "録画サービス",

File diff suppressed because it is too large Load Diff

View File

@@ -882,7 +882,6 @@
"document": "Gedeeld document in- of uitschakelen",
"download": "Download onze apps",
"embedMeeting": "Vergadering embedden",
"endConference": "Vergadering voor iedereen beëindigen",
"feedback": "Feedback achterlaten",
"fullScreen": "Volledig scherm in- of uitschakelen",
"grantModerator": "Moderatorrechten verlenen",
@@ -890,7 +889,6 @@
"help": "Hulp",
"invite": "Personen uitnodigen",
"kick": "Deelnemer verwijderen",
"leaveConference": "Vergadering verlaten",
"lobbyButton": "Lobby-modus in- of uitschakelen",
"localRecording": "Besturingselementen voor lokale opname in- of uitschakelen",
"lockRoom": "Wachtwoord voor vergadering in- of uitschakelen",
@@ -940,7 +938,6 @@
"download": "Download onze apps",
"e2ee": "Eind-tot-eind-versleuteling",
"embedMeeting": "Vergadering embedden",
"endConference": "Vergadering voor iedereen beëindigen",
"enterFullScreen": "Volledig scherm weergeven",
"enterTileView": "Tegelweergave openen",
"exitFullScreen": "Volledig scherm sluiten",
@@ -951,7 +948,6 @@
"invite": "Personen uitnodigen",
"joinBreakoutRoom": "Deelnemen aan aparte vergaderruimte",
"leaveBreakoutRoom": "Aparte vergaderruimte verlaten",
"leaveConference": "Vergadering verlaten",
"lobbyButtonDisable": "Schakel lobby-modus uit",
"lobbyButtonEnable": "Schakel lobby-modus in",
"login": "Aanmelden",

Some files were not shown because too many files have changed in this diff Show More