Compare commits

...

34 Commits

Author SHA1 Message Date
Pawel Domas
e79ae56676 fix after rebase 2022-01-06 17:23:07 -06:00
Pawel Domas
aadb5ada8c wip 2022-01-06 17:23:06 -06:00
Pawel Domas
06b32d5014 update ljm 2022-01-06 17:03:35 -06:00
Pawel Domas
6c6c8010db force display video 2022-01-06 16:32:42 -06:00
Pawel Domas
c7911e32c2 fix video track selectors 2022-01-06 16:32:42 -06:00
Pawel Domas
30a22254ab Wip 2022-01-06 16:32:26 -06:00
Pawel Domas
e8e2b20758 fix camera button muted state 2022-01-06 16:30:00 -06:00
Pawel Domas
3327d4cf92 do not hide remote videos when someone is sharing the screen 2022-01-06 16:30:00 -06:00
Pawel Domas
2c8fe1b3ba select the last video track to be displayed in the speaker view 2022-01-06 16:30:00 -06:00
Pawel Domas
bfd37bb087 multiple video stream WiP 2022-01-06 16:29:56 -06:00
Jaya Allamsetty
29eb9452c0 fix(toolbox) Disable screensharing button on mobile for video sender limit.
Also, ignore the toggle screenshare shortcut when the video sender limit is reached.
2022-01-06 12:23:39 -05:00
Saúl Ibarra Corretgé
b8469545f3 fix(rn,android) adjust changed package names 2022-01-06 14:39:34 +01:00
Saúl Ibarra Corretgé
ba50ecec78 chore(deps) react-native-youtube-iframe @ 2.2.1 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
c88ac2f3bd chore(deps) react-native-webview @ 11.15.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
b6501412c4 chore(deps) react-native-watch-connectivity @ 1.0.4 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
188aff5aff chore(deps) react-native-video @ 5.2.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
2d683e4d41 chore(deps) react-native-url-polyfill @ 1.3.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
1c4a500c1c chore(deps) react-native-svg-transformer @ 1.0.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
29eb3c5347 chore(deps) react-native-splash-screen @ 3.3.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
656e0ba1e9 chore(deps) react-native-sound @ 0.11.1 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
50eb6563e3 chore(deps) react-native-performance @ 2.1.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
d290c1d11a chore(deps) react-native-get-random-values @ 1.7.2 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
5cbb526c04 chore(deps) react-native-device-info @ 8.4.8 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
06384b452b chore(deps) react-native-default-preference @ latest 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
36956810b1 chore(deps) react-native-collapsible @ 1.6.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
d161816972 chore(deps) react-native-callstats @ 3.73.7 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
50d33d068b chore(deps) react-native-calendar-events @ 2.2.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
e8939ba949 chore(deps) react-native-background-timer @ 2.4.1 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
bfc556f4df chore(deps) @react-native-community/slider @ 4.1.12 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
bac4afcdb4 chore(deps) @react-native-community/netinfo @ 7.1.7 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
8fd353f5f1 chore(deps) @react-native-google-signin/google-signin @ 7.0.4 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
f0b475e2bc chore(deps) @amplitude/react-native @ 2.7.0 2022-01-06 13:10:32 +01:00
Saúl Ibarra Corretgé
1d77c52f91 chore(deps) @react-native-async-storage/async-storage @ 1.15.14 2022-01-06 13:10:32 +01:00
José Luís Andrade
44e07cd7e2 fix(lang) update Portuguese translation 2022-01-06 12:59:32 +01:00
24 changed files with 1178 additions and 524 deletions

View File

@@ -177,7 +177,7 @@ class ReactInstanceManagerHolder {
= new ArrayList<>(Arrays.asList(
new com.reactnativecommunity.asyncstorage.AsyncStoragePackage(),
new com.ocetnik.timer.BackgroundTimerPackage(),
new com.calendarevents.CalendarEventsPackage(),
new com.calendarevents.RNCalendarEventsPackage(),
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),
new com.reactnativecommunity.clipboard.ClipboardPackage(),
@@ -219,7 +219,7 @@ class ReactInstanceManagerHolder {
// RNGoogleSigninPackage
try {
Class<?> googlePackageClass = Class.forName("co.apptailor.googlesignin.RNGoogleSigninPackage");
Class<?> googlePackageClass = Class.forName("com.reactnativegooglesignin.RNGoogleSigninPackage");
Constructor constructor = googlePackageClass.getConstructor();
packages.add((ReactPackage)constructor.newInstance());
} catch (Exception e) {

View File

@@ -22,7 +22,7 @@ project(':react-native-gesture-handler').projectDir = new File(rootProject.proje
include ':react-native-get-random-values'
project(':react-native-get-random-values').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-get-random-values/android')
include ':react-native-google-signin'
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/google-signin/android')
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-google-signin/google-signin/android')
include ':react-native-immersive'
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
include ':react-native-keep-awake'

View File

@@ -105,6 +105,7 @@ import {
updateSettings
} from './react/features/base/settings';
import {
addLocalTrack,
createLocalPresenterTrack,
createLocalTracksF,
destroyLocalTracks,
@@ -1911,7 +1912,24 @@ export default {
if (desktopVideoStream) {
logger.debug(`_switchToScreenSharing is using ${desktopVideoStream} for useVideoStream`);
await this.useVideoStream(desktopVideoStream);
await new Promise((resolve, reject) => {
_replaceLocalVideoTrackQueue.enqueue(onFinish => {
APP.store.dispatch(
addLocalTrack(desktopVideoStream))
.then(() => {
this._setSharingScreen(desktopVideoStream);
// TODO FIXME
// this.setVideoMuteStatus();
})
.then(resolve)
.catch(error => {
logger.error(`_switchToScreenSharing failed: ${error}`);
reject(error);
})
.then(onFinish);
});
});
}
if (this._desktopAudioStream) {

View File

@@ -56,7 +56,6 @@ target 'JitsiMeetSDK' do
pod 'amplitude-react-native', :path => '../node_modules/@amplitude/react-native'
pod 'react-native-background-timer', :path => '../node_modules/react-native-background-timer'
pod 'react-native-calendar-events', :path => '../node_modules/react-native-calendar-events'
pod 'react-native-get-random-values', :path => '../node_modules/react-native-get-random-values'
pod 'react-native-keep-awake', :path => '../node_modules/react-native-keep-awake'
pod 'react-native-netinfo', :path => '../node_modules/@react-native-community/netinfo'
@@ -68,12 +67,13 @@ target 'JitsiMeetSDK' do
pod 'react-native-webview', :path => '../node_modules/react-native-webview'
pod 'react-native-webrtc', :path => '../node_modules/react-native-webrtc'
pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-async-storage/async-storage'
pod 'RNCalendarEvents', :path => '../node_modules/react-native-calendar-events'
pod 'RNCClipboard', :path => '../node_modules/@react-native-community/clipboard'
pod 'RNCMaskedView', :path => '../node_modules/@react-native-masked-view/masked-view'
pod 'RNDefaultPreference', :path => '../node_modules/react-native-default-preference'
pod 'RNDeviceInfo', :path => '../node_modules/react-native-device-info'
pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler'
pod 'RNGoogleSignin', :path => '../node_modules/@react-native-community/google-signin'
pod 'RNGoogleSignin', :path => '../node_modules/@react-native-google-signin/google-signin'
pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'
pod 'RNScreens', :path => '../node_modules/react-native-screens'
pod 'RNSound', :path => '../node_modules/react-native-sound'

View File

@@ -1,7 +1,7 @@
PODS:
- Amplitude (8.2.0)
- amplitude-react-native (2.3.3):
- Amplitude (= 8.2.0)
- Amplitude (8.7.1)
- amplitude-react-native (2.7.0):
- Amplitude (= 8.7.1)
- React-Core
- AppAuth (1.4.0):
- AppAuth/Core (= 1.4.0)
@@ -83,8 +83,8 @@ PODS:
- nanopb (~> 1.30906.0)
- GoogleDataTransport (7.5.1):
- nanopb (~> 1.30906.0)
- GoogleSignIn (5.0.2):
- AppAuth (~> 1.2)
- GoogleSignIn (6.0.2):
- AppAuth (~> 1.4)
- GTMAppAuth (~> 1.0)
- GTMSessionFetcher/Core (~> 1.1)
- GoogleUtilities/AppDelegateSwizzler (6.7.2):
@@ -280,32 +280,30 @@ PODS:
- React-cxxreact (= 0.61.5-jitsi.2)
- React-jsi (= 0.61.5-jitsi.2)
- React-jsinspector (0.61.5-jitsi.2)
- react-native-background-timer (2.4.0):
- React
- react-native-calendar-events (2.0.0):
- React
- react-native-get-random-values (1.7.0):
- react-native-background-timer (2.4.1):
- React-Core
- react-native-get-random-values (1.7.2):
- React-Core
- react-native-keep-awake (4.0.0):
- React
- react-native-netinfo (4.1.5):
- React
- react-native-performance (2.0.0):
- react-native-netinfo (7.1.7):
- React-Core
- react-native-performance (2.1.0):
- React-Core
- react-native-safe-area-context (3.3.2):
- React-Core
- react-native-slider (3.0.3):
- React
- react-native-splash-screen (3.2.0):
- React
- react-native-video (5.1.1):
- react-native-slider (4.1.12):
- React-Core
- react-native-video/Video (= 5.1.1)
- react-native-video/Video (5.1.1):
- react-native-splash-screen (3.3.0):
- React-Core
- react-native-video (5.2.0):
- React-Core
- react-native-video/Video (= 5.2.0)
- react-native-video/Video (5.2.0):
- React-Core
- react-native-webrtc (1.94.1):
- React-Core
- react-native-webview (11.0.2):
- react-native-webview (11.15.0):
- React-Core
- React-RCTActionSheet (0.61.5-jitsi.2):
- React-Core/RCTActionSheetHeaders (= 0.61.5-jitsi.2)
@@ -361,33 +359,35 @@ PODS:
- React-jsi (= 0.61.5-jitsi.2)
- ReactCommon/jscallinvoker (= 0.61.5-jitsi.2)
- ReactCommon/turbomodule/core (= 0.61.5-jitsi.2)
- RNCAsyncStorage (1.15.5):
- RNCalendarEvents (2.2.0):
- React
- RNCAsyncStorage (1.15.14):
- React-Core
- RNCClipboard (1.5.1):
- React-Core
- RNCMaskedView (0.2.6):
- React-Core
- RNDefaultPreference (1.4.2):
- React
- RNDeviceInfo (8.0.0):
- RNDefaultPreference (1.4.3):
- React-Core
- RNDeviceInfo (8.4.8):
- React-Core
- RNGestureHandler (1.10.3):
- React-Core
- RNGoogleSignin (3.0.1):
- GoogleSignIn (~> 5.0.0)
- React
- RNGoogleSignin (7.0.4):
- GoogleSignIn (~> 6.0.0)
- React-Core
- RNReanimated (1.13.3):
- React-Core
- RNScreens (2.18.1):
- React-Core
- RNSound (0.11.0):
- React
- RNSound/Core (= 0.11.0)
- RNSound/Core (0.11.0):
- React
- RNSound (0.11.1):
- React-Core
- RNSound/Core (= 0.11.1)
- RNSound/Core (0.11.1):
- React-Core
- RNSVG (12.1.0):
- React
- RNWatch (0.4.3):
- RNWatch (1.0.4):
- React
- Yoga (1.14.0)
@@ -415,7 +415,6 @@ DEPENDENCIES:
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
- react-native-background-timer (from `../node_modules/react-native-background-timer`)
- react-native-calendar-events (from `../node_modules/react-native-calendar-events`)
- react-native-get-random-values (from `../node_modules/react-native-get-random-values`)
- react-native-keep-awake (from `../node_modules/react-native-keep-awake`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
@@ -436,13 +435,14 @@ DEPENDENCIES:
- React-RCTText (from `../node_modules/react-native/Libraries/Text`)
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- ReactCommon/turbomodule (from `../node_modules/react-native/ReactCommon`)
- 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`)
- "RNGoogleSignin (from `../node_modules/@react-native-community/google-signin`)"
- "RNGoogleSignin (from `../node_modules/@react-native-google-signin/google-signin`)"
- RNReanimated (from `../node_modules/react-native-reanimated`)
- RNScreens (from `../node_modules/react-native-screens`)
- RNSound (from `../node_modules/react-native-sound`)
@@ -506,8 +506,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/jsinspector"
react-native-background-timer:
:path: "../node_modules/react-native-background-timer"
react-native-calendar-events:
:path: "../node_modules/react-native-calendar-events"
react-native-get-random-values:
:path: "../node_modules/react-native-get-random-values"
react-native-keep-awake:
@@ -548,6 +546,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/Libraries/Vibration"
ReactCommon:
:path: "../node_modules/react-native/ReactCommon"
RNCalendarEvents:
:path: "../node_modules/react-native-calendar-events"
RNCAsyncStorage:
:path: "../node_modules/@react-native-async-storage/async-storage"
RNCClipboard:
@@ -561,7 +561,7 @@ EXTERNAL SOURCES:
RNGestureHandler:
:path: "../node_modules/react-native-gesture-handler"
RNGoogleSignin:
:path: "../node_modules/@react-native-community/google-signin"
:path: "../node_modules/@react-native-google-signin/google-signin"
RNReanimated:
:path: "../node_modules/react-native-reanimated"
RNScreens:
@@ -576,8 +576,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
Amplitude: 263118b9e691e73a1c864b05bb08a3aff3636d16
amplitude-react-native: 9369759dc6d01590aeb6261f714d53beaebc7e6f
Amplitude: 834c7332dfb9640a751e21c13efb22a07c0c12d4
amplitude-react-native: 0ed8cab759aafaa94961b82122bf56297da607ad
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
@@ -595,7 +595,7 @@ SPEC CHECKSUMS:
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
GoogleAppMeasurement: 966e88df9d19c15715137bb2ddaf52373f111436
GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833
GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213
GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
@@ -611,18 +611,17 @@ SPEC CHECKSUMS:
React-jsi: ddb471a56185e4007835a1bba0882ecb5ce3dc0e
React-jsiexecutor: 67106691c60030ec888d7cbbc4f48a3168e27a02
React-jsinspector: 92ceee6c66dc19886289b52436ade7e020b89602
react-native-background-timer: 029c606b3fd6dd476b153e177c518b6ade4c169f
react-native-calendar-events: 82dc6c915653a1a8a266e43fdbbfdb3b1022ca99
react-native-get-random-values: 237bffb1c7e05fb142092681531810a29ba53015
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
react-native-netinfo: 0e563248a4b9a99c33ec29bd03c2d50767db22a6
react-native-performance: 6bd6cfac80594775fb782405fceaaf206becf53b
react-native-netinfo: 27f287f2d191693f3b9d01a4273137fcf91c3b5d
react-native-performance: f4b6604a9d5a8a7407e34a82fab6c641d9a3ec12
react-native-safe-area-context: 584dc04881deb49474363f3be89e4ca0e854c057
react-native-slider: e99fc201cefe81270fc9d81714a7a0f5e566b168
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-video: 0bb76b6d6b77da3009611586c7dbf817b947f30e
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
react-native-video: a4c2635d0802f983594b7057e1bce8f442f0ad28
react-native-webrtc: 2f20515f3ebb9dbf1f2aad638cc7573396cf948f
react-native-webview: dfd7202ff115c44d3ea401c2f36122fb3ac79f07
react-native-webview: e89bf2dba26a04cda967814df3ed1be99f291233
React-RCTActionSheet: bcbc311dc3b47bc8efb2737ff0940239a45789a9
React-RCTAnimation: 65f61080ce632f6dea23d52e354ffac9948396c6
React-RCTBlob: 70d88f7b68b5c44953cdb286ac2e36a7a509a97e
@@ -633,20 +632,21 @@ SPEC CHECKSUMS:
React-RCTText: 4f1b99f228278d2a5e9008eced8dc9c974c4a270
React-RCTVibration: c1041024893fdfdb8371e7c720c437751b711676
ReactCommon: 18014e1d98dbeb9141e935cfe35fc93bd511ffb6
RNCAsyncStorage: 56a3355a10b5d660c48c6e37325ac85ebfd09885
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
RNCAsyncStorage: ea6b5c280997b2b32a587793163b1f10e580c4f7
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
RNDefaultPreference: 1f8133ec0bc0f9453cdada578564ba1ef551fb44
RNDeviceInfo: 87d2d175c760f6bcf58acd036f887e8b2392802c
RNDefaultPreference: 326860d42a681bfd7338c8f6d061cf58745bd860
RNDeviceInfo: 0400a6d0c94186d1120c3cbd97b23abc022187a9
RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211
RNGoogleSignin: 39336070b35fc4cea6a98cf111e00480317be0ae
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
RNReanimated: 514a11da3a2bcc6c3dfd9de32b38e2b9bf101926
RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d
RNSound: da030221e6ac7e8290c6b43f2b5f2133a8e225b0
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
RNWatch: 99637948ec9b5c9ec5a41920642594ad5ba07e80
Yoga: 96b469c5e81ff51b917b92e8c3390642d4ded30c
PODFILE CHECKSUM: 0cfc1f35e2872ceb0a86252e14e226bd489a2602
PODFILE CHECKSUM: 2e6a49cec4d0e9eb135654df2dddb3448d26cb4a
COCOAPODS: 1.11.2

View File

@@ -407,8 +407,8 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK-resources.sh",
"${PODS_ROOT}/Amplitude/Sources/Amplitude/Resources/ComodoRsaDomainValidationCA.der",
"${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle",
"${PODS_ROOT}/Amplitude/Sources/Resources/ComodoRsaDomainValidationCA.der",
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (

View File

@@ -1,32 +1,54 @@
{
"en": "Inglês",
"af": "Africâner",
"af": "Africânder",
"ar": "Árabe",
"bg": "Búlgaro",
"ca": "Catalão",
"cs": "Checo",
"da": "Dinamarquês",
"de": "Alemão",
"el": "Grego",
"enGB": "Inglês (Reino Unido)",
"eo": "Esperanto",
"es": "Espanhol",
"esUS": "Espanhol (América Latina)",
"et": "Estónio",
"eu": "Basco",
"fi": "Finlandês",
"fr": "Francês",
"frCA": "Francês (Canadá)",
"he": "Hebraico",
"hi": "Hindu",
"mr":"Marata",
"hr": "Croata",
"hu": "Húngaro",
"hy": "Armênio",
"hy": "Arménio",
"id": "Indonésio",
"it": "Italiano",
"ja": "Japonês",
"kab": "Cabila",
"ko": "Coreano",
"lt": "Lituano",
"ml": "Malaio",
"lv": "Letão",
"nl": "Holandês",
"oc": "Occitano",
"pl": "Polonês",
"fa": "Persa",
"pl": "Polaco",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ru": "Russo",
"ro": "Romeno",
"sc": "Sardo",
"sk": "Eslovaco",
"sl": "Esloveno",
"sr": "Sérvio",
"sq": "Albanês",
"sv": "Sueco",
"te": "Telugu",
"th": "Tailandês",
"tr": "Turco",
"uk": "Ucraniano",
"vi": "Vietnamita",
"zhCN": "Chinês (China)",
"zhTW": "Chinês (Taiwan)"

View File

@@ -7,7 +7,10 @@ import {
getPinnedParticipant,
getParticipantById
} from '../../../react/features/base/participants';
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
import {
getLastTrackByMediaTypeAndParticipant,
getTrackByMediaTypeAndParticipant
} from '../../../react/features/base/tracks';
import LargeVideoManager from './LargeVideoManager';
import { VIDEO_CONTAINER_TYPE } from './VideoContainer';
@@ -177,7 +180,7 @@ const VideoLayout = {
const currentContainerType = largeVideo.getCurrentContainerType();
const isOnLarge = this.isCurrentlyOnLarge(id);
const state = APP.store.getState();
const videoTrack = getTrackByMediaTypeAndParticipant(state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
const videoTrack = getLastTrackByMediaTypeAndParticipant(state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
const videoStream = videoTrack?.jitsiTrack;
if (isOnLarge && !forceUpdate

1282
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@
"author": "",
"readmeFilename": "README.md",
"dependencies": {
"@amplitude/react-native": "2.3.3",
"@amplitude/react-native": "2.7.0",
"@atlaskit/button": "15.1.4",
"@atlaskit/checkbox": "12.0.0",
"@atlaskit/dropdown-menu": "10.1.2",
@@ -40,11 +40,11 @@
"@material-ui/core": "4.11.3",
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
"@microsoft/microsoft-graph-client": "1.1.0",
"@react-native-async-storage/async-storage": "1.15.5",
"@react-native-async-storage/async-storage": "1.15.14",
"@react-native-community/clipboard": "1.5.1",
"@react-native-community/google-signin": "3.0.1",
"@react-native-community/netinfo": "4.1.5",
"@react-native-community/slider": "3.0.3",
"@react-native-community/netinfo": "7.1.7",
"@react-native-community/slider": "4.1.12",
"@react-native-google-signin/google-signin": "7.0.4",
"@react-native-masked-view/masked-view": "0.2.6",
"@react-navigation/bottom-tabs": "5.11.15",
"@react-navigation/drawer": "5.12.9",
@@ -71,7 +71,7 @@
"jquery-i18next": "1.2.1",
"js-md5": "0.6.1",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#55a03ac1b52f85dcbd9bfe339690ad88436ac029",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#720985f944233df1fe189183d1b7d2789fb50b67",
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.21",
"moment": "2.29.1",
@@ -86,32 +86,32 @@
"react-i18next": "10.11.4",
"react-linkify": "1.0.0-alpha",
"react-native": "github:jitsi/react-native#891986ec5ecaef65d1c8a7fe472f86cf84fe7551",
"react-native-background-timer": "2.4.0",
"react-native-calendar-events": "github:jitsi/react-native-calendar-events#df48ecdc4e1e90c5352f803ddbab1fa7269b74a7",
"react-native-callstats": "3.70.1",
"react-native-collapsible": "1.5.1",
"react-native-default-preference": "1.4.2",
"react-native-device-info": "8.0.0",
"react-native-background-timer": "2.4.1",
"react-native-calendar-events": "2.2.0",
"react-native-callstats": "3.73.7",
"react-native-collapsible": "1.6.0",
"react-native-default-preference": "github:kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
"react-native-device-info": "8.4.8",
"react-native-gesture-handler": "1.10.3",
"react-native-get-random-values": "1.7.0",
"react-native-get-random-values": "1.7.2",
"react-native-immersive": "2.0.0",
"react-native-keep-awake": "4.0.0",
"react-native-paper": "4.8.1",
"react-native-performance": "2.0.0",
"react-native-performance": "2.1.0",
"react-native-reanimated": "1.13.3",
"react-native-safe-area-context": "3.3.2",
"react-native-screens": "2.18.1",
"react-native-sound": "github:jitsi/react-native-sound#3fe5480fce935e888d5089d94a191c7c7e3aa190",
"react-native-splash-screen": "3.2.0",
"react-native-sound": "0.11.1",
"react-native-splash-screen": "3.3.0",
"react-native-svg": "12.1.0",
"react-native-svg-transformer": "0.14.3",
"react-native-svg-transformer": "1.0.0",
"react-native-tab-view": "2.16.0",
"react-native-url-polyfill": "1.2.0",
"react-native-video": "5.1.1",
"react-native-watch-connectivity": "0.4.3",
"react-native-url-polyfill": "1.3.0",
"react-native-video": "5.2.0",
"react-native-watch-connectivity": "1.0.4",
"react-native-webrtc": "1.94.1",
"react-native-webview": "11.0.2",
"react-native-youtube-iframe": "2.1.1",
"react-native-webview": "11.15.0",
"react-native-youtube-iframe": "2.2.1",
"react-redux": "7.1.0",
"react-textarea-autosize": "8.3.0",
"react-transition-group": "2.4.0",

View File

@@ -5,6 +5,7 @@ import {
sendAnalytics
} from '../../analytics';
import { NOTIFICATION_TIMEOUT_TYPE, showErrorNotification, showNotification } from '../../notifications';
import { getCurrentConference } from '../conference';
import { JitsiTrackErrors, JitsiTrackEvents, createLocalTrack } from '../lib-jitsi-meet';
import {
CAMERA_FACING_MODE,
@@ -312,6 +313,19 @@ export function replaceLocalTrack(oldTrack, newTrack, conference) {
};
}
// eslint-disable-next-line require-jsdoc
export function addLocalTrack(newTrack) {
return async (dispatch, getState) => {
const conference = getCurrentConference(getState());
if (conference) {
await conference.addTrack(newTrack);
}
return dispatch(_addTracks([ newTrack ]));
};
}
/**
* Replaces a stored track with another.
*

View File

@@ -346,6 +346,18 @@ export function getLocalVideoTrack(tracks) {
return getLocalTrack(tracks, MEDIA_TYPE.VIDEO);
}
// eslint-disable-next-line require-jsdoc
export function getLocalCameraTrack(tracks) {
return getLocalTracks(tracks, false)
.find(t => t.videoType === VIDEO_TYPE.CAMERA);
}
// eslint-disable-next-line require-jsdoc
export function getLocalScreenTrack(tracks) {
return getLocalTracks(tracks, false)
.find(t => t.videoType === VIDEO_TYPE.DESKTOP);
}
/**
* Returns the media type of the local video, presenter or video.
*
@@ -399,6 +411,39 @@ export function getTrackByMediaTypeAndParticipant(
);
}
// eslint-disable-next-line require-jsdoc
export function getParticipantsCameraTrack(tracks, participantId) {
return tracks.find(
t => Boolean(t.jitsiTrack)
&& t.participantId === participantId
&& t.mediaType === MEDIA_TYPE.VIDEO
&& (t.videoType === undefined || t.videoType === VIDEO_TYPE.CAMERA)
);
}
// eslint-disable-next-line require-jsdoc
export function getParticipantsScreenTrack(tracks, participantId) {
return tracks.find(
t => Boolean(t.jitsiTrack)
&& t.participantId === participantId
&& t.mediaType === MEDIA_TYPE.VIDEO
&& t.videoType === VIDEO_TYPE.DESKTOP
);
}
// eslint-disable-next-line require-jsdoc
export function getLastTrackByMediaTypeAndParticipant(
tracks,
mediaType,
participantId) {
const userTracks = tracks.filter(
t => Boolean(t.jitsiTrack) && t.participantId === participantId && t.mediaType === mediaType
);
const selected = userTracks[userTracks.length - 1];
return selected;
}
/**
* Returns track source name of specified media type for specified participant id.
*
@@ -450,16 +495,15 @@ export function getTracksByMediaType(tracks, mediaType) {
*/
export function isLocalCameraTrackMuted(tracks) {
const presenterTrack = getLocalTrack(tracks, MEDIA_TYPE.PRESENTER);
const videoTrack = getLocalTrack(tracks, MEDIA_TYPE.VIDEO);
const localCameraTrack = getLocalCameraTrack(tracks);
// Make sure we check the mute status of only camera tracks, i.e.,
// presenter track when it exists, camera track when the presenter
// track doesn't exist.
if (presenterTrack) {
return isLocalTrackMuted(tracks, MEDIA_TYPE.PRESENTER);
} else if (videoTrack) {
return videoTrack.videoType === 'camera'
? isLocalTrackMuted(tracks, MEDIA_TYPE.VIDEO) : true;
} else if (localCameraTrack) {
return localCameraTrack.muted;
}
return true;

View File

@@ -130,9 +130,13 @@ ReducerRegistry.register('features/base/tracks', (state = [], action) => {
let withoutTrackStub = state;
if (action.track.local) {
withoutTrackStub
= state.filter(
t => !t.local || t.mediaType !== action.track.mediaType);
// FIXME verify if it's working as expected
// The track stubs were introduced to track get user media in progress state.
// Now this check will be over complicated with multiple tracks per type.
withoutTrackStub = state.filter(
t => !t.local
|| t.mediaType !== action.track.mediaType
|| (t.jitsiTrack && t.jitsiTrack !== action.track.jitsiTrack));
}
return [ ...withoutTrackStub, action.track ];

View File

@@ -128,12 +128,12 @@ export function _fetchCalendarEntries(
*/
function _ensureCalendarAccess(promptForPermission, dispatch) {
return new Promise((resolve, reject) => {
RNCalendarEvents.authorizationStatus()
RNCalendarEvents.checkPermissions()
.then(status => {
if (status === 'authorized') {
resolve(true);
} else if (promptForPermission) {
RNCalendarEvents.authorizeEventStore()
RNCalendarEvents.requestPermissions()
.then(result => {
dispatch(setCalendarAuthorization(result));
resolve(result === 'authorized');

View File

@@ -571,7 +571,9 @@ function _mapStateToProps(state) {
const enableThumbnailReordering = testing.enableThumbnailReordering ?? true;
const { visible, remoteParticipants } = state['features/filmstrip'];
const reduceHeight = state['features/toolbox'].visible && toolbarButtons.length;
const remoteVideosVisible = shouldRemoteVideosBeVisible(state);
// TODO remove
// Forced true to stop hiding presenter's camera
const remoteVideosVisible = true;
const { isOpen: shiftRight } = state['features/chat'];
const {
gridDimensions = {},

View File

@@ -17,8 +17,8 @@ import { connect } from '../../../base/redux';
import { ASPECT_RATIO_NARROW } from '../../../base/responsive-ui/constants';
import { isTestModeEnabled } from '../../../base/testing';
import {
getLocalAudioTrack,
getLocalVideoTrack,
getLocalAudioTrack, getLocalCameraTrack, getLocalScreenTrack,
getLocalVideoTrack, getParticipantsCameraTrack, getParticipantsScreenTrack,
getTrackByMediaTypeAndParticipant,
updateLastTrackVideoMediaEvent
} from '../../../base/tracks';
@@ -192,7 +192,9 @@ export type Props = {|
/**
* Styles that will be set to the Thumbnail's main span element.
*/
style?: ?Object
style?: ?Object,
_hasOnlyScreenStream: boolean,
|};
const defaultStyles = theme => {
@@ -369,14 +371,14 @@ class Thumbnail extends Component<Props, State> {
const {
_currentLayout,
_isAudioOnly,
_isScreenSharing
_videoTrack
} = this.props;
const { displayMode } = this.state;
const tileViewActive = _currentLayout === LAYOUTS.TILE_VIEW;
if (!(DISPLAY_VIDEO === displayMode)
&& tileViewActive
&& _isScreenSharing
&& _videoTrack && _videoTrack.videoType === VIDEO_TYPE.DESKTOP
&& !_isAudioOnly) {
sendAnalytics(createScreenSharingIssueEvent({
source: 'thumbnail',
@@ -901,8 +903,9 @@ function _mapStateToProps(state, ownProps): Object {
const id = participant?.id;
const isLocal = participant?.local ?? true;
const tracks = state['features/base/tracks'];
const _videoTrack = isLocal
? getLocalVideoTrack(tracks) : getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.VIDEO, participantID);
const _cameraTrack = isLocal ? getLocalCameraTrack(tracks) : getParticipantsCameraTrack(tracks, participantID);
const _screenTrack = isLocal ? getLocalScreenTrack(tracks) : getParticipantsScreenTrack(tracks, participantID);
const _videoTrack = _cameraTrack || _screenTrack;
const _audioTrack = isLocal
? getLocalAudioTrack(tracks) : getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.AUDIO, participantID);
const _currentLayout = getCurrentLayout(state);
@@ -969,6 +972,7 @@ function _mapStateToProps(state, ownProps): Object {
_isMobile,
_isMobilePortrait,
_isScreenSharing: _videoTrack?.videoType === 'desktop',
_hasOnlyScreenStream: Boolean(_screenTrack) && !_cameraTrack,
_isTestModeEnabled: isTestModeEnabled(state),
_isVideoPlayable: id && isVideoPlayable(state, id),
_localFlipX: Boolean(localFlipX),

View File

@@ -295,14 +295,17 @@ export function computeDisplayModeFromInput(input: Object) {
const {
isAudioOnly,
isCurrentlyOnLargeVideo,
isScreenSharing,
hasOnlyScreenStream,
canPlayEventReceived,
isRemoteParticipant,
tileViewActive
} = input;
const adjustedIsVideoPlayable = input.isVideoPlayable && (!isRemoteParticipant || canPlayEventReceived);
if (!tileViewActive && isScreenSharing && isRemoteParticipant) {
// TODO fix the logic to work with multiple streams
return DISPLAY_VIDEO;
if (!tileViewActive && hasOnlyScreenStream && isRemoteParticipant) {
return DISPLAY_AVATAR;
} else if (isCurrentlyOnLargeVideo && !tileViewActive) {
// Display name is always and only displayed when user is on the stage
@@ -326,6 +329,7 @@ export function computeDisplayModeFromInput(input: Object) {
export function getDisplayModeInput(props: Object, state: Object) {
const {
_currentLayout,
_hasOnlyScreenStream,
_isAudioOnly,
_isCurrentlyOnLargeVideo,
_isScreenSharing,
@@ -346,6 +350,7 @@ export function getDisplayModeInput(props: Object, state: Object) {
videoStream: Boolean(_videoTrack),
isRemoteParticipant: !_participant?.isFakeParticipant && !_participant?.local,
isScreenSharing: _isScreenSharing,
hasOnlyScreenStream: _hasOnlyScreenStream,
videoStreamMuted: _videoTrack ? _videoTrack.muted : 'no stream'
};
}

View File

@@ -5,7 +5,7 @@ import { NativeModules } from 'react-native';
let GoogleSignin;
if (NativeModules.RNGoogleSignin) {
GoogleSignin = require('@react-native-community/google-signin').GoogleSignin;
GoogleSignin = require('@react-native-google-signin/google-signin').GoogleSignin;
}
import {
@@ -19,7 +19,7 @@ import {
* the export object is similar so no need for different export logic.
*
* For more detailed documentation of the {@code GoogleSignin} API, please visit
* https://github.com/react-native-community/react-native-google-signin.
* https://github.com/@react-native-google-signin/google-signin.
*/
class GoogleApi {
/**

View File

@@ -1,7 +1,7 @@
// @flow
import { Platform } from 'react-native';
import * as watch from 'react-native-watch-connectivity';
import { updateApplicationContext, watchEvents } from 'react-native-watch-connectivity';
import { appNavigate } from '../../app/actions';
import { APP_WILL_MOUNT } from '../../base/app';
@@ -70,18 +70,12 @@ watchOSEnabled && MiddlewareRegistry.register(store => next => action => {
* @returns {void}
*/
function _appWillMount({ dispatch, getState }) {
watch.subscribeToWatchReachability((error, reachable) => {
watchEvents.addListener('reachability', reachable => {
dispatch(setWatchReachable(reachable));
_updateApplicationContext(getState);
});
watch.subscribeToMessages((error, message) => {
if (error) {
logger.error('watch.subscribeToMessages error:', error);
return;
}
watchEvents.addListener('message', message => {
const {
command,
sessionID
@@ -185,7 +179,7 @@ function _updateApplicationContext(stateful) {
}
try {
watch.updateApplicationContext({
updateApplicationContext({
conferenceTimestamp,
conferenceURL: getCurrentConferenceUrl(state),
micMuted: _isAudioMuted(state),

View File

@@ -4,6 +4,7 @@ import React from 'react';
import { Platform } from 'react-native';
import { connect } from '../../../base/redux';
import { isDesktopShareButtonDisabled } from '../../functions';
import ScreenSharingAndroidButton from './ScreenSharingAndroidButton.js';
import ScreenSharingIosButton from './ScreenSharingIosButton.js';
@@ -30,7 +31,7 @@ const ScreenSharingButton = props => (
* }}
*/
function _mapStateToProps(state): Object {
const disabled = state['features/base/audio-only'].enabled;
const disabled = state['features/base/audio-only'].enabled || isDesktopShareButtonDisabled(state);
return {
_disabled: disabled

View File

@@ -5,7 +5,8 @@ import { IconShareDesktop } from '../../../base/icons';
import JitsiMeetJS from '../../../base/lib-jitsi-meet/_';
import { connect } from '../../../base/redux';
import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components';
import { isScreenMediaShared, isScreenVideoShared } from '../../../screen-share';
import { isScreenVideoShared } from '../../../screen-share';
import { isDesktopShareButtonDisabled } from '../../functions';
type Props = AbstractButtonProps & {
@@ -97,15 +98,8 @@ class ShareDesktopButton extends AbstractButton<Props, *> {
* @returns {Object}
*/
const mapStateToProps = state => {
const { muted, unmuteBlocked } = state['features/base/media'].video;
const videoOrShareInProgress = isScreenMediaShared(state) || !muted;
// Disable the screenshare button if the video sender limit is reached and there is no video or media share in
// progress.
let desktopSharingEnabled = JitsiMeetJS.isDesktopSharingEnabled()
&& !(unmuteBlocked && !videoOrShareInProgress);
let desktopSharingEnabled = JitsiMeetJS.isDesktopSharingEnabled();
const { enableFeaturesBasedOnToken } = state['features/base/config'];
let desktopSharingDisabledTooltipKey;
if (enableFeaturesBasedOnToken) {
@@ -115,6 +109,10 @@ const mapStateToProps = state => {
desktopSharingDisabledTooltipKey = 'dialog.shareYourScreenDisabled';
}
// Disable the screenshare button if the video sender limit is reached and there is no video or media share in
// progress.
desktopSharingEnabled = desktopSharingEnabled && !isDesktopShareButtonDisabled(state);
return {
_desktopSharingDisabledTooltipKey: desktopSharingDisabledTooltipKey,
_desktopSharingEnabled: desktopSharingEnabled,

View File

@@ -77,7 +77,7 @@ import {
showToolbox
} from '../../actions';
import { THRESHOLDS, NOT_APPLICABLE, DRAWER_MAX_HEIGHT, NOTIFY_CLICK_MODE } from '../../constants';
import { isToolboxVisible } from '../../functions';
import { isDesktopShareButtonDisabled, isToolboxVisible } from '../../functions';
import DownloadButton from '../DownloadButton';
import HangupButton from '../HangupButton';
import HelpButton from '../HelpButton';
@@ -123,6 +123,11 @@ type Props = {
*/
_conference: Object,
/**
* Whether or not screensharing button is disabled.
*/
_desktopSharingButtonDisabled: boolean,
/**
* The tooltip key to use when screensharing is disabled. Or undefined
* if non to be shown and the button to be hidden.
@@ -537,6 +542,7 @@ class Toolbox extends Component<Props> {
_doToggleScreenshare() {
const {
_backgroundType,
_desktopSharingButtonDisabled,
_desktopSharingEnabled,
_localVideo,
_virtualSource,
@@ -558,7 +564,7 @@ class Toolbox extends Component<Props> {
return;
}
if (_desktopSharingEnabled) {
if (_desktopSharingEnabled && !_desktopSharingButtonDisabled) {
dispatch(startScreenShareFlow());
}
}
@@ -1059,6 +1065,10 @@ class Toolbox extends Component<Props> {
* @returns {void}
*/
_onShortcutToggleScreenshare() {
// Ignore the shortcut if the button is disabled.
if (this.props._desktopSharingButtonDisabled) {
return;
}
sendAnalytics(createShortcutEvent(
'toggle.screen.sharing',
ACTION_SHORTCUT_TRIGGERED,
@@ -1377,6 +1387,7 @@ function _mapStateToProps(state, ownProps) {
_clientWidth: clientWidth,
_conference: conference,
_desktopSharingEnabled: desktopSharingEnabled,
_desktopSharingButtonDisabled: isDesktopShareButtonDisabled(state),
_desktopSharingDisabledTooltipKey: desktopSharingDisabledTooltipKey,
_dialog: Boolean(state['features/base/dialog'].component),
_feedbackConfigured: Boolean(callStatsID),

View File

@@ -53,6 +53,19 @@ export function getMovableButtons(width: number): Set<string> {
return new Set(buttons);
}
/**
* Indicates if the desktop share button is disabled or not.
*
* @param {Object} state - The state from the Redux store.
* @returns {boolean}
*/
export function isDesktopShareButtonDisabled(state: Object) {
const { muted, unmuteBlocked } = state['features/base/media'].video;
const videoOrShareInProgress = !muted || isLocalVideoTrackDesktop(state);
return unmuteBlocked && !videoOrShareInProgress;
}
/**
* Returns true if the toolbox is visible.
*

View File

@@ -1,7 +1,7 @@
// @flow
import { getToolbarButtons } from '../base/config';
import { hasAvailableDevices } from '../base/devices';
import { isScreenMediaShared } from '../screen-share/functions';
import { TOOLBAR_TIMEOUT } from './constants';
@@ -66,6 +66,19 @@ export function isAudioSettingsButtonDisabled(state: Object) {
|| state['features/base/config'].startSilent;
}
/**
* Indicates if the desktop share button is disabled or not.
*
* @param {Object} state - The state from the Redux store.
* @returns {boolean}
*/
export function isDesktopShareButtonDisabled(state: Object) {
const { muted, unmuteBlocked } = state['features/base/media'].video;
const videoOrShareInProgress = !muted || isScreenMediaShared(state);
return unmuteBlocked && !videoOrShareInProgress;
}
/**
* Indicates if the video settings button is disabled or not.
*