Compare commits

...

372 Commits
4792 ... 5074

Author SHA1 Message Date
Avram Tudor
34bc3c9533 Merge pull request #9395 from jitsi/tavram/invert-flag
fix(api) invert filmstrip autohide flag
2021-06-15 16:25:48 +03:00
Tudor-Ovidiu Avram
2eedc2945d fix(api) invert filmstrip autohide flag 2021-06-15 16:09:01 +03:00
hmuresan
342dd4ceca feat(replace-participant): Replace participant with same jwt in the conf
- update lib-jitsi-meet to version with support for replacing participant
2021-06-15 14:24:12 +03:00
Calinteodor
60188794b5 fix(authentication) language display problem resolved #9385 (#9390) 2021-06-14 08:03:27 -05:00
hmuresan
cafefecea5 feat(external_api) Expose command for toggling background dlg 2021-06-14 14:33:34 +03:00
Avram Tudor
9d22da823e Merge pull request #9368 from jitsi/tavram/mousemove
feat(api) expose event for mouse movements inside the iframe
2021-06-14 11:22:22 +03:00
Tudor-Ovidiu Avram
b2985934f7 fix(share-video) fix backwards compatibility issue 2021-06-11 08:37:01 -05:00
tmoldovan8x8
51a996d0e0 fix(rn): adds check for blur function on currentTarget 2021-06-11 13:53:10 +03:00
Jaya Allamsetty
2549f83313 chore(deps) lib-jitsi-meet@latest
* fix(TPC): fix local resolution/fps stats. Browsers do not generate a 'msid' attribute for ssrcs in unified plan mode, use mediaType as a key for the TrackSSRCInfo map.
* fix(recording): Send participant id when recording starts/stops (#1632)

8057f12a39...2259d44185
2021-06-10 17:42:33 -04:00
Tudor-Ovidiu Avram
6b095b9794 feat(api) allow always hiding remote videos for 1-1 calls 2021-06-10 13:43:23 -05:00
SiderealArt
d4b6ac6c3a Update languages-zhTW.json 2021-06-10 13:35:28 -05:00
SiderealArt
e6b5deade2 Fix Thailand to Thai 2021-06-10 13:35:16 -05:00
Tudor-Ovidiu Avram
7f04767566 feat(api) expose event for mouse movements inside the iframe 2021-06-10 17:45:28 +03:00
Steffen Kolmer
e9675453e1 feat: Make Jitsi WCAG 2.1 compliant (#8921)
* Make Jitsi WCAG 2.1 compliant

* Fixed password form keypress handling

* Added keypress handler to name form

* Removed unneccessary dom query

* Fixed mouse hove style

* Removed obsolete css rules

* accessibilty background feature

* Merge remote-tracking branch 'upstream/master' into nic/fix/merge-conflicts

* fix error

* add german translation

* Fixed merge issue

* Add id prop back to device selection

* Fixed lockfile

Co-authored-by: AHMAD KADRI <52747422+ahmadkadri@users.noreply.github.com>
2021-06-10 07:48:44 -05:00
Avram Tudor
76f1fe8457 Merge pull request #9374 from jitsi/tavram/config-autohide-filmstrip
feat(api) allow filmstrip autohide to be configurable
2021-06-10 12:44:37 +03:00
Tudor-Ovidiu Avram
a1e8f36f4f feat(api) allow filmstrip autohide to be configurable 2021-06-10 12:12:01 +03:00
Avram Tudor
1d4e40b49f Merge pull request #9371 from alexbumbu/fix_deeplinking
fix(vpaas) enable deeplinking
2021-06-10 11:33:55 +03:00
Jaya Allamsetty
440e7844c8 chore(deps) lib-jitsi-meet@latest
* fix(connectivity): Fix video freezes on Safari when ep goes out of last-n.

a1b870c616...8057f12a39
2021-06-09 18:32:55 -04:00
alittriutari
a3a9eab57a Update main-ja.json 2021-06-09 12:54:07 -05:00
Alex Bumbu
e2a4d0d42d fix(vpaas) enable deeplinking 2021-06-09 17:46:56 +03:00
Vlad Piersec
913d7e89dd feat(participants-pane): Add 'admit all' knocking participants button 2021-06-09 16:28:31 +03:00
Vlad Piersec
db9b8784ac fix(participants-pane): Don't show 'grant moderator' action if already moderator 2021-06-09 15:09:05 +03:00
Mihai-Andrei Uscat
a564ce581d fix(DeviceSelection): Remove video from mobile Safari 2021-06-09 09:22:16 +03:00
Jaya Allamsetty
3917c5b283 chore(deps) lib-jitsi-meet@latest
* Don't accept p2p call on FF/Safari.

d9d9b7fc31...a1b870c616
2021-06-08 17:07:42 -04:00
Jaya Allamsetty
ccdab94ee8 chore(deps) lib-jitsi-meet@latest
* fix(RTC): Adjust the media direction for p2p conn. For p2p connections, the media direction needs to be adjusted after every source-add/source-remove is processed based on the availability of local sources.
* fix(RTC): Use a enum for media direction.

5738c80baf...d9d9b7fc31
2021-06-08 14:52:07 -04:00
damencho
4fc9aed708 fix: Fixes playing muted youtube video.
If we mute a video in Youtube it is stored in the current browser session and if someone shares a video it will start muted and we don't have the control to unmute it.
2021-06-07 11:56:46 -05:00
damencho
5f657a7d6c fix: Fixes selecting screen share when shared video stopped. 2021-06-07 11:56:46 -05:00
damencho
37e7919fd1 fix: Fixes import warnings. 2021-06-07 11:56:46 -05:00
damencho
4ace04e63c fix: Stops auto pinning if shared video is playing. 2021-06-07 11:56:46 -05:00
titus.moldovan
cb2891ead3 feat(e2ee): shows E2EESection only when user is moderator 2021-06-07 16:28:57 +03:00
titus.moldovan
093d8f830a feat(e2ee): broadcast e2ee disabled 2021-06-07 16:28:57 +03:00
Jaya Allamsetty
2ca4dd3755 chore(deps) lib-jitsi-meet@latest
* fix(JingleSessionPC): Disable unified-plan for p2p. Disable cross browser p2p using unified plan until all the issues are fixed.

0993c8e93d...5738c80baf
2021-06-04 13:55:41 -05:00
damencho
52279d0a2a chore(deps) lib-jitsi-meet@latest
* fix(moderation): Unmuting after av moderation and no track.

ab12f212d5...0993c8e93d
2021-06-04 12:12:44 -05:00
damencho
65642d20e4 chore(deps) lib-jitsi-meet@latest
* fix(moderation): Fixes detecting av moderation approved.

a2560f9519...ab12f212d5
2021-06-03 18:21:20 -05:00
HippyJim
8dbb392d85 CLOSE_CHAT action calls notifyChatUpdated with the isOpen flag set to false, previously was always true even when closing 2021-06-03 12:29:02 -05:00
Christoph Settgast
1b200abaa7 fix(participants) do not preload gravatars if config is empty
Previously gravatars (external resources) were preloaded even if
disableThirdPartyRequests was set to true in the config, as the
config may be empty at the time of preloading.

Closes: #5670
Signed-off-by: Christoph Settgast <csett86@web.de>
2021-06-02 15:24:33 -05:00
damencho
06ce24527e fix: Escapes some keys when parsing input. 2021-06-02 15:24:13 -05:00
VolodyaKalashnikov
e05d53e71a main-uk.json Update
Added more support of Ukrainian language
2021-06-02 13:41:05 -05:00
damencho
acdde6f1f5 fix: Skips check on domain verification disabled. Fixes #9313. 2021-06-02 11:50:26 -05:00
Aaron van Meerten
81c4e9a7fd fix: prosody: token alg is checked before public key is used 2021-06-02 11:50:16 -05:00
kychen
fb144a55a3 i18n: zhTW: new translation (#9293)
* i18n: zhTW: new translation

* Fixed the proper semantic of toolbar.hangup

* i18n: zhTW: new translation

* Fixed the proper semantic of speaker related strings

* i18n: zhTW: new translation

* Added startupoverlay.genericTitle
2021-06-02 11:50:04 -05:00
Pierre Ozoux
de2cdb1d6c Fixes typo. (#9315) 2021-06-02 11:49:55 -05:00
Shawn Chin
0d7ec9552b Hide invite button in participant panel if disabled in config (#9287)
* Hide invite button in participant panel if disabled in config

* match code style, fix lint errors
2021-06-02 11:49:44 -05:00
damencho
e5a3f8505e chore(deps) lib-jitsi-meet@latest
* fix(Sdp): Fix maxaveragebitrate typo

3fb44f7695...a2560f9519
2021-06-02 10:30:29 -05:00
Vlad Piersec
fdbf526b60 fix(video-filmstrip): Place filmstrip videos over toolbar 2021-06-02 06:54:29 -05:00
hmuresan
bb5f589fa1 fix(feedback): don't wait for feedback submission on leave meeting 2021-06-02 06:53:59 -05:00
tudordan7
839f632af6 fix(virtual-background): Responsive virtual background preview. 2021-06-02 06:51:44 -05:00
damencho
737d542ca8 fix: Fixes av moderation logic when granting moderator. 2021-06-02 09:38:25 +03:00
Jaya Allamsetty
eff1d13d21 fix(config): Add config for enabling unified-plan support on chromium. 2021-06-01 14:30:49 -04:00
Jaya Allamsetty
870d847f5f chore(deps) lib-jitsi-meet@latest
* fix(LocalSdpMunger): Fix unit test.
* fix(CodecSelection): Call RTCRtpTransceiver#setCodecPreferences before renegotiation. Call RTCRtpTransceiver#setCodecPreferences with the preferrred codec order before every createOffer/createAnswer. This ensures that the codec preference is enforced even when there is no local description available yet while the preferred codec is being set immediately after media session creation.
* fix(JingleSessionPC): Add a workaround for chrome issue. The 'signalingstatechange' event for 'stable' is fired after the 'iceconnectionstatechange' event for 'completed' is fired on chrome in Unified plan. This prevents the client from switching the media connection to the p2p connection once the ice connection for p2p gets established.
* fix(Logging): Log enhancements. Add a preifx to logs for idenitifying the type of TPC/jingleSessionPC.
* feat(TPC): Enable unified-plan support for Chromium based browsers. This can be controlled through the config.js  option 'enableUnifiedOnChrome'.
* fix(TPC): Do not configure encodings on Safari until reneg. Avoid configuring the encodings on Chromium/Safari until simulcast is configured for the newly added track using SDP munging which happens during the renegotiation.
* fix(TPC): Do not configure encodings on chromium immediately after replace track. Avoid configuring the encodings on chromium immediately after replace track since the encoding params are read-only until the renegotation is done.
* fix: send json message (#1180)

be3e2a69f2...3fb44f7695
2021-06-01 13:54:50 -04:00
tmoldovan8x8
f84f7332b9 chore(rn,versions): set mobile SDK versions 2021-05-31 11:20:14 +03:00
Andrei Bora
27481f0270 Allow both regex and normal check for the room name 2021-05-27 13:37:24 -05:00
Alex Bumbu
724391648e fix(ScreenShare): remove listener for native events when app unmounts 2021-05-27 16:53:20 +03:00
Julian1203
9a8b5551be Update main-de.json
Small improvements
2021-05-26 17:12:18 -05:00
Jaya Allamsetty
b39e5968bf chore(deps) lib-jitsi-meet@latest
* fix(SDP): Add missing msid for p2p sources.
* fix(TPC): Don't convert plan-b<->unified-plan SDPs for p2p.
* squash: Implement review comments.
* fix(JingleSessionPC): Do not try to re-use inactive mid for new remote ssrcs. The direction was marked as 'inactive' only on Firefox as Safari had audio issues when an inactive mid is re-used. Chrome (in unified-plan) needs the direction of the mid in remote desc to be set to 'inactive' for a 'removetrack' to be fired on the associated media stream whenever a remote source is removed.
* fix(SDP): Drop SSRCs whenever the transceiver direction is 'inactive' or 'recvonly'. This is needed only for JVB connections. Add unit tests for LocalSdpMunger.
* fix: Ignore startAudioMuted/startVideoMuted for p2p. The tracks will not be added when the call switches from jvb to p2p for an endpoint that joins muted by focus.
* fix(RTC): Do not suppress the source updates on Firefox. If the msid attribute is missing, then remove the ssrc from the transformed description so that a source-remove is signaled to Jicofo. This happens when the direction of the transceiver (or m-line) is set to 'inactive' or 'recvonly' on Firefox. Not signaling these source updates creates issues with remote track handling on the other endpoints in the call.
* fix(RTC): Set transceiver direction after RTCRtpSender#replaceTrack. This fixes the issue where TRACK_REMOVED event is not fired when a remote track is removed from the peerconnection. Fixes https://github.com/jitsi/lib-jitsi-meet/issues/1612 and https://github.com/jitsi/jitsi-meet/issues/8482.

60c5667957...be3e2a69f2
2021-05-26 16:51:18 -04:00
tudordan7
c0917f87ae feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
06c527b6fe feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
7f020a1107 feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
748a84eeef feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
f5dd848daf feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
4872ce83ba feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
99f61ca2cd feat(virtual-background): Desktop share as virtual background 2021-05-26 12:36:29 -04:00
tudordan7
dffe2316d4 feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
tudordan7
72cd3d70e1 feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
tudordan7
04a464dfee feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
tudordan7
be0632783d feat(virtual-background): Desktop share as virtual background wip 2021-05-26 12:36:29 -04:00
damencho
15c08f90c4 feat: Adds new module to unlimit jicofo and jvb connections.
In case limited those connection will be whitelisted and unlimited. Updates existing configurations to make sure prosody update will not break it by limiting too much.

Uses 28c16c93d79a version of the module: https://modules.prosody.im/mod_limits_exception.html
Will be available in prosody 0.12.
2021-05-26 11:17:25 -05:00
Calinteodor
c4677be87a fix(authentication): removed cancel event from overlay effect (#9274)
* fix(authentication) resolved #9263 issue

* fix(authentication) hide dialog close icon

* fix(authentication) fixed lint error about missing prop
2021-05-26 11:15:35 -05:00
Jaya Allamsetty
2fdf1a9165 chore(deps) lib-jitsi-meet@latest
* fix(caps): Disable TCC on Firefox. There is a known issue with Firefox where the BWE gets halved on every renegotiation causing the low upload bitrates from the Firefox clients.
* fix: Drops unused config, fixes jitsi/lib-jitsi-meet#1620.
* fix(e2ee): destroys olm session on disabling e2ee

f95a455c08...60c5667957
2021-05-26 11:32:48 -04:00
tmoldovan8x8
06110d1dfb task(rn): hide screen share button when audioOnly mode 2021-05-26 11:43:24 +03:00
Hristo Terezov
8d25950d98 fix(AudioTrack): _play promise chain 2021-05-25 20:11:15 -05:00
hmuresan
aea09a8da3 Send feedback metadata to JaaS feedback endpoint 2021-05-25 20:37:56 +03:00
Mihai-Andrei Uscat
01a127b557 fix(SharedVideo): Ensure shared video takes filmstrip into account 2021-05-25 12:55:57 +03:00
Hristo Terezov
574994607c feat(AudioTrack): retries for play() 2021-05-24 17:16:04 -05:00
damencho
689bb3f226 Updates prosody config for main muc component. 2021-05-24 15:13:53 -05:00
Avram Tudor
598d014960 Merge pull request #9022 from jitsi/tavram/share-video
feat(share-video) Add capability for sharing any direct link video
2021-05-24 12:46:07 +03:00
Vlad Piersec
d99bf9797d fix(vpaas): Avoid url blipping on invite dialog 2021-05-24 11:12:06 +03:00
Avram Tudor
4138e1ac53 Merge pull request #9251 from jitsi/tavram/remove-sip-invite
fix(sip) remove sip text from invite
2021-05-24 09:21:19 +03:00
damencho
0ee13b1fd8 fix: Drops unused config, fixes jitsi/lib-jitsi-meet#1620. 2021-05-22 12:45:36 -05:00
tudordan7
6ca61e03fd fix(virtual-background): Fix delete virtual background icon position. 2021-05-21 06:26:38 -05:00
Tudor-Ovidiu Avram
2f9fb64332 fix(sip) remove sip text from invite
this will be added in a subsequent commit to the dial in page
2021-05-21 13:04:26 +03:00
Tudor-Ovidiu Avram
3ebfb1de70 code review 2021-05-21 12:55:45 +03:00
Tudor D. Pop
d7a6a48acd fix(virtual-background): Responsive virtual background dialog
Fixes: https://github.com/jitsi/jitsi-meet/issues/9202
2021-05-20 17:12:39 +02:00
Saúl Ibarra Corretgé
496e47af20 chore(deps) uppdate amplitude-js
Fixes: https://github.com/jitsi/jitsi-meet/issues/8380
2021-05-20 17:11:45 +02:00
cagriertek1
d077021031 fix(lang) Update Turkish Translation
"mute Everyone" means "Herkesi sustur" in Turkish language.
2021-05-20 06:39:23 -05:00
Tudor-Ovidiu Avram
4e4ff0f60f feat(share-video) Add capability for sharing any direct link video 2021-05-20 13:00:54 +03:00
scott boone
9657bd9b6d removed a typo (#9244) 2021-05-19 16:02:59 -05:00
Scott Boone
e6242f5bc7 lowercase to fix tokens with uppercase letters (e.g., slack JWTs) 2021-05-19 15:52:04 -05:00
damencho
1f41ddd228 fix: Drops extra message sent on leave. 2021-05-19 10:11:14 -05:00
Saúl Ibarra Corretgé
eb3295cedd fix(ci) fix checking if the git repository is clean 2021-05-19 11:53:47 +02:00
Saúl Ibarra Corretgé
0e7a992b43 chore(deps) sync package-lock.json 2021-05-19 11:53:47 +02:00
Pawel Domas
6f5e0b0321 feat: more user friendly default device label
Also fixes an issue where starting Chrome 90 air pods
no longer have the "Default -" prefix and the default
entry looks like a buggy duplicated one.
2021-05-18 09:28:47 -05:00
Mihai-Andrei Uscat
e33674fb2e fix(FocusLock): Stop stealing focus when embedded 2021-05-18 09:04:42 +03:00
Vlad Piersec
3f7073c589 fix(participants): Knocking participant name in participants list
Fixes https://github.com/jitsi/jitsi-meet/issues/9211
2021-05-17 15:41:34 +03:00
Christoph Settgast
2a37f7caa8 fix(lang) update German translation for participants pane 2021-05-17 07:57:10 +02:00
Christoph Settgast
106ce79375 fix(participants-pane) enable translation of invite button
Copy over existing "invite" translations where the participants
pane is already translated.

Signed-off-by: Christoph Settgast <csett86@web.de>
2021-05-16 13:29:11 -05:00
Cross
b944088d99 Update README.md
Just a couple grammatical changes to the readme.
2021-05-16 07:34:14 -05:00
cagriertek1
b19bd38379 Update main-tr.json
"Kamerayı aç / kapat" means "Turn On / Off Camera" and it is not true case.

"Toggle camera" means "Kamerayı değiştir" in Turkish.
2021-05-16 07:33:41 -05:00
Felix Wolfsteller
1699216c99 fix(config) remove reference to interface_config.js 2021-05-15 11:15:02 +02:00
Jaya Allamsetty
e78ad54809 chore(deps) lib-jitsi-meet@latest
* fix(RTC): Disable simulcast for SS when using H.264. Fixes https://github.com/jitsi/docker-jitsi-meet/issues/1048

9eb4af1e80...f95a455c08
2021-05-14 17:28:48 -04:00
Calinteodor
9b5eae7a60 feat(rn, security) added flag for controlling security options button visibility 2021-05-14 15:01:43 +02:00
Avram Tudor
7db9fc94e2 Merge pull request #9204 from jitsi/tavram/sip-fixes
fix(sip) allow sip invites to contain phone numbers
2021-05-14 14:33:14 +03:00
Gabriel Imre
db5d6a56b8 fix(participants-pane): Use selector for displaying chat context item 2021-05-14 12:21:14 +03:00
Tudor-Ovidiu Avram
f7ddcbbbf3 fix(sip) allow sip invites to contain phone numbers
display sip address in invites
hide lobby password for sip users
tidy up invite placeholders
2021-05-14 11:54:54 +03:00
Shawn Chin
cff4ed83f6 Reservations prosody plugin (#8386)
* Added mod_reservations prosody plugin

* Removed comments re mutex

* Add support for HTTP retries and expose config to tweak retry behaviour

* Removed TODO comment. Feature implemented

* Added multi-tenant support

* renamed config var and default to always including tenant name in name field

* Simplified handling of multi-tenant

* Fixed bug with DELETE not called on reservation expiry

* fix: Fixes destroying room.

Co-authored-by: damencho <damencho@jitsi.org>
2021-05-13 22:20:21 -05:00
damencho
a39f2aebd9 fix: Fixes handling tenant in util and lobby. 2021-05-13 13:52:45 -05:00
Jaya Allamsetty
2bce5acad3 chore(deps) lib-jitsi-meet@latest
* fix(TPC): Return default codec if the local sdp is not available. Get the correct media type when generating the source identifier.

88560a8a5e...9eb4af1e80
2021-05-13 13:57:06 -04:00
damencho
7396db71fd feat: jitsi_session: extracts URL parameters from BOSH or WS into session
Co-authored-by: Saúl Ibarra Corretgé <saghul@jitsi.org>
2021-05-13 06:29:42 -05:00
Mihai-Andrei Uscat
f7b73c0d09 feat(AddPeopleDialog): Add config option to overwrite invite subject app name 2021-05-13 12:33:05 +03:00
Дамян Минков
5c08b1ec5b feat: A/V moderation (prosody module) (#9106)
* feat(prosody-modules): Moves a function for getting room to util.

* feat: Audio/Video moderation.

* squash: Fix docs.

* squash: Changes a field name in the message for adding jid to whitelist.

* squash: Moves to boolean from boolean string.

* squash: Only moderators get whitelist on join.

* squash: Check whether in room and moderator.

* squash: Send to participants only message about approval.

Skips sending the whole list.

* feat: Separates enable/disable by media type.

Adds actor to the messages to inform who enabled it.

* squash: Fixes reporting disable of the feature.

* squash: Fixes init of av_moderation_actors.

* squash: Fixes av_moderation_actor jid to be room jid.

* squash: Fixes comments.

* squash: Fixes warning about shadowing definition.

* squash: Updates ljm.

* fix: Fixes auto-granting from jicofo.

* squash: Further simplify...
2021-05-12 16:36:02 -05:00
Jaya Allamsetty
6d15bcc719 chore(deps) lib-jitsi-meet@latest
* fix(JingleSession): Move the ssrc identifier generation to LocalSdpMunger.
* fix(logger): Logging enhancements. Get rid of noisy logs related to SDP transformations which are redundant. Fix formatting and add missing information.

7cbd9c8f2a...923aa449c4
2021-05-12 10:19:19 -04:00
Saúl Ibarra Corretgé
47c9e14155 fix(toolbox) fix displaying mute everyone buttons for non-moderators 2021-05-12 08:29:00 -05:00
otho
fe22e33343 doc(config) document "inviteDomain" in dynamicBrandingUrl 2021-05-12 11:38:16 +02:00
Tudor D. Pop
dcc659215e fix(virtual-background) fix track leak in preview 2021-05-12 11:36:49 +02:00
Tudor D. Pop
5e4753888e feat(virtual-background): Add placeholder on virtual background preview 2021-05-11 16:25:49 +02:00
Avram Tudor
6e91665987 Merge pull request #9184 from jitsi/tavram/invite-types
fix(invite) fix notifications for phone invites
2021-05-11 16:23:20 +03:00
hmuresan
a1a5d1e7f8 fix(deploymentUrls): Disable help and download apps buttons for JaaS 2021-05-11 13:54:41 +03:00
Tudor-Ovidiu Avram
9a8961b90c fix(invite) fix notifications for phone invites 2021-05-11 11:51:02 +03:00
Calinteodor
07eb19b98a feat(rn,ui) introduce react-native-paper 2021-05-11 10:01:45 +02:00
Gabriel Imre
d69d4dd91a fix(participants-pane): Use selector for displaying names 2021-05-11 09:10:17 +03:00
Jaya Allamsetty
91197bc69f fix(quality-control): Send the new receiver constraints on state changes.
The client now listens for changes to lastN, selectedEndpoints and maxReceiverVideoQuality in redux to trigger sending  bridge message in the new format. This fixes an issue where the stage view <-> tile view changes prompt two receiver constraints messages to be sent, first with the maxHeight update and then with the selected endpoints update.
2021-05-10 16:06:19 -04:00
Jaya Allamsetty
913cf259cf chore(deps) lib-jitsi-meet@latest
* fix(quality-control): Propagate the height constraints to p2p session. If the application is using the new receiver constraints, propagate the height constraint to the p2p session as well.
* build(deps): bump lodash from 4.17.19 to 4.17.21
* chore(deps): bump hosted-git-info from 2.8.8 to 2.8.9

74a90f7035...7cbd9c8f2a
2021-05-10 16:04:59 -04:00
dependabot[bot]
096e1e0dc6 chore(deps-dev): bump lodash in /resources/load-test
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-09 08:15:19 +02:00
dependabot[bot]
022f5865e5 chore(deps): bump hosted-git-info from 2.5.0 to 2.8.9
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.5.0 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.5.0...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-09 08:10:02 +02:00
Jaya Allamsetty
cc3377c0da chore(deps) lib-jitsi-meet@latest
* fix(quality-control): fix constraints sent on channel initialization. Do not send old format constraints if no constraints are set before the channel is initialized.
* chore(deps) run npm audit fix
* chore(deps) update webrtc-adater@8.0.0

86c7a35817...74a90f7035
2021-05-08 13:49:29 -04:00
dependabot[bot]
c2d7e19a1d chore(deps): bump hosted-git-info in /resources/load-test
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 15:45:40 +02:00
dependabot[bot]
a32adec667 chore(deps): bump ssri from 6.0.1 to 6.0.2 in /resources/load-test
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 00:28:06 +02:00
dependabot[bot]
ce70b005b1 chore(deps): bump url-parse from 1.4.7 to 1.5.1
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.1.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 00:27:19 +02:00
dependabot[bot]
a07fceb8fd chore(deps): bump ua-parser-js from 0.7.17 to 0.7.28
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.17 to 0.7.28.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.17...0.7.28)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-08 00:26:26 +02:00
Vlad Piersec
9fd8491d04 fix(RN, Toolbox): Show full participant thumbnails in tile view 2021-05-08 00:25:40 +02:00
వీవెన్
98078f9160 More Telugu (te) translations. 2021-05-07 15:15:58 -04:00
Calinteodor
450c961e68 Update contributing file
Added Avoiding bundle bloat section
2021-05-07 17:23:01 +02:00
Saúl Ibarra Corretgé
ea8ed8aa84 fix(dev) make sure each bundle analysis report gets its own file 2021-05-07 15:37:41 +02:00
Saúl Ibarra Corretgé
a5ddc896e2 fix(dev) disable performance hints when doing bundle analysis 2021-05-07 15:37:41 +02:00
Vlad Piersec
2c24dc3d27 fix(premeeting): "Don't show screen" button hover state 2021-05-07 14:26:23 +03:00
Gabriel Imre
edff9bef53 fix(participants-pane): Resize video layout when closing or opening 2021-05-07 10:51:21 +03:00
Hristo Terezov
dec90bdeb8 fix(Thumbnail): Display mode typo. 2021-05-06 15:27:27 -05:00
Tudor D. Pop
f38bf7b14c fix(dialogs-style): Remove box shadow from header and footer 2021-05-06 18:38:08 +02:00
Avram Tudor
c851136f8e Merge pull request #9110 from jitsi/tavram/fix-case-sensitive-replcement
fix(sip-invite) fix baseurl case sensitive replacement
2021-05-06 11:24:17 +03:00
Saúl Ibarra Corretgé
89abaa83aa fix(premeeting) drop gradient
It looks particularly odd, specially when any virtual background is activated.
2021-05-06 09:55:53 +02:00
Tudor D. Pop
9ef984ca3d feat(virtual-background) add virtual background preview
Also enable background selection while muted.
2021-05-06 08:54:23 +02:00
Jaya Allamsetty
2f51d9fd3e chore(deps) lib-jitsi-meet@latest
* fix(JingleSession): Add a unique identifier for source on Firefox.
* fix: Drops unused nick from messages. Fixes #1592

5629ba5d99...86c7a35817
2021-05-05 17:06:37 -04:00
damencho
ceca00b573 fix: Fixes welcome page add calendar link. Fixes #9132 2021-05-05 14:05:50 -05:00
Jaya Allamsetty
1c6677f523 squash: use oldScreenSharesOrder for checking. 2021-05-05 15:05:10 -04:00
Jaya Allamsetty
035d026e90 fix(video-layout): Fix video-layout when a SS participant leaves.
Unpin the screenshare when the screensharing participant leaves. Switch to tile view if no other participant was pinned before screenshare was auto-pinned, pin the previously pinned participant otherwise.
2021-05-05 15:05:10 -04:00
hmuresan
a582f1c191 fix(jwt-validation): validate kid value only for JaaS
- add some missing meet features
2021-05-05 13:03:39 +03:00
Vlad Piersec
79939f108c fix(rn, Labels): Place picture-in-picture button on the left 2021-05-05 09:16:48 +03:00
Jaya Allamsetty
e765253204 chore(deps) lib-jitsi-meet@latest
* fix(RTC): Fix screenshare with audio on Electron.

e362c89eb6...5629ba5d99
2021-05-04 21:44:41 -05:00
Paweł Domas
a605403029 fix(Video.js): prevent DOMException: The play() request was interrupted by a new load request 2021-05-04 17:18:34 -05:00
Ilko
6aae1c024d Added lobby translations for bulgarian language (#9128)
* Added lobby component translations for bg language

* Update translation of shared youtube video button and label

* Translate security litterals in bg. Update lobby translations
2021-05-04 14:32:39 -05:00
Jaya Allamsetty
2b7a256aa6 chore(deps) lib-jitsi-meet@latest
* Add dependency for promise.allSettled. Older chrome versions like M72 do not support Promise.allSettled.
* fix(conference): Enable p2p for unified plan clients.
* fix(TPC): Use addTrack instead of addStream in Unified-plan impl.
* Add missing spaces in debug logs.

ad5692d6aa...e362c89eb6
2021-05-04 13:47:20 -04:00
hmuresan
b998d80ee3 fix (external-api): fix notify video mute changed when presenting
- small refactor to trigger `notifyVideoMutedStatusChanged` correctly when participant is presenting
2021-05-04 18:23:32 +03:00
Vlad Piersec
428c3cef38 fix(Labels): Recording label background color 2021-05-04 16:02:00 +03:00
Besnik Bleta
32a9c94dee Adding sq translation (#9091)
* Adding sq translation

* Adding sq to languages.json
2021-04-30 17:27:13 -05:00
Yagiz ISIK
42f07624b4 Updated Turkish Localizations
Added translations for mute everyone's microphone and camera.
2021-04-30 17:11:48 -05:00
Saúl Ibarra Corretgé
153f991097 chore(deps) lib-jitsi-meet@latest
* fix(RTC) drop the "old gUM" flow

7667117117...ad5692d6aa
2021-04-30 12:38:10 -04:00
Christoph Wiechert
79497cecba Add: remoteVideoMenu.disableGrantModerator option (#7534)
* Add: remoteVideoMenu.disableGrantModerator option

* Add disableGrantModerator to native side

* Update RemoteVideoMenu.js

* Update RemoteVideoMenuTriggerButton.js

Co-authored-by: ouya99 <alexander@andlabs.eu>
2021-04-30 11:22:36 -05:00
Saúl Ibarra Corretgé
f44faa8d81 deps(rn) updatereact-native-webrtc
Includes a MST.getSettings implementation, necessary for dropping "old
getUserMedia flow".
2021-04-30 12:02:50 -04:00
Jaya Allamsetty
7ef22603fc chore(deps) lib-jitsi-meet@latest
* fix(SDP): Move all SDP related files to a different dir. SDP utility classes are spread across RTC and XMPP directories now, moving these class files to a 'sdp' directory.
* fix(stats): Return promise for getStats. Switch to returning a Promise for getStats. Reset frame rate stat to 0 when video is suspended as a result of endpoint falling out of last-n.
* Fix: sysMessageHandler not deleted (#1590)
* task(e2ee): switch back to GCM

463e213b3f...7667117117
2021-04-30 10:51:31 -04:00
Philipp Fruck
f030706a94 fix(external_api) fixed misspelled api command 2021-04-30 15:36:32 +02:00
Hamza KHAIT
6eac19a058 fix(lang) update French translation 2021-04-29 16:55:31 +02:00
Saúl Ibarra Corretgé
8cffa5553d chore(rn,versions) set mobile app and SDK versions 2021-04-29 16:56:14 +03:00
Saúl Ibarra Corretgé
0fcdb6f248 fix(patch) remove unneeded hunks from RN patch 2021-04-29 13:39:27 +02:00
Saúl Ibarra Corretgé
399fac78f5 fix(ios) fix building with Xcode 12.5 2021-04-29 13:24:00 +02:00
Tudor-Ovidiu Avram
3339a1d19f fix(sip-invite) fix baseurl case sensitive replacement 2021-04-29 13:50:29 +03:00
Vlad Piersec
8bd874ca70 feat(themes): Add style tokens and web theme 2021-04-29 13:19:53 +03:00
Saúl Ibarra Corretgé
8477ae8daa feat(ios) add ability to set CallKit options for incoming calls
The implemented options are the call handle and UUID.
2021-04-29 12:10:43 +02:00
Saúl Ibarra Corretgé
b83bc50c03 chore(deps) drop jQuery impromptu
It's no longer used.
2021-04-29 11:02:09 +02:00
Alex Bumbu
9bffe149d3 feat(iOS): screensharing extension swift implementation 2021-04-29 10:44:40 +02:00
Jaya Allamsetty
1898e4a768 feat(last-n): Implement startLastN and make last-n configurable through UI. (#9093) 2021-04-28 19:00:20 -04:00
Jaya Allamsetty
d7639963d3 chore(deps) lib-jitsi-meet@latest
* fix(quality-control): Send the new constraint on join. Fixes the case where the old format height constraint is sent on join for a jvb media session.

7dedb59b9c...463e213b3f
2021-04-28 15:02:57 -04:00
Saúl Ibarra Corretgé
f68fe2d083 chore(deps) run npm audit fix 2021-04-28 19:09:32 +02:00
hmuresan
24bf5a2dc3 fix(toolbox): hide toolbox when mouse outside toolbox area 2021-04-28 17:49:40 +03:00
Andrei Gavrilescu
6ee868032e fix(screenshare): remove redundant event / only show on supported env (#9100)
* remove redundant event / only show on supported env

* remove unused imports
2021-04-28 17:06:41 +03:00
Alex Bumbu
cf37d34923 fix(ios) fix leaving the meeting when screen-sharing 2021-04-28 13:33:11 +02:00
dependabot[bot]
f187923233 chore(deps): bump ssri from 6.0.1 to 6.0.2
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-28 11:20:00 +02:00
chipechop
ce6ebca90f fix(lang) update Italian translation 2021-04-28 11:19:27 +02:00
Calin Chitu
546df558e3 feat(settings) removed openTwoButtonDialog from UI module and created react LogoutDialog component 2021-04-28 09:51:14 +02:00
hmuresan
02ec30b8ff feat(aot): improve AOT UI/UX 2021-04-28 09:49:37 +02:00
Ilko
0d127b30df Refine bulgarian translations (#9089)
* Translate addPeople prompt in Bulgarian

* Update bulgarian translations

* Use gender neutral language in bg translations
2021-04-26 10:02:05 -05:00
వీవెన్
fc78cd0d71 Add Telugu (te) language 2021-04-26 10:36:31 -04:00
Calinteodor
f377455069 fix(UI) removed unused methods 2021-04-24 15:14:07 +02:00
Jaya Allamsetty
b536aa035c fix(config): Deprecate capScreenshareBitrate. 2021-04-23 17:25:23 -04:00
Jaya Allamsetty
d3b18a281a chore(deps) lib-jitsi-meet@latest
* fix(quality-control): Switch to new receiver constraints by default. Use the new receiver constraints unless it is explicitly disabled through config.js.

3c9913ed61...7dedb59b9c
2021-04-23 17:25:23 -04:00
damencho
cb9c85e1bc fix: Updates jiconop2 to drop custom type. 2021-04-23 12:19:35 -05:00
Avram Tudor
ff44ff9026 Merge pull request #9076 from jitsi/tavram/remove-hash
fix(sip-invite) remove hash params
2021-04-23 16:26:16 +03:00
Tudor-Ovidiu Avram
3048ce4345 fix(sip-invite) remove hash params 2021-04-23 16:19:52 +03:00
damencho
0ef6db51d6 chore(deps) lib-jitsi-meet@latest
* fix: Fixes sending initial disco info on attaching connection.

ab667ef809...19e7cbe592
2021-04-22 14:56:11 -05:00
Jaya Allamsetty
d96bb83496 fix(presenter): Do not resize the desktop track on FF by default.
Resizing of the desktop track on Firefox is not needed anymore since the browser now reports the correct resolution of the desktop track after the fix here - ada0f5e537.
Fixes https://github.com/jitsi/jitsi-meet/issues/8519
2021-04-22 14:39:56 -04:00
Дамян Минков
f4c8310ea7 JiConOp2 (#9052)
* feat: Exposes a hook to mod_external_services data.

The hook can be used to get turn servers and credentials from another module.

* feat: JiConOp2 pushes a message with some info to clients.

* feat: JiConOp adds config for shard name feature.

* squash: Changes message type to service-info.

* squash: Drops the event in external_services.
2021-04-22 12:54:34 -05:00
Jaya Allamsetty
9856add282 chore(deps) lib-jitsi-meet@latest
* JiConOp2 (#1569)
* fix: high CPU on Chrome with low fps screen sharing (#1570)

0dc1540a44...ab667ef809
2021-04-22 13:38:24 -04:00
Calinteodor
98658f573c fix(authentication): removed old LoginDialog.js file, fixed redirection to the external auth and created actions.any.js (#9049)
* fix(authentication) login dialog now closes when connection is established

* fix(authentication) fixed shibboleth auth

* fix(authentication) renamed authenticateExternal func to authenticate and updated its logic

* fix(authentication)removed logindialog.js and created actions.any

* fix(authentication) removed focus from externalauthwindow

* fix(authentication) removed private sign from some actions and added openLoginDialog to actions.any

* fix(authentication) exported all from actions.any

* fix(authentication) reverted change regarding externalAuth

* fix(authentication) fixed indentation
2021-04-22 17:05:14 +02:00
Gabriel Imre
20a62e5eb4 fix(participants-pane): Consider reducer/state being unavailable on native 2021-04-22 17:02:35 +02:00
Saúl Ibarra Corretgé
77890fc27a fix(config) drop ancient backwards compatibility options 2021-04-22 17:00:33 +02:00
Saúl Ibarra Corretgé
433e212e20 fix(config) avoid using legacy config options
If the new ones are specified, use them.
2021-04-22 17:00:33 +02:00
titus.moldovan
527d022d63 fix(android): catch exception thrown when media projection is stopped 2021-04-22 16:52:09 +02:00
Saúl Ibarra Corretgé
9724bb1799 fix(android) fix screen rotation when screen-sharing 2021-04-22 12:59:17 +02:00
Avram Tudor
6398b4ec89 Merge pull request #9047 from jitsi/tavram/sip-invite-fixes
fix(sip-invite) add minor fixes to sip invite flow
2021-04-22 12:13:45 +03:00
Avram Tudor
d8e5b48aeb Merge pull request #9046 from jitsi/tavram/fix-rec-logo
fix(jaas) fix recorder and sip gateways not detecting vpaas meetings
2021-04-22 11:43:17 +03:00
Jaya Allamsetty
477d94497b fix(audio-share): Show button only when supported by browser.
Show the audio share button only when its supported. For example, mobile browsers do not support getDisplayMedia yet.
2021-04-21 16:50:29 -04:00
Gabriel Imre
d014a52ab3 feat(participants-pane) implement participants pane 2021-04-21 15:48:05 +02:00
Jaya Allamsetty
6efa94541e chore(deps) lib-jitsi-meet@latest
* fix(JingleSession): Increase the ICE candidate gathering timeout to 150ms. This will reduce the numbers of transport-info IQs sent by the client.
* fix(TPC): Fix error handling for getStats.

ca325f5ef9...0dc1540a44
2021-04-20 14:37:06 -04:00
Tudor-Ovidiu Avram
f0f9c02452 fix(sip-invite) add minor fixes to sip invite flow 2021-04-20 16:05:49 +03:00
Avram Tudor
ef4af415a8 Merge pull request #9037 from jitsi/tavram/sip-invite-password
feat(sip-invite) add room password for sip invite requests
2021-04-20 15:36:44 +03:00
Tudor-Ovidiu Avram
c6fd8c2bcb fix(jaas) fix recorder and sip gateways not detecting vpaas meetings 2021-04-20 15:35:36 +03:00
hmuresan
7d1c8da827 fix(aot): fix aot buttons size
- fix aot not being debug-able locally in jitsi-meet-electron app
2021-04-20 15:32:29 +03:00
Saúl Ibarra Corretgé
9e6939d25f fix(ios) detect orientation when screen sharing
Fixes: https://github.com/jitsi/jitsi-meet/issues/9012
2021-04-20 10:23:20 +02:00
tudordan7
c765e08aa1 fix(virtual-background): Check if virtual background is disabled on premeeting. 2021-04-19 11:54:55 -05:00
Jaya Allamsetty
41939d99c8 chore(deps) lib-jitsi-meet@latest
* fix(stats): Use promise-based getStats on all browsers. Get rid of the browser specific keys and use the standard spec-compliant fields for stats. Get the resolution/fps for remote streams from 'inbound-rtp' stats. Use the 'track' stats for the local resolution/fps since these take the active simulcast streams into account.

8b3dc59374...ca325f5ef9
2021-04-19 11:32:10 -04:00
Tudor-Ovidiu Avram
9d0c6e3741 fix(prejoin) fix background selection not being available for 3rd party apps 2021-04-19 09:29:08 -05:00
Andrei Bora
572b99b208 Verify room name using regex in JWT 2021-04-19 07:49:46 -05:00
Tudor-Ovidiu Avram
64ab813b55 feat(sip-invite) add room password for sip invite requests 2021-04-19 15:10:28 +03:00
JohnProv
67ac48cac6 Update main-nl.json (#9017)
* Update main-nl.json

Add missing keys and delete some old keys

* Update main-nl.json

Fix typo

* Update main-nl.json
2021-04-16 17:36:01 -05:00
Saúl Ibarra Corretgé
afbd29f4a2 chore(deps) lib-jitsi-meet@latest
* Implement review changes 4
* Implement review changes 3
* Implement review changes 2
* Implement review changes 1
* feat(HDAudio): Initial implementation.

baa78aca40...8b3dc59374
2021-04-16 13:06:55 +02:00
Mihai-Andrei Uscat
996c9fb064 Implement review changes 3 2021-04-16 12:21:53 +02:00
Mihai-Andrei Uscat
b53ad353cb Implement review changes 2 2021-04-16 12:21:53 +02:00
Mihai-Andrei Uscat
e0da67dff5 Implement review changes 1 2021-04-16 12:21:53 +02:00
Mihai-Andrei Uscat
dcd073b407 feat(HDAudio): Initial implementation. 2021-04-16 12:21:53 +02:00
Jaya Allamsetty
c12c554138 fix(video-layout): Unpin SS when the screensharing participant leaves. 2021-04-15 16:38:25 -04:00
Saúl Ibarra Corretgé
289ba6f764 fix(rn,config) update to new configuration for codec selection 2021-04-15 18:35:47 +02:00
Jaya Allamsetty
59afafdf7c fix(config): Add missing config.js settings.
Add missing enforcePreferredCodec, bitrates for H264 and fix an issue with missing comma.
2021-04-15 11:55:11 -04:00
Avram Tudor
b74c8b5d1f fix(invite) fix mailto links not working on Brave for iOS 2021-04-15 12:52:11 +02:00
Jaya Allamsetty
0aef918c55 chore(deps) lib-jitsi-meet@latest
* fix(SS): Implement a 2500Kbps limit for VP9 SS.
* fix(RTC): Remove stream effect before disposing the track. Remove the effect instead of stopping it so that the original stream is restored on both the local track and on the peerconnection. Fixes issues when a stream with effect applied is replaced on the pc after it is muted, also fixes https://github.com/jitsi/lib-jitsi-meet/issues/1537.
* fix: Drops unused config.

1f3f85978d...baa78aca40
2021-04-14 18:54:33 -04:00
qwertiko GmbH
dc3f64fe7a update main-de.json (#9003)
* language update: main.json and main-de.json

* language update: main-de.json

* language update: main-de.json

* revert changes in main.json and delete same entries in main-de.json

Co-authored-by: qwertiko <gross@qwertiko>
2021-04-14 16:45:53 -05:00
Horatiu Muresan
cbeb7b86cc fix(toolbox): Fix toolbox not auto-hiding. (#9002) 2021-04-14 19:30:19 +02:00
Tudor D. Pop
b1833fddad feat(virtual-background) Virtual background UI changes 2021-04-14 18:26:36 +02:00
Vlad Piersec
1b2f64efb3 fix(icons): CC, invite, user & virtual-background 2021-04-14 18:07:49 +02:00
Jaya Allamsetty
7121b2f1e1 chore(deps) lib-jitsi-meet@latest
* fix(connection-quality): Calculate target bps based on videoQuality settings.

d73723dae6...1f3f85978d
2021-04-14 11:07:38 -04:00
Saúl Ibarra Corretgé
6c4652e3a0 feat(build,ios) add lane to update dSYMs on Crashlytics 2021-04-14 15:24:50 +02:00
Saúl Ibarra Corretgé
a256c6b8e7 fix(ios) use app_store_connect_api_key for Fastlane builds 2021-04-14 15:24:50 +02:00
Andrei Gavrilescu
96e886d306 feat(rtcstats): switch to rtcstats v3 protocol (#8989)
* use new rtcstats clinet

* add room name to identity

* update rtcstats version
2021-04-14 12:32:16 +03:00
damencho
12552766ce chore(deps) lib-jitsi-meet@latest
* Update presence and skip default values (#1536)
* fix: Adds back removed method used by jibri. (#1561)

49c4e75f37...d73723dae6
2021-04-13 17:51:34 -05:00
chipechop
299674508b Update main-it.json
- added a few missing lines
- changed some fragmented phrases, so that they sound fluent, once reunited
- gave coherence to the usage of the persons (I, or you) in some mismatching title and dialog boxes
2021-04-13 12:24:31 -05:00
Avram Tudor
58be0f6914 Merge pull request #8994 from jitsi/tavram/fix-query-params
fix(sip-invite) do not send query params on sip invite request
2021-04-13 13:37:10 +03:00
Tudor-Ovidiu Avram
529b182666 fix(sip-invite) do not send query params on sip invite request 2021-04-13 12:24:19 +03:00
tmoldovan8x8
067ff0729e bugfix(ios): fixes typo on JitsiMeetViewDelegate method 2021-04-12 14:08:53 +03:00
Andrei Gavrilescu
6d3d65da03 feat(screenshare): Audio only screenshare (#8922)
* audio only screen share implementation

* clean up

* handle stop screen share from chrome window

* update icon
2021-04-12 10:37:39 +03:00
Saúl Ibarra Corretgé
fd4819aeca fix(toolbar) restore security button backwards compat
In https://github.com/jitsi/jitsi-meet/pull/8673 we inadvertently removed the
backwards compatibility code which would show the security button when the
"info" button is configured in interface_config. The security button replaced
the info button.
2021-04-09 09:27:10 -05:00
Tudor D. Pop
7ca04ccb0f fix(virtual-background) keep selected state on dialog 2021-04-09 16:25:26 +02:00
Calinteodor
bf3726cb93 feat(rn,security) add security dialog 2021-04-09 14:30:25 +02:00
titus.moldovan
524af5ca67 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/...49c4e75f37cfec5a5bdd921c869b6ec1bff8f9d2
2021-04-09 14:18:39 +02:00
Tudor D. Pop
af28080058 feat(virtual-background) add slight blur option 2021-04-09 14:17:06 +02:00
Jean-François Alarie
927b40ec71 fix(rn,full-screen) make sure immersive mode respects the fullscreen flag 2021-04-09 14:05:16 +02:00
Saúl Ibarra Corretgé
3bbfdb2846 fix(debian) don't include package{-lock}.json files 2021-04-08 17:18:39 -05:00
Nikhil
e38ebc6628 lang:New translation Hindi(hi) (#8968)
* lang:New translation Hindi(hi)

Work in progress. I will update this on the way. I also want to quickly test this out. Thanks

* add new lang Hindi(hi)

* add HIndi(hi)

* Update main-hi.json
2021-04-08 08:59:22 -05:00
Vlad Piersec
62cf3099a7 fix(settings): Make language dropdown wider 2021-04-08 07:10:11 -05:00
Vlad Piersec
b135e2a06a feat(Labels): Redesign labels on mobile & web 2021-04-08 11:57:15 +02:00
Saúl Ibarra Corretgé
7656985fe1 chore(rn,versions) bump SDK and apps versions 2021-04-08 10:44:33 +02:00
Avram Tudor
5599454ea9 Merge pull request #8962 from jitsi/tavram/sip-invite-auth
fix(sip-invite) fix sip invite jwt not being sent correctly
2021-04-08 10:24:06 +03:00
Mejans
807a5ab893 Adds Farsi and Portuguese 2021-04-07 16:56:33 -05:00
damencho
c4766125bb feat: Adds an option to preset in localstorage key for locked rooms.
This feature will be used by sip-jibri to join locked rooms.
2021-04-07 11:07:04 -05:00
Emil Ivov
ba41745d1e Merge pull request #8965 from jitsi/saghul-patch-10 2021-04-07 10:40:33 -05:00
Saúl Ibarra Corretgé
8eed42c273 fix(virtual-backgrounds) add segmentation model license information
Fixes: https://github.com/jitsi/jitsi-meet/issues/8792
2021-04-07 17:15:17 +02:00
tmoldovan8x8
e803e8cfd9 feat(ios): adds ios screensharing enabled flag 2021-04-07 16:28:26 +03:00
Tudor-Ovidiu Avram
86dd35b927 code review changes 2021-04-07 15:46:01 +03:00
Tudor-Ovidiu Avram
32ecd6310c fix(sip-invite) fix sip invite jwt not being sent correctly 2021-04-07 15:37:17 +03:00
tudordan7
e5277deed5 chore(deps) lib-jitsi-meet@latest
* fix(rtc) Fix setting effects while not in a conference.

3cd9d31b97...cd53f249c5
2021-04-07 13:12:36 +02:00
Tudor D. Pop
8b315846b9 feat(premeeting-screen) add virtual background functionality 2021-04-07 11:29:54 +02:00
Jaya Allamsetty
c687f41a89 chore(deps) lib-jitsi-meet@latest
* feat(RTC): Signal video type and availability to bridge.

dddbab99f1...3cd9d31b97
2021-04-06 17:46:04 -04:00
Jonathan Lennox
31c0ba4481 Load-test: emulate jitsi-meet stage view behavior, if selected. (#8957) 2021-04-06 16:31:26 -04:00
Calinteodor
fc3a743372 fix(ios) keyboard no longer covers message board and input 2021-04-06 12:07:24 +02:00
damencho
8b038716a5 chore(deps) lib-jitsi-meet@latest
* fix: Fixes error for undefined error, on happening on p2p kick.

2e598a4bda...dddbab99f1
2021-04-05 16:49:58 -05:00
Jonathan Lennox
9662b2ae67 Load test: send video constraints only after ICE is connected. (#8952) 2021-04-05 17:17:25 -04:00
Jonathan Lennox
6275439a91 Load-test: Fix getId call. (#8941) 2021-04-05 12:03:54 -04:00
Vlad Piersec
d9693117f2 fix(Toolbar, rn): Button overflow in landscape orientation 2021-04-05 13:54:44 +03:00
Jaya Allamsetty
21382ea6d5 chore(deps) lib-jitsi-meet@latest
* Get rid of stats debug message, fix typo with codec type.
* fix(receiveVideoController): Do a deep copy of constraints for comparsion.
* fix(codec-selection): Fix codec selection for unified plan browsers.

93af5ada95...2e598a4bda
2021-04-02 16:18:44 -04:00
JohnProv
6df67694d1 Update main-nl.json (#8938)
Remove keys in main-nl but not in main.
2021-04-02 12:01:32 -05:00
JohnProv
08756bc6d0 Update main-nl.json (#8937)
* Update main-nl.json

Add some translated keys.

* Update main-nl.json

Fix

* Update main-nl.json

Fix typo

* Update main-nl.json

Fix
2021-04-02 11:25:23 -05:00
Mihai-Andrei Uscat
1b1d650b75 fix(MoreTab): Fix languages not being scrollable on mobile 2021-04-02 13:38:02 +03:00
Jaya Allamsetty
b1eff72394 chore(deps) lib-jitsi-meet@latest
* fix(receiveVideoController): Do not send redundant video constraints to the bridge.
* feat(stats): Add a new bridge message "EndpointStats" for stats. Use the new Colibri message "EndpointStats" for broadcasting the local stats. The bridge then will be able to filter the endpoint stats and send them only to the interested parties instead of broadcasting it to all the endpoints in the call.
* Test RTCRtpReceiver.getCapabilities before using

2b94da12e8...93af5ada95
2021-04-01 10:44:22 -04:00
Jonathan Lennox
357bbd1158 Load test: emulate Jitsi-Meet's lastN and selectParticipant behavior. (#8926) 2021-04-01 10:30:23 -04:00
Arnaud (Martient) Leherpeur
0ca47e9ffb fix (lang): update french and canadian french i18n
change "cryptage" to "chiffrement"
2021-04-01 08:29:12 -05:00
Дамян Минков
1123b4f2fe fix: Adds Portuguese to listed languages 2021-04-01 08:27:49 -05:00
tmoldovan8x8
1224597ede feat(e2ee): auto turns on e2ee when one participant enabled it 2021-04-01 12:34:01 +03:00
Avram Tudor
58b7663a97 Merge pull request #8866 from jitsi/tavram/sip-invite
feat(sipcall) implement sip invite
2021-04-01 11:39:31 +03:00
Christoph Settgast
cf8ab5e13b fix(lang) Differentiate prejoin and lobby better in German translation
Signed-off-by: Christoph Settgast <csett86@web.de>
2021-03-31 15:46:05 -05:00
Tudor-Ovidiu Avram
f99c919416 code review changes 2021-03-31 15:51:53 +03:00
Tudor-Ovidiu Avram
ae21a09bd6 feat(sipcall) implement sip invite 2021-03-31 09:53:55 +03:00
Tudor D. Pop
39011d8fd3 feat(virtual-background) persist settings 2021-03-30 23:27:44 +02:00
Johnny998
77f1a24344 Update main-sk.json
Translated a few missing strings.
2021-03-30 08:41:32 -05:00
tudordan7
3453e49182 fix(virtual-background): Hide scrollbar on loading action. 2021-03-30 13:43:57 +02:00
tmoldovan8x8
b1d7debfb9 feat(e2ee): adds sounds for e2ee enabling/disabling 2021-03-30 12:59:32 +03:00
Дамян Минков
b826fc1d5a fix: Correct some missing comas in config.js. 2021-03-30 08:51:43 +02:00
Jaya Allamsetty
c5626e99e9 chore(deps) lib-jitsi-meet@latest
* feat(stats): Get audio levels for the top 5 speakers only.

1249681a0e...43c589f409
2021-03-29 17:21:46 -04:00
Christoph Wiechert
ae28fcc12f Fix: used deprecated onmousewheel event
https://developer.mozilla.org/en-US/docs/Web/API/Element/mousewheel_event
2021-03-29 10:53:13 -05:00
chipechop
987760abbd Update main-it.json (#8795)
* Update main-it.json

Added roughly 20 missinig lines

* Update main-it.json

Fixed two typos, left behind...
2021-03-29 10:53:02 -05:00
KyungheeKo
a3b364f8d7 lang: Update korean translation (#8879)
* Update main-ko.json

update korean translation

* Update main-ko.json

fix comma error

* Update languages-ko.json

add korean translation
2021-03-29 10:52:50 -05:00
JohnProv
2ea317d721 Update main-nl.json (#8891)
* Update main-nl.json

Add missing keys for virtualBackground

* Update main-nl.json
2021-03-29 10:52:22 -05:00
Vlad Piersec
eb41a306a6 fix(lobby): Knocking participants list for small widths 2021-03-29 09:47:11 -05:00
Vlad Piersec
3426290bf2 fix(captions): Lift captions upper when invite box is shown & fix icon 2021-03-29 09:09:21 -05:00
Tudor D. Pop
dfd33521bf fix(virtual-background): Fixes upload virtual background on Firefox
Fixes: #8892
2021-03-29 14:28:22 +02:00
Hristo Terezov
be3bc75403 chore(deps) lib-jitsi-meet@latest
* fix(caps): features update event is not emitted.

0e180efdfa...1249681a0e
2021-03-26 17:43:54 -05:00
Jaya Allamsetty
4621fad832 fix(large-video): Always pin screenshare to large-video if it exists.
Set higher preference for screenshare over dominant speaker when trying to elect a participant for large-video. This prevents the dominant speaker from taking over the stage when a user toggles tile view on and off while a screenshare is in progress.
2021-03-26 09:14:03 -04:00
tmoldovan8x8
e4b34e1c89 feat(rn): makes InputDialog textInput autoFocus 2021-03-26 10:51:47 +02:00
damencho
0067f6b077 fix: Fixes lobby when allowners is enabled. 2021-03-25 15:20:49 -06:00
JohnProv
989044b3a9 fix(lang) update Dutch translation 2021-03-25 17:43:52 +01:00
Mihai-Andrei Uscat
a78ca5fcad feat(external_api): Add command for toggling localFlipX 2021-03-25 14:57:41 +02:00
Mihai-Andrei Uscat
1ad40de487 feat(external_api): Add command for toggling camera on mobile web 2021-03-25 13:48:49 +02:00
ggalperi
2c9078985f fix(lang) fix typo in Russian translation
Fixed typo
2021-03-24 15:59:45 -06:00
Tudor D. Pop
77ee4b13e1 feat(virtual-backgrounds) add ability to upload custom images 2021-03-24 17:32:45 +01:00
Jaya Allamsetty
a3a2ce3875 feat(rn,polyfill): Add a polyfill for Promise.allSettled.
Promise.allSettled is supported from RN 0.63 onwards and is not supported on the current version, use a polyfill for that shims Promise.allSettled if its unavailable or noncompliant.

Co-authored-by: Saúl Ibarra Corretgé <saghul@jitsi.org>
2021-03-24 11:59:52 -04:00
Saúl Ibarra Corretgé
e0c77dcd95 feat(tile-view) allow to toggle tile view while alone 2021-03-24 16:43:50 +01:00
Calinteodor
e035d33fa9 feat(authentication) refactor auth dialogs to use React 2021-03-24 15:09:40 +01:00
Kylian Kropf
11202595bd fix(lang) update Dutch translation 2021-03-24 11:16:32 +01:00
Jaya Allamsetty
415670e24b chore(deps) lib-jitsi-meet@latest
* fix(TPC): get ssrc info per ssrc and not per mline.
* feat: Consider absence of A/V muted from presence as muted.
* Feature: Moderator can revoke moderator role to others and himself (#1532)

4191198233...0e180efdfa
2021-03-23 18:11:23 -04:00
Izak Glasenčnik
05f3b4390d feat(iFrame): Emit event when recording status changes, including errors (#7973)
* feat(iFrame): Emit event when recording status changes, including errors

* Fix APP access on mobile
2021-03-23 11:35:46 -05:00
Saúl Ibarra Corretgé
cff0a619f5 fix(interfaceConfig) mark as deprecated 2021-03-23 16:59:46 +01:00
hmuresan
f7c0d4f1fe feat(background alpha) Set background transparency 2021-03-23 16:16:56 +02:00
TigiBoom
8fccb05519 fix(lang) fix typo in Russian translation 2021-03-23 14:47:25 +01:00
Vlad Piersec
b4155ab6d2 fix(toolbox): Add missing lang key for video settings 2021-03-23 15:38:15 +02:00
tmoldovan8x8
a1d3870634 feat(external_api): add videoMuted event and action (#8862) 2021-03-23 15:30:17 +02:00
hmuresan
07f16a7a51 feat (external-api) Add command for setting tile view mode 2021-03-23 15:21:57 +02:00
Vlad Piersec
0e7bde2ff0 fix(overflow-menu): Don't change state on hover for disabled items 2021-03-23 14:30:52 +02:00
Vlad Piersec
e9d00acad8 fix(menu): Pop menu icons & background 2021-03-23 14:18:22 +02:00
Mihai-Andrei Uscat
911aaed052 fix: Refactor client width computation.
* Unify chat open/close size changes and move them to redux.
* Fix responsive columns not accounting for chat.
2021-03-23 14:06:43 +02:00
Vlad Piersec
5fd9dc74e4 fix(welcome): Align meeting list at the top when no footer 2021-03-23 14:03:54 +02:00
Vlad Piersec
eb68467e15 fix(rn, toolbox): Change button appearing order 2021-03-23 10:14:54 +02:00
Jaya Allamsetty
6a5d6afc94 chore(deps) lib-jitsi-meet@latest
* fix(JingleSession): Avoid renegotiation when user with no sources leaves the call.
* feat: participant kick reason add
* ref(RTC): remove legacy pc constraints. Stop using the legacy pc constraints that are no longer wired up to WebRTC.
* fix(deps) update webrtc-adapter to v7.7.1

087a8e19eb...4191198233
2021-03-22 19:25:02 -04:00
Дамян Минков
2a9b6a7d28 fix(load-test): Fixes unmuting loadtest client. (#8849)
* fix(load-test): Fixes unmuting loadtest client.

Fixes the case where audio track was not added due to jicofo muting clients.

* squash(load-test): Drop noAutoLocalAudio and change add track logic.

Trying to mimic jitsi-meet.

* squash(load-test): Fix adding video.
2021-03-22 14:39:57 -05:00
adam j hartz
67beafc9af add option for disabling join/leave sounds (#8596)
* add option for disabling join/leave sounds

* document disableJoinLeaveSounds and add it to whitelist
2021-03-22 11:28:34 -05:00
BenjaminVega
6175a5cad5 Be able to toggle the raise-hand via external-api (#8838)
* Be able to toggle the raise-hand via external_api

* Code Review inputs
2021-03-22 11:22:45 -05:00
Vlad Piersec
678f3e232b fix(toolbar): Re-add "mute everyone's video" button 2021-03-22 15:25:30 +02:00
Jake Breen
f3c1b8ac08 fix(android) apply flags when launching activity from non-activity context
Check whether context is that of an Activity before launching the Jitsi Conference Activity. If context is not an activity context, apply flag FLAG_ACTIVITY_NEW_TASK to the Jitsi Activity Intent to ensure activity can launch without error.

This scenario would manifest when a user attempts to launch the Jitsi Actvity from a Widget... for example.

https://developer.android.com/about/versions/pie/android-9.0-changes-all#fant-required
2021-03-22 12:59:43 +01:00
John Wu
f225ce886f fix(chore) fix typo 2021-03-22 11:21:48 +01:00
dependabot[bot]
6a4417c6cc chore(deps): bump ini from 1.3.5 to 1.3.7
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-22 11:03:23 +01:00
Дамян Минков
6b66c8dd20 fix(config, docs) document feedbackPercentage 2021-03-22 10:56:26 +01:00
luz paz
d3680bbebd fix(misc) follow-up typos
Found via `codespell -q 3 -S ./lang`
2021-03-22 10:41:41 +01:00
dependabot[bot]
7933d4b4d6 chore(deps): bump xmldom from 0.1.27 to 0.5.0
Bumps [xmldom](https://github.com/xmldom/xmldom) from 0.1.27 to 0.5.0.
- [Release notes](https://github.com/xmldom/xmldom/releases)
- [Changelog](https://github.com/xmldom/xmldom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/xmldom/xmldom/compare/v0.1.27...0.5.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-22 10:36:43 +01:00
Vlad Piersec
e7297714c6 feat(toolbox): Adaptive toolbar on mobile 2021-03-22 11:26:00 +02:00
Saúl Ibarra Corretgé
8da154b185 fix(android) remove leftover package 2021-03-19 12:58:47 +01:00
Saúl Ibarra Corretgé
3c94a5ccfd feat(rn,ui) update in-meeting colors 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
78d4af6bf2 feat(rn,conference) new UI for conference name duration 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
33fc3833f9 fix(rn,labels) don't add extra margin in tile view
There is no need to skip the filmstrip, since it's not there.
2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
b179542c39 fix(rn,labels) top-align with room name field 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
49c38a73aa fix(filmstrip) make sure it's not rendered outside of a safe area 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
fc27300132 fix(rn,filmstrip) simplify thumbnail height calculations 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
57ecdff9eb fix(rn,conference) remove no longer needed margin
We are using a safe area view now.
2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
effa878fa4 fix(rn,filmstrip) simplify visibility calculation 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
9d4e49a5af fix(rn,toolbox) fill gap underneath Toolbox
This is for devices without the home button.
2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
6b4d25c0d3 fix(rn,ui) move top labels to navbar component 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
2f5ab2757f feat(rn,ui) get rid of the gradients 2021-03-19 11:32:00 +01:00
Saúl Ibarra Corretgé
bde26c4fbb fix(icons) never specify fill 2021-03-19 11:32:00 +01:00
trippledave
68c2c9be40 feat(flags) add feature flag for audio-only button 2021-03-19 08:17:37 +01:00
Jaya Allamsetty
5b21051c6b fix(startMuted): Fix unmute on mobile when it is muted by Jicofo on join. 2021-03-18 15:23:54 -04:00
hmuresan
8806269af0 * chore(deps) lib-jitsi-meet@latest
5796d83bb1...087a8e19eb
2021-03-18 19:34:44 +01:00
hmuresan
3a8bd852b2 feat(jwt) log jwt validation errors 2021-03-18 16:58:54 +02:00
Hristo Terezov
f50872285d ref(Filmstrip): Use Thumbnail component. 2021-03-18 09:37:55 -05:00
Jaya Allamsetty
e937e99284 chore(deps) lib-jitsi-meet@latest
* squash: Use different function syntax.
* squash: Fix lint errors.
* Process stats immediately before setting the interval.
* feat(ReceiveVideoController): Add the ability to send constraints in the new format. Add the ability to send the bridge messages for the receiver video constraints in the new format directly.

676c7a9105...5796d83bb1
2021-03-18 10:25:29 -04:00
Mihai-Andrei Uscat
3972e076f0 fix(Chat): Fix modals displaying improperly due to chat.
* Adjust chat font size.
* Adjust invite more button and text size.
* Remove useless constant.
2021-03-18 15:56:20 +02:00
Jonathan Lennox
81cf79e643 In loadtest, make localAudio non-const. (#8829)
(Because we modify it.)
2021-03-18 09:39:13 -04:00
Mihai-Andrei Uscat
a22d054b10 feat(InviteMore): Relocate invite prompt for mobile friendliness. 2021-03-18 14:09:22 +02:00
Vlad Piersec
7fce181080 feat(config): Add config option to allow unsetting local video flip 2021-03-18 09:35:42 +02:00
Vlad Piersec
92735478d1 fix(toolbox): Fix overflow menu & button background 2021-03-18 09:16:43 +02:00
Mihai-Andrei Uscat
7dabfc21b4 feat(Chat): Revamp design.
* ensure keyboard stays open when sending messages on mobile web.
2021-03-18 09:08:34 +02:00
Saúl Ibarra Corretgé
1395f84550 fix(virtual-background) fix tainted canvas when using the CDN
When we use a CDN the images come from an origin different than the site so
unless we mark them for CORS the canvas where they are painted will be tainted.

Ref: https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image
2021-03-17 16:32:16 +01:00
Vlad Piersec
d080460f9b fix(toolbox): Fix mic disabled icon 2021-03-17 15:23:45 +02:00
tmoldovan8x8
61567f47c0 fix(android) changes the property name for the manifestOutputDirectory 2021-03-17 14:19:43 +01:00
Avram Tudor
4f3058eae2 Merge pull request #8823 from jitsi/tavram/hide-support
fix(jaas) hide support link in invite error for jaas users
2021-03-17 15:16:32 +02:00
Tudor-Ovidiu Avram
3a073d9af4 fix(jaas) hide support link in invite error for jaas users 2021-03-17 11:53:58 +02:00
Mihai-Andrei Uscat
aef0287605 feat(ToggleCamera): Implement for web. 2021-03-17 10:44:18 +02:00
Vlad Piersec
bb19567efa fix(prejoin): Use localFlipX on prejoin screen 2021-03-17 09:19:55 +01:00
Saúl Ibarra Corretgé
79ab973694 chore(deps) update react-native-webrtc
Fix script for downloading bitcode.
2021-03-16 22:09:21 +01:00
Saúl Ibarra Corretgé
7046785ca3 chore(deps) update react-native-webrtc to 1.89.1 2021-03-16 19:57:26 +01:00
Saúl Ibarra Corretgé
b817bd19d5 chore(deps) bump js-utils to 1.0.6
Fixes a harmless but confusing error in postis processing when using the
Bitwarden Chrome extension, for example.
2021-03-16 19:57:03 +01:00
luz paz
817d54b0b9 fix(misc) typos
Found via `codespell -q 3 -S ./lang`
2021-03-16 16:12:12 +01:00
Vlad Piersec
3f0bb6818c fix(toolbox): Fix always on top toolbar 2021-03-16 16:07:49 +01:00
Saúl Ibarra Corretgé
4fa47c8070 fix(virtual-background) use a DOM element for storing the image
THis will reuse the previously cached image and obey the base href.

Ref:
https://stackoverflow.com/questions/6241716/is-there-a-difference-between-new-image-and-document-createelementimg
2021-03-16 11:27:27 +01:00
Saúl Ibarra Corretgé
0dcb8a025b fix(rn,bottomsheet) limit width 2021-03-16 11:19:52 +01:00
tmoldovan8x8
8defaa9aec feat(android): adds timer to OngoingNotification 2021-03-16 12:13:37 +02:00
Vlad Piersec
d214079148 fix(toolbox): Constrain toolbox width on large mobile device 2021-03-16 09:50:49 +01:00
Vlad Piersec
096ee3cb53 fix(toolbox): Background of disabled settings button & tileview button 2021-03-16 09:20:02 +01:00
Vlad Piersec
fd606896b8 fix(toolbox): Fix buttons size in minified mode 2021-03-16 09:32:36 +02:00
719 changed files with 22653 additions and 9943 deletions

View File

@@ -7,6 +7,7 @@ flow-typed/*
libs/*
resources/*
react/features/stream-effects/virtual-background/vendor/*
load-test/*
# ESLint will by default ignore its own configuration file. However, there does
# not seem to be a reason why we will want to risk being inconsistent with our

View File

@@ -12,6 +12,7 @@ jobs:
with:
node-version: '12.x'
- run: npm install
- run: git status -s --untracked-files=no
- name: Check if the git repository is clean
run: exit $( git status --porcelain --untracked-files=no | head -255 | wc -l )
- run: npm run lint
- run: make

View File

@@ -152,3 +152,20 @@ this model but new features should follow this new layout.
When working on an old feature, adding the necessary changes to migrate to the new
model is encouraged.
### Avoiding bundle bloat
When adding a new feature it's possible that it triggers a build failure due to the increased bundle size. We have safeguards inplace to avoid bundles growing disproportionatelly. While there are legit reasons for increasing the limits, please analyze the bundle first to make sure no unintended dependencies have been included, causing the increase in size.
First, make a production build with bundle-analysis enabled:
```
npx webpack -p --analyze-bundle
```
Then open the interactive bundle analyzer tool:
```
npx webpack-bundle-analyzer build/app-stats.json
```

View File

@@ -2,9 +2,9 @@
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](https://jitsi.org/security) and scalable video conferences. Jitsi Meet in action can be seen at [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
The Jitsi Meet client runs in your browser, without installing anything else on your computer. You can try it out at https://meet.jit.si.
The Jitsi Meet client runs in your browser, without installing anything on your computer. You can try it out at https://meet.jit.si.
Jitsi Meet allows very efficient collaboration. Users can stream their desktop or only some windows. It also supports shared document editing with Etherpad.
Jitsi Meet allows for very efficient collaboration. Users can stream their desktop or only some windows. It also supports shared document editing with Etherpad.
**NOTE:** If you are looking for Jitsi as a Service (JaaS) please start [here](https://jaas.8x8.vc).

View File

@@ -122,7 +122,7 @@ gradle.projectsEvaluated {
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.getProcessManifestProvider().get().doLast {
def outputDir = manifestOutputDirectory.get().asFile
def outputDir = multiApkManifestOutputDirectory.get().asFile
def manifestPath = new File(outputDir, 'AndroidManifest.xml')
def charset = 'UTF-8'
def text

View File

@@ -25,5 +25,5 @@ android.enableDexingArtifactTransform.desugaring=false
android.useAndroidX=true
android.enableJetifier=true
appVersion=21.0.0
sdkVersion=3.2.0
appVersion=21.2.0
sdkVersion=3.6.0

View File

@@ -70,7 +70,6 @@ dependencies {
implementation project(':react-native-default-preference')
implementation project(':react-native-immersive')
implementation project(':react-native-keep-awake')
implementation project(':react-native-linear-gradient')
implementation project(':react-native-sound')
implementation project(':react-native-svg')
implementation project(':react-native-webrtc')

View File

@@ -36,8 +36,17 @@ public class BroadcastAction {
for (String key : this.data.keySet()) {
try {
// TODO add support for different types of objects
nativeMap.putString(key, this.data.get(key).toString());
if (this.data.get(key) instanceof Boolean) {
nativeMap.putBoolean(key, (Boolean) this.data.get(key));
} else if (this.data.get(key) instanceof Integer) {
nativeMap.putInt(key, (Integer) this.data.get(key));
} else if (this.data.get(key) instanceof Double) {
nativeMap.putDouble(key, (Double) this.data.get(key));
} else if (this.data.get(key) instanceof String) {
nativeMap.putString(key, (String) this.data.get(key));
} else {
throw new Exception("Unsupported extra data type");
}
} catch (Exception e) {
JitsiMeetLogger.w(TAG + " invalid extra data in event", e);
}
@@ -66,7 +75,8 @@ public class BroadcastAction {
RETRIEVE_PARTICIPANTS_INFO("org.jitsi.meet.RETRIEVE_PARTICIPANTS_INFO"),
OPEN_CHAT("org.jitsi.meet.OPEN_CHAT"),
CLOSE_CHAT("org.jitsi.meet.CLOSE_CHAT"),
SEND_CHAT_MESSAGE("org.jitsi.meet.SEND_CHAT_MESSAGE");
SEND_CHAT_MESSAGE("org.jitsi.meet.SEND_CHAT_MESSAGE"),
SET_VIDEO_MUTED("org.jitsi.meet.SET_VIDEO_MUTED");
private final String action;

View File

@@ -85,7 +85,9 @@ public class BroadcastEvent {
SCREEN_SHARE_TOGGLED("org.jitsi.meet.SCREEN_SHARE_TOGGLED"),
PARTICIPANTS_INFO_RETRIEVED("org.jitsi.meet.PARTICIPANTS_INFO_RETRIEVED"),
CHAT_MESSAGE_RECEIVED("org.jitsi.meet.CHAT_MESSAGE_RECEIVED"),
CHAT_TOGGLED("org.jitsi.meet.CHAT_TOGGLED");
CHAT_TOGGLED("org.jitsi.meet.CHAT_TOGGLED"),
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED");
private static final String CONFERENCE_WILL_JOIN_NAME = "CONFERENCE_WILL_JOIN";
private static final String CONFERENCE_JOINED_NAME = "CONFERENCE_JOINED";
@@ -98,6 +100,7 @@ public class BroadcastEvent {
private static final String PARTICIPANTS_INFO_RETRIEVED_NAME = "PARTICIPANTS_INFO_RETRIEVED";
private static final String CHAT_MESSAGE_RECEIVED_NAME = "CHAT_MESSAGE_RECEIVED";
private static final String CHAT_TOGGLED_NAME = "CHAT_TOGGLED";
private static final String VIDEO_MUTED_CHANGED_NAME = "VIDEO_MUTED_CHANGED";
private final String action;
@@ -142,6 +145,8 @@ public class BroadcastEvent {
return CHAT_MESSAGE_RECEIVED;
case CHAT_TOGGLED_NAME:
return CHAT_TOGGLED;
case VIDEO_MUTED_CHANGED_NAME:
return VIDEO_MUTED_CHANGED;
}
return null;

View File

@@ -20,8 +20,10 @@ public class BroadcastIntentHelper {
return intent;
}
public static Intent buildToggleScreenShareIntent() {
return new Intent(BroadcastAction.Type.TOGGLE_SCREEN_SHARE.getAction());
public static Intent buildToggleScreenShareIntent(boolean enabled) {
Intent intent = new Intent(BroadcastAction.Type.TOGGLE_SCREEN_SHARE.getAction());
intent.putExtra("enabled", enabled);
return intent;
}
public static Intent buildOpenChatIntent(String participantId) {
@@ -40,4 +42,10 @@ public class BroadcastIntentHelper {
intent.putExtra("message", message);
return intent;
}
public static Intent buildSetVideoMutedIntent(boolean muted) {
Intent intent = new Intent(BroadcastAction.Type.SET_VIDEO_MUTED.getAction());
intent.putExtra("muted", muted);
return intent;
}
}

View File

@@ -85,6 +85,7 @@ class ExternalAPIModule
constants.put("OPEN_CHAT", BroadcastAction.Type.OPEN_CHAT.getAction());
constants.put("CLOSE_CHAT", BroadcastAction.Type.CLOSE_CHAT.getAction());
constants.put("SEND_CHAT_MESSAGE", BroadcastAction.Type.SEND_CHAT_MESSAGE.getAction());
constants.put("SET_VIDEO_MUTED", BroadcastAction.Type.SET_VIDEO_MUTED.getAction());
return constants;
}

View File

@@ -32,6 +32,7 @@ import com.facebook.react.modules.core.PermissionListener;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
import android.app.Activity;
/**
* A base activity for SDK users to embed. It uses {@link JitsiMeetFragment} to do the heavy
@@ -58,6 +59,9 @@ public class JitsiMeetActivity extends FragmentActivity
Intent intent = new Intent(context, JitsiMeetActivity.class);
intent.setAction(ACTION_JITSI_MEET_CONFERENCE);
intent.putExtra(JITSI_MEET_CONFERENCE_OPTIONS, options);
if (!(context instanceof Activity)) {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}

View File

@@ -132,6 +132,7 @@ public class JitsiMeetOngoingConferenceService extends Service
public void onCurrentConferenceChanged(String conferenceUrl) {
if (conferenceUrl == null) {
stopSelf();
OngoingNotification.resetStartingtime();
JitsiMeetLogger.i(TAG + "Service stopped");
}
}

View File

@@ -43,6 +43,7 @@ class OngoingNotification {
private static final String CHANNEL_NAME = "Ongoing Conference Notifications";
static final int NOTIFICATION_ID = new Random().nextInt(99999) + 10000;
private static long startingTime = 0;
static void createOngoingConferenceNotificationChannel() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
@@ -85,6 +86,10 @@ class OngoingNotification {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID);
if (startingTime == 0) {
startingTime = System.currentTimeMillis();
}
builder
.setCategory(NotificationCompat.CATEGORY_CALL)
.setContentTitle(context.getString(R.string.ongoing_notification_title))
@@ -92,6 +97,8 @@ class OngoingNotification {
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setOngoing(true)
.setWhen(startingTime)
.setUsesChronometer(true)
.setAutoCancel(false)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setOnlyAlertOnce(true)
@@ -110,6 +117,10 @@ class OngoingNotification {
return builder.build();
}
static void resetStartingtime() {
startingTime = 0;
}
private static NotificationCompat.Action createAction(Context context, JitsiMeetOngoingConferenceService.Action action, @StringRes int titleId) {
Intent intent = new Intent(context, JitsiMeetOngoingConferenceService.class);
intent.setAction(action.getName());

View File

@@ -178,7 +178,6 @@ class ReactInstanceManagerHolder {
List<ReactPackage> packages
= new ArrayList<>(Arrays.asList(
new com.BV.LinearGradient.LinearGradientPackage(),
new com.calendarevents.CalendarEventsPackage(),
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),

View File

@@ -19,8 +19,6 @@ 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-linear-gradient'
project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android')
include ':react-native-sound'
project(':react-native-sound').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sound/android')
include ':react-native-splash-screen'

2
app.js
View File

@@ -1,8 +1,6 @@
/* application specific logic */
import 'jquery';
import 'jquery-contextmenu';
import 'jQuery-Impromptu';
import 'olm';

9
babel.config.js Normal file
View File

@@ -0,0 +1,9 @@
module.exports = {
presets: [ 'module:metro-react-native-babel-preset' ],
env: {
production: {
plugins: [ 'react-native-paper/babel' ]
}
},
plugins: [ 'optional-require' ]
};

View File

@@ -1,10 +1,12 @@
/* global APP, JitsiMeetJS, config, interfaceConfig */
import { jitsiLocalStorage } from '@jitsi/js-utils';
import EventEmitter from 'events';
import Logger from 'jitsi-meet-logger';
import { openConnection } from './connection';
import { ENDPOINT_TEXT_MESSAGE_NAME } from './modules/API/constants';
import { AUDIO_ONLY_SCREEN_SHARE_NO_TRACK } from './modules/UI/UIErrors';
import AuthHandler from './modules/UI/authentication/AuthHandler';
import UIUtil from './modules/UI/util/UIUtil';
import mediaDeviceHelper from './modules/devices/mediaDeviceHelper';
@@ -125,8 +127,8 @@ import {
makePrecallTest
} from './react/features/prejoin';
import { disableReceiver, stopReceiver } from './react/features/remote-control';
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
import { toggleScreenshotCaptureEffect } from './react/features/screenshot-capture';
import { setSharedVideoStatus } from './react/features/shared-video/actions';
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
import { createPresenterEffect } from './react/features/stream-effects/presenter';
import { endpointMessageReceived } from './react/features/subtitles';
@@ -174,8 +176,7 @@ const commands = {
AVATAR_URL: AVATAR_URL_COMMAND,
CUSTOM_ROLE: 'custom-role',
EMAIL: EMAIL_COMMAND,
ETHERPAD: 'etherpad',
SHARED_VIDEO: 'shared-video'
ETHERPAD: 'etherpad'
};
/**
@@ -303,10 +304,14 @@ class ConferenceConnector {
// not enough rights to create conference
case JitsiConferenceErrors.AUTHENTICATION_REQUIRED: {
const { replaceParticipant }
= APP.store.getState()['features/base/config'];
// Schedule reconnect to check if someone else created the room.
this.reconnectTimeout = setTimeout(() => {
APP.store.dispatch(conferenceWillJoin(room));
room.join();
room.join(null, replaceParticipant);
}, 5000);
const { password }
@@ -378,7 +383,6 @@ class ConferenceConnector {
if (this.reconnectTimeout !== null) {
clearTimeout(this.reconnectTimeout);
}
AuthHandler.closeAuth();
}
/**
@@ -393,7 +397,10 @@ class ConferenceConnector {
*
*/
connect() {
room.join();
const { replaceParticipant } = APP.store.getState()['features/base/config'];
// the local storage overrides here and in connection.js can be used by jibri
room.join(jitsiLocalStorage.getItem('xmpp_conference_password_override'), replaceParticipant);
}
}
@@ -506,7 +513,7 @@ export default {
let tryCreateLocalTracks;
// On Electron there is no permission prompt for granting permissions. That's why we don't need to
// spend much time displaying the overlay screen. If GUM is not resolved withing 15 seconds it will
// spend much time displaying the overlay screen. If GUM is not resolved within 15 seconds it will
// probably never resolve.
const timeout = browser.isElectron() ? 15000 : 60000;
@@ -568,7 +575,7 @@ export default {
if (err.name === JitsiTrackErrors.TIMEOUT && !browser.isElectron()) {
// In this case we expect that the permission prompt is still visible. There is no point of
// executing GUM with different source. Also at the time of writting the following
// executing GUM with different source. Also at the time of writing the following
// inconsistency have been noticed in some browsers - if the permissions prompt is visible
// and another GUM is executed the prompt does not change its content but if the user
// clicks allow the user action isassociated with the latest GUM call.
@@ -625,7 +632,7 @@ export default {
// Hide the permissions prompt/overlay as soon as the tracks are
// created. Don't wait for the connection to be made, since in some
// cases, when auth is rquired, for instance, that won't happen until
// cases, when auth is required, for instance, that won't happen until
// the user inputs their credentials, but the dialog would be
// overshadowed by the overlay.
tryCreateLocalTracks.then(tracks => {
@@ -736,7 +743,7 @@ export default {
}
if (!tracks.find(t => t.isVideoTrack())) {
this.setVideoMuteStatus(true);
this.setVideoMuteStatus();
}
if (config.iAmRecorder) {
@@ -990,7 +997,7 @@ export default {
// This will only modify base/media.video.muted which is then synced
// up with the track at the end of local tracks initialization.
muteLocalVideo(mute);
this.setVideoMuteStatus(mute);
this.setVideoMuteStatus();
return;
} else if (this.isLocalVideoMuted() === mute) {
@@ -1084,17 +1091,6 @@ export default {
return room && room.isCallstatsEnabled();
},
/**
* Sends the given feedback through CallStats if enabled.
*
* @param overallFeedback an integer between 1 and 5 indicating the
* user feedback
* @param detailedFeedback detailed feedback from the user. Not yet used
*/
sendFeedback(overallFeedback, detailedFeedback) {
return room.sendFeedback(overallFeedback, detailedFeedback);
},
/**
* Get speaker stats that track total dominant speaker time.
*
@@ -1399,10 +1395,7 @@ export default {
.then(() => {
this.localVideo = newTrack;
this._setSharingScreen(newTrack);
if (newTrack) {
APP.UI.addLocalVideoStream(newTrack);
}
this.setVideoMuteStatus(this.isLocalVideoMuted());
this.setVideoMuteStatus();
})
.then(resolve)
.catch(error => {
@@ -1553,6 +1546,8 @@ export default {
this._desktopAudioStream = undefined;
}
APP.store.dispatch(setScreenAudioShareState(false));
if (didHaveVideo) {
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
.then(([ stream ]) => {
@@ -1669,6 +1664,23 @@ export default {
= this._turnScreenSharingOff.bind(this, didHaveVideo);
const desktopVideoStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.VIDEO);
const dekstopAudioStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
if (dekstopAudioStream) {
dekstopAudioStream.on(
JitsiTrackEvents.LOCAL_TRACK_STOPPED,
() => {
logger.debug(`Local screensharing audio track stopped. ${this.isSharingScreen}`);
// Handle case where screen share was stopped from the browsers 'screen share in progress'
// window. If audio screen sharing is stopped via the normal UX flow this point shouldn't
// be reached.
isScreenAudioShared(APP.store.getState())
&& this._untoggleScreenSharing
&& this._untoggleScreenSharing();
}
);
}
if (desktopVideoStream) {
desktopVideoStream.on(
@@ -1752,16 +1764,12 @@ export default {
const isPortrait = height >= width;
const DESKTOP_STREAM_CAP = 720;
// Config.js setting for resizing high resolution desktop tracks to 720p when presenter is turned on.
const resizeEnabled = config.videoQuality && config.videoQuality.resizeDesktopForPresenter;
const highResolutionTrack
= (isPortrait && width > DESKTOP_STREAM_CAP) || (!isPortrait && height > DESKTOP_STREAM_CAP);
// Resizing the desktop track for presenter is causing blurriness of the desktop share on chrome.
// Disable resizing by default, enable it only when config.js setting is enabled.
// Firefox doesn't return width and height for desktop tracks. Therefore, track needs to be resized
// for creating the canvas for presenter.
const resizeDesktopStream = browser.isFirefox() || (highResolutionTrack && resizeEnabled);
const resizeDesktopStream = highResolutionTrack && config.videoQuality?.resizeDesktopForPresenter;
if (resizeDesktopStream) {
let desktopResizeConstraints = {};
@@ -1779,7 +1787,7 @@ export default {
};
}
// Apply the contraints on the desktop track.
// Apply the constraints on the desktop track.
try {
await this.localVideo.track.applyConstraints(desktopResizeConstraints);
} catch (err) {
@@ -1806,7 +1814,7 @@ export default {
try {
await this.localVideo.setEffect(effect);
APP.store.dispatch(setVideoMuted(mute, MEDIA_TYPE.PRESENTER));
this.setVideoMuteStatus(mute);
this.setVideoMuteStatus();
} catch (err) {
logger.error('Failed to apply the Presenter effect', err);
}
@@ -1837,14 +1845,28 @@ export default {
return this._createDesktopTrack(options)
.then(async streams => {
const desktopVideoStream = streams.find(stream => stream.getType() === MEDIA_TYPE.VIDEO);
let desktopVideoStream = streams.find(stream => stream.getType() === MEDIA_TYPE.VIDEO);
this._desktopAudioStream = streams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
const { audioOnly = false } = options;
// If we're in audio only mode dispose of the video track otherwise the screensharing state will be
// inconsistent.
if (audioOnly) {
desktopVideoStream.dispose();
desktopVideoStream = undefined;
if (!this._desktopAudioStream) {
return Promise.reject(AUDIO_ONLY_SCREEN_SHARE_NO_TRACK);
}
}
if (desktopVideoStream) {
logger.debug(`_switchToScreenSharing is using ${desktopVideoStream} for useVideoStream`);
await this.useVideoStream(desktopVideoStream);
}
this._desktopAudioStream = streams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
if (this._desktopAudioStream) {
// If there is a localAudio stream, mix in the desktop audio stream captured by the screen sharing
@@ -1857,7 +1879,9 @@ export default {
// If no local stream is present ( i.e. no input audio devices) we use the screen share audio
// stream as we would use a regular stream.
await this.useAudioStream(this._desktopAudioStream);
}
APP.store.dispatch(setScreenAudioShareState(true));
}
})
.then(() => {
@@ -1925,6 +1949,9 @@ export default {
} else if (error.name === JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR) {
descriptionKey = 'dialog.screenSharingFailed';
titleKey = 'dialog.screenSharingFailedTitle';
} else if (error === AUDIO_ONLY_SCREEN_SHARE_NO_TRACK) {
descriptionKey = 'notify.screenShareNoAudio';
titleKey = 'notify.screenShareNoAudioTitle';
}
APP.UI.messageHandler.showError({
@@ -1951,7 +1978,12 @@ export default {
room.on(
JitsiConferenceEvents.CONFERENCE_UNIQUE_ID_SET,
(...args) => APP.store.dispatch(conferenceUniqueIdSet(room, ...args)));
(...args) => {
// Preserve the sessionId so that the value is accessible even after room
// is disconnected.
room.sessionId = room.getMeetingUniqueId();
APP.store.dispatch(conferenceUniqueIdSet(room, ...args));
});
room.on(
JitsiConferenceEvents.AUTH_STATUS_CHANGED,
@@ -1970,7 +2002,7 @@ export default {
}
APP.store.dispatch(updateRemoteParticipantFeatures(user));
logger.log(`USER ${id} connnected:`, user);
logger.log(`USER ${id} connected:`, user);
APP.UI.addUser(user);
});
@@ -1983,8 +2015,6 @@ export default {
}
logger.log(`USER ${id} LEFT:`, user);
APP.UI.onSharedVideoStop(id);
});
room.on(JitsiConferenceEvents.USER_STATUS_CHANGED, (id, status) => {
@@ -2143,7 +2173,20 @@ export default {
JitsiConferenceEvents.LOCK_STATE_CHANGED,
(...args) => APP.store.dispatch(lockStateChanged(room, ...args)));
room.on(JitsiConferenceEvents.KICKED, participant => {
room.on(JitsiConferenceEvents.KICKED, (participant, reason, isReplaced) => {
if (isReplaced) {
// this event triggers when the local participant is kicked, `participant`
// is the kicker. In replace participant case, kicker is undefined,
// as the server initiated it. We mark in store the local participant
// as being replaced based on jwt.
const localParticipant = getLocalParticipant(APP.store.getState());
APP.store.dispatch(participantUpdated({
conference: room,
id: localParticipant.id,
isReplaced
}));
}
APP.store.dispatch(kickedOut(room, participant));
});
@@ -2269,7 +2312,7 @@ export default {
return this._createPresenterStreamEffect(height, cameraDeviceId)
.then(effect => this.localVideo.setEffect(effect))
.then(() => {
this.setVideoMuteStatus(false);
this.setVideoMuteStatus();
logger.log('Switched local video device while screen sharing and the video is unmuted');
this._updateVideoDeviceId();
})
@@ -2408,65 +2451,18 @@ export default {
// There is no guarantee another event will trigger the update
// immediately and in all situations, for example because a remote
// participant is having connection trouble so no status changes.
APP.UI.updateAllVideos();
const displayedUserId = APP.UI.getLargeVideoID();
if (displayedUserId) {
APP.UI.updateLargeVideo(displayedUserId, true);
}
});
APP.UI.addListener(
UIEvents.TOGGLE_SCREENSHARING, this.toggleScreenSharing.bind(this)
UIEvents.TOGGLE_SCREENSHARING, audioOnly => {
this.toggleScreenSharing(undefined, { audioOnly });
}
);
/* eslint-disable max-params */
APP.UI.addListener(
UIEvents.UPDATE_SHARED_VIDEO,
(url, state, time, isMuted, volume) => {
/* eslint-enable max-params */
// send start and stop commands once, and remove any updates
// that had left
if (state === 'stop'
|| state === 'start'
|| state === 'playing') {
const localParticipant = getLocalParticipant(APP.store.getState());
room.removeCommand(this.commands.defaults.SHARED_VIDEO);
room.sendCommandOnce(this.commands.defaults.SHARED_VIDEO, {
value: url,
attributes: {
state,
time,
muted: isMuted,
volume,
from: localParticipant.id
}
});
} else {
// in case of paused, in order to allow late users to join
// paused
room.removeCommand(this.commands.defaults.SHARED_VIDEO);
room.sendCommand(this.commands.defaults.SHARED_VIDEO, {
value: url,
attributes: {
state,
time,
muted: isMuted,
volume
}
});
}
APP.store.dispatch(setSharedVideoStatus(state));
});
room.addCommandListener(
this.commands.defaults.SHARED_VIDEO,
({ value, attributes }, id) => {
if (attributes.state === 'stop') {
APP.UI.onSharedVideoStop(id, attributes);
} else if (attributes.state === 'start') {
APP.UI.onSharedVideoStart(id, value, attributes);
} else if (attributes.state === 'playing'
|| attributes.state === 'pause') {
APP.UI.onSharedVideoUpdate(id, value, attributes);
}
});
},
/**
@@ -2820,14 +2816,11 @@ export default {
requestFeedbackPromise = Promise.resolve(true);
}
// All promises are returning Promise.resolve to make Promise.all to
// be resolved when both Promises are finished. Otherwise Promise.all
// will reject on first rejected Promise and we can redirect the page
// before all operations are done.
Promise.all([
requestFeedbackPromise,
this.leaveRoomAndDisconnect()
]).then(values => {
])
.then(values => {
this._room = undefined;
room = undefined;
@@ -3065,12 +3058,9 @@ export default {
/**
* Sets the video muted status.
*
* @param {boolean} muted - New muted status.
*/
setVideoMuteStatus(muted) {
setVideoMuteStatus() {
APP.UI.setVideoMuted(this.getMyUserId());
APP.API.notifyVideoMutedStatusChanged(muted);
},
/**

113
config.js
View File

@@ -59,8 +59,10 @@ var config = {
// simulcast is turned off for the desktop share. If presenter is turned
// on while screensharing is in progress, the max bitrate is automatically
// adjusted to 2.5 Mbps. This takes a value between 0 and 1 which determines
// the probability for this to be enabled.
// capScreenshareBitrate: 1 // 0 to disable
// the probability for this to be enabled. This setting has been deprecated.
// desktopSharingFrameRate.max now determines whether simulcast will be enabled
// or disabled for the screenshare.
// capScreenshareBitrate: 1 // 0 to disable - deprecated.
// Enable callstats only for a percentage of users.
// This takes a value between 0 and 100 which determines the probability for
@@ -80,6 +82,9 @@ var config = {
// Media
//
// Enable unified plan implementation support on Chromium based browsers.
// enableUnifiedOnChrome: false,
// Audio
// Disable measuring of audio levels.
@@ -117,13 +122,15 @@ var config = {
// participants and to enable it back a reload is needed.
// startSilent: false
// Sets the preferred target bitrate for the Opus audio codec by setting its
// 'maxaveragebitrate' parameter. Currently not available in p2p mode.
// Valid values are in the range 6000 to 510000
// opusMaxAverageBitrate: 20000,
// Enables support for opus-red (redundancy for Opus).
// enableOpusRed: false
// enableOpusRed: false,
// Specify audio quality stereo and opusMaxAverageBitrate values in order to enable HD audio.
// Beware, by doing so, you are disabling echo cancellation, noise suppression and AGC.
// audioQuality: {
// stereo: false,
// opusMaxAverageBitrate: null // Value to fit the 6000 to 510000 range.
// },
// Video
@@ -224,6 +231,11 @@ var config = {
// Default value for the channel "last N" attribute. -1 for unlimited.
channelLastN: -1,
// Provides a way for the lastN value to be controlled through the UI.
// When startLastN is present, conference starts with a last-n value of startLastN and channelLastN
// 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.
@@ -261,12 +273,24 @@ var config = {
// // to take effect.
// preferredCodec: 'VP8',
//
// // Provides a way to enforce the preferred codec for the conference even when the conference has endpoints
// // that do not support the preferred codec. For example, older versions of Safari do not support VP9 yet.
// // This will result in Safari not being able to decode video from endpoints sending VP9 video.
// // When set to false, the conference falls back to VP8 whenever there is an endpoint that doesn't support the
// // preferred codec and goes back to the preferred codec when that endpoint leaves.
// // enforcePreferredCodec: false,
//
// // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for
// // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values
// // are the max.bitrates to be set on that particular type of stream. The actual send may vary based on
// // the available bandwidth calculated by the browser, but it will be capped by the values specified here.
// // This is currently not implemented on app based clients on mobile.
// maxBitratesVideo: {
// H264: {
// low: 200000,
// standard: 500000,
// high: 1500000
// },
// VP8 : {
// low: 200000,
// standard: 500000,
@@ -332,8 +356,7 @@ var config = {
// enableIceRestart: false,
// Enables forced reload of the client when the call is migrated as a result of
// the bridge going down. Currently enabled by default as call migration through
// session-terminate is causing siganling issues when Octo is enabled.
// the bridge going down.
// enableForcedReload: true,
// Use TURN/UDP servers for the jitsi-videobridge connection (by default
@@ -369,7 +392,9 @@ var config = {
// enableClosePage: false,
// Disable hiding of remote thumbnails when in a 1-on-1 conference call.
// disable1On1Mode: false,
// Setting this to null, will also disable showing the remote videos
// when the toolbar is shown on mouse movements
// disable1On1Mode: null | false | true,
// Default language for the user interface.
// defaultLanguage: 'en',
@@ -414,6 +439,10 @@ var config = {
// Base URL for a Gravatar-compatible service. Defaults to libravatar.
// gravatarBaseURL: 'https://seccdn.libravatar.org/avatar/',
// App name to be displayed in the invitation email subject, as an alternative to
// interfaceConfig.APP_NAME.
// inviteAppName: null,
// Moved from interfaceConfig(TOOLBAR_BUTTONS).
// The name of the toolbar buttons to display in the toolbar, including the
// "More actions" menu. If present, the button will display. Exceptions are
@@ -428,7 +457,7 @@ var config = {
// toolbarButtons: [
// 'microphone', 'camera', 'closedcaptions', 'desktop', 'embedmeeting', 'fullscreen',
// 'fodeviceselection', 'hangup', 'profile', 'chat', 'recording',
// 'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
// 'livestreaming', 'etherpad', 'sharedvideo', 'shareaudio', 'settings', 'raisehand',
// 'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
// 'tileview', 'select-background', 'download', 'help', 'mute-everyone', 'mute-video-everyone', 'security'
// ],
@@ -456,6 +485,10 @@ var config = {
// Enables sending participants' emails (if available) to callstats and other analytics
// enableEmailInStats: false,
// Controls the percentage of automatic feedback shown to participants when callstats is enabled.
// The default value is 100%. If set to 0, no automatic feedback will be requested
// feedbackPercentage: 100,
// Privacy
//
@@ -477,13 +510,6 @@ var config = {
// connection.
enabled: true,
// The STUN servers that will be used in the peer to peer connections
stunServers: [
// { urls: 'stun:jitsi-meet.example.com:3478' },
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
]
// 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
@@ -494,7 +520,7 @@ var config = {
// If set to true, it will prefer to use H.264 for P2P calls (if H.264
// is supported). This setting is deprecated, use preferredCodec instead.
// preferH264: true
// preferH264: true,
// Provides a way to set the video codec preference on the p2p connection. Acceptable
// codec values are 'VP8', 'VP9' and 'H264'.
@@ -509,7 +535,14 @@ var config = {
// How long we're going to wait, before going back to P2P after the 3rd
// participant has left the conference (to filter out page reload).
// backToP2PDelay: 5
// backToP2PDelay: 5,
// The STUN servers that will be used in the peer to peer connections
stunServers: [
// { urls: 'stun:jitsi-meet.example.com:3478' },
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
]
},
analytics: {
@@ -536,7 +569,7 @@ var config = {
// The interval at which rtcstats will poll getStats, defaults to 1000ms.
// If the value is set to 0 getStats won't be polled and the rtcstats client
// will only send data related to RTCPeerConnection events.
// rtcstatsPolIInterval: 1000
// rtcstatsPolIInterval: 1000,
// Array of script URLs to load as lib-jitsi-meet "analytics handlers".
// scriptURLs: [
@@ -559,6 +592,10 @@ var config = {
// Decides whether the start/stop recording audio notifications should play on record.
// disableRecordAudioNotification: false,
// Disables the sounds that play when other participants join or leave the
// conference (if set to true, these sounds will not be played).
// disableJoinLeaveSounds: false,
// Information for the chrome extension banner
// chromeExtensionBanner: {
// // The chrome extension to be installed address
@@ -579,8 +616,8 @@ var config = {
// localRecording: {
// Enables local recording.
// Additionally, 'localrecording' (all lowercase) needs to be added to
// TOOLBAR_BUTTONS in interface_config.js for the Local Recording
// button to show up on the toolbar.
// the `toolbarButtons`-array for the Local Recording button to show up
// on the toolbar.
//
// enabled: true,
//
@@ -618,6 +655,10 @@ var config = {
// the menu has option to flip the locally seen video for local presentations
// disableLocalVideoFlip: false,
// A property used to unset the default flip state of the local video.
// When it is set to 'true', the local(self) video will not be mirrored anymore.
// doNotFlipLocalVideo: false,
// Mainly privacy related settings
// Disables all invite functions from the app (share, invite, dial out...etc)
@@ -639,7 +680,9 @@ var config = {
// Options related to the remote participant menu.
// remoteVideoMenu: {
// // If set to true the 'Kick out' button will be disabled.
// disableKick: true
// disableKick: true,
// // If set to true the 'Grant moderator' button will be disabled.
// disableGrantModerator: true
// },
// If set to true all muting operations of remote participants will be disabled.
@@ -651,8 +694,11 @@ var config = {
/**
External API url used to receive branding specific information.
If there is no url set or there are missing fields, the defaults are applied.
The config file should be in JSON.
None of the fields are mandatory and the response must have the shape:
{
// The domain url to apply (will replace the domain in the sharing conference link/embed section)
inviteDomain: 'example-company.org,
// The hex value for the colour used as background
backgroundColor: '#fff',
// The url for the image used as background
@@ -665,6 +711,9 @@ var config = {
*/
// dynamicBrandingUrl: '',
// Sets the background transparency level. '0' is fully transparent, '1' is opaque.
// backgroundAlpha: 1,
// The URL of the moderated rooms microservice, if available. If it
// is present, a link to the service will be rendered on the welcome page,
// otherwise the app doesn't render it.
@@ -674,13 +723,13 @@ var config = {
// disableTileView: true,
// Hides the conference subject
// hideConferenceSubject: true
// hideConferenceSubject: true,
// Hides the conference timer.
// hideConferenceTimer: true,
// Hides the participants stats
// hideParticipantsStats: true
// hideParticipantsStats: true,
// Sets the conference subject
// subject: 'Conference Subject',
@@ -745,6 +794,11 @@ var config = {
websocketKeepAliveUrl
*/
/**
* Default interval (milliseconds) for triggering mouseMoved iframe API event
*/
mouseMoveCallbackInterval: 1000,
/**
Use this array to configure which notifications will be shown to the user
The items correspond to the title or description key of that notification
@@ -804,7 +858,10 @@ var config = {
// 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone
// 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted
// 'transcribing.failedToStart' // shown when transcribing fails to start
// ]
// ],
// Prevent the filmstrip from autohiding when screen width is under a certain threshold
// disableFilmstripAutohiding: false,
// Allow all above example options to include a trailing comma and
// prevent fear when commenting out the last value.

View File

@@ -3,18 +3,20 @@
import { jitsiLocalStorage } from '@jitsi/js-utils';
import Logger from 'jitsi-meet-logger';
import AuthHandler from './modules/UI/authentication/AuthHandler';
import { redirectToTokenAuthService } from './modules/UI/authentication/AuthHandler';
import { LoginDialog } from './react/features/authentication/components';
import { isTokenAuthEnabled } from './react/features/authentication/functions';
import {
connectionEstablished,
connectionFailed
} from './react/features/base/connection/actions';
import { openDialog } from './react/features/base/dialog/actions';
import {
isFatalJitsiConnectionError,
JitsiConnectionErrors,
JitsiConnectionEvents
} from './react/features/base/lib-jitsi-meet';
import { setPrejoinDisplayNameRequired } from './react/features/prejoin/actions';
const logger = Logger.getLogger(__filename);
/**
@@ -80,7 +82,7 @@ function checkForAttachParametersAndConnect(id, password, connection) {
* @returns {Promise<JitsiConnection>} connection if
* everything is ok, else error.
*/
function connect(id, password, roomName) {
export function connect(id, password, roomName) {
const connectionConfig = Object.assign({}, config);
const { jwt } = APP.store.getState()['features/base/jwt'];
@@ -214,10 +216,38 @@ export function openConnection({ id, password, retry, roomName }) {
const { jwt } = APP.store.getState()['features/base/jwt'];
if (err === JitsiConnectionErrors.PASSWORD_REQUIRED && !jwt) {
return AuthHandler.requestAuth(roomName, connect);
return requestAuth(roomName);
}
}
throw err;
});
}
/**
* Show Authentication Dialog and try to connect with new credentials.
* If failed to connect because of PASSWORD_REQUIRED error
* then ask for password again.
* @param {string} [roomName] name of the conference room
*
* @returns {Promise<JitsiConnection>}
*/
function requestAuth(roomName) {
const config = APP.store.getState()['features/base/config'];
if (isTokenAuthEnabled(config)) {
// This Promise never resolves as user gets redirected to another URL
return new Promise(() => redirectToTokenAuthService(roomName));
}
return new Promise(resolve => {
const onSuccess = connection => {
resolve(connection);
};
APP.store.dispatch(
openDialog(LoginDialog, { onSuccess,
roomName })
);
});
}

View File

@@ -32,12 +32,25 @@
.dropdown-menu div[style*="transform"] {
outline: 1px solid #455166;
}
.dropdown-menu button:not(:active):not(:hover) > span {
color: #B8C7E0;
}
/**
* Override @atlaskit/tab styling when in a modal because the
* tab text color clash with the modal backgrounds.
*/
div[role="tablist"] > div:not([data-selected]):not(:hover),
label > div > span {
color: #B8C7E0 !important;
}
}
/**
* Override @atlaskit/modal-dialog header styling
*/
.atlaskit-portal [role="dialog"] header {
box-shadow: none;
.jitsi-icon {
cursor: pointer;
}
@@ -47,6 +60,13 @@
}
}
/**
* Override @atlaskit/modal-dialog footer styling.
*/
.atlaskit-portal [role="dialog"] footer {
box-shadow: none;
}
/**
* Make header close button more easily tappable on mobile.
*/
@@ -72,8 +92,10 @@
* 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;
}
@@ -111,15 +133,16 @@
}
}
@media (min-width: 580px) and (max-width: 680px) {
.mobile-browser {
&.shift-right .focus-lock > div > div {
@include full-size-modal-positioner();
}
@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;
}
&.shift-right .focus-lock [role="dialog"] {
@include full-size-modal-dialog();
}
// Remove Atlaskit padding from the chat dialog.
.shift-right .focus-lock [role="dialog"] > div:first-child > div:nth-child(2) {
padding: 0;
}
}

View File

@@ -9,6 +9,11 @@
max-height: 456px;
overflow: auto;
width: 300px;
&-ul {
margin:0;
padding:0;
list-style-type: none;
}
}
&-header {
@@ -64,7 +69,13 @@
&-speaker {
position: relative;
&:hover {
&-ul {
margin:0;
padding:0;
list-style-type: none;
}
&:hover, &:focus-within, &:focus {
.audio-preview-entry {
background: #36383C;
margin-left: 0;
@@ -72,7 +83,7 @@
&--selected {
padding-left: 18px;
background: #131519;
background: $newToolbarBackgroundColor;
}
}
@@ -81,7 +92,7 @@
}
.audio-preview-entry-text {
max-width: 196px;
max-width: 178px;
}
}
@@ -90,7 +101,7 @@
}
.audio-preview-entry-text {
max-width: 256px;
max-width: 238px;
}
}
@@ -104,7 +115,7 @@
padding-left: 48px;
&--selected {
background: #131519;
background: $newToolbarBackgroundColor;
padding-left: 18px;
}
}
@@ -150,8 +161,9 @@
color: #1C2025;
cursor: pointer;
font-weight: 600;
font-size: 0.8rem;
line-height: 24px;
padding: 2px 16px;
padding: 2px 8px;
position: absolute;
right: 16px;
top: 5px;
@@ -162,4 +174,10 @@
right: 16px;
top: 14px;
}
// Override @atlaskit/InlineDialog container which is made with styled components
& > div:nth-child(2) {
outline: none;
padding: 0;
}
}

View File

@@ -219,8 +219,9 @@ abbr {
}
a {
color: #3572b0;
color: #44A5FF;
text-decoration: none;
font-weight: bold;
}
a:focus,
a:hover,

View File

@@ -1,7 +1,7 @@
.avatar {
background-color: #AAA;
border-radius: 50%;
color: rgba(255, 255, 255, 0.6);
color: rgba(255, 255, 255, 1);
font-weight: 100;
object-fit: cover;
@@ -25,10 +25,6 @@
width: 100%;
}
.defaultAvatar {
opacity: 0.6
}
.avatar-badge {
position: relative;

View File

@@ -55,6 +55,10 @@ body {
fill: white;
}
.disabled .jitsi-icon svg {
fill: #929292;
}
.jitsi-icon.gray svg {
fill: #5E6D7A;
cursor: pointer;

View File

@@ -1,5 +1,5 @@
#sideToolbarContainer {
background-color: $newToolbarBackgroundColor;
background-color: $chatBackgroundColor;
box-sizing: border-box;
color: #FFF;
display: flex;
@@ -99,13 +99,13 @@
div {
svg {
cursor: pointer;
fill: white
fill: white;
}
}
}
.chat-header {
background-color: $chatHeaderBackgroundColor;
height: 70px;
position: relative;
width: 100%;
@@ -123,22 +123,27 @@
.jitsi-icon {
cursor: pointer;
}
.jitsi-icon > svg {
fill: #A4B8D1;
}
}
.chat-input-container {
padding: 0 16px 24px;
padding: 0 16px 16px;
&.populated {
#chat-input {
border: 1px solid #619CF4;
.send-button {
background: #1B67EC;
cursor: pointer;
margin-left: 0.3rem;
@media (hover: hover) and (pointer: fine) {
&:hover {
background: #3D82FB;
}
}
&:active {
background: #0852D4;
}
path {
fill: #fff;
@@ -151,9 +156,13 @@
#chat-input {
border: 1px solid $chatInputSeparatorColor;
display: flex;
padding: 5px 10px;
padding: 4px;
border-radius: 3px;
&:focus-within {
border: 1px solid #619CF4;
}
* {
background-color: transparent;
}
@@ -177,10 +186,21 @@
}
}
.mobile-browser {
.send-button {
height: 48px;
width: 48px;
.smiley-button {
display: flex;
align-items: center;
justify-content: center;
height: 38px;
width: 38px;
margin: 2px;
border-radius: 3px;
}
#chat-input .smiley-button {
@media (hover: hover) and (pointer: fine) {
&:hover {
background-color: #484A4F;
}
}
}
@@ -197,7 +217,7 @@
border-radius:0;
box-shadow: none;
color: white;
font-size: 15px;
font-size: 14px;
padding: 10px;
overflow-y: auto;
resize: none;
@@ -209,6 +229,11 @@
border: 0px none;
box-shadow: none;
}
#usermsg:focus,
#usermsg:active {
border-bottom: 1px solid white;
padding-bottom: 8px;
}
#nickname {
text-align: center;
@@ -217,6 +242,16 @@
margin: auto 0;
padding: 0 16px;
#nickname-title {
margin-bottom: 5px;
display: block;
}
label[for="nickinput"] {
> div > span {
color: #B8C7E0;
}
}
input {
height: 40px;
}
@@ -237,7 +272,7 @@
cursor: pointer;
&.disabled {
color: #757575;
color: #AFB6BC;
background: #11336E;
pointer-events: none;
}
@@ -254,6 +289,14 @@
height: 48px;
}
}
#usermsg {
font-size: 16px;
}
.chatmessage .usermessage {
font-size: 16px;
}
}
.sideToolbarContainer {
@@ -263,8 +306,8 @@
}
.display-name {
font-size: 13px;
font-weight: bold;
font-size: 12px;
font-weight: 600;
margin-bottom: 5px;
white-space: nowrap;
text-overflow: ellipsis;
@@ -276,6 +319,19 @@
}
}
.sr-only {
border: 0 !important;
clip: rect(1px, 1px, 1px, 1px) !important;
clip-path: inset(50%) !important;
height: 1px !important;
margin: -1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
width: 1px !important;
white-space: nowrap !important;
}
.chatmessage {
background-color: $chatRemoteMessageBackgroundColor;
border-radius: 0px 6px 6px 6px;
@@ -292,6 +348,7 @@
.usermessage {
white-space: pre-wrap;
font-size: 14px;
}
&.error {
@@ -314,14 +371,14 @@
}
.messagecontent {
margin: 5px 10px;
margin: 8px;
max-width: 100%;
overflow: hidden;
}
}
.smiley {
font-size: 14pt;
.timestamp {
color: #757575;
}
#smileys {
@@ -352,10 +409,12 @@
box-sizing: border-box;
background-color: rgba(0, 0, 0, .6) !important;
height: auto;
max-height: 0;
display: none;
overflow: hidden;
position: absolute;
width: $sidebarWidth;
width: calc(#{$sidebarWidth} - 32px);
margin-bottom: 5px;
margin-left: -5px;
/**
* CSS transitions do not apply for auto dimensions. So to produce the css
@@ -366,13 +425,13 @@
transition: max-height 0.3s;
&.show-smileys {
display: flex;
max-height: 500%;
}
#smileysContainer {
background-color: $newToolbarBackgroundColor;
border-bottom: 1px solid;
border-top: 1px solid;
background-color: $chatBackgroundColor;
border-top: 1px solid $chatInputSeparatorColor;
}
}
@@ -382,7 +441,7 @@
.smileyContainer {
width: 40px;
height: 36px;
height: 40px;
display: inline-block;
text-align: center;
}
@@ -480,7 +539,7 @@
display: flex;
justify-content: space-between;
align-items: center;
margin: 16px 16px 24px;
margin: 16px;
width: calc(100% - 32px);
box-sizing: border-box;
color: #fff;
@@ -491,19 +550,11 @@
.jitsi-icon {
cursor: pointer;
}
.jitsi-icon > svg {
fill: #A4B8D1;
}
}
#chatconversation {
width: 100%;
}
.chat-input-container {
padding: 0 0 24px;
}
}
.touchmove-hack {
@@ -520,6 +571,6 @@
place-items: center;
height: 48px;
width: 48px;
background: #2a3a4b;
background: #36383C;
border-radius: 3px;
}

View File

@@ -8,7 +8,10 @@
.read-more {
cursor: pointer;
opacity: .7;
opacity: .9;
color: #fff;
font-size: 0.8rem;
font-weight: bold;
}
}

View File

@@ -1,129 +0,0 @@
/*
------------------------------
Impromptu
------------------------------
*/
.jqifade{
position: absolute;
background-color: #000;
}
div.jqi{
width: 400px;
position: absolute;
color: #3a3a3a;
background-color: #ffffff;
font-size: 11px;
text-align: left;
border: solid 1px #eeeeee;
border-radius: 6px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
padding: 7px;
}
div.jqi .jqicontainer{
}
div.jqi .jqiclose{
position: absolute;
top: 4px; right: -2px;
width: 18px;
cursor: default;
color: #bbbbbb;
font-weight: bold;
}
div.jqi .jqistate{
background-color: #fff;
}
div.jqi .jqititle{
padding: 5px 10px;
font-size: 16px;
line-height: 20px;
border-bottom: solid 1px #eeeeee;
}
div.jqi .jqimessage{
padding: 10px;
line-height: 20px;
color: #444444;
}
div.jqi .jqibuttons{
text-align: right;
margin: 0 -7px -7px -7px;
border-top: solid 1px #e4e4e4;
background-color: #f4f4f4;
border-radius: 0 0 6px 6px;
-moz-border-radius: 0 0 6px 6px;
-webkit-border-radius: 0 0 6px 6px;
}
div.jqi .jqibuttons button{
margin: 0;
padding: 5px 20px;
background-color: transparent !important;
font-weight: normal;
border: none;
border-left: solid 1px #e4e4e4;
color: #777;
font-weight: bold;
font-size: 12px;
}
div.jqi .jqibuttons button.jqidefaultbutton{
color: #489afe;
}
div.jqi .jqibuttons button:disabled {
color: #b6b6b6 !important;
}
div.jqi .jqibuttons button:hover,
div.jqi .jqibuttons button:focus{
color: #287ade;
outline: none;
}
.jqiwarning .jqi .jqibuttons{
background-color: #b95656;
}
/* sub states */
div.jqi .jqiparentstate::after{
background-color: #777;
opacity: 0.6;
filter: alpha(opacity=60);
content: '';
position: absolute;
top:0;left:0;bottom:0;right:0;
border-radius: 6px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
}
div.jqi .jqisubstate{
position: absolute;
top:0;
left: 20%;
width: 60%;
padding: 7px;
border: solid 1px #eeeeee;
border-top: none;
border-radius: 0 0 6px 6px;
-moz-border-radius: 0 0 6px 6px;
-webkit-border-radius: 0 0 6px 6px;
}
div.jqi .jqisubstate .jqibuttons button{
padding: 10px 18px;
}
/* arrows for tooltips/tours */
.jqi .jqiarrow{ position: absolute; height: 0; width:0; line-height: 0; font-size: 0; border: solid 10px transparent;}
.jqi .jqiarrowtl{ left: 10px; top: -20px; border-bottom-color: #ffffff; }
.jqi .jqiarrowtc{ left: 50%; top: -20px; border-bottom-color: #ffffff; margin-left: -10px; }
.jqi .jqiarrowtr{ right: 10px; top: -20px; border-bottom-color: #ffffff; }
.jqi .jqiarrowbl{ left: 10px; bottom: -20px; border-top-color: #ffffff; }
.jqi .jqiarrowbc{ left: 50%; bottom: -20px; border-top-color: #ffffff; margin-left: -10px; }
.jqi .jqiarrowbr{ right: 10px; bottom: -20px; border-top-color: #ffffff; }
.jqi .jqiarrowlt{ left: -20px; top: 10px; border-right-color: #ffffff; }
.jqi .jqiarrowlm{ left: -20px; top: 50%; border-right-color: #ffffff; margin-top: -10px; }
.jqi .jqiarrowlb{ left: -20px; bottom: 10px; border-right-color: #ffffff; }
.jqi .jqiarrowrt{ right: -20px; top: 10px; border-left-color: #ffffff; }
.jqi .jqiarrowrm{ right: -20px; top: 50%; border-left-color: #ffffff; margin-top: -10px; }
.jqi .jqiarrowrb{ right: -20px; bottom: 10px; border-left-color: #ffffff; }

View File

@@ -1,206 +0,0 @@
@charset "UTF-8";
/*!
* jQuery contextMenu - Plugin for simple contextMenu handling
*
* Version: v2.1.1
*
* Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF)
* Web: http://swisnl.github.io/jQuery-contextMenu/
*
* Copyright (c) 2011-2016 SWIS BV and contributors
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
* Date: 2016-02-28T09:53:18.890Z
*/
@font-face {
font-family: "context-menu-icons";
font-style: normal;
font-weight: normal;
src: url("font/context-menu-icons.eot?2qmzf");
src: url("font/context-menu-icons.eot?2qmzf#iefix") format("embedded-opentype"), url("font/context-menu-icons.woff2?2qmzf") format("woff2"), url("font/context-menu-icons.woff?2qmzf") format("woff"), url("font/context-menu-icons.ttf?2qmzf") format("truetype");
}
.context-menu-icon:before {
position: absolute;
top: 50%;
left: 0;
width: 28px;
font-family: "context-menu-icons";
font-size: 16px;
font-style: normal;
font-weight: normal;
line-height: 1;
color: #2980b9;
text-align: center;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.context-menu-icon-add:before {
content: "";
}
.context-menu-icon-copy:before {
content: "";
}
.context-menu-icon-cut:before {
content: "";
}
.context-menu-icon-delete:before {
content: "";
}
.context-menu-icon-edit:before {
content: "";
}
.context-menu-icon-paste:before {
content: "";
}
.context-menu-icon-quit:before {
content: "";
}
.context-menu-icon.context-menu-hover:before {
color: #fff;
}
.context-menu-list {
position: absolute;
display: inline-block;
min-width: 180px;
max-width: 360px;
padding: 4px 0;
margin: 5px;
font-family: inherit;
font-size: inherit;
list-style-type: none;
background: #fff;
border: 1px solid #bebebe;
border-radius: $borderRadius;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
}
.context-menu-item {
position: relative;
padding: 3px 28px;
color: #2f2f2f;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-color: #fff;
}
.context-menu-separator {
padding: 0;
margin: 5px 0;
border-bottom: 1px solid #e6e6e6;
}
.context-menu-item > label > input,
.context-menu-item > label > textarea {
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.context-menu-item.context-menu-hover {
color: #fff;
cursor: pointer;
background-color: #2980b9;
}
.context-menu-item.context-menu-disabled {
color: #626262;
background-color: #fff;
}
.context-menu-item.context-menu-disabled {
color: #626262;
}
.context-menu-input.context-menu-hover,
.context-menu-item.context-menu-disabled.context-menu-hover {
cursor: default;
background-color: #eee;
}
.context-menu-submenu:after {
position: absolute;
top: 50%;
right: 8px;
z-index: $zindex1;
width: 0;
height: 0;
content: '';
border-color: transparent transparent transparent #2f2f2f;
border-style: solid;
border-width: 4px 0 4px 4px;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
/**
* Inputs
*/
.context-menu-item.context-menu-input {
padding: 5px 10px;
}
/* vertically align inside labels */
.context-menu-input > label > * {
vertical-align: top;
}
/* position checkboxes and radios as icons */
.context-menu-input > label > input[type="checkbox"],
.context-menu-input > label > input[type="radio"] {
position: relative;
top: 3px;
}
.context-menu-input > label,
.context-menu-input > label > input[type="text"],
.context-menu-input > label > textarea,
.context-menu-input > label > select {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.context-menu-input > label > textarea {
height: 100px;
}
.context-menu-item > .context-menu-list {
top: 5px;
/* re-positioned by js */
right: -5px;
display: none;
}
.context-menu-item.context-menu-visible > .context-menu-list {
display: block;
}
.context-menu-accesskey {
text-decoration: underline;
}

View File

@@ -1,68 +1,37 @@
.large-video-labels {
.label {
align-items: center;
background: #36383C;
border-radius: 3px;
color: #fff;
display: flex;
position: absolute;
top: 30px;
right: 30px;
transition: right 0.5s;
z-index: $labelsZ;
font-size: 12px;
font-weight: 600;
height: 28px;
margin: 0 0 4px 4px;
padding: 0 8px;
.circular-label {
align-items: center;
color: white;
display: flex;
font-weight: bold;
justify-content: center;
margin-left: 8px;
opacity: 0.8;
&--green {
background: #31B76A;
}
.circular-label {
background: #B8C7E0;
&--red {
background: #E34F56
}
.circular-label.e2ee {
align-items: center;
background: #76CF9C;
display: flex;
justify-content: center;
}
&--white {
background: #fff;
color: #5e6d7a;
.circular-label.file {
background: #FF5630;
}
.circular-label.local-rec {
background: #FF5630;
}
.circular-label.stream {
background: #0065FF;
}
.circular-label.insecure {
background: $defaultWarningColor;
}
.recording-label.center-message {
background: $videoStateIndicatorBackground;
bottom: 50%;
display: block;
left: 50%;
padding: 10px;
position: fixed;
transform: translate(-50%, -50%);
z-index: $centeredVideoLabelZ;
svg {
fill: #5e6d7a;
}
}
}
.circular-label {
background: $videoStateIndicatorBackground;
border-radius: 50%;
box-sizing: border-box;
cursor: default;
font-size: 13px;
height: $videoStateIndicatorSize;
line-height: $videoStateIndicatorSize;
text-align: center;
min-width: $videoStateIndicatorSize;
}
.label-text-with-icon {
margin-left: 8px;
}
.participants-count {
cursor: pointer;
}

View File

@@ -9,7 +9,7 @@
.spinner {
margin: 30px;
}
.joining-message {
margin: 10px;
}
@@ -49,7 +49,7 @@
position: fixed;
top: 20;
transition: top 1s ease;
z-index: 100;
z-index: $toolbarZ + 1;
&.toolbox-visible {
// Same as toolbox subject position
@@ -62,31 +62,6 @@
padding: 15px
}
ul {
list-style-type: none;
padding: 0 15px 15px 15px;
li {
align-items: center;
display: flex;
flex-direction: row;
margin: 8px 0;
.details {
display: flex;
flex: 1;
flex-direction: column;
justify-content: space-evenly;
margin: 0 30px 0 10px;
}
button {
align-self: unset;
margin: 0 5px;
}
}
}
button {
align-self: stretch;
margin: 8px 0;
@@ -116,3 +91,50 @@
}
}
}
.knocking-participants-container {
list-style-type: none;
max-height: 600px;
overflow-y: scroll;
padding: 0 15px 15px 15px;
}
.knocking-participant {
align-items: center;
display: flex;
flex-direction: row;
margin: 8px 0;
.details {
display: flex;
flex: 1;
flex-direction: column;
justify-content: space-evenly;
margin: 0 30px 0 10px;
}
button {
align-self: unset;
margin: 0 5px;
}
}
@media (max-width: 300px) {
#knocking-participant-list {
margin: 0;
text-align: center;
width: 100%;
.avatar {
display: none;
}
}
.knocking-participant {
flex-direction: column;
.details {
margin: 0;
}
}
}

View File

@@ -125,7 +125,8 @@
cursor: pointer;
}
&.with-click-handler:hover {
&.with-click-handler:hover,
&.with-click-handler:focus {
background-color: #c7ddff;
}
@@ -158,7 +159,7 @@
}
}
.item:hover {
.item:hover, .item:focus, .item:focus-within {
.delete-meeting {
display: block;
}

View File

@@ -8,9 +8,11 @@
.toolbox-icon {
cursor: pointer;
padding: 7px;
width: 22px;
height : 22px;
&.toggled {
background: $AOTToolbarButtonToggleColor;
background: none;
}
&.disabled {
@@ -23,44 +25,11 @@
flex-direction: row;
left: 50%;
position: absolute;
top: 10px;
bottom: 10px;
transform: translateX(-50%);
.toolbox-button {
&:first-child {
.toolbox-icon {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
}
&:nth-child(2) {
svg {
fill: $hangupColor;
}
}
&:last-child {
.toolbox-icon {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
}
}
padding: 3px !important;
}
.filmstrip-toolbox {
flex-direction: column;
.toolbox-button {
&:nth-child(1) {
svg {
fill: $hangupColor;
}
}
.toolbox-icon {
border-radius: 3px;
}
}
}
}

View File

@@ -1,26 +0,0 @@
.participants-count {
background: #fff;
border-radius: 4px;
color: #5e6d7a;
cursor: pointer;
display: inline-block;
font-size: 13px;
line-height: 20px;
margin-left: 16px;
padding: 4px 8px;
pointer-events: auto;
&-number {
margin-right: 8px;
vertical-align: middle;
}
&-icon {
background: url('../images/user-groups.svg');
background-repeat: no-repeat;
display: inline-block;
height: 16px;
width: 16px;
vertical-align: middle;
}
}

View File

@@ -0,0 +1,51 @@
.participants_pane {
background-color: $participantsPaneBgColor;
flex-shrink: 0;
overflow: hidden;
position: relative;
transition: width .16s ease-in-out;
width: 315px;
z-index: $zindex0;
&--closed {
width: 0;
}
}
.participants_pane-content {
display: flex;
flex-direction: column;
font-weight: 600;
height: 100%;
width: 315px;
& > *:first-child,
& > *:last-child {
flex-shrink: 0;
}
}
.participant-avatar {
margin: 8px 16px 8px 0;
}
@media (max-width: 375px) {
.participants_pane {
height: 100vh;
height: -webkit-fill-available;
left: 0;
position: fixed;
right: 0;
top: 0;
width: auto;
&--closed {
display: none;
width: auto;
}
}
.participants_pane-content {
width: 100%;
}
}

View File

@@ -3,7 +3,9 @@
**/
.popupmenu {
min-width: 75px;
background-color: $menuBG;
border-radius: 3px;
min-width: 150px;
text-align: left;
padding: 0px;
white-space: nowrap;
@@ -38,6 +40,7 @@
&__text {
display: inline-block;
margin-left: 8px;
vertical-align: middle;
}
@@ -109,6 +112,6 @@ ul.popupmenu {
margin: -16px -24px;
}
span.remotevideomenu:hover ul.popupmenu, ul.popupmenu:hover {
span.localvideomenu:hover ul.popupmenu, span.remotevideomenu:hover ul.popupmenu, ul.popupmenu:hover {
display:block !important;
}

View File

@@ -3,6 +3,15 @@
&-input-area {
margin: 0 auto;
text-align: center;
&-label {
display: block;
margin-bottom: 5px;
color: #ffffff;
font-weight: 300;
font-size: 15px;
line-height: 24px;
}
}
&-title {
@@ -74,10 +83,10 @@
z-index: 1;
&--warning {
background: rgba(241, 173, 51, 0.7)
background: rgba(241, 173, 51, 1);
}
&--ok {
background: rgba(49, 183, 106, 0.7);
background: rgba(49, 183, 106, 1);
}
}
@@ -92,6 +101,8 @@
&-error-desc {
margin-right: 4px;
color: #fff;
font-weight: bold;
}
.settings-button-container {

View File

@@ -1,8 +1,7 @@
/**
* Shared style for full screen local track based dialogs/modals.
*/
.premeeting-screen,
.preview-overlay {
.premeeting-screen {
position: absolute;
left: 0;
right: 0;
@@ -93,11 +92,6 @@
}
}
.preview-overlay {
background-image: linear-gradient(transparent, black);
z-index: $toolbarZ + 1;
}
.content {
align-items: center;
display: flex;
@@ -119,7 +113,7 @@
cursor: pointer;
color: #fff;
display: flex;
flex-direction: row;
flex-direction: column;
font-size: 15px;
font-weight: 300;
justify-content: center;
@@ -145,6 +139,9 @@
margin-left: 10px;
}
}
.copy-button{
width: 298px;
}
.copy-meeting-text {
width: 266px;
@@ -183,7 +180,7 @@
}
&.focused {
box-shadow: 0px 0px 4px 3px #0376DA;
box-shadow: 0px 0px 1px 1.5px black, 0px 0px 1.3px 4px white;
}
}
}
@@ -255,10 +252,16 @@
fill: transparent;
}
label {
cursor: pointer;
}
&:hover {
background: rgba(255, 255, 255, 0.1);
@include icon-container(#A4B8D1, #1C2025);
.toggle-button-icon-container {
display: none;
}
}
&-container {
@@ -276,5 +279,15 @@
&--toggled {
@include icon-container(white, #1C2025);
&:hover {
.toggle-button-icon-container {
display: block;
}
}
.toggle-button-icon-container {
display: block;
}
}
}

View File

@@ -105,6 +105,7 @@
.helper-link {
cursor: pointer;
font-weight: bold;
display: inline-block;
flex-shrink: 0;
margin-left: auto;

View File

@@ -39,6 +39,8 @@
}
&.settings-button-small-icon--disabled {
background: #36383C;
&> svg {
fill: #929292;
}

View File

@@ -1,35 +1,60 @@
.subject {
box-sizing: border-box;
color: #fff;
margin-top: 20px;
position: absolute;
top: -120px;
transition: top .3s ease-in;
height: 95px;
width: 100%;
pointer-events: none;
position: absolute;
padding: 25px 140px 0 140px;
text-align: center;
font-size: 17px;
color: #fff;
z-index: $zindex10;
overflow: hidden;
text-overflow: ellipsis;
box-sizing: border-box;
white-space: nowrap;
z-index: $zindex3;
&.visible {
top: 0px;
}
}
&.gradient {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
.subject-info-container {
display: flex;
justify-content: center;
max-width: calc(100% - 280px);
margin: 0 auto;
&--full-width {
max-width: 100%;
}
&-text {
vertical-align: middle;
}
&-conference-timer {
display: block;
font-size: 15px;
opacity: 0.6;
@media (max-width: 500px) {
flex-wrap: wrap;
max-width: 100%;
}
}
.subject-info {
align-items: center;
display: flex;
margin-bottom: 4px;
max-width: 80%;
height: 28px;
}
.subject-text {
background: rgba(0, 0, 0, 0.6);
border-radius: 3px 0px 0px 3px;
font-size: 14px;
line-height: 24px;
padding: 2px 16px;
height: 24px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.subject-timer {
background: rgba(0, 0, 0, 0.8);
border-radius: 0px 3px 3px 0px;
display: inline-block;
font-size: 12px;
line-height: 16px;
min-width: 34px;
padding: 6px 8px;
}

View File

@@ -54,6 +54,7 @@
margin-bottom: 16px;
position: relative;
z-index: $toolbarZ;
pointer-events: none;
.button-group-center,
.button-group-left,
@@ -72,10 +73,6 @@
.toolbox-button-wth-dialog {
display: inline-block;
&> div {
padding: 0;
}
}
}
@@ -102,14 +99,22 @@
}
}
.toolbox-content-wrapper {
display: flex;
flex-direction: column;
margin: 0 auto;
max-width: 100%;
pointer-events: all;
}
.toolbox-content-items {
background: #131519;
background: $newToolbarBackgroundColor;
box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.15);
border-radius: 6px;
margin: 0 auto;
padding: 6px;
text-align: center;
pointer-events: all;
>div {
margin-left: 8px;
@@ -165,9 +170,14 @@
cursor: initial;
color: #929292;
&:hover {
background: none;
}
svg {
fill: #929292;
}
}
@media (hover: hover) and (pointer: fine) {
@@ -235,6 +245,11 @@
}
}
@media (max-width: 320px) {
height: 36px;
width: 36px;
}
&.toggled {
background: $newToolbarButtonToggleColor;
}
@@ -294,12 +309,16 @@
}
/**
* On small mobile devices make the toolbar full width.
* On small mobile devices make the toolbar full width and pad the invite prompt.
*/
.toolbox-content-mobile {
@media (max-width: 500px) {
margin-bottom: 0;
.toolbox-content-wrapper {
width: 100%;
}
.toolbox-content-items {
border-radius: 0;
display: flex;
@@ -307,5 +326,13 @@
padding: 6px 0;
width: 100%;
}
.invite-more-container {
margin: 0 16px 8px;
}
.invite-more-container.elevated {
margin-bottom: 52px;
}
}
}

View File

@@ -1,10 +1,11 @@
.transcription-subtitles{
bottom: 10%;
.transcription-subtitles {
bottom: $newToolbarSize + 40px;
font-size: 16px;
font-weight: 1000;
left: 50%;
max-width: 50vw;
opacity: 0.80;
overflow-wrap: break-word;
pointer-events: none;
position: absolute;
text-shadow: 0px 0px 1px rgba(0,0,0,0.3),
@@ -14,6 +15,11 @@
transform: translateX(-50%);
z-index: $subtitlesZ;
&.lifted {
// Lift subtitle above toolbar+invite box.
bottom: $newToolbarSize + 112px + 40px;
}
span {
background: black;
}

View File

@@ -30,6 +30,7 @@ $defaultSideBarFontColor: #44A5FF;
$defaultSemiDarkColor: #ACACAC;
$defaultDarkColor: #2b3d5c;
$defaultWarningColor: rgb(215, 121, 118);
$participantsPaneBgColor: #141414;
$presence-available: rgb(110, 176, 5);
$presence-away: rgb(250, 201, 20);
$presence-busy: rgb(233, 0, 27);
@@ -38,11 +39,9 @@ $presence-idle: rgb(172, 172, 172);
/**
* Toolbar
*/
$newToolbarBackgroundColor: rgba(22, 38, 55, 0.8);
$newToolbarBackgroundColor: #131519;
$newToolbarButtonHoverColor: rgba(255, 255, 255, 0.2);
$newToolbarButtonToggleColor: rgba(255, 255, 255, 0.15);
$AOTToolbarButtonHoverColor: rgba(14, 20, 35, 0.6);
$AOTToolbarButtonToggleColor: rgba(14, 20, 35, 1);
$menuBG:#242528;
$newToolbarFontSize: 24px;
$newToolbarHangupFontSize: 32px;
@@ -91,12 +90,12 @@ $modalTextColor: #333;
* Chat
*/
$chatActionsSeparatorColor: rgb(173, 105, 112);
$chatHeaderBackgroundColor: rgba(42, 58, 75, 0.9);
$chatBackgroundColor: #131519;
$chatInputSeparatorColor: #A4B8D1;
$chatLocalMessageBackgroundColor: rgb(4, 98, 178);
$chatLocalMessageBackgroundColor: #484A4F;
$chatPrivateMessageBackgroundColor: rgb(153, 69, 77);
$chatRemoteMessageBackgroundColor: rgb(86, 101, 114);
$sidebarWidth: 375px;
$chatRemoteMessageBackgroundColor: #242528;
$sidebarWidth: 315px;
/**
* Misc.
@@ -116,7 +115,6 @@ $zindex2: 2;
$zindex3: 3;
$toolbarBackgroundZ: 4;
$labelsZ: 5;
$filmstripVideosZ: 6;
$subtitlesZ: 7;
$popoverZ: 8;
$zindex10: 10;
@@ -131,6 +129,9 @@ $dropdownMaskZ: 900;
$dropdownZ: 901;
$centeredVideoLabelZ: 1010;
$overlayZ: 1016;
// Place filmstrip videos over toolbar in order
// to make connection info visible.
$filmstripVideosZ: $toolbarZ + 1;
/**

View File

@@ -79,4 +79,8 @@
white-space: nowrap;
}
}
// Override @atlaskit/InlineDialog container which is made with styled components
& > div:nth-child(2) {
padding: 0;
}
}

View File

@@ -1,5 +1,13 @@
#videoconference_page {
min-height: 100%;
position: relative;
transform: translate3d(0, 0, 0);
width: 100%;
}
#layout_wrapper {
display: flex;
height: 100%;
}
#videospace {
@@ -232,6 +240,15 @@
object-fit: cover;
}
#sharedVideo video {
width: 100%;
height: 100%;
}
#sharedVideo.disable-pointer {
pointer-events: none;
}
#sharedVideo,
#etherpad,
#localVideoWrapper video,
@@ -400,7 +417,9 @@
}
}
.local-video-menu-trigger,
.remote-video-menu-trigger,
.localvideomenu,
.remotevideomenu
{
display: inline-block;
@@ -409,7 +428,7 @@
right: 0;
z-index: $zindex2;
width: 18px;
height: 13px;
height: 18px;
color: #FFF;
font-size: 10pt;
margin-right: $remoteVideoMenuIconMargin;
@@ -418,6 +437,7 @@
cursor: hand;
}
}
.local-video-menu-trigger,
.remote-video-menu-trigger {
margin-top: 7px;
}

View File

@@ -233,6 +233,10 @@ body.welcome-page {
}
}
&.without-footer {
justify-content: start;
}
.welcome-cards-container {
color:#131519;
padding-top: 40px;

View File

@@ -3,7 +3,7 @@
justify-content: space-between;
align-items: center;
padding: 8px 8px 8px 16px;
margin-top: 8px;
margin-top: 5px;
width: calc(100% - 24px);
height: 24px;

View File

@@ -1,3 +1,5 @@
$rangeInputThumbSize: 14;
/**
* Disable the default webkit styles for range inputs (sliders).
*/
@@ -7,10 +9,10 @@ input[type=range]{
}
/**
* Disable the default focus styles for webkit range inputs (sliders).
* Show focus for keyboard accessibility.
*/
input[type=range]:focus {
outline: none;
outline: 1px solid white !important;
}
/**

View File

@@ -16,7 +16,6 @@
padding: 0;
margin: 0;
border: none;
outline: none;
-webkit-appearance: none;

View File

@@ -19,7 +19,7 @@
0 0 3px $videoThumbnailSelected;
}
.remotevideomenu > .icon-menu {
.remotevideomenu > .icon-menu, .localvideomenu > .icon-menu {
display: none;
}
@@ -32,7 +32,7 @@
box-shadow: inset 0 0 3px $videoThumbnailHovered,
0 0 3px $videoThumbnailHovered;
.remotevideomenu > .icon-menu {
.remotevideomenu > .icon-menu, .localvideomenu > .icon-menu {
display: inline-block;
}
}

View File

@@ -7,7 +7,7 @@
* see.
*/
.active-speaker {
box-shadow: 0 0 5px 3px $videoThumbnailSelected
box-shadow: 0px 0px 1px 1.5px black, 0px 0px 1.3px 4px $videoThumbnailSelected;
}
#filmstripRemoteVideos {
@@ -16,7 +16,7 @@
display: flex;
flex-direction: column;
height: 100%;
width: 100vw;
width: 100%;
}
.filmstrip__videos .videocontainer {
@@ -50,10 +50,6 @@
&.shift-right {
margin-left: $sidebarWidth;
width: calc(100% - #{$sidebarWidth});
#filmstripRemoteVideos {
width: calc(100vw - #{$sidebarWidth});
}
}
}
}
@@ -121,3 +117,15 @@
align-self: baseline;
}
}
.shift-right #filmstripRemoteVideosContainer {
/**
* Max-width corresponding to the ASPECT_RATIO_BREAKPOINT from features/filmstrip/constants,
* from which we subtract the chat size.
*/
@media only screen and (max-width: calc(500px + #{$sidebarWidth})) {
video {
object-fit: cover;
}
}
}

View File

@@ -43,6 +43,7 @@
* specifically the various status icons.
*/
.remotevideomenu,
.localvideomenu,
.videocontainer__toptoolbar {
z-index: auto;
}

View File

@@ -51,6 +51,7 @@
* and tooltips from getting a new location context due to translate3d.
*/
.connection-indicator,
.local-video-menu-trigger,
.remote-video-menu-trigger,
.indicator-icon-container {
transform: translate3d(0, 0, 0);
@@ -68,7 +69,9 @@
* Move the remote video menu trigger to the bottom left of the video
* thumbnail.
*/
.localvideomenu,
.remotevideomenu,
.local-video-menu-trigger,
.remote-video-menu-trigger {
bottom: 0;
left: 0;
@@ -76,8 +79,9 @@
right: auto;
}
.local-video-menu-trigger,
.remote-video-menu-trigger {
margin-bottom: 7px;
margin-bottom: 3px;
margin-left: $remoteVideoMenuIconMargin;
}
}

View File

@@ -48,7 +48,6 @@ $flagsImagePath: "../images/";
@import 'videolayout_default';
@import 'notice';
@import 'subject';
@import 'participants-count';
@import 'popup_menu';
@import 'recording';
@import 'login_menu';
@@ -58,7 +57,6 @@ $flagsImagePath: "../images/";
@import 'welcome_page_content';
@import 'welcome_page_settings_toolbar';
@import 'toolbars';
@import 'jquery.contextMenu';
@import 'keyboard-shortcuts';
@import 'redirect_page';
@import 'components/form-control';
@@ -105,5 +103,6 @@ $flagsImagePath: "../images/";
@import 'responsive';
@import 'connection-status';
@import 'drawer';
@import 'participants-pane';
/* Modules END */

View File

@@ -103,7 +103,7 @@
font-size: 14px;
a {
color: #2684FF;
color: #6FB1EA;
cursor: pointer;
text-decoration: none;
}
@@ -119,7 +119,7 @@
height: 8px;
.audio-input-preview-level {
background: #4C9AFF;
background: #75B1FF;
border-radius: 5px;
height: 100%;
-webkit-transition: width .1s ease-in-out;
@@ -129,3 +129,20 @@
}
}
}
.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

@@ -94,5 +94,9 @@
};
}
.star-btn:focus,
.star-btn:active {
outline: 1px solid #B8C7E0;
}
}
}

View File

@@ -30,20 +30,26 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: 5px;
}
.info-password-none,
.info-password-remote {
opacity: 0.5;
color: #fff;
}
.info-password-input {
width: 100%;
background-color: transparent;
border: none;
background-color: #0E1624;
border-radius: 3px;
border: 2px solid #202B3D;
color: inherit;
padding-left: 0;
}
.info-password-input:focus ,
.info-password-input:active {
border: 2px solid #B8C7E0;
}
.info-password-local {
user-select: text;

View File

@@ -1,31 +1,42 @@
.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;
position: absolute;
width: 100%;
text-align: center;
z-index: $zindex2;
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
}
&-header {
font-size: 19px;
line-height: 28px;
margin: 24px 0 16px 0;
max-width: 100%;
margin-bottom: 16px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
&-button {
display: flex;
margin: auto;
max-width: 100%;
height: 40px;
box-sizing: border-box;
padding: 8px 16px;
width: fit-content;
width: -moz-fit-content;
height: 24px;
background: #0376DA;
border-radius: 3px;
font-size: 14px;
line-height: 24px;
cursor: pointer;
@media (hover: hover) and (pointer: fine) {
@@ -36,8 +47,9 @@
&-text {
margin-left: 8px;
font-size: 15px;
line-height: 24px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
}
&-dialog {
@@ -85,18 +97,18 @@
border-top: none;
border-radius: 0 0 3px 3px;
& > * {
display: flex;
justify-content: center;
.copy-invite-icon, .provider-icon {
align-items: center;
height: 40px;
width: 40px;
border-radius: 4px;
cursor: pointer;
display: flex;
height: 40px;
place-content: center;
width: 40px;
}
&:hover > div:hover {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 4px;
}
& > :not(:last-child) {
@@ -118,6 +130,7 @@
display: inline-block;
vertical-align: middle;
cursor: pointer;
height: 24px;
}
}
@@ -129,7 +142,7 @@
& > a {
display: inline-block;
height: 24px;
width: 48px;
min-width: 48px;
border-radius: 3px;
text-align: center;
text-decoration: none;
@@ -195,3 +208,14 @@
}
}
}
.mobile-browser {
.invite-more-content {
font-size: 16px;
}
.invite-more-button {
height: 48px;
padding: 12px 16px;
}
}

View File

@@ -16,12 +16,19 @@
}
.mock-atlaskit-label {
color: #56637A;
color: #b8c7e0;
font-size: 12px;
font-weight: 600;
line-height: 1.33;
padding: 20px 0px 4px 0px;
}
input[type="checkbox"]:checked + svg {
--checkbox-background-color: #6492e7;
--checkbox-border-color: #6492e7;
}
input[type="checkbox"] + svg + span {
color: #b8c7e0;
}
input[type="checkbox"] + svg + span {
color: #9FB0CC;
@@ -47,6 +54,7 @@
.language-settings {
max-width: 50%;
width: 35%;
}
.calendar-tab {
@@ -64,4 +72,14 @@
.sign-out-cta {
margin-bottom: 20px;
}
@media only screen and (max-width: $smallScreen) {
.device-selection {
display: flex;
flex-direction: column;
}
.more-tab {
flex-direction: column;
}
}
}

View File

@@ -86,6 +86,7 @@
.video-quality-dialog-label-container.active {
color: $videoQualityActive;
font-weight: bold;
&::before {
background: $videoQualityActive;

View File

@@ -1,44 +1,190 @@
.virtual-background-dialog{
display: inline-flex;
cursor: pointer;
.thumbnail{
.virtual-background-dialog {
margin-left:-10px;
position: relative;
max-height: 300px;
color: white;
display: inline-grid;
grid-template-columns: auto auto auto auto auto;
column-gap: 9px;
cursor: pointer;
.desktop-share:hover, .thumbnail:hover, .blur:hover, .slight-blur:hover, .virtual-background-none:hover{
opacity: .5;
border: 2px solid #99bbf3;
@media (min-width: 432px) and (min-width: 432px) and (max-width: 632px) {
height: 56px;
width: 56px;
}
@media (max-width: 432px){
height: 56px;
width: 56px;
}
}
.background-option {
margin-top: 8px;
border-radius: 6px;
height: 60px;
width: 107px;
text-align: center;
justify-content: center;
font-weight: bold;
box-sizing: border-box;
display: flex;
align-items: center;
}
.thumbnail {
object-fit: cover;
}
.thumbnail:hover ~ .delete-image-icon {
display: block;
}
.thumbnail-selected {
object-fit: cover;
border: 2px solid #246FE5;
}
.blur{
box-shadow: inset 0 0 12px #000000;
background: #7E8287;
padding: 0 10px;
}
.blur-selected {
box-shadow: inset 0 0 12px #000000;
background: #7E8287;
border: 2px solid #246FE5;
padding: 0 10px;
}
.slight-blur{
box-shadow: inset 0 0 12px #000000;
background: #A4A4A4;
padding: 0 10px;
}
.slight-blur-selected{
box-shadow: inset 0 0 12px #000000;
background: #A4A4A4;
border: 2px solid #246FE5;
padding: 0 10px;
}
.virtual-background-none {
background: #525252;
padding: 0 10px;
}
.none-selected {
background: #525252;
border: 2px solid #246FE5;
padding: 0 10px;
}
.desktop-share{
background: #525252;
}
.desktop-share-selected{
background: #525252;
border: 2px solid #246FE5;
padding: 0 10px;
}
@media (min-width: 432px) and (max-width: 632px) {
font-size: 1.5vw;
}
@media (max-width: 432px){
font-size: 1.5vw;
}
}
.modal-dialog-form .virtual-background-loading {
overflow: hidden;
position: fixed;
left: 50%;
margin-top: 10px;
transform: translateX(-50%);
}
.modal-dialog-form .video-preview {
height: 250px;
}
.file-upload-btn {
display: none;
}
.file-upload-label{
font-size: 14px;
font-weight: 600;
line-height: 20px;
margin-left: -10px;
margin-top: 16px;
margin-bottom: 8px;
color: #669AEC;
display: inline-flex;
cursor: pointer;
}
.delete-image-icon {
background: #3d3d3d;
position: absolute;
display: none;
left: 96;
bottom: 51;
@media (min-width: 432px) and (max-width: 632px) {
left: 51px
}
}
.delete-image-icon:hover {
display: block;
}
.thumbnail-container {
position: relative;
&:focus-within {
.thumbnail ~ .delete-image-icon{
display: block;
}
}
}
.add-background{
margin-right: 8px;
}
.apply-background-btn{
margin-top: 16px;
float: right;
}
.video-background-preview-entry{
margin-left: -10px;
height: 250px;
width: 570px;
margin-bottom: 8px;
z-index: 2;
@media (min-width: 432px) and (max-width: 632px) {
max-width: 336;
}
@media (max-width: 432px){
max-width: 336;
}
}
.virtual-background-preview-video{
margin-left: -10;
border-radius: 6px;
height: 100%;
object-fit: cover;
padding: 5px;
height: 40px;
width: 40px;
}
.thumbnail-selected{
object-fit: cover;
padding: 5px;
height: 40px;
width: 40px;
border: 2px solid #a4b8d1;
}
.blur-selected{
border: 2px solid #a4b8d1;
}
.virtual-background-none{
font-weight: bold;
padding: 5px;
height: 35px;
width: 35px;
border-radius: 10px;
border: 1px solid #a4b8d1;
text-align: center;
vertical-align: middle;
line-height: 35px;
margin-right: 5px;
}
.none-selected{
font-weight: bold;
padding: 5px;
height: 35px;
width: 35px;
border-radius: 10px;
border: 2px solid #a4b8d1;
text-align: center;
vertical-align: middle;
line-height: 35px;
margin-right: 5px;
}
}
width: 100%;
}
.video-preview-loader{
border-radius: 6px;
background-color: transparent;
height: 250px;
margin-bottom: 8px;
width: 572px;
position: fixed;
z-index: 2;
@media (min-width: 432px) and (max-width: 632px) {
width: 340px;
}
}
.video-preview-loader svg{
position: absolute;
top: 40%;
left: 45%;
}

View File

@@ -107,4 +107,4 @@ $selectActiveItemBg: darken($controlBackground, 20%);
/**
* TODO: Replace by themed component.
*/
$videoQualityActive: #4C9AFF;
$videoQualityActive: #57A0ff;

View File

@@ -125,11 +125,11 @@ case "$1" in
# Check whether prosody config has the internal muc, if not add it,
# as we are migrating configs
if [ -f $PROSODY_HOST_CONFIG ] && ! grep -q "internal.auth.$JVB_HOSTNAME" $PROSODY_HOST_CONFIG; then
echo -e "\nComponent \"internal.auth.$JVB_HOSTNAME\" \"muc\"" >> $PROSODY_HOST_CONFIG
if [ -f $PROSODY_HOST_CONFIG ] && ! grep -q "internal.$JICOFO_AUTH_DOMAIN" $PROSODY_HOST_CONFIG; then
echo -e "\nComponent \"internal.$JICOFO_AUTH_DOMAIN\" \"muc\"" >> $PROSODY_HOST_CONFIG
echo -e " storage = \"memory\"" >> $PROSODY_HOST_CONFIG
echo -e " modules_enabled = { \"ping\"; }" >> $PROSODY_HOST_CONFIG
echo -e " admins = { \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\", \"jvb@auth.$JVB_HOSTNAME\" }" >> $PROSODY_HOST_CONFIG
echo -e " admins = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\", \"jvb@$JICOFO_AUTH_DOMAIN\" }" >> $PROSODY_HOST_CONFIG
fi
# Convert the old focus component config to the new one.
@@ -140,7 +140,7 @@ case "$1" in
# Component "focus.jitmeet.example.com" "client_proxy"
# target_address = "focus@auth.jitmeet.example.com"
if grep -q "Component \"focus.$JVB_HOSTNAME\"" $PROSODY_HOST_CONFIG && ! grep "Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"" $PROSODY_HOST_CONFIG ;then
sed -i "s/Component \"focus.$JVB_HOSTNAME\"/Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"\n target_address = \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\"/g" $PROSODY_HOST_CONFIG
sed -i "s/Component \"focus.$JVB_HOSTNAME\"/Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"\n target_address = \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\"/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
@@ -151,8 +151,21 @@ case "$1" in
PROSODY_CONFIG_PRESENT="false"
fi
# Updates main muc component
MAIN_MUC_PATTERN="Component \"conference.$JVB_HOSTNAME\" \"muc\""
if ! grep -A 2 -- "${MAIN_MUC_PATTERN}" $PROSODY_HOST_CONFIG | grep -q "restrict_room_creation" ;then
sed -i "s/${MAIN_MUC_PATTERN}/${MAIN_MUC_PATTERN}\n restrict_room_creation = true/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
if ! grep -q -- 'unlimited_jids' $PROSODY_HOST_CONFIG ;then
sed -i "1s/^/unlimited_jids = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\", \"jvb@$JICOFO_AUTH_DOMAIN\" }\n/" $PROSODY_HOST_CONFIG
sed -i "s/VirtualHost \"$JICOFO_AUTH_DOMAIN\"/VirtualHost \"$JICOFO_AUTH_DOMAIN\"\n modules_enabled = { \"limits_exception\"; }/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
# Make sure the focus@auth user's roster includes the proxy component (this is idempotent)
prosodyctl mod_roster_command subscribe focus.$JVB_HOSTNAME $JICOFO_AUTH_USER@auth.$JVB_HOSTNAME
prosodyctl mod_roster_command subscribe focus.$JVB_HOSTNAME $JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN
if [ ! -f /var/lib/prosody/$JVB_HOSTNAME.crt ]; then
# prosodyctl takes care for the permissions

View File

@@ -1,6 +1,5 @@
interface_config.js /usr/share/jitsi-meet/
logging_config.js /usr/share/jitsi-meet/
*.json /usr/share/jitsi-meet/
*.html /usr/share/jitsi-meet/
*.ico /usr/share/jitsi-meet/
libs /usr/share/jitsi-meet/

View File

@@ -20,6 +20,11 @@ ssl = {
ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
}
unlimited_jids = {
"focusUser@auth.jitmeet.example.com",
"jvb@auth.jitmeet.example.com"
}
VirtualHost "jitmeet.example.com"
-- enabled = false -- Remove this line to enable this host
authentication = "anonymous"
@@ -35,6 +40,7 @@ VirtualHost "jitmeet.example.com"
key = "/etc/prosody/certs/jitmeet.example.com.key";
certificate = "/etc/prosody/certs/jitmeet.example.com.crt";
}
av_moderation_component = "avmoderation.jitmeet.example.com"
speakerstats_component = "speakerstats.jitmeet.example.com"
conference_duration_component = "conferenceduration.jitmeet.example.com"
-- we need bosh
@@ -46,6 +52,7 @@ VirtualHost "jitmeet.example.com"
"external_services";
"conference_duration";
"muc_lobby_rooms";
"av_moderation";
}
c2s_require_encryption = false
lobby_muc = "lobby.jitmeet.example.com"
@@ -53,6 +60,7 @@ VirtualHost "jitmeet.example.com"
-- muc_lobby_whitelist = { "recorder.jitmeet.example.com" } -- Here we can whitelist jibri to enter lobby enabled rooms
Component "conference.jitmeet.example.com" "muc"
restrict_room_creation = true
storage = "memory"
modules_enabled = {
"muc_meeting_id";
@@ -74,6 +82,9 @@ Component "internal.auth.jitmeet.example.com" "muc"
muc_room_default_public_jids = true
VirtualHost "auth.jitmeet.example.com"
modules_enabled = {
"limits_exception";
}
authentication = "internal_hashed"
-- Proxy to jicofo's user JID, so that it doesn't have to register as a component.
@@ -86,6 +97,9 @@ Component "speakerstats.jitmeet.example.com" "speakerstats_component"
Component "conferenceduration.jitmeet.example.com" "conference_duration_component"
muc_component = "conference.jitmeet.example.com"
Component "avmoderation.jitmeet.example.com" "av_moderation_component"
muc_component = "conference.jitmeet.example.com"
Component "lobby.jitmeet.example.com" "muc"
storage = "memory"
restrict_room_creation = true

View File

@@ -35,6 +35,7 @@ server {
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
set $prefix "";
ssl_certificate /etc/jitsi/meet/jitsi-meet.example.com.crt;
ssl_certificate_key /etc/jitsi/meet/jitsi-meet.example.com.key;
@@ -76,7 +77,7 @@ server {
# BOSH
location = /http-bind {
proxy_pass http://localhost:5280/http-bind;
proxy_pass http://127.0.0.1:5280/http-bind?prefix=$prefix&$args;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
@@ -125,13 +126,6 @@ server {
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
}
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
location ~ ^/([^/?&:'"]+)/(.*)$ {
set $subdomain "$1.";
set $subdir "$1/";
rewrite ^/([^/?&:'"]+)/(.*)$ /$2;
}
# BOSH for subdomains
location ~ ^/([^/?&:'"]+)/http-bind {
set $subdomain "$1.";
@@ -149,4 +143,11 @@ server {
rewrite ^/(.*)$ /xmpp-websocket;
}
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
location ~ ^/([^/?&:'"]+)/(.*)$ {
set $subdomain "$1.";
set $subdir "$1/";
rewrite ^/([^/?&:'"]+)/(.*)$ /$2;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 KiB

After

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 KiB

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 341 KiB

After

Width:  |  Height:  |  Size: 685 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 KiB

View File

@@ -186,10 +186,10 @@
<!--#include virtual="static/settingsToolbarAdditionalContent.html" -->
</head>
<body>
<noscript>
<noscript aria-hidden="true">
<div>JavaScript is disabled. </br>For this site to work you have to enable JavaScript.</div>
</noscript>
<!--#include virtual="body.html" -->
<div id="react"></div>
<div id="react" role="main"></div>
</body>
</html>

View File

@@ -1,6 +1,13 @@
/* eslint-disable no-unused-vars, no-var, max-len */
/* eslint sort-keys: ["error", "asc", {"caseSensitive": false}] */
/**
* !!!IMPORTANT!!!
*
* This file is considered deprecated. All options will eventually be moved to
* config.js, and no new options should be added here.
*/
var interfaceConfig = {
APP_NAME: 'Jitsi Meet',
AUDIO_LEVEL_PRIMARY_COLOR: 'rgba(255,255,255,0.4)',

View File

@@ -61,7 +61,6 @@ target 'JitsiMeetSDK' do
pod 'react-native-splash-screen', :path => '../node_modules/react-native-splash-screen'
pod 'react-native-webview', :path => '../node_modules/react-native-webview'
pod 'react-native-webrtc', :path => '../node_modules/react-native-webrtc'
pod 'BVLinearGradient', :path => '../node_modules/react-native-linear-gradient'
pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-async-storage/async-storage'
pod 'RNDeviceInfo', :path => '../node_modules/react-native-device-info'
pod 'RNGoogleSignin', :path => '../node_modules/@react-native-community/google-signin'

View File

@@ -5,8 +5,6 @@ PODS:
- AppAuth/Core (1.2.0)
- AppAuth/ExternalUserAgent (1.2.0)
- boost-for-react-native (1.63.0)
- BVLinearGradient (2.5.6):
- React
- CocoaLumberjack (3.5.3):
- CocoaLumberjack/Core (= 3.5.3)
- CocoaLumberjack/Core (3.5.3)
@@ -292,7 +290,7 @@ PODS:
- React
- react-native-splash-screen (3.2.0):
- React
- react-native-webrtc (1.87.3):
- react-native-webrtc (1.89.1):
- React-Core
- react-native-webview (11.0.2):
- React-Core
@@ -371,7 +369,6 @@ PODS:
- Yoga (1.14.0)
DEPENDENCIES:
- BVLinearGradient (from `../node_modules/react-native-linear-gradient`)
- CocoaLumberjack (~> 3.5.3)
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector/`)
@@ -442,8 +439,6 @@ SPEC REPOS:
- PromisesObjC
EXTERNAL SOURCES:
BVLinearGradient:
:path: "../node_modules/react-native-linear-gradient"
DoubleConversion:
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
FBLazyVector:
@@ -526,7 +521,6 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
AppAuth: bce82c76043657c99d91e7882e8a9e1a93650cd4
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
FBLazyVector: ca7f56c8ff6cd8590f7a673d7903b06019805581
@@ -563,7 +557,7 @@ SPEC CHECKSUMS:
react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae
react-native-netinfo: 8d8db463bcc5db66a8ac5c48a7d86beb3b92f61a
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-webrtc: dc1208bdca2c4d091f7b57859e69332bff6f1986
react-native-webrtc: ccb0c21eb4fb04326648fbdb4a5d49977e2cf274
react-native-webview: b2542d6fd424bcc3e3b2ec5f854f0abb4ec86c87
React-RCTActionSheet: bcbc311dc3b47bc8efb2737ff0940239a45789a9
React-RCTAnimation: 65f61080ce632f6dea23d52e354ffac9948396c6
@@ -584,6 +578,6 @@ SPEC CHECKSUMS:
RNWatch: a5320c959c75e72845c07985f3e935e58998f1d3
Yoga: 96b469c5e81ff51b917b92e8c3390642d4ded30c
PODFILE CHECKSUM: 5be5132e41831a98362eeed760558227a4df89ae
PODFILE CHECKSUM: d059cebf82da14a53940a16c24c3330752d4b0c8
COCOAPODS: 1.10.1

View File

@@ -23,12 +23,13 @@
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
4E51B75E25E4115F0038575A /* DarwinNotificationCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B75D25E4115F0038575A /* DarwinNotificationCenter.m */; };
4EC49BB725BEDAC100E76218 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EC49B8625BED71300E76218 /* ReplayKit.framework */; };
4EC49BBB25BEDAC100E76218 /* SampleHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EC49BBA25BEDAC100E76218 /* SampleHandler.m */; };
4EC49BBF25BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4EC49BCB25BEDB6400E76218 /* SocketConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EC49BCA25BEDB6400E76218 /* SocketConnection.m */; };
4EC49BD125BF19CF00E76218 /* SampleUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EC49BD025BF19CF00E76218 /* SampleUploader.m */; };
4E90F9402632D1AB001102D4 /* Atomic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E90F93F2632D1AB001102D4 /* Atomic.swift */; };
4EB06024260E026600F524C5 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EC49B8625BED71300E76218 /* ReplayKit.framework */; };
4EB06027260E026600F524C5 /* SampleHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB06026260E026600F524C5 /* SampleHandler.swift */; };
4EB0602B260E026600F524C5 /* JitsiMeetBroadcastExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4EB0603C260E09D000F524C5 /* SocketConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB06039260E09D000F524C5 /* SocketConnection.swift */; };
4EB0603D260E09D000F524C5 /* DarwinNotificationCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */; };
4EB0603E260E09D000F524C5 /* SampleUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0603B260E09D000F524C5 /* SampleUploader.swift */; };
55BEDABDA92D47D399A70A5E /* libPods-JitsiMeet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D878B07B3FBD6E305EAA6B27 /* libPods-JitsiMeet.a */; };
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; };
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -54,11 +55,11 @@
remoteGlobalIDString = 0BEA5C241F7B8F73000D0AB4;
remoteInfo = JitsiMeetCompanion;
};
4EC49BBD25BEDAC100E76218 /* PBXContainerItemProxy */ = {
4EB06029260E026600F524C5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 4EC49BB525BEDAC100E76218;
remoteGlobalIDString = 4EB06022260E026600F524C5;
remoteInfo = "JitsiMeetBroadcast Extension";
};
/* End PBXContainerItemProxy section */
@@ -104,7 +105,7 @@
dstPath = "";
dstSubfolderSpec = 13;
files = (
4EC49BBF25BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex in Embed App Extensions */,
4EB0602B260E026600F524C5 /* JitsiMeetBroadcastExtension.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
@@ -139,19 +140,18 @@
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
4670A512A688E2DC34528282 /* Pods-jitsi-meet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-jitsi-meet.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-jitsi-meet/Pods-jitsi-meet.debug.xcconfig"; sourceTree = "<group>"; };
4E51B75C25E4115F0038575A /* DarwinNotificationCenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DarwinNotificationCenter.h; sourceTree = "<group>"; };
4E51B75D25E4115F0038575A /* DarwinNotificationCenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DarwinNotificationCenter.m; sourceTree = "<group>"; };
4E90F93F2632D1AB001102D4 /* Atomic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = "<group>"; };
4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = JitsiMeetBroadcastExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
4EB06026260E026600F524C5 /* SampleHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleHandler.swift; sourceTree = "<group>"; };
4EB06028260E026600F524C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4EB06032260E08CC00F524C5 /* extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = extension.entitlements; sourceTree = "<group>"; };
4EB06039260E09D000F524C5 /* SocketConnection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketConnection.swift; sourceTree = "<group>"; };
4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DarwinNotificationCenter.swift; sourceTree = "<group>"; };
4EB0603B260E09D000F524C5 /* SampleUploader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleUploader.swift; sourceTree = "<group>"; };
4EC49B8625BED71300E76218 /* ReplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReplayKit.framework; path = System/Library/Frameworks/ReplayKit.framework; sourceTree = SDKROOT; };
4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "JitsiMeetBroadcast Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
4EC49BB925BEDAC100E76218 /* SampleHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SampleHandler.h; sourceTree = "<group>"; };
4EC49BBA25BEDAC100E76218 /* SampleHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SampleHandler.m; sourceTree = "<group>"; };
4EC49BBC25BEDAC100E76218 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4EC49BC925BEDB6400E76218 /* SocketConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SocketConnection.h; sourceTree = "<group>"; };
4EC49BCA25BEDB6400E76218 /* SocketConnection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SocketConnection.m; sourceTree = "<group>"; };
4EC49BCF25BF19CF00E76218 /* SampleUploader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SampleUploader.h; sourceTree = "<group>"; };
4EC49BD025BF19CF00E76218 /* SampleUploader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SampleUploader.m; sourceTree = "<group>"; };
4EC49BDB25BF280A00E76218 /* extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = extension.entitlements; sourceTree = "<group>"; };
5FEF9D87A4D2A38AD7193308 /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet-JitsiMeetBroadcastExtension/Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig"; sourceTree = "<group>"; };
609CB2080B75F75A89923F3D /* Pods-JitsiMeet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.debug.xcconfig"; sourceTree = "<group>"; };
A7B2827E068A0E05260054AC /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet-JitsiMeetBroadcastExtension/Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig"; sourceTree = "<group>"; };
B3B083EB1D4955FF0069CEE7 /* app.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = app.entitlements; sourceTree = "<group>"; };
D878B07B3FBD6E305EAA6B27 /* libPods-JitsiMeet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JitsiMeet.a"; sourceTree = BUILT_PRODUCTS_DIR; };
DE050388256E904600DEE3A5 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/apple/WebRTC.xcframework"; sourceTree = "<group>"; };
@@ -189,11 +189,11 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4EC49BB325BEDAC100E76218 /* Frameworks */ = {
4EB06020260E026600F524C5 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4EC49BB725BEDAC100E76218 /* ReplayKit.framework in Frameworks */,
4EB06024260E026600F524C5 /* ReplayKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -261,23 +261,22 @@
path = src;
sourceTree = "<group>";
};
4EC49BB825BEDAC100E76218 /* JitsiMeetBroadcast Extension */ = {
4EB06025260E026600F524C5 /* JitsiMeetBroadcast Extension */ = {
isa = PBXGroup;
children = (
4EC49BDB25BF280A00E76218 /* extension.entitlements */,
4EC49BB925BEDAC100E76218 /* SampleHandler.h */,
4EC49BBA25BEDAC100E76218 /* SampleHandler.m */,
4EC49BC925BEDB6400E76218 /* SocketConnection.h */,
4EC49BCA25BEDB6400E76218 /* SocketConnection.m */,
4EC49BCF25BF19CF00E76218 /* SampleUploader.h */,
4EC49BD025BF19CF00E76218 /* SampleUploader.m */,
4EC49BBC25BEDAC100E76218 /* Info.plist */,
4E51B75C25E4115F0038575A /* DarwinNotificationCenter.h */,
4E51B75D25E4115F0038575A /* DarwinNotificationCenter.m */,
4EB06032260E08CC00F524C5 /* extension.entitlements */,
4EB06026260E026600F524C5 /* SampleHandler.swift */,
4EB0603B260E09D000F524C5 /* SampleUploader.swift */,
4EB06039260E09D000F524C5 /* SocketConnection.swift */,
4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */,
4E90F93F2632D1AB001102D4 /* Atomic.swift */,
4EB06028260E026600F524C5 /* Info.plist */,
);
indentWidth = 4;
name = "JitsiMeetBroadcast Extension";
path = "broadcast-extension";
sourceTree = "<group>";
tabWidth = 4;
};
5E96ADD5E49F3B3822EF9A52 /* Pods */ = {
isa = PBXGroup;
@@ -286,6 +285,8 @@
09AA3B93E4CC62D84B424690 /* Pods-jitsi-meet.release.xcconfig */,
609CB2080B75F75A89923F3D /* Pods-JitsiMeet.debug.xcconfig */,
FC040BBED70876444D89E91C /* Pods-JitsiMeet.release.xcconfig */,
A7B2827E068A0E05260054AC /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.debug.xcconfig */,
5FEF9D87A4D2A38AD7193308 /* Pods-JitsiMeet-JitsiMeetBroadcastExtension.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
@@ -299,8 +300,8 @@
13B07FAE1A68108700A75B9A /* src */,
5E96ADD5E49F3B3822EF9A52 /* Pods */,
0BEA5C261F7B8F73000D0AB4 /* Watch app */,
4EC49BB825BEDAC100E76218 /* JitsiMeetBroadcast Extension */,
0BEA5C351F7B8F73000D0AB4 /* WatchKit extension */,
4EB06025260E026600F524C5 /* JitsiMeetBroadcast Extension */,
);
indentWidth = 2;
sourceTree = "<group>";
@@ -312,7 +313,7 @@
13B07F961A680F5B00A75B9A /* jitsi-meet.app */,
0BEA5C251F7B8F73000D0AB4 /* JitsiMeetCompanion.app */,
0BEA5C311F7B8F73000D0AB4 /* JitsiMeetCompanion Extension.appex */,
4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */,
4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */,
);
name = Products;
sourceTree = "<group>";
@@ -376,28 +377,28 @@
);
dependencies = (
0BEA5C401F7B8F73000D0AB4 /* PBXTargetDependency */,
4EC49BBE25BEDAC100E76218 /* PBXTargetDependency */,
4EB0602A260E026600F524C5 /* PBXTargetDependency */,
);
name = JitsiMeet;
productName = "Jitsi Meet";
productReference = 13B07F961A680F5B00A75B9A /* jitsi-meet.app */;
productType = "com.apple.product-type.application";
};
4EC49BB525BEDAC100E76218 /* JitsiMeetBroadcast Extension */ = {
4EB06022260E026600F524C5 /* JitsiMeetBroadcastExtension */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4EC49BC025BEDAC100E76218 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcast Extension" */;
buildConfigurationList = 4EB0602C260E026700F524C5 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcastExtension" */;
buildPhases = (
4EC49BB225BEDAC100E76218 /* Sources */,
4EC49BB325BEDAC100E76218 /* Frameworks */,
4EC49BB425BEDAC100E76218 /* Resources */,
4EB0601F260E026600F524C5 /* Sources */,
4EB06020260E026600F524C5 /* Frameworks */,
4EB06021260E026600F524C5 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "JitsiMeetBroadcast Extension";
name = JitsiMeetBroadcastExtension;
productName = "JitsiMeetBroadcast Extension";
productReference = 4EC49BB625BEDAC100E76218 /* JitsiMeetBroadcast Extension.appex */;
productReference = 4EB06023260E026600F524C5 /* JitsiMeetBroadcastExtension.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
@@ -406,6 +407,7 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1240;
LastUpgradeCheck = 1020;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
@@ -429,8 +431,8 @@
};
};
};
4EC49BB525BEDAC100E76218 = {
CreatedOnToolsVersion = 12.2;
4EB06022260E026600F524C5 = {
CreatedOnToolsVersion = 12.4;
};
};
};
@@ -450,7 +452,7 @@
13B07F861A680F5B00A75B9A /* JitsiMeet */,
0BEA5C241F7B8F73000D0AB4 /* JitsiMeetCompanion */,
0BEA5C301F7B8F73000D0AB4 /* JitsiMeetCompanion Extension */,
4EC49BB525BEDAC100E76218 /* JitsiMeetBroadcast Extension */,
4EB06022260E026600F524C5 /* JitsiMeetBroadcastExtension */,
);
};
/* End PBXProject section */
@@ -483,7 +485,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4EC49BB425BEDAC100E76218 /* Resources */ = {
4EB06021260E026600F524C5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -625,14 +627,15 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
4EC49BB225BEDAC100E76218 /* Sources */ = {
4EB0601F260E026600F524C5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4EC49BCB25BEDB6400E76218 /* SocketConnection.m in Sources */,
4EC49BBB25BEDAC100E76218 /* SampleHandler.m in Sources */,
4E51B75E25E4115F0038575A /* DarwinNotificationCenter.m in Sources */,
4EC49BD125BF19CF00E76218 /* SampleUploader.m in Sources */,
4EB0603C260E09D000F524C5 /* SocketConnection.swift in Sources */,
4EB0603E260E09D000F524C5 /* SampleUploader.swift in Sources */,
4EB0603D260E09D000F524C5 /* DarwinNotificationCenter.swift in Sources */,
4EB06027260E026600F524C5 /* SampleHandler.swift in Sources */,
4E90F9402632D1AB001102D4 /* Atomic.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -649,10 +652,10 @@
target = 0BEA5C241F7B8F73000D0AB4 /* JitsiMeetCompanion */;
targetProxy = 0BEA5C3F1F7B8F73000D0AB4 /* PBXContainerItemProxy */;
};
4EC49BBE25BEDAC100E76218 /* PBXTargetDependency */ = {
4EB0602A260E026600F524C5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 4EC49BB525BEDAC100E76218 /* JitsiMeetBroadcast Extension */;
targetProxy = 4EC49BBD25BEDAC100E76218 /* PBXContainerItemProxy */;
target = 4EB06022260E026600F524C5 /* JitsiMeetBroadcastExtension */;
targetProxy = 4EB06029260E026600F524C5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -879,7 +882,7 @@
};
name = Release;
};
4EC49BC125BEDAC100E76218 /* Debug */ = {
4EB0602D260E026700F524C5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
@@ -890,13 +893,13 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = "broadcast-extension/extension.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = FC967L3QRG;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = "broadcast-extension/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -907,11 +910,14 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.broadcast.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
4EC49BC225BEDAC100E76218 /* Release */ = {
4EB0602E260E026700F524C5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
@@ -922,14 +928,14 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = "broadcast-extension/extension.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = FC967L3QRG;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = "broadcast-extension/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -939,6 +945,8 @@
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet.broadcast.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
@@ -1087,11 +1095,11 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4EC49BC025BEDAC100E76218 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcast Extension" */ = {
4EB0602C260E026700F524C5 /* Build configuration list for PBXNativeTarget "JitsiMeetBroadcastExtension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4EC49BC125BEDAC100E76218 /* Debug */,
4EC49BC225BEDAC100E76218 /* Release */,
4EB0602D260E026700F524C5 /* Debug */,
4EB0602E260E026700F524C5 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;

View File

@@ -0,0 +1,30 @@
import Foundation
@propertyWrapper
struct Atomic<Value> {
private var value: Value
private let lock = NSLock()
init(wrappedValue value: Value) {
self.value = value
}
var wrappedValue: Value {
get { return load() }
set { store(newValue: newValue) }
}
func load() -> Value {
lock.lock()
defer { lock.unlock() }
return value
}
mutating func store(newValue: Value) {
lock.lock()
defer { lock.unlock() }
value = newValue
}
}

View File

@@ -1,31 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
extern NSNotificationName const kBroadcastStartedNotification;
extern NSNotificationName const kBroadcastStoppedNotification;
@interface DarwinNotificationCenter: NSObject
+ (instancetype)sharedInstance;
- (void)postNotificationWithName:(NSNotificationName)name;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,50 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "DarwinNotificationCenter.h"
NSNotificationName const kBroadcastStartedNotification = @"iOS_BroadcastStarted";
NSNotificationName const kBroadcastStoppedNotification = @"iOS_BroadcastStopped";
@implementation DarwinNotificationCenter {
CFNotificationCenterRef _notificationCenter;
}
+ (instancetype)sharedInstance {
static DarwinNotificationCenter *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init {
self = [super init];
if (self) {
_notificationCenter = CFNotificationCenterGetDarwinNotifyCenter();
}
return self;
}
- (void)postNotificationWithName:(NSString*)name {
CFNotificationCenterPostNotification(_notificationCenter, (__bridge CFStringRef)name, NULL, NULL, true);
}
@end

View File

@@ -0,0 +1,37 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
enum DarwinNotification: String {
case broadcastStarted = "iOS_BroadcastStarted"
case broadcastStopped = "iOS_BroadcastStopped"
}
class DarwinNotificationCenter {
static var shared = DarwinNotificationCenter()
private var notificationCenter: CFNotificationCenter
init() {
notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
}
func postNotification(_ name: DarwinNotification) {
CFNotificationCenterPostNotification(notificationCenter, CFNotificationName(rawValue: name.rawValue as CFString), nil, nil, true)
}
}

View File

@@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>JitsiMeet Broadcast Extension</string>
<string>Jitsi Meet Broadcast Extension</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>21.0.0</string>
<string>21.2.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
@@ -25,7 +25,7 @@
<key>NSExtensionPointIdentifier</key>
<string>com.apple.broadcast-services-upload</string>
<key>NSExtensionPrincipalClass</key>
<string>SampleHandler</string>
<string>$(PRODUCT_MODULE_NAME).SampleHandler</string>
<key>RPBroadcastProcessMode</key>
<string>RPBroadcastProcessModeSampleBuffer</string>
</dict>

View File

@@ -1,21 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <ReplayKit/ReplayKit.h>
@interface SampleHandler : RPBroadcastSampleHandler
@end

View File

@@ -1,123 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "SampleHandler.h"
#import "SocketConnection.h"
#import "SampleUploader.h"
#import "DarwinNotificationCenter.h"
@interface SampleHandler ()
@property (nonatomic, retain) SocketConnection *clientConnection;
@property (nonatomic, retain) SampleUploader *uploader;
@end
@implementation SampleHandler
- (instancetype)init {
self = [super init];
if (self) {
self.clientConnection = [[SocketConnection alloc] initWithFilePath:self.socketFilePath];
[self setupConnection];
self.uploader = [[SampleUploader alloc] initWithConnection:self.clientConnection];
}
return self;
}
- (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
NSLog(@"broadcast started");
[[DarwinNotificationCenter sharedInstance] postNotificationWithName:kBroadcastStartedNotification];
[self openConnection];
}
- (void)broadcastPaused {
// User has requested to pause the broadcast. Samples will stop being delivered.
}
- (void)broadcastResumed {
// User has requested to resume the broadcast. Samples delivery will resume.
}
- (void)broadcastFinished {
// User has requested to finish the broadcast.
[[DarwinNotificationCenter sharedInstance] postNotificationWithName:kBroadcastStoppedNotification];
[self.clientConnection close];
}
- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
static NSUInteger frameCount = 0;
switch (sampleBufferType) {
case RPSampleBufferTypeVideo:
// adjust frame rate by using every third frame
if (++frameCount%3 == 0 && self.uploader.isReady) {
[self.uploader sendSample:sampleBuffer];
}
break;
default:
break;
}
}
// MARK: Private Methods
- (NSString *)socketFilePath {
// the appGroupIdentifier must match the value provided in the app's info.plist for the RTCAppGroupIdentifier key
NSString *appGroupIdentifier = @"group.org.jitsi.meet.appgroup";
NSURL *sharedContainer = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupIdentifier];
NSString *socketFilePath = [[sharedContainer URLByAppendingPathComponent:@"rtc_SSFD"] path];
return socketFilePath;
}
- (void)setupConnection {
__weak __typeof(self) weakSelf = self;
self.clientConnection.didClose = ^(NSError *error) {
NSLog(@"client connection did close: %@", error);
if (error) {
[weakSelf finishBroadcastWithError:error];
}
else {
NSInteger JMScreenSharingStopped = 10001;
NSError *customError = [NSError errorWithDomain:RPRecordingErrorDomain
code:JMScreenSharingStopped
userInfo:@{NSLocalizedDescriptionKey: @"Screen sharing stopped"}];
[weakSelf finishBroadcastWithError:customError];
}
};
}
- (void)openConnection {
dispatch_queue_t queue = dispatch_queue_create("org.jitsi.meet.broadcast.connectTimer", 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), 0.1 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
BOOL success = [self.clientConnection open];
if (success) {
dispatch_source_cancel(timer);
}
});
dispatch_resume(timer);
}
@end

View File

@@ -0,0 +1,117 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import ReplayKit
import JitsiMeetSDK
private enum Constants {
// the App Group ID value that the app and the broadcast extension targets are setup with. It differs for each app.
static let appGroupIdentifier = "group.org.jitsi.meet.appgroup"
}
class SampleHandler: RPBroadcastSampleHandler {
private var clientConnection: SocketConnection?
private var uploader: SampleUploader?
private var frameCount: Int = 0
var socketFilePath: String {
let sharedContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: Constants.appGroupIdentifier)
return sharedContainer?.appendingPathComponent("rtc_SSFD").path ?? ""
}
override init() {
super.init()
if let connection = SocketConnection(filePath: socketFilePath) {
clientConnection = connection
setupConnection()
uploader = SampleUploader(connection: connection)
}
}
override func broadcastStarted(withSetupInfo setupInfo: [String: NSObject]?) {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
print("broadcast started")
frameCount = 0
DarwinNotificationCenter.shared.postNotification(.broadcastStarted)
openConnection()
}
override func broadcastPaused() {
// User has requested to pause the broadcast. Samples will stop being delivered.
}
override func broadcastResumed() {
// User has requested to resume the broadcast. Samples delivery will resume.
}
override func broadcastFinished() {
// User has requested to finish the broadcast.
DarwinNotificationCenter.shared.postNotification(.broadcastStopped)
clientConnection?.close()
}
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType {
case RPSampleBufferType.video:
// very simple mechanism for adjusting frame rate by using every third frame
frameCount += 1
if frameCount % 3 == 0 {
uploader?.send(sample: sampleBuffer)
}
default:
break
}
}
}
private extension SampleHandler {
func setupConnection() {
clientConnection?.didClose = { [weak self] error in
print("client connection did close \(String(describing: error))")
if let error = error {
self?.finishBroadcastWithError(error)
} else {
// the displayed failure message is more user friendly when using NSError instead of Error
let JMScreenSharingStopped = 10001
let customError = NSError(domain: RPRecordingErrorDomain, code: JMScreenSharingStopped, userInfo: [NSLocalizedDescriptionKey: "Screen sharing stopped"])
self?.finishBroadcastWithError(customError)
}
}
}
func openConnection() {
let queue = DispatchQueue(label: "broadcast.connectTimer")
let timer = DispatchSource.makeTimerSource(queue: queue)
timer.schedule(deadline: .now(), repeating: .milliseconds(100), leeway: .milliseconds(500))
timer.setEventHandler { [weak self] in
guard self?.clientConnection?.open() == true else {
return
}
timer.cancel()
}
timer.resume()
}
}

View File

@@ -1,33 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <Foundation/Foundation.h>
#import <ReplayKit/ReplayKit.h>
NS_ASSUME_NONNULL_BEGIN
@class SocketConnection;
@interface SampleUploader : NSObject
@property (nonatomic, assign, readonly) BOOL isReady;
- (instancetype)initWithConnection:(SocketConnection *)connection;
- (void)sendSample:(CMSampleBufferRef)sampleBuffer;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,155 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <MessageUI/MessageUI.h>
#import <ReplayKit/ReplayKit.h>
#import "SampleUploader.h"
#import "SocketConnection.h"
static const NSInteger kBufferMaxLenght = 10 * 1024;
@interface SampleUploader ()
@property (nonatomic, assign) BOOL isReady;
@property (nonatomic, strong) dispatch_queue_t serialQueue;
@property (nonatomic, strong) SocketConnection *connection;
@property (nonatomic, strong) CIContext *imageContext;
@property (nonatomic, strong) NSData *dataToSend;
@property (nonatomic, assign) NSUInteger byteIndex;
@end
@implementation SampleUploader
- (instancetype)initWithConnection:(SocketConnection *)connection {
self = [super init];
if (self) {
self.serialQueue = dispatch_queue_create("org.jitsi.meet.broadcast.sampleUploader", DISPATCH_QUEUE_SERIAL);
self.connection = connection;
[self setupConnection];
self.imageContext = [[CIContext alloc] initWithOptions:nil];
self.isReady = false;
}
return self;
}
- (void)sendSample:(CMSampleBufferRef)sampleBuffer {
self.isReady = false;
self.dataToSend = [self prepareSample:sampleBuffer];
self.byteIndex = 0;
dispatch_async(self.serialQueue, ^{
[self sendData];
});
}
// MARK: Private Methods
- (void)setupConnection {
__weak __typeof(self) weakSelf = self;
self.connection.didOpen = ^{
weakSelf.isReady = true;
};
self.connection.streamHasSpaceAvailable = ^{
dispatch_async(weakSelf.serialQueue, ^{
weakSelf.isReady = ![weakSelf sendData];
});
};
}
/**
This function downscales and converts to jpeg the provided sample buffer, then wraps the resulted image data into a CFHTTPMessageRef. Returns the serialized CFHTTPMessageRef.
*/
- (NSData *)prepareSample:(CMSampleBufferRef)sampleBuffer {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);
CGFloat scaleFactor = 2;
size_t width = CVPixelBufferGetWidth(imageBuffer)/scaleFactor;
size_t height = CVPixelBufferGetHeight(imageBuffer)/scaleFactor;
CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1/scaleFactor, 1/scaleFactor);
NSData *bufferData = [self jpegDataFromPixelBuffer:imageBuffer withScaling:scaleTransform];
CVPixelBufferUnlockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);
if (bufferData) {
CFHTTPMessageRef httpResponse = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 200, NULL, kCFHTTPVersion1_1);
CFHTTPMessageSetHeaderFieldValue(httpResponse, (__bridge CFStringRef)@"Content-Length", (__bridge CFStringRef)[NSString stringWithFormat:@"%ld", bufferData.length]);
CFHTTPMessageSetHeaderFieldValue(httpResponse, (__bridge CFStringRef)@"Buffer-Width", (__bridge CFStringRef)[NSString stringWithFormat:@"%ld", width]);
CFHTTPMessageSetHeaderFieldValue(httpResponse, (__bridge CFStringRef)@"Buffer-Height", (__bridge CFStringRef)[NSString stringWithFormat:@"%ld", height]);
CFHTTPMessageSetBody(httpResponse, (__bridge CFDataRef)bufferData);
CFDataRef serializedMessage = CFHTTPMessageCopySerializedMessage(httpResponse);
CFRelease(httpResponse);
return CFBridgingRelease(serializedMessage);
}
return nil;
}
- (BOOL)sendData {
if (!self.dataToSend) {
NSLog(@"no data to send");
return false;
}
NSUInteger bytesLeft = self.dataToSend.length - self.byteIndex;
NSInteger length = bytesLeft > kBufferMaxLenght ? kBufferMaxLenght : bytesLeft;
uint8_t buffer[length];
[self.dataToSend getBytes:&buffer range:NSMakeRange(self.byteIndex, length)];
length = [self.connection writeBufferToStream:buffer maxLength:length];
if (length > 0) {
self.byteIndex += length;
bytesLeft -= length;
if (bytesLeft == 0) {
NSLog(@"video sample processed successfully");
self.dataToSend = nil;
self.byteIndex = 0;
}
}
else {
NSLog(@"writeBufferToStream failure");
}
return true;
}
- (NSData *)jpegDataFromPixelBuffer:(CVPixelBufferRef)pixelBuffer withScaling:(CGAffineTransform)scaleTransform {
CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer];
image = [image imageByApplyingTransform:scaleTransform];
NSDictionary *options = @{(NSString *)kCGImageDestinationLossyCompressionQuality: [NSNumber numberWithFloat:1.0]};
NSData *imageData = [self.imageContext JPEGRepresentationOfImage:image
colorSpace:image.colorSpace
options:options];
return imageData;
}
@end

View File

@@ -0,0 +1,154 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
import ReplayKit
private enum Constants {
static let bufferMaxLength = 10240
}
class SampleUploader {
private static var imageContext = CIContext(options: nil)
@Atomic private var isReady: Bool = false
private var connection: SocketConnection
private var dataToSend: Data?
private var byteIndex = 0
private let serialQueue: DispatchQueue
init(connection: SocketConnection) {
self.connection = connection
self.serialQueue = DispatchQueue(label: "org.jitsi.meet.broadcast.sampleUploader")
setupConnection()
}
@discardableResult func send(sample buffer: CMSampleBuffer) -> Bool {
guard isReady == true else {
return false
}
isReady = false
dataToSend = prepare(sample: buffer)
byteIndex = 0
serialQueue.async { [weak self] in
self?.sendDataChunk()
}
return true
}
}
private extension SampleUploader {
func setupConnection() {
connection.didOpen = { [weak self] in
self?.isReady = true
}
connection.streamHasSpaceAvailable = { [weak self] in
self?.serialQueue.async {
self?.isReady = !(self?.sendDataChunk() ?? true)
}
}
}
@discardableResult func sendDataChunk() -> Bool {
guard let dataToSend = dataToSend else {
return false
}
var bytesLeft = dataToSend.count - byteIndex
var length = bytesLeft > Constants.bufferMaxLength ? Constants.bufferMaxLength : bytesLeft
length = dataToSend[byteIndex..<(byteIndex + length)].withUnsafeBytes {
guard let ptr = $0.bindMemory(to: UInt8.self).baseAddress else {
return 0
}
return connection.writeToStream(buffer: ptr, maxLength: length)
}
if length > 0 {
byteIndex += length
bytesLeft -= length
if bytesLeft == 0 {
self.dataToSend = nil
byteIndex = 0
}
} else {
print("writeBufferToStream failure")
}
return true
}
func prepare(sample buffer: CMSampleBuffer) -> Data? {
guard let imageBuffer = CMSampleBufferGetImageBuffer(buffer) else {
print("image buffer not available")
return nil
}
CVPixelBufferLockBaseAddress(imageBuffer, .readOnly)
let scaleFactor = 2.0
let width = CVPixelBufferGetWidth(imageBuffer)/Int(scaleFactor)
let height = CVPixelBufferGetHeight(imageBuffer)/Int(scaleFactor)
let orientation = CMGetAttachment(buffer, key: RPVideoSampleOrientationKey as CFString, attachmentModeOut: nil)?.uintValue ?? 0
let scaleTransform = CGAffineTransform(scaleX: CGFloat(1.0/scaleFactor), y: CGFloat(1.0/scaleFactor))
let bufferData = self.jpegData(from: imageBuffer, scale: scaleTransform)
CVPixelBufferUnlockBaseAddress(imageBuffer, .readOnly)
guard let messageData = bufferData else {
print("corrupted image buffer")
return nil
}
let httpResponse = CFHTTPMessageCreateResponse(nil, 200, nil, kCFHTTPVersion1_1).takeRetainedValue()
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Content-Length" as CFString, String(messageData.count) as CFString)
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Width" as CFString, String(width) as CFString)
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Height" as CFString, String(height) as CFString)
CFHTTPMessageSetHeaderFieldValue(httpResponse, "Buffer-Orientation" as CFString, String(orientation) as CFString)
CFHTTPMessageSetBody(httpResponse, messageData as CFData)
let serializedMessage = CFHTTPMessageCopySerializedMessage(httpResponse)?.takeRetainedValue() as Data?
return serializedMessage
}
func jpegData(from buffer: CVPixelBuffer, scale scaleTransform: CGAffineTransform) -> Data? {
var image = CIImage(cvPixelBuffer: buffer)
image = image.transformed(by: scaleTransform)
guard let colorSpace = image.colorSpace else {
return nil
}
let options: [CIImageRepresentationOption: Float] = [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption: 1.0]
let imageData = SampleUploader.imageContext.jpegRepresentation(of: image, colorSpace: colorSpace, options: options)
return imageData
}
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface SocketConnection : NSObject
@property (nonatomic, copy, nullable) void (^didOpen)(void);
@property (nonatomic, copy, nullable) void (^didClose)(NSError*);
@property (nonatomic, copy, nullable) void (^streamHasSpaceAvailable)(void);
- (instancetype)initWithFilePath:(nonnull NSString *)filePath;
- (BOOL)open;
- (void)close;
- (NSInteger)writeBufferToStream:(const uint8_t*)buffer maxLength:(NSInteger)length;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,189 +0,0 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/socket.h>
#include <sys/un.h>
#import "SocketConnection.h"
@interface SocketConnection () <NSStreamDelegate>
@property (nonatomic, copy) NSString *filePath;
@property (nonatomic, strong) NSInputStream *inputStream;
@property (nonatomic, strong) NSOutputStream *outputStream;
@property (nonatomic, strong) NSThread *networkThread;
@end
@implementation SocketConnection {
int _socket;
struct sockaddr_un _socketAddr;
}
- (instancetype)initWithFilePath:(NSString *)path {
self = [super init];
if (self) {
self.filePath = path;
[self setupSocketWithFilePath:path];
[self setupNetworkThread];
}
return self;
}
- (BOOL)open {
NSLog(@"Open socket connection");
if (![[NSFileManager defaultManager] fileExistsAtPath:self.filePath]) {
NSLog(@"failure: socket file missing");
return false;
}
int status = connect(_socket, (struct sockaddr *)&_socketAddr, sizeof(_socketAddr));
if (status < 0) {
NSLog(@"failure: socket connect (%d)", status);
return false;
}
[self.networkThread start];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, _socket, &readStream, &writeStream);
self.inputStream = (__bridge_transfer NSInputStream *)readStream;
self.inputStream.delegate = self;
[self.inputStream setProperty:@"kCFBooleanTrue" forKey:@"kCFStreamPropertyShouldCloseNativeSocket"];
self.outputStream = (__bridge_transfer NSOutputStream *)writeStream;
self.outputStream.delegate = self;
[self.outputStream setProperty:@"kCFBooleanTrue" forKey:@"kCFStreamPropertyShouldCloseNativeSocket"];
[self performSelector:@selector(scheduleStreams) onThread:self.networkThread withObject:nil waitUntilDone:true];
[self.inputStream open];
[self.outputStream open];
NSLog(@"read stream status: %ld", CFReadStreamGetStatus(readStream));
NSLog(@"write stream status: %ld", CFWriteStreamGetStatus(writeStream));
return true;
}
- (void)close {
[self performSelector:@selector(unscheduleStreams) onThread:self.networkThread withObject:nil waitUntilDone:true];
self.inputStream.delegate = nil;
self.outputStream.delegate = nil;
[self.inputStream close];
[self.outputStream close];
[self.networkThread cancel];
}
- (NSInteger)writeBufferToStream:(const uint8_t*)buffer maxLength:(NSInteger)length {
return [self.outputStream write:buffer maxLength:length];
}
// MARK: Private Methods
- (BOOL)isOpen {
return self.inputStream.streamStatus == NSStreamStatusOpen && self.outputStream.streamStatus == NSStreamStatusOpen;
}
- (void)setupSocketWithFilePath:(NSString*)path {
_socket = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&_socketAddr, 0, sizeof(_socketAddr));
_socketAddr.sun_family = AF_UNIX;
strncpy(_socketAddr.sun_path, path.UTF8String, sizeof(_socketAddr.sun_path) - 1);
}
- (void)setupNetworkThread {
self.networkThread = [[NSThread alloc] initWithBlock:^{
do {
@autoreleasepool {
[[NSRunLoop currentRunLoop] run];
}
} while (![NSThread currentThread].isCancelled);
}];
self.networkThread.qualityOfService = NSQualityOfServiceUserInitiated;
}
- (void)scheduleStreams {
[self.inputStream scheduleInRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
[self.outputStream scheduleInRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
}
- (void)unscheduleStreams {
[self.inputStream removeFromRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
[self.outputStream removeFromRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes];
}
- (void)notifyDidClose:(NSError *)error {
if (self.didClose) {
self.didClose(error);
}
}
@end
#pragma mark - NSStreamDelegate
@implementation SocketConnection (NSStreamDelegate)
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"client stream open completed");
if (aStream == self.outputStream && self.didOpen) {
self.didOpen();
}
break;
case NSStreamEventHasBytesAvailable:
if (aStream == self.inputStream) {
uint8_t buffer;
NSInteger numberOfBytesRead = [(NSInputStream *)aStream read:&buffer maxLength:sizeof(buffer)];
if (!numberOfBytesRead && aStream.streamStatus == NSStreamStatusAtEnd) {
NSLog(@"server socket closed");
[self close];
[self notifyDidClose:nil];
}
}
break;
case NSStreamEventHasSpaceAvailable:
if (aStream == self.outputStream && self.streamHasSpaceAvailable) {
NSLog(@"client stream has space available");
self.streamHasSpaceAvailable();
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"client stream error occurred: %@", aStream.streamError);
[self close];
[self notifyDidClose:aStream.streamError];
break;
default:
break;
}
}
@end

View File

@@ -0,0 +1,205 @@
/*
* Copyright @ 2021-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Foundation
class SocketConnection: NSObject {
var didOpen: (() -> Void)?
var didClose: ((Error?) -> Void)?
var streamHasSpaceAvailable: (() -> Void)?
private let filePath: String
private var socketHandle: Int32 = -1
private var address: sockaddr_un?
private var inputStream: InputStream?
private var outputStream: OutputStream?
private var networkQueue: DispatchQueue?
private var shouldKeepRunning = false
init?(filePath path: String) {
filePath = path
socketHandle = Darwin.socket(AF_UNIX, SOCK_STREAM, 0)
guard socketHandle != -1 else {
print("failure: create socket")
return nil
}
}
func open() -> Bool {
print("open socket connection")
guard FileManager.default.fileExists(atPath: filePath) else {
print("failure: socket file missing")
return false
}
guard setupAddress() == true else {
return false
}
guard connectSocket() == true else {
return false
}
setupStreams()
inputStream?.open()
outputStream?.open()
return true
}
func close() {
unscheduleStreams()
inputStream?.delegate = nil
outputStream?.delegate = nil
inputStream?.close()
outputStream?.close()
inputStream = nil
outputStream = nil
}
func writeToStream(buffer: UnsafePointer<UInt8>, maxLength length: Int) -> Int {
return outputStream?.write(buffer, maxLength: length) ?? 0
}
}
extension SocketConnection: StreamDelegate {
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
switch eventCode {
case .openCompleted:
print("client stream open completed")
if aStream == outputStream {
didOpen?()
}
case .hasBytesAvailable:
if aStream == inputStream {
var buffer: UInt8 = 0
let numberOfBytesRead = inputStream?.read(&buffer, maxLength: 1)
if numberOfBytesRead == 0 && aStream.streamStatus == .atEnd {
print("server socket closed")
close()
notifyDidClose(error: nil)
}
}
case .hasSpaceAvailable:
if aStream == outputStream {
streamHasSpaceAvailable?()
}
case .errorOccurred:
print("client stream error occured: \(String(describing: aStream.streamError))")
close()
notifyDidClose(error: aStream.streamError)
default:
break
}
}
}
private extension SocketConnection {
func setupAddress() -> Bool {
var addr = sockaddr_un()
guard filePath.count < MemoryLayout.size(ofValue: addr.sun_path) else {
print("failure: fd path is too long")
return false
}
_ = withUnsafeMutablePointer(to: &addr.sun_path.0) { ptr in
filePath.withCString {
strncpy(ptr, $0, filePath.count)
}
}
address = addr
return true
}
func connectSocket() -> Bool {
guard var addr = address else {
return false
}
let status = withUnsafePointer(to: &addr) { ptr in
ptr.withMemoryRebound(to: sockaddr.self, capacity: 1) {
Darwin.connect(socketHandle, $0, socklen_t(MemoryLayout<sockaddr_un>.size))
}
}
guard status == noErr else {
print("failure: \(status)")
return false
}
return true
}
func setupStreams() {
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocket(kCFAllocatorDefault, socketHandle, &readStream, &writeStream)
inputStream = readStream?.takeRetainedValue()
inputStream?.delegate = self
inputStream?.setProperty(kCFBooleanTrue, forKey: Stream.PropertyKey(kCFStreamPropertyShouldCloseNativeSocket as String))
outputStream = writeStream?.takeRetainedValue()
outputStream?.delegate = self
outputStream?.setProperty(kCFBooleanTrue, forKey: Stream.PropertyKey(kCFStreamPropertyShouldCloseNativeSocket as String))
scheduleStreams()
}
func scheduleStreams() {
shouldKeepRunning = true
networkQueue = DispatchQueue.global(qos: .userInitiated)
networkQueue?.async { [weak self] in
self?.inputStream?.schedule(in: .current, forMode: .common)
self?.outputStream?.schedule(in: .current, forMode: .common)
var isRunning = false
repeat {
isRunning = self?.shouldKeepRunning ?? false && RunLoop.current.run(mode: .default, before: .distantFuture)
} while (isRunning)
}
}
func unscheduleStreams() {
networkQueue?.sync { [weak self] in
self?.inputStream?.remove(from: .current, forMode: .common)
self?.outputStream?.remove(from: .current, forMode: .common)
}
shouldKeepRunning = false
}
func notifyDidClose(error: Error?) {
if didClose != nil {
didClose?(error)
}
}
}

View File

@@ -35,6 +35,7 @@
jitsiMeet.defaultConferenceOptions = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
[builder setFeatureFlag:@"resolution" withValue:@(360)];
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
builder.welcomePageEnabled = YES;
@@ -51,7 +52,7 @@
if ([FIRUtilities appContainsRealServiceInfoPlist]) {
NSLog(@"Enabling Firebase");
[FIRApp configure];
// Crashlytics defaults to disabled wirth the FirebaseCrashlyticsCollectionEnabled Info.plist key.
// Crashlytics defaults to disabled with the FirebaseCrashlyticsCollectionEnabled Info.plist key.
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:![jitsiMeet isCrashReportingDisabled]];
}

View File

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

View File

@@ -131,6 +131,10 @@
NSLog(@"%@%@", @"Chat toggled: ", data);
}
- (void)videoMutedChanged:(NSDictionary *)data {
NSLog(@"%@%@", @"Video muted changed: ", data[@"muted"]);
}
#pragma mark - Helpers
- (void)terminate {

View File

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

View File

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

View File

@@ -35,7 +35,7 @@ fi
echo "PR_REPO_SLUG=${PR_REPO_SLUG} PR_BRANCH=${PR_BRANCH}"
# do the marge and git log
# do the merge and git log
if [ $PR_BRANCH != "master" ]; then
echo "Will merge ${PR_REPO_SLUG}/${PR_BRANCH} into master"

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