Compare commits

..

159 Commits

Author SHA1 Message Date
Alex Bumbu
95ccc2cbe1 fix methods naming for swift 2022-09-14 16:17:42 +03:00
Alex Bumbu
468d77c3d6 feat(iOS): callkit objc implementation 2022-09-14 16:17:42 +03:00
Gabriel Borlea
d6f3c2a0f4 ref(face-landmarks): convert to typescript and add detector class (#12144)
* fix(face-landmarks): stop recognition when imageCapture error

* ref(face-landmarks): convert files in typescript

fix: lint issues

* code review

* ref(face-landmarks): move detection part to a class

* ref(face-landmarks): make FaceLandmarksDetector singleton

* fix typo and ts-ignore problematic types

* fix linting issues
2022-09-14 15:42:46 +03:00
tmoldovan8x8
b83c55e9c4 fix(rn) fixes typo in functions.native 2022-09-14 14:49:13 +03:00
Robert Pintilii
a1d20dc188 ref(TS) Convert some features to TS (#12149)
Convert AV Moderation and Breakout Rooms to TS
2022-09-14 14:32:58 +03:00
Robert Pintilii
95084e1004 ref(TS) Convert some base features to TS (#12138) 2022-09-14 10:54:56 +03:00
Saúl Ibarra Corretgé
5502601fb3 fix(subtitles) web components must not be used in generic action files 2022-09-13 16:17:10 +02:00
Saúl Ibarra Corretgé
3fa72c99bc fix(rn,conference) fix mobile build
Looks like Metro is confused by these imports.
2022-09-13 16:17:10 +02:00
Дамян Минков
079a2a505d feat: Adds LE choice when installing debian package. (#12154)
* feat: Adds LE choice when installing debian package.

* Update debian/jitsi-meet-web-config.templates

Co-authored-by: raluca8x8 <raluca.tocmag@8x8.com>

* squash: Print in the console the JaaS link everytime.

* squash: Note that JaaS does not support self-signed certs.

* squash: Fix message.

* squash: Moves acme.sh stuff into a script, so it is easy to re-run.

Co-authored-by: raluca8x8 <raluca.tocmag@8x8.com>
2022-09-13 07:55:00 -05:00
Robert Pintilii
139884fbe7 ref(dep) Upgrade MUI (#12089) 2022-09-13 10:36:00 +03:00
Misha
3ef3233242 ref(conn-indicator): remove E2E RTT (#12139)
There was a fundamental change in how e2e pings work in lib-jitsi-meet where it does few pings at the beginning, pushes metrics and shuts the whole thing down, so there are no more e2ertt updates after that. Plus it's disabled by default. @paweldomas have decided with @bgrozev to remove that instead of trying to adjust. Even if e2e pings are enabled the data is not feed correctly to the indicators, what's wrong there is as soon as the pings stop going the new data does not arrive and then all you get is N/A if the UI component is recreated.
2022-09-12 15:57:15 -05:00
JohnProv
443f4e4feb fix(lang) update Dutch translation 2022-09-12 19:28:25 +02:00
Alexandru Petrus
21a1d52753 fix(large-video) disable screen-sharing placeholder on Spot
Temporary hack, this should likely be configurable.
2022-09-12 18:00:02 +02:00
Bogdan Duduman
0f63e560b0 feat(external_api) add adbility to resize the filmstrip 2022-09-12 14:08:55 +02:00
Horatiu Muresan
43bea201e6 fix(prejoin) Hide conference name based on config 2022-09-12 10:35:37 +03:00
Horatiu Muresan
6e1e6df952 fix(prejoin) Fix roomname showing for 3rd party prejoin app (#12155)
* fix(prejoin) Fix roomname showing for 3rd party prejoin app

* fix: Do not convert roomName to string when undefined.

Co-authored-by: damencho <damencho@jitsi.org>
2022-09-09 12:10:50 -05:00
Saúl Ibarra Corretgé
8ce1423373 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1496.0.0+e1ca2f5a...v1498.0.0+bc3aae02
2022-09-09 16:57:08 +02:00
Saúl Ibarra Corretgé
ede97584f2 fix(ios) fix lite SDK release process 2022-09-09 13:37:08 +02:00
Robert Pintilii
247c54b6c6 ref(TS) Convert constants tiles to TS (#12148)
Remove unnecessary ts-ignores
2022-09-09 12:22:30 +03:00
Robert Pintilii
10bb186c13 ref(eslint) Use new TypeScript ESlint config (#12143)
Use new TS config from @jitsi/eslint
Fix all lint errors
2022-09-08 12:52:36 +03:00
Artur Shepilko
e296008d95 lang: update Ukrainian translation 2022-09-07 18:33:00 -05:00
Jaya Allamsetty
01001d6438 fix(large-video) Update large-video when the streamingStatus of the attached track changes.
This fixes an issue where screenshare appears on the thumbnail but not on the large-video.
2022-09-07 18:31:23 -04:00
damencho
fce15b491d feat: Adds jaas choice when installing. 2022-09-07 08:21:12 -05:00
damencho
cf37ba8771 feat: Drops prosody 0.10 checks. 2022-09-07 08:21:12 -05:00
damencho
0350f18e68 feat: Drops migration from jetty deployments. 2022-09-07 08:21:12 -05:00
Robert Pintilii
c9bbc6c762 ref(TS) Remove unnecessary ts-ignores (#12136) 2022-09-07 11:20:05 +03:00
Christoph Settgast
fa942e9f3b fix(lang) update German translation (#12122)
Signed-off-by: Christoph Settgast <csett86@web.de>
2022-09-07 09:13:19 +02:00
Robert Pintilii
fd67fb652b fix(analytics) Fix lint error (#12135) 2022-09-07 09:54:31 +03:00
Ali Alhaidary
a87d4f4a1d fix(lang) updated Arabic translation 2022-09-06 19:32:47 +02:00
Robert Pintilii
efb69d5382 ref: Improve TS files (#12130)
Remove unnecessary ts-ignores
Change any to actual types
Fix eslint rule
2022-09-06 20:32:20 +03:00
Flying-Light
db988f6e62 fix(lang) improve Arabic translation
Modify some translations for their difficulty for the user.
Add some missing translations like "ask to unmute"
2022-09-06 19:27:44 +02:00
Robert Pintilii
f4b46128bc ref(analytics) Convert to TS (#12099) 2022-09-06 15:51:50 +03:00
Gabriel Borlea
9323b86e3c feat(rtc-stats): support for react native and breakout rooms (#11835)
* feat(rtc-stats): mobile flow

* fix(rtc-stats): create websocket connection event

* feat(rtc-stats): separate middlewares and filter callstats pcs

* fix: linting problems

* fix: linting problems 2

* fix(rtc-stats): middlewares

* ref(rtc-stats): rewrite in typescript

* remove blank line and flow tag

* fix: linting problems

* remove redundant comment

* remove index file

* fix: sort interface keys

* feat(rtc-stats): support for breakout rooms

* ref(rtc-stats): send isBreakoutRoom flag when connecting to rtc stats

* code review

* fix(rtc-stats): rebase issues

* remove empty lines

* chore(rtc-stats): update rtc-stats to latest version

* fix: linting issues
2022-09-06 10:42:59 +03:00
Saúl Ibarra Corretgé
06842c724a fix(rn,video-layout) fix mobile
In adcd9a501b a call to getCurrentLayout
was introduced, which is not mobile-friendly :-(
2022-09-06 09:27:47 +02:00
Duduman Bogdan Vlad
5f62acc67c fix(external_api): Fix number of participants in meeting (#12052) 2022-09-06 09:51:38 +03:00
Robert Pintilii
17008237dc ref: Improve TS state (#12125)
Create IStateful interface
Use IState interface everywhere
Remove unnecessary @ts-ignore
2022-09-05 14:24:13 +03:00
Robert Pintilii
271ea8315b ref: Improve reducers TS (#12123) 2022-09-05 12:05:07 +03:00
Alexey Matveev
f18f8c1061 fix(lang) update Russian translation 2022-09-05 10:22:13 +02:00
Saúl Ibarra Corretgé
b535b8c583 fix(lobby) fix opening lobby chat after API change 2022-09-01 14:21:32 -05:00
Hristo Terezov
adcd9a501b ref(receiver-constraints): Refactor and fixes. 2022-09-01 13:22:09 -05:00
Saúl Ibarra Corretgé
cfb1fef162 fix(breakout-rooms) fix broadcast timer 2022-09-01 18:19:29 +02:00
Saúl Ibarra Corretgé
8b4f2495dc fixup! 2022-09-01 17:13:33 +02:00
Saúl Ibarra Corretgé
7e7107d45a feat(build,ljm) don't expose jquery
lib-jitsi-meet no longer requires it.
2022-09-01 17:13:33 +02:00
Saúl Ibarra Corretgé
45c0597aff chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1494.0.0+c9be46e2...v1496.0.0+e1ca2f5a
2022-09-01 17:12:50 +02:00
Calinteodor
c77e2c8301 feat(settings/native): fixes and updates (#12094)
feat(settings/native): fixes and updates
2022-09-01 15:05:14 +03:00
Robert Pintilii
3403d7bec2 ref: Convert reducers to TS (#12101) 2022-09-01 14:00:49 +03:00
Robert Pintilii
c4557c66aa chore(dep) Update caniuse-lite (#12109) 2022-09-01 11:32:11 +03:00
Robert Pintilii
cfda02ee10 ref(shared-video) Merge web and native reducers (#12108)
Convert reducer to TS
2022-09-01 11:32:01 +03:00
JohnProv
575ab1f1cb fix(lang) update Dutch translation 2022-09-01 09:19:29 +02:00
tamasdomokos
b4f98e7386 feat(translation) enable cc translation (#12046)
* feat(translation) enable cc translation

* Refactor translation for ListItem.

* fix language file sorting

* fix translation order

* change import order
2022-08-31 10:57:31 -05:00
Calin-Teodor
e8de9b4d66 feat(prejoin/native): update react-native-video dep and unmount LargeVideo is Prejoin is not focused 2022-08-31 12:55:02 +03:00
damencho
6fe353cfa4 fix: Fixes lua log lines.
When using directly log( the log lines come from `general` not from the module itself.
`Aug 29 19:38:08 general	info	Starting speakerstats for conference...`
2022-08-30 11:24:28 -05:00
Stefan Weil
882d343e8b chore(typos) fix some typos 2022-08-30 16:21:58 +02:00
Hristo Terezov
cc3a8b7b8d fix(stage-filmstrip): Pinning
Pinning participant was not working for stage filmstrip and
screen sharing filmstirp layouts
2022-08-30 08:41:38 -05:00
Saúl Ibarra Corretgé
104bfe7339 fix(rn,thumbnail) show SS indicator on the local thumbnail 2022-08-30 14:13:17 +02:00
Saúl Ibarra Corretgé
fb9d35a991 fix(rn,tracks) fix muting local screenshare when remote is muted
A "is local" check was missing.
2022-08-30 14:13:17 +02:00
Saúl Ibarra Corretgé
8fabba1679 fix(shared-video) fix exception on mobile
Also use the "standardized" way of instantiating loggers.
2022-08-30 14:13:17 +02:00
Saúl Ibarra Corretgé
5fbf741278 fix(rn,filmstrip) avoid "red" screen sharing tile
Mobile does not render screen-shares in tiles for performance reasons.
This coincidentally fixes the "red" tile that was attempted to be
rendered when the local partitipant started screen-sharing.
2022-08-30 14:13:17 +02:00
Saúl Ibarra Corretgé
bebcc8234f fix(rn,multi-stream) don't send multiple streams on mobile
Mobile does not do multiple local video streams for performance reasons,
so avoid creating the local fake participant.

WIP
2022-08-30 14:13:17 +02:00
Avram Tudor
1e9f599a35 ref(config) move defaultLogoUrl to config object (#12087)
* ref(config) move defaultLogoUrl to config object

* code review changes
2022-08-30 14:52:36 +03:00
Horatiu Muresan
cc5a3e499f feat(aot-prejoin) Add support for showing AOT on prejoin 2022-08-30 11:42:29 +03:00
Calin-Teodor
dbcbafe088 feat(polls/native): fixed scroll inside screen 2022-08-29 17:09:50 +03:00
José Luís Andrade
b034cf27cb lang: Update Portuguese translation (#12081) 2022-08-29 08:08:14 -05:00
Calin-Teodor
126dba8070 feat(security/native): options available only if participant is moderator 2022-08-29 15:30:36 +03:00
Calin-Teodor
a7c1aa4900 feat(settings/native): updated placeholder and placeholder text color 2022-08-29 15:21:50 +03:00
Saúl Ibarra Corretgé
206215c7c1 feat(ios) add generated Swift interface header
We need it for the RN module since it won't be (re)generated. It has not
changed in 4 years, so I guess it's safe to assume it'll stay that way.
2022-08-29 12:49:07 +02:00
Jaya Allamsetty
f38c5f39d2 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1493.0.0+3cf3db1a...v1494.0.0+c9be46e2
2022-08-26 15:12:56 -04:00
wfleischer
09efaecc41 feat(conference) add end conference
Add the ability (for moderators) to end the meeting for everyone.
2022-08-26 20:25:04 +02:00
Saúl Ibarra Corretgé
3bb581c8d9 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1487.0.0+f3f922a8...v1493.0.0+3cf3db1a
2022-08-26 20:24:08 +02:00
Nils Ohlmeier
96099a06a8 feature(rtcstats): expose sendSdp as config option (#12072)
* feature(rtcstats): expose sendSdp as config option

* fixed linting error
2022-08-26 13:03:08 -05:00
Saúl Ibarra Corretgé
4ef5da6c82 fix(ts) fix build 2022-08-26 08:01:59 -05:00
George Politis
289ece42df feat(logging): Store JS console logs in RTCStats.
With this commit JS console logs can optionally be sent to the RTCstats server
for storage and processing.

The functionality is off by default and can be enabled by setting to `true` the
config.js option

    config.analytics.rtcstatsStoreLogs: false // off by default

Obviously, if rtcstats is disabled/not configured nothing will be sent to the
rtcstats backend, even if this setting is set to `true`.

This commit also adds a config.js option that can be used to disable sending the
logs back to callstats:

    config.callstatsStoreLogs: true // on by default

Obviously, if callstats is disabled nothing would be sent in the first place,
but if callstats is enabled and this new configuration parameter is set to
`false`, then callstats will be kept active but no logs will be sent to
callstats.
2022-08-26 14:19:48 +03:00
Saúl Ibarra Corretgé
7dba5f8a7e fix(prejoin) use the conference display name instead of the room name
The room name could be a UUID and the conference display name an actual
name, using the subject.
2022-08-26 12:21:01 +02:00
Robert Pintilii
1010955393 ref: Convert some reducers to TS (#12065) 2022-08-26 12:54:16 +03:00
Robert Pintilii
3bd3be4df0 ref: Convert files to TS (#12007)
Convert files that use material-ui to TS (needed for material-ui upgrade)
2022-08-26 12:54:03 +03:00
Duduman Bogdan Vlad
fc60ab8383 feat(conference) send leave reasons on switching room and when errors occur 2022-08-26 11:53:32 +02:00
Rokixy
85d2123fac fix(chore) fix typo 2022-08-26 10:11:08 +02:00
Дамян Минков
5790742d53 fix(debian) add missing dependency of lua-inspect 2022-08-26 09:31:11 +02:00
bogdandarie
be1752c162 Feat (chat) add new message badge (#11987)
Change scroll to bottom when receive a new message with:
- scroll to bottom if scroll was at the bottom before getting a new message
- keep the scroll in his original position when the scroll position was not at the bottom
- scroll to bottom when open first time the chat
2022-08-26 09:21:41 +03:00
Gabriel Borlea
b9aeb19379 fix(face-landmarks): not sending duplicate expressions when recognition stops (#12067)
fix(facelandmarks): do not perform stop recognition if it is not active
2022-08-25 16:52:03 +03:00
Jaya Allamsetty
7951dc3ce7 fix(audio-only) Do not enable video automatically when audio-only is disabled (#12056)
* fix(audio-only) Do not enable video automatically when audio-only is disabled.
2022-08-25 08:40:32 -04:00
Robert Pintilii
dfb2a07cfa ref: Convert material-ui files to TS (#12013)
Convert files that use material-ui to TS (needed for material-ui upgrade)
2022-08-25 14:35:19 +03:00
Calinteodor
94dc6309de feat(base/native): Switch thumb track color (#12066)
* feat(base/native): Switch thumbColor and trackColor default props
2022-08-25 14:25:13 +03:00
Rokixy
3f2018a1de fix(chore) fix typo 2022-08-25 11:30:39 +02:00
Calin-Teodor
cd4ab8a5f1 feat(polls/native): added thumbColor for android 2022-08-25 10:57:34 +03:00
Hristo Terezov
594f9dfcdd fix(follow-me): SS not visible
The remote screen shares stored in redux were not updated when follow
me is active. Therefore the receiver constraints were not correct.
2022-08-24 16:42:51 -05:00
Robert Pintilii
8dd71a921b ref(ui-components) Improve native and web Switch (#12061)
Bring Switch component more in line
Convert some files to TS
2022-08-24 12:46:22 +03:00
Calinteodor
6d39d13af7 feat(lobby/prejoin): added room name title (#12054)
* feat(lobby/prejoin): added room name title
2022-08-24 12:43:28 +03:00
Robert Pintilii
372c2cb0f9 fix(participant) Avoid unnecessary unpin calls (#12060) 2022-08-24 11:26:09 +03:00
Calin-Teodor
5b41d68d39 feat(settings): changed switch enabled track color 2022-08-24 11:10:26 +03:00
JohnProv
1b9870dade Update main-nl.json 2022-08-23 13:13:27 -05:00
Mariusz Krzaczkowski
38eff2ba24 lang: Update for Polish (#12053)
* [i18n] Update for Polish

* [i18n] Update for Polish

* [i18n] Update for Polish
2022-08-23 09:54:50 -05:00
apetrus20
11f6b442fe feat (screen-share) Added logs and emit iframe event for video and audio sharing (#12051) 2022-08-23 15:17:18 +03:00
Calinteodor
e458eed931 feat(recording): StartRecordingDialogContent web and native (#12009)
* feat(recording): StartRecordingDialogContent web and native
2022-08-23 11:56:02 +03:00
Avram Tudor
f07bd4a0d6 feat(prejoin) add room name to premeeting screen (#12049) 2022-08-22 16:26:35 +03:00
Robert Pintilii
40637aa3dc ref(ui-components) Improve Button component (#12015)
Bring web and native more in line
2022-08-22 12:40:59 +03:00
Jaya Allamsetty
2f10d80184 fix(logging) Add more info logs for device switching. 2022-08-18 21:59:03 -04:00
Artur Shepilko
739c060018 lang: add Ukrainian to more languages 2022-08-18 13:20:02 -05:00
damencho
41a6cbd3fc fix: Jwt context.features to work without context.user. Fixes #12005 2022-08-18 12:01:20 -05:00
Calin-Teodor
61df6f6794 feat(media): added extra percentage padding right to screen share view fit 2022-08-18 18:07:35 +03:00
Artur Shepilko
d44cbb6d1e lang: update Ukrainian translation 2022-08-17 15:46:12 -05:00
Nils Ohlmeier
06ed0e43ad update(rtcstats): fix one more left over comment around poll intervall (#12036) 2022-08-17 12:58:09 -07:00
Calin-Teodor
eb911ec9b5 feat(participants-pane/native): fixed undefined error 2022-08-17 18:21:30 +03:00
Calin-Teodor
e8cdf38fda native ui fixes 2022-08-17 15:45:23 +03:00
Saúl Ibarra Corretgé
e578f6c30f feat(logging) migrate logging to config.js 2022-08-17 14:32:40 +02:00
Saúl Ibarra Corretgé
77d687952d feat(jwt) deprecate and remove enableFeaturesBasedOnToken
The new behavior is as follows:

IF a user has a token and `features` is not set, we treat it as if the
feature was enabled.

IF a user has a token and `features` is set, we check if the feature
name has a value of "true".

`isJwtFeatureEnabled` also provides a way to specify the default value
in case there is no token.
2022-08-17 11:17:29 +02:00
Saúl Ibarra Corretgé
bf222c5094 fix(highlight) check for JaaS features before opening the dialog 2022-08-17 11:17:14 +02:00
Saúl Ibarra Corretgé
08f9dc5e83 fix(participants-pane) fix button impport
Fixes: https://community.jitsi.org/t/navigation-link-in-participants-button-broken-after-usage-of-lobby-chat/116606
2022-08-17 10:34:33 +02:00
Nils Ohlmeier
9c83831b2c update(rtcstats): adjusted poll intervals in comments to match default value 2022-08-16 13:10:20 -05:00
Jaya Allamsetty
97bc41f644 fix(filmstrip) Push dominant speaker to the top of the active speaker list.
The active speaker list in redux is alpha sorted, we need to ensure dominant speaker is at the top otherwise it can get truncated based on the available number of visible slots in the filmstrip.
2022-08-16 14:05:48 -04:00
Nils Ohlmeier
f70ed9cb8a fix(rtcstats): Fix rtcstats poll interval typo and increase default value (#12024)
* fix(rtcstats): fixed typo in rtcstats pollInterval

* fix(rtcstats): set rtcstats default poll interval value to 10s
2022-08-16 10:37:04 -07:00
Saúl Ibarra Corretgé
123ab32e75 chore(config,known-domains) remove legacy code 2022-08-16 17:18:04 +02:00
Saúl Ibarra Corretgé
3c370eb6ca chore(recent-list) remove legacy compatibility code 2022-08-16 17:18:04 +02:00
Saúl Ibarra Corretgé
3e6c988c30 chore(redux) remove legacy compatibility code 2022-08-16 17:18:04 +02:00
Saúl Ibarra Corretgé
649ace1f44 chore(config) remove legacy comment 2022-08-16 17:18:04 +02:00
Saúl Ibarra Corretgé
57f27b4234 chore(analytics) remove lagacy backwards compatibility code 2022-08-16 17:18:04 +02:00
Saúl Ibarra Corretgé
2ae4ba3875 feat(ios) add lite SDK target 2022-08-16 09:58:37 +02:00
Saúl Ibarra Corretgé
0bfa1027a9 fix(virtual-backgrounds) cache loaded model
There is no need to fetch and apply the model every time we want to
createe the effect since it doesn't change.
2022-08-16 08:20:58 +02:00
emrah
f412ff7f11 fix(config) add a missing comma in json list 2022-08-14 11:25:20 +02:00
Jaya Allamsetty
3975db7a68 fix(fimstrip): Do not re-sort the active speakers if dominant speaker is visible.
Fixes a case where re-sorting doesn't happen even when dominant speaker is currently not visible.
2022-08-12 14:18:37 -04:00
Werner Fleischer
02e4d2b902 fix(participants-pane): leave breakout room button appearance 2022-08-12 13:08:49 +02:00
Jaya Allamsetty
ca095240b9 fix(audio-only-ss): Attach a track stopped handler to the audioDesktop track only for audio-only sharing case.
There will be an audio desktop track for regular screensahring when a tab is selected. We do not have to toggle screensharing again when that track is killed.
2022-08-11 16:59:57 -04:00
Jaya Allamsetty
3d60773963 Add debugging for SS streaming issues 2022-08-11 16:59:57 -04:00
Saúl Ibarra Corretgé
895ce56e8d chore(deps) style-loader@3.3.1 2022-08-11 17:54:16 +02:00
Saúl Ibarra Corretgé
d12860082c chore(deps) run npm audit fix 2022-08-11 17:54:16 +02:00
Saúl Ibarra Corretgé
4e03f20a51 chore(deps) update react-native-svg@12.4.3 2022-08-11 17:54:16 +02:00
Robert Pintilii
0435c3cc64 ref(ui-components) Use new input and button in chat (#12000) 2022-08-11 16:32:44 +03:00
Alex Bumbu
ea4be6cb30 fix(iOS): script for enabling multitasking camera access for release build 2022-08-11 14:34:20 +02:00
damencho
fa39c10766 feat: Updates the local stats to match remote for 'connected to'. 2022-08-10 21:13:12 -05:00
tmoldovan8x8
82c047707f fix(mobile externalApi) suppress participant joined and left events for virtual screenshare 2022-08-10 16:34:18 +03:00
Robert Pintilii
00221b7482 ref: Convert some reducers to TS (#12002) 2022-08-10 12:56:24 +03:00
Hristo Terezov
8266d55cb9 chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1484.0.0+6d5ca18b...v1487.0.0+f3f922a8
2022-08-10 11:48:42 +03:00
Robert Pintilii
b2396ff809 ref(ui-components) Replace livestream input (#11997) 2022-08-10 10:22:24 +03:00
Robert Pintilii
fb20786b65 ref(ui-components) Replace inputs with new component (#11964) 2022-08-10 09:25:31 +03:00
Saúl Ibarra Corretgé
f5649efa49 fix(dropbox) fix signing out when switching rec providers 2022-08-09 10:23:05 -05:00
Saúl Ibarra Corretgé
7b361b3e23 fix(dropbox) fix incorrect button labels and click on web
The web and mobile Button components are not implemented the same way
and this came to bite us.

This is a stopgap fix, the real fix needs to be to make them have
exactly the same shared props and behavior.
2022-08-09 08:25:44 -05:00
Robert Pintilii
05fdd5f31f ref: Convert some reducers to TS (#11994) 2022-08-09 15:22:18 +03:00
Дамян Минков
5c52ee97ed fix: Adds missing notification in example config.
Add missing 'notify.videoMutedRemotelyTitle'.
2022-08-08 15:58:50 -05:00
Дамян Минков
3626e51c24 feat: Adds a jaas reference when installing. 2022-08-08 10:50:02 -05:00
Saúl Ibarra Corretgé
ef748c576d fix(face-landmarks) fix createImageBitMap polyfill on Safari 14
The polyfill returns an Image object instead of an ImageBitmap. The
latter has a close method, however, which we call.

Make sure we provide a dummy close method to avoid errors.
2022-08-08 17:03:48 +02:00
Saúl Ibarra Corretgé
dd044ad252 fix(settings) fix not showing the more tab
It used to only contain 3 sets of options, so we'd check if any of them
were set before showing it, but it now contains more options, so always
show it if the user requested it.
2022-08-08 14:26:04 +02:00
Robert Pintilii
5f04c5ba64 ref: Convert some reducers to TS (#11988) 2022-08-08 14:06:29 +03:00
Robert Pintilii
8f5eabe1f2 ref(TS) Remove ts-ignores (#11979) 2022-08-08 12:36:06 +03:00
Robert Pintilii
43578474a0 ref: Convert base/participants to TS (#11978)
Remove unnecessary ts-ignores
2022-08-08 11:12:22 +03:00
José Luís Andrade
6dbf283f3d Update Portuguese translation 2022-08-07 12:07:39 +02:00
Jaya Allamsetty
a1e0a46bad fix(audio-only SS) Stop audio-only SS when user stops share from the browser's share in progress window. 2022-08-05 14:30:49 -04:00
Hristo Terezov
627027b167 fix(remote-control): when multistream is enabled
The remote control controller events were sent for the camera
participant instead of the screen sharing one.
2022-08-05 19:04:52 +03:00
Jaya Allamsetty
4d41d36020 fix(remote-control): fix remote-control when multi-stream is enabled. 2022-08-05 09:35:52 -04:00
Robert Pintilii
0f57c37d6a feat(ui-components) Add clickable icon component (#11976) 2022-08-05 15:07:44 +03:00
Robert Pintilii
5b34068435 ref(ui-components) Use new input component (#11965) 2022-08-05 15:07:28 +03:00
apetrus20
52ce9a86ed feat(large-video/web) Add screen share placeholder (#11971)
* feat(large-video/web) new ScreenSharePlaceholder component
2022-08-05 12:11:09 +03:00
Andrei Gavrilescu
bdff92397b fix(noise-suppression): remove no track warning on share audio flow (#11966)
* remove no track warning on share audio flow

* remove unused import
2022-08-04 16:51:13 +03:00
Andrei Gavrilescu
1abc6b1e4a feat(noise-suppression): add toggle noise-suppression API (#11968)
* add toggle noise-suppression API

* switch NS API from toggle to set
2022-08-04 15:47:49 +03:00
Дамян Минков
ca259287be fix: Applies AV moderation checks on screen sharing with multistream on.
Guests trying to screenshare see the notification but also the dialog for choosing content.
2022-08-04 14:28:43 +03:00
Robert Pintilii
5601a62b60 ref(ui-components) Use new Button component (#11969)
Remove atlaskit deps
2022-08-04 13:39:22 +03:00
Robert Pintilii
d3c7b074d4 ref: Convert some files to TS (#11947) 2022-08-04 11:51:33 +03:00
Robert Pintilii
0fa0e99ffa ref(ui-components) Replace Recording dialog switch with new component (#11963)
The additional component is needed because the dialog is shared between native and web
2022-08-04 11:32:00 +03:00
Robert Pintilii
002d0fed42 ref(security-dialog) Use new input component for password (#11946) 2022-08-04 11:26:13 +03:00
Jaya Allamsetty
873cdbb404 fix(external-api) Fix toggleShareScreen in multi-stream mode.
Fixes https://github.com/jitsi/jitsi-meet/issues/11916.
2022-08-03 11:28:09 -04:00
727 changed files with 16407 additions and 12761 deletions

View File

@@ -21,5 +21,5 @@ jobs:
- run: npm run lint
- run: for file in lang/*.json; do npx --yes jsonlint -q $file || exit 1; done
- env:
NODE_OPTIONS: '--max-old-space-size=4096'
NODE_OPTIONS: '--max-old-space-size=8192'
run: make

View File

@@ -206,7 +206,7 @@ public class JitsiMeetView extends FrameLayout {
// by leaving the conference. However, React and, respectively,
// appProperties/initialProperties are declarative expressions i.e. one
// and the same URL will not trigger an automatic re-render in the
// JavaScript source code. The workaround implemented bellow introduces
// JavaScript source code. The workaround implemented below introduces
// "imperativeness" in React Component props by defining a unique value
// per setProps() invocation.
props.putLong("timestamp", System.currentTimeMillis());

View File

@@ -193,7 +193,7 @@ class RNConnectionService extends ReactContextBaseJavaModule {
* Called by the JS side to update the call's state.
*
* @param callUUID - the call's UUID.
* @param callState - the map which carries infor about the current call's
* @param callState - the map which carries info about the current call's
* state. See static fields in {@link ConnectionService.ConnectionImpl}
* prefixed with "KEY_" for the values supported by the Android
* implementation.

6
app.js
View File

@@ -1,6 +1,10 @@
/* application specific logic */
import 'jquery';
// Re-export jQuery
// FIXME: Remove this requirement from torture tests.
import $ from 'jquery';
window.$ = window.jQuery = $;
import '@matrix-org/olm';

View File

@@ -52,7 +52,8 @@ import {
onStartMutedPolicyChanged,
p2pStatusChanged,
sendLocalParticipant,
nonParticipantMessageReceived
nonParticipantMessageReceived,
CONFERENCE_LEAVE_REASONS
} from './react/features/base/conference';
import {
getReplaceParticipant,
@@ -159,6 +160,7 @@ import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/Au
import { createPresenterEffect } from './react/features/stream-effects/presenter';
import { createRnnoiseProcessor } from './react/features/stream-effects/rnnoise';
import { endpointMessageReceived } from './react/features/subtitles';
import { handleToggleVideoMuted } from './react/features/toolbox/actions.any';
import { muteLocal } from './react/features/video-menu/actions.any';
import UIEvents from './service/UI/UIEvents';
@@ -381,7 +383,7 @@ class ConferenceConnector {
// FIXME the conference should be stopped by the library and not by
// the app. Both the errors above are unrecoverable from the library
// perspective.
room.leave().then(() => connection.disconnect());
room.leave(CONFERENCE_LEAVE_REASONS.UNRECOVERABLE_ERROR).then(() => connection.disconnect());
break;
case JitsiConferenceErrors.CONFERENCE_MAX_USERS:
@@ -464,7 +466,7 @@ function _connectionFailedHandler(error) {
_connectionFailedHandler);
if (room) {
APP.store.dispatch(conferenceWillLeave(room));
room.leave();
room.leave(CONFERENCE_LEAVE_REASONS.UNRECOVERABLE_ERROR);
}
}
}
@@ -1151,9 +1153,13 @@ export default {
* Simulates toolbar button click for video mute. Used by shortcuts and API.
* @param {boolean} [showUI] when set to false will not display any error
* dialogs in case of media permissions error.
* @param {boolean} ensureTrack - True if we want to ensure that a new track is
* created if missing.
*/
toggleVideoMuted(showUI = true) {
this.muteVideo(!this.isLocalVideoMuted(), showUI);
toggleVideoMuted(showUI = true, ensureTrack = false) {
const mute = !this.isLocalVideoMuted();
APP.store.dispatch(handleToggleVideoMuted(mute, showUI, ensureTrack));
},
/**
@@ -2420,8 +2426,8 @@ export default {
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
this.muteAudio(muted);
});
APP.UI.addListener(UIEvents.VIDEO_MUTED, muted => {
this.muteVideo(muted);
APP.UI.addListener(UIEvents.VIDEO_MUTED, (muted, showUI = false) => {
this.muteVideo(muted, showUI);
});
room.addCommandListener(this.commands.defaults.ETHERPAD,
@@ -2577,16 +2583,16 @@ export default {
return stream;
})
.then(stream => {
logger.log('Switching the local video device.');
logger.info(`Switching the local video device to ${cameraDeviceId}.`);
return this.useVideoStream(stream);
})
.then(() => {
logger.log('Switched local video device.');
logger.info(`Switched local video device to ${cameraDeviceId}.`);
this._updateVideoDeviceId();
})
.catch(error => {
logger.error(`Switching the local video device failed: ${error}`);
logger.error(`Failed to switch to selected camera:${cameraDeviceId}, error:${error}`);
return APP.store.dispatch(notifyCameraError(error));
});
@@ -2602,20 +2608,20 @@ export default {
// Disable noise suppression if it was enabled on the previous track.
await APP.store.dispatch(setNoiseSuppressionEnabled(false));
// When the 'default' mic needs to be selected, we need to
// pass the real device id to gUM instead of 'default' in order
// to get the correct MediaStreamTrack from chrome because of the
// following bug.
// https://bugs.chromium.org/p/chromium/issues/detail?id=997689
const hasDefaultMicChanged = micDeviceId === 'default';
// When the 'default' mic needs to be selected, we need to pass the real device id to gUM instead of
// 'default' in order to get the correct MediaStreamTrack from chrome because of the following bug.
// https://bugs.chromium.org/p/chromium/issues/detail?id=997689.
const isDefaultMicSelected = micDeviceId === 'default';
const selectedDeviceId = isDefaultMicSelected
? getDefaultDeviceId(APP.store.getState(), 'audioInput')
: micDeviceId;
logger.info(`Switching audio input device to ${selectedDeviceId}`);
sendAnalytics(createDeviceChangedEvent('audio', 'input'));
createLocalTracksF({
devices: [ 'audio' ],
cameraDeviceId: null,
micDeviceId: hasDefaultMicChanged
? getDefaultDeviceId(APP.store.getState(), 'audioInput')
: micDeviceId
micDeviceId: selectedDeviceId
})
.then(([ stream ]) => {
// if audio was muted before changing the device, mute
@@ -2635,45 +2641,24 @@ export default {
.then(() => {
const localAudio = getLocalJitsiAudioTrack(APP.store.getState());
if (localAudio && hasDefaultMicChanged) {
if (localAudio && isDefaultMicSelected) {
// workaround for the default device to be shown as selected in the
// settings even when the real device id was passed to gUM because of the
// above mentioned chrome bug.
localAudio._realDeviceId = localAudio.deviceId = 'default';
}
logger.log(`switched local audio device: ${localAudio?.getDeviceId()}`);
logger.info(`switched local audio input device to: ${selectedDeviceId}`);
this._updateAudioDeviceId();
})
.catch(err => {
logger.error(`Failed to switch to selected audio input device ${selectedDeviceId}, error=${err}`);
APP.store.dispatch(notifyMicError(err));
});
}
);
APP.UI.addListener(UIEvents.TOGGLE_AUDIO_ONLY, audioOnly => {
// FIXME On web video track is stored both in redux and in
// 'localVideo' field, video is attempted to be unmuted twice when
// turning off the audio only mode. This will crash the app with
// 'unmute operation is already in progress'.
// Because there's no logic in redux about creating new track in
// case unmute when not track exists the things have to go through
// muteVideo logic in such case.
const tracks = APP.store.getState()['features/base/tracks'];
const isTrackInRedux
= Boolean(tracks.find(track => track.jitsiTrack && track.jitsiTrack.getType() === MEDIA_TYPE.VIDEO));
if (isTrackInRedux && !this.isSharingScreen) {
this.muteVideo(audioOnly);
}
// Immediately update the UI by having remote videos and the large
// video update themselves instead of waiting for some other event
// to cause the update, usually PARTICIPANT_CONN_STATUS_CHANGED.
// 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.addListener(UIEvents.TOGGLE_AUDIO_ONLY, () => {
// Immediately update the UI by having remote videos and the large video update themselves.
const displayedUserId = APP.UI.getLargeVideoID();
if (displayedUserId) {
@@ -3080,13 +3065,14 @@ export default {
* Leaves the room.
*
* @param {boolean} doDisconnect - Whether leaving the room should also terminate the connection.
* @param {string} reason - reason for leaving the room.
* @returns {Promise}
*/
async leaveRoom(doDisconnect = true) {
async leaveRoom(doDisconnect = true, reason = '') {
APP.store.dispatch(conferenceWillLeave(room));
if (room && room.isJoined()) {
return room.leave().finally(() => {
return room.leave(reason).finally(() => {
if (doDisconnect) {
return disconnect();
}

View File

@@ -22,6 +22,8 @@ if (subdomain.startsWith('<!--')) {
subdomain = '';
}
var enableJaaS = false;
var config = {
// Connection
//
@@ -618,9 +620,6 @@ var config = {
// Hides the email section under profile settings.
// hideEmailInSettings: false,
// Whether or not some features are checked based on token.
// enableFeaturesBasedOnToken: false,
// When enabled the password used for locking a room is restricted to up to the number of digits specified
// default: roomPasswordNumberOfDigits: false,
// roomPasswordNumberOfDigits: 10,
@@ -701,7 +700,7 @@ var config = {
// 'chat',
// 'closedcaptions',
// 'desktop',
// 'dock-iframe'
// 'dock-iframe',
// 'download',
// 'embedmeeting',
// 'etherpad',
@@ -736,13 +735,13 @@ var config = {
// Holds values related to toolbar visibility control.
// toolbarConfig: {
// // Moved from interfaceConfig.INITIAL_TOOLBAR_TIMEOUT
// // The initial numer of miliseconds for the toolbar buttons to be visible on screen.
// // The initial number of milliseconds for the toolbar buttons to be visible on screen.
// initialTimeout: 20000,
// // Moved from interfaceConfig.TOOLBAR_TIMEOUT
// // Number of miliseconds for the toolbar buttons to be visible on screen.
// // Number of milliseconds for the toolbar buttons to be visible on screen.
// timeout: 4000,
// // Moved from interfaceConfig.TOOLBAR_ALWAYS_VISIBLE
// // Whether toolbar should be always visible or should hide after x miliseconds.
// // Whether toolbar should be always visible or should hide after x milliseconds.
// alwaysVisible: false,
// // Indicates whether the toolbar should still autohide when chat is open
// autoHideWhileChatIsOpen: false,
@@ -825,6 +824,7 @@ var config = {
// Application ID and Secret.
// callStatsID: '',
// callStatsSecret: '',
// callstatsStoreLogs: true,
// The callstats initialize config params as described in the API:
// https://docs.callstats.io/docs/javascript#callstatsinitialize-with-app-secret
@@ -961,14 +961,19 @@ var config = {
// PeerConnection states along with getStats metrics polled at the specified
// interval.
// rtcstatsEnabled: false,
// rtcstatsStoreLogs: false,
// In order to enable rtcstats one needs to provide a endpoint url.
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,
// The interval at which rtcstats will poll getStats, defaults to 1000ms.
// The interval at which rtcstats will poll getStats, defaults to 10000ms.
// 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,
// rtcstatsPollInterval: 10000,
// This determines if rtcstats sends the SDP to the rtcstats server or replaces
// all SDPs with an empty string instead.
// rtcstatsSendSdp: false,
// Array of script URLs to load as lib-jitsi-meet "analytics handlers".
// scriptURLs: [
@@ -1062,7 +1067,7 @@ var config = {
// maxConferenceSize: 200,
//
// // The maximum number of e2e ping messages per second for the whole conference to aim for.
// // This is used to contol the pacing of messages in order to reduce the load on the backend.
// // This is used to control the pacing of messages in order to reduce the load on the backend.
// maxMessagesPerSecond: 250,
// },
@@ -1284,11 +1289,6 @@ var config = {
// {"countryCode":"US","tollFree":false,"formattedNumber":"+1 123-456-7890"}
// dialInConfCodeUrl is the conference mapper converting a meeting id to a PIN used for dial-in
// or the other way around (more info in resources/cloud-api.swagger)
//
// For JaaS customers the default values are:
// dialInNumbersUrl: 'https://conference-mapper.jitsi.net/v1/access/dids',
// dialInConfCodeUrl: 'https://conference-mapper.jitsi.net/v1/access',
//
// List of undocumented settings used in jitsi-meet
/**
@@ -1389,6 +1389,7 @@ var config = {
// 'notify.leftTwoMembers', // show when two participants left simultaneously
// 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously
// 'notify.grantedTo', // shown when moderator rights were granted to a participant
// 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute
// 'notify.invitedOneMember', // shown when 1 participant has been invited
// 'notify.invitedThreePlusMembers', // shown when 3+ participants have been invited
// 'notify.invitedTwoMembers', // shown when 2 participants have been invited
@@ -1409,7 +1410,7 @@ var config = {
// 'notify.raisedHand', // shown when a partcipant used raise hand,
// 'notify.startSilentTitle', // shown when user joined with no audio
// 'notify.unmute', // shown to moderator when user raises hand during AV moderation
// 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute
// 'notify.videoMutedRemotelyTitle', // shown when user's video is muted by a remote party,
// 'prejoin.errorDialOut',
// 'prejoin.errorDialOutDisconnected',
// 'prejoin.errorDialOutFailed',
@@ -1469,7 +1470,31 @@ var config = {
// // - chat: show the GIF as a message in chat
// // - all: all of the above. This is the default option
// displayMode: 'all',
// // How long the GIF should be displayed on the tile (in miliseconds).
// // How long the GIF should be displayed on the tile (in milliseconds).
// tileTime: 5000,
// },
// Logging
// logging: {
// // Default log level for the app and lib-jitsi-meet.
// defaultLogLevel: 'trace',
// // Option to disable LogCollector (which stores the logs on CallStats).
// //disableLogCollector: true,
// // Individual loggers are customizable.
// loggers: {
// // The following are too verbose in their logging with the default level.
// 'modules/RTC/TraceablePeerConnection.js': 'info',
// 'modules/statistics/CallStats.js': 'info',
// 'modules/xmpp/strophe.util.js': 'log',
// },
// Application logo url
// defaultLogoUrl: 'images/watermark.svg',
};
// Set the default values for JaaS customers
if (enableJaaS) {
config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids';
config.dialInConfCodeUrl = 'https://conference-mapper.jitsi.net/v1/access';
config.roomPasswordNumberOfDigits = 10; // skip re-adding it (do not remove comment)
}

View File

@@ -30,12 +30,18 @@
height: calc(100% - 70px);
}
#chat-conversation-container {
// extract message input height
height: calc(100% - 68px);
overflow: hidden;
position: relative;
}
#chatconversation {
box-sizing: border-box;
flex: 1;
font-size: 10pt;
// extract message input height
height: calc(100% - 68px);
height: 100%;
line-height: 20px;
overflow: auto;
padding: 16px;
@@ -119,63 +125,18 @@
.chat-input-container {
padding: 0 16px 16px;
&.populated {
#chat-input {
.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;
}
}
}
}
}
#chat-input {
border: 1px solid $chatInputSeparatorColor;
display: flex;
align-items: flex-end;
padding: 4px;
border-radius: 3px;
&:focus-within {
border: 1px solid #619CF4;
}
* {
background-color: transparent;
}
position: relative;
}
.send-button-container {
display: flex;
align-items: center;
}
.send-button {
display: flex;
align-items: center;
justify-content: center;
height: 40px;
width: 40px;
border-radius: 3px;
path {
fill: $chatInputSeparatorColor;
}
.chat-input {
flex: 1;
margin-right: 8px;
}
.smiley-button {
@@ -395,7 +356,9 @@
.smiley-input {
display: flex;
position: relative;
position: absolute;
top: 0;
left: 0;
}
.smileys-panel {
@@ -403,7 +366,7 @@
box-sizing: border-box;
background-color: rgba(0, 0, 0, .6) !important;
height: auto;
display: none;
display: flex;
overflow: hidden;
position: absolute;
width: calc(#{$sidebarWidth} - 32px);
@@ -418,11 +381,6 @@
*/
transition: max-height 0.3s;
&.show-smileys {
display: flex;
max-height: 500%;
}
#smileysContainer {
background-color: $chatBackgroundColor;
border-top: 1px solid $chatInputSeparatorColor;

View File

@@ -134,6 +134,20 @@
}
}
.hangup-menu-button {
background-color: $hangupMenuButtonColor;
@media (hover: hover) and (pointer: fine) {
&:hover {
background-color: $hangupMenuButtonHoverColor;
}
}
svg {
fill: #fff;
}
}
.profile-button-avatar {
align-items: center;
}

View File

@@ -6,6 +6,8 @@
$baseFontFamily: -apple-system, BlinkMacSystemFont, 'open_sanslight', 'Helvetica Neue', Helvetica, Arial, sans-serif;
$hangupColor:#DD3849;
$hangupHoverColor: #F25363;
$hangupMenuButtonColor:#0056E0;;
$hangupMenuButtonHoverColor: #246FE5;
$hangupFontSize: 2em;
/**

View File

@@ -68,6 +68,12 @@
}
.buttons {
margin-top: 16px;
display: flex;
align-items: center;
&>button:first-child {
margin-right: 8px;
}
}
}
}

View File

@@ -38,19 +38,6 @@
color: #fff;
}
.info-password-input {
width: 100%;
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

@@ -13,12 +13,14 @@
}
.password {
align-items: center;
align-items: flex-start;
display: flex;
justify-content: space-between;
justify-content: flex-start;
margin-top: 15px;
flex-direction: column;
&-actions {
margin-top: 10px;
a {
cursor: pointer;
text-decoration: none;
@@ -26,8 +28,8 @@
color: #6FB1EA;
}
& > :first-child:not(:last-child) {
margin-right: 24px;
& > :first-child:not(:last-child) {
margin-right: 24px;
}
}
}

View File

@@ -101,7 +101,7 @@
font-weight: 600;
letter-spacing: -0.015;
line-height: 36px;
margin-bottom: 32px;
margin-bottom: 16px;
text-align: center;
}

4
debian/control vendored
View File

@@ -20,7 +20,7 @@ Description: WebRTC JavaScript video conferences
Package: jitsi-meet-web-config
Architecture: all
Depends: openssl, nginx | nginx-full | nginx-extras | apache2
Depends: openssl, nginx | nginx-full | nginx-extras | apache2, curl
Description: Configuration for web serving of Jitsi Meet
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
Videobridge to provide high quality, scalable video conferences.
@@ -33,7 +33,7 @@ Description: Configuration for web serving of Jitsi Meet
Package: jitsi-meet-prosody
Architecture: all
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec, lua-basexx, lua-luaossl, lua-cjson
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec, lua-basexx, lua-luaossl, lua-cjson, lua-inspect
Replaces: jitsi-meet-tokens
Description: Prosody configuration for Jitsi Meet
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi

View File

@@ -1,2 +1,3 @@
doc/debian/jitsi-meet-prosody/prosody.cfg.lua-jvb.example /usr/share/jitsi-meet-prosody/
doc/debian/jitsi-meet-prosody/jaas.cfg.lua /usr/share/jitsi-meet-prosody/
resources/prosody-plugins/ /usr/share/jitsi-meet/

View File

@@ -83,6 +83,18 @@ case "$1" in
TURN_SECRET="$RET"
fi
db_get jitsi-meet/jaas-choice
JAAS_INPUT="$RET"
# In the case of updating from an older version the configure of -prosody package may happen before the -config
# one, so if JAAS_INPUT is empty (the question is not asked), let's ask it now.
if [ -z "$JAAS_INPUT" ] ; then
db_subst jitsi-meet/jaas-choice domain "${JVB_HOSTNAME}"
db_input critical jitsi-meet/jaas-choice || true
db_go
db_get jitsi-meet/jaas-choice
JAAS_INPUT="$RET"
fi
# and we're done with debconf
db_stop
@@ -141,7 +153,7 @@ case "$1" in
# New:
# 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
if grep -q "Component \"focus.$JVB_HOSTNAME\"" $PROSODY_HOST_CONFIG && ! grep -q "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@$JICOFO_AUTH_DOMAIN\"/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
@@ -166,6 +178,29 @@ case "$1" in
PROSODY_CONFIG_PRESENT="false"
fi
JAAS_HOST_CONFIG="/etc/prosody/conf.avail/jaas.cfg.lua"
if [ "${JAAS_INPUT}" = "true" ] && [ ! -f $JAAS_HOST_CONFIG ]; then
sed -i "s/enabled = false -- Jitsi meet components/enabled = true -- Jitsi meet components/g" $PROSODY_HOST_CONFIG
PROSODY_CONFIG_PRESENT="false"
fi
# For those deployments that don't have the config in the jitsi-meet prosody config add the new jaas file
if [ ! -f $JAAS_HOST_CONFIG ] && ! grep -q "VirtualHost \"jigasi.meet.jitsi\"" $PROSODY_HOST_CONFIG; then
PROSODY_CONFIG_PRESENT="false"
cp /usr/share/jitsi-meet-prosody/jaas.cfg.lua $JAAS_HOST_CONFIG
sed -i "s/jitmeet.example.com/$JVB_HOSTNAME/g" $JAAS_HOST_CONFIG
fi
if [ "${JAAS_INPUT}" = "true" ]; then
JAAS_HOST_CONFIG_ENABLED="/etc/prosody/conf.d/jaas.cfg.lua "
if [ ! -f $JAAS_HOST_CONFIG_ENABLED ] && ! grep -q "VirtualHost \"jigasi.meet.jitsi\"" $PROSODY_HOST_CONFIG; then
if [ -f $JAAS_HOST_CONFIG ]; then
ln -s $JAAS_HOST_CONFIG $JAAS_HOST_CONFIG_ENABLED
PROSODY_CONFIG_PRESENT="false"
fi
fi
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@$JICOFO_AUTH_DOMAIN
@@ -178,32 +213,6 @@ case "$1" in
ln -sf /var/lib/prosody/$JVB_HOSTNAME.crt /etc/prosody/certs/$JVB_HOSTNAME.crt
fi
PRTRUNK_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-trunk' 2>/dev/null | awk '{print $3}' || true)"
PR10_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.10' 2>/dev/null | awk '{print $3}' || true)"
PR_VER_INSTALLED=$(dpkg-query -f='${Version}\n' --show prosody 2>/dev/null || true)
if [ "$PRTRUNK_INSTALL_CHECK" = "installed" ] \
|| [ "$PRTRUNK_INSTALL_CHECK" = "unpacked" ] ; then
if [ -f $PROSODY_HOST_CONFIG ]; then
sed -i 's/storage = \"memory\"/storage = \"null\"/g' $PROSODY_HOST_CONFIG
# trigger a restart
PROSODY_CONFIG_PRESENT="false"
fi
fi
if [ "$PR10_INSTALL_CHECK" = "installed" ] \
|| [ "$PR10_INSTALL_CHECK" = "unpacked" ] \
|| dpkg --compare-versions "$PR_VER_INSTALLED" gt "0.10" ; then
# if the version is 0.10.X (>0.10 and <0.11)
if [ -f $PROSODY_HOST_CONFIG ] \
&& dpkg --compare-versions "$PR_VER_INSTALLED" lt "0.11" ; then
sed -i 's/storage = \"memory\"/storage = \"none\"/g' $PROSODY_HOST_CONFIG
# trigger a restart
PROSODY_CONFIG_PRESENT="false"
fi
fi
CERT_ADDED_TO_TRUST="false"
if [ ! -f /var/lib/prosody/$JICOFO_AUTH_DOMAIN.crt ]; then

View File

@@ -35,6 +35,8 @@ case "$1" in
if [ -n "$RET" ]; then
rm -f /etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua
rm -f /etc/prosody/conf.d/$JVB_HOSTNAME.cfg.lua
rm -f /etc/prosody/conf.avail/jaas.cfg.lua
rm -f /etc/prosody/conf.d/jaas.cfg.lua
JICOFO_AUTH_DOMAIN="auth.$JVB_HOSTNAME"
# clean up generated certificates

View File

@@ -1,3 +1,2 @@
doc/debian/jitsi-meet-turn/turnserver.conf /usr/share/jitsi-meet-turnserver/
doc/debian/jitsi-meet/jitsi-meet.conf /usr/share/jitsi-meet-turnserver/
doc/debian/jitsi-meet-turn/coturn-certbot-deploy.sh /usr/share/jitsi-meet-turnserver/

View File

@@ -107,7 +107,9 @@ denied-peer-ip=240.0.0.0-255.255.255.255" >> $TURN_CONFIG
db_get jitsi-meet/cert-choice
CERT_CHOICE="$RET"
if [ "$CERT_CHOICE" = "I want to use my own certificate" ] ; then
UPLOADED_CERT_CHOICE="I want to use my own certificate"
LE_CERT_CHOICE="Let's Encrypt certificates"
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ]; then
db_get jitsi-meet/cert-path-key
CERT_KEY="$RET"
db_get jitsi-meet/cert-path-crt
@@ -120,22 +122,13 @@ denied-peer-ip=240.0.0.0-255.255.255.255" >> $TURN_CONFIG
CERT_CRT_ESC=$(echo $CERT_CRT | sed 's/\./\\\./g')
CERT_CRT_ESC=$(echo $CERT_CRT_ESC | sed 's/\//\\\//g')
sed -i "s/cert=\/etc\/jitsi\/meet\/.*crt/cert=$CERT_CRT_ESC/g" $TURN_CONFIG
elif [ "$CERT_CHOICE" = "$LE_CERT_CHOICE" ]; then
/usr/share/jitsi-meet/scripts/coturn-le-update.sh ${JVB_HOSTNAME}
fi
sed -i "s/#TURNSERVER_ENABLED/TURNSERVER_ENABLED/g" /etc/default/coturn
invoke-rc.d coturn restart || true
NGINX_STREAM_CONFIG="/etc/nginx/modules-enabled/60-jitsi-meet.conf"
if [ -f $NGINX_STREAM_CONFIG ] ; then
echo "------------------------------------------------"
echo ""
echo "You have multiplexing enabled, it is recommended to disable it and migrate to using websockets for the bridge channel."
echo "The support for sctp data channels is deprecated and will be dropped at some point."
echo "How to do it at: https://jitsi.org/multiplexing-to-bridge-ws-howto"
echo ""
echo "------------------------------------------------"
fi
# and we're done with debconf
db_stop
;;

View File

@@ -1,8 +0,0 @@
#!/bin/sh -e
# Source debconf library.
. /usr/share/debconf/confmodule
# certificate type choice
db_input critical jitsi-meet/cert-choice || true
db_go

View File

@@ -43,14 +43,6 @@ case "$1" in
rm -f /etc/jitsi/meet/$JVB_HOSTNAME_OLD-config.js
fi
JVB_SERVE="false"
# this detect only old installations
RET=""
db_get jitsi-meet/jvb-serve || true
if [ "$RET" = "true" ] ; then
JVB_SERVE="true"
fi
# stores the hostname so we will reuse it later, like in purge
db_set jitsi-meet/jvb-hostname $JVB_HOSTNAME
@@ -76,14 +68,23 @@ case "$1" in
FORCE_NGINX="false"
fi
db_subst jitsi-meet/jaas-choice domain "${JVB_HOSTNAME}"
db_input critical jitsi-meet/jaas-choice || true
db_go
db_get jitsi-meet/jaas-choice
JAAS_INPUT="$RET"
UPLOADED_CERT_CHOICE="I want to use my own certificate"
LE_CERT_CHOICE="Let's Encrypt certificates"
# if first time config ask for certs, or if we are reconfiguring
if [ -z "$JVB_HOSTNAME_OLD" ] || [ "$RECONFIGURING" = "true" ] ; then
RET=""
db_input critical jitsi-meet/cert-choice || true
db_go
db_get jitsi-meet/cert-choice
CERT_CHOICE="$RET"
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ]; then
RET=""
db_get jitsi-meet/cert-path-key
if [ -z "$RET" ] ; then
@@ -103,7 +104,7 @@ case "$1" in
fi
CERT_CRT="$RET"
else
# create self-signed certs
# create self-signed certs (we also need them for the case of LE so we can start nginx)
CERT_KEY="/etc/jitsi/meet/$JVB_HOSTNAME.key"
CERT_CRT="/etc/jitsi/meet/$JVB_HOSTNAME.crt"
HOST="$( (hostname -s; echo localhost) | head -n 1)"
@@ -116,6 +117,17 @@ case "$1" in
-extensions SAN \
-config <(cat /etc/ssl/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=DNS:localhost,DNS:$JVB_HOSTNAME"))
if [ "$CERT_CHOICE" = "$LE_CERT_CHOICE" ]; then
db_subst jitsi-meet/email domain "${JVB_HOSTNAME}"
db_input critical jitsi-meet/email || true
db_go
db_get jitsi-meet/email
EMAIL="$RET"
if [ ! -z "$EMAIL" ] ; then
ISSUE_LE_CERT="true"
fi
fi
fi
fi
@@ -130,51 +142,20 @@ case "$1" in
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $JITSI_MEET_CONFIG
fi
# getting rid of jetty serving web
if [[ "$JVB_SERVE" = "true" ]] ; then
JVB_CONFIG="/etc/jitsi/videobridge/sip-communicator.properties"
if [ "${JAAS_INPUT}" = "true" ] && ! grep -q "^var enableJaaS = true;$" $JITSI_MEET_CONFIG; then
if grep -q "^var enableJaaS = false;$" $JITSI_MEET_CONFIG; then
sed -i "s/^var enableJaaS = false;$/var enableJaaS = true;/g" $JITSI_MEET_CONFIG
else
# old config, let's add the lines at the end. Adding var enableJaaS to avoid adding it on update again
echo "var enableJaaS = true;" >> $JITSI_MEET_CONFIG
echo "config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids';" >> $JITSI_MEET_CONFIG
echo "config.dialInConfCodeUrl = 'https://conference-mapper.jitsi.net/v1/access';" >> $JITSI_MEET_CONFIG
# we will write to the file if missing create it
if [ -f $JVB_CONFIG ] ; then
echo ""
echo "------------------------------------------------"
echo ""
echo "You are using jetty to serve jitsi-meet, we are now upgrading you to use nginx!"
echo ""
echo "If you are using Lets Encrypt certificates please re-run the script."
echo ""
echo "------------------------------------------------"
echo ""
sed -i "s/org.jitsi.videobridge.rest.jetty/#org.jitsi.videobridge.rest.jetty/g" $JVB_CONFIG
sed -i "s/org.jitsi.videobridge.TCP_HARVESTER_PORT/#org.jitsi.videobridge.TCP_HARVESTER_PORT/g" $JVB_CONFIG
if [ -d /run/systemd/system ]; then
systemctl restart jitsi-videobridge2.service >/dev/null || true
fi
# Removing this value will force nginx or apache to be locally configured
JVB_HOSTNAME_OLD=""
RET=""
db_get jitsi-meet/cert-choice
CERT_CHOICE="$RET"
# Fix certs on upgrade from jetty
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
RET=""
db_get jitsi-meet/cert-path-key
CERT_KEY="$RET"
RET=""
db_get jitsi-meet/cert-path-crt
CERT_CRT="$RET"
else
# create self-signed certs
CERT_KEY="/etc/jitsi/meet/$JVB_HOSTNAME.key"
CERT_CRT="/etc/jitsi/meet/$JVB_HOSTNAME.crt"
# Sets roomPasswordNumberOfDigits only if there was not already set
if ! cat $JITSI_MEET_CONFIG | grep roomPasswordNumberOfDigits | grep -qv //; then
echo "config.roomPasswordNumberOfDigits = 10; // skip re-adding it (do not remove comment)" >> $JITSI_MEET_CONFIG
fi
fi
db_set jitsi-meet/jvb-serve "false"
fi
if [[ "$FORCE_NGINX" = "true" && ( -z "$JVB_HOSTNAME_OLD" || "$RECONFIGURING" = "true" ) ]] ; then
@@ -239,12 +220,38 @@ case "$1" in
invoke-rc.d apache2 reload || true
fi
echo "----------------"
if [ "$ISSUE_LE_CERT" = "true" ] ; then
/usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh $EMAIL $JVB_HOSTNAME
fi
echo ""
echo ""
echo " ;dOocd;"
echo " .dNMM0dKO."
echo " lNMMMKd0K,"
echo " .xMMMMNxkNc"
echo " dMMMMMkxXc"
echo " cNMMMNl.."
if [ "${JAAS_INPUT}" != "true" ]; then
echo " .kMMMX; Interested in adding telephony to your Jitsi meetings?"
echo " ;XMMMO'"
echo " lNMMWO' Sign up on https://jaas.8x8.vc/components?host=${JVB_HOSTNAME}"
echo " lNMMM0, and follow the guide in the dev console."
else
echo " .kMMMX;"
echo " ;XMMMO' Don't forget to sign up on"
echo " lNMMWO' https://jaas.8x8.vc/components?host=${JVB_HOSTNAME}"
echo " lNMMM0, in order to add telephony to your Jitsi meetings!"
fi
echo " lXMMMK:."
echo " ;KMMMNKd. 'oo,"
echo " 'xNMMMMXkkkkOKOl'"
echo " :0WMMMMMMNOkk0Kk,"
echo " .cdOWMMMMMWXOkOl"
echo " .;dKWMMMMMXc."
echo " .,:cll:'"
echo ""
echo "You can now switch to a Lets Encrypt certificate. To do so, execute:"
echo "/usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh"
echo ""
echo "----------------"
# and we're done with debconf
db_stop

View File

@@ -1,13 +1,16 @@
Template: jitsi-meet/cert-choice
Type: select
__Choices: Generate a new self-signed certificate (You will later get a chance to obtain a Let's encrypt certificate), I want to use my own certificate
__Choices: Generate a new self-signed certificate, Let's Encrypt certificates, I want to use my own certificate
_Description: SSL certificate for the Jitsi Meet instance
.
Jitsi Meet is best to be set up with an SSL certificate.
.
Having no certificate, a self-signed one will be generated.
By choosing self-signed you will later have a chance to install Lets Encrypt certificates.
Having a certificate signed by a recognised CA, it can be uploaded on the server
and point its location. The default filenames will be /etc/ssl/--domain.name--.key
for the key and /etc/ssl/--domain.name--.crt for the certificate.
In the case of using a self-signed certificate, only the web app will be available with some warnings, the mobile app will not connect.
Self-signed certificates are not supported by JaaS (Jitsi as a Service).
.
Having a certificate signed by a recognised CA, it can be uploaded on the server and point its location.
The default filenames will be /etc/ssl/--domain.name--.key for the key and /etc/ssl/--domain.name--.crt for the certificate.
Template: jitsi-meet/cert-path-key
Type: string
@@ -30,3 +33,21 @@ Template: jitsi-videobridge/jvb-hostname
Type: string
_Description: Hostname:
The Jitsi Meet web config package needs the DNS hostname of your instance.
Template: jitsi-meet/jaas-choice
Type: boolean
_Description: Interested in adding telephony to your Jitsi meetings?
You can easily add dialing in support to your meetings using JaaS (Jitsi as a Service).
You need to:
- have a certificate signed by a recognised CA or Lets Encrypt on your deployment
- sign in for JaaS at https://jaas.8x8.vc/components?host=${domain}
Template: jitsi-meet/email
Type: string
_Description: Enter your email:
To successfully issue Let's Encrypt certificates:
.
You need a working DNS record pointing to this machine(for hostname ${domain})"
.
You need to agree to the ACME server's Subscriber Agreement (https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf)
by providing an email address for important account notifications

View File

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

View File

@@ -20,7 +20,7 @@ msgstr ""
#. Type: select
#. Choices
#: ../jitsi-meet-web-config.templates:1001
msgid "Generate a new self-signed certificate (You will later get a chance to obtain a Let's encrypt certificate)"
msgid "Generate a new self-signed certificate"
msgstr ""
#. Type: select

View File

@@ -0,0 +1,12 @@
-- Enables dial-in for Jitsi meet components customers
VirtualHost "jigasi.meet.jitsi"
modules_enabled = {
"ping";
"bosh";
"muc_password_check";
}
authentication = "token"
app_id = "jitsi";
asap_key_server = "https://jaas-public-keys.jitsi.net/jitsi-components/prod-8x8"
asap_accepted_issuers = { "jaas-components" }
asap_accepted_audiences = { "jigasi.jitmeet.example.com" }

View File

@@ -52,6 +52,7 @@ VirtualHost "jitmeet.example.com"
av_moderation_component = "avmoderation.jitmeet.example.com"
speakerstats_component = "speakerstats.jitmeet.example.com"
conference_duration_component = "conferenceduration.jitmeet.example.com"
end_conference_component = "endconference.jitmeet.example.com"
-- we need bosh
modules_enabled = {
"bosh";
@@ -60,6 +61,7 @@ VirtualHost "jitmeet.example.com"
"speakerstats";
"external_services";
"conference_duration";
"end_conference";
"muc_lobby_rooms";
"muc_breakout_rooms";
"av_moderation";
@@ -123,6 +125,9 @@ Component "speakerstats.jitmeet.example.com" "speakerstats_component"
Component "conferenceduration.jitmeet.example.com" "conference_duration_component"
muc_component = "conference.jitmeet.example.com"
Component "endconference.jitmeet.example.com" "end_conference"
muc_component = "conference.jitmeet.example.com"
Component "avmoderation.jitmeet.example.com" "av_moderation_component"
muc_component = "conference.jitmeet.example.com"
@@ -135,19 +140,3 @@ Component "lobby.jitmeet.example.com" "muc"
"muc_rate_limit";
"polls";
}
-- Enables dial-in for Jitsi meet components customers
-- Note: make sure you have the following packages installed: lua-basexx, liblua5.3-dev, libssl-dev, luarocks
-- and execute $ sudo luarocks install luajwtjitsi 3.0-0
VirtualHost "jigasi.meet.jitsi"
enabled = false -- Jitsi meet components customers remove this line
modules_enabled = {
"ping";
"bosh";
"muc_password_check";
}
authentication = "token"
app_id = "jitsi";
asap_key_server = "https://jaas-public-keys.jitsi.net/jitsi-components/prod-8x8"
asap_accepted_issuers = { "jaas-components" }
asap_accepted_audiences = { "jigasi.jitmeet.example.com" }

View File

@@ -1,45 +0,0 @@
#!/bin/sh
set -e
COTURN_CERT_DIR="/etc/coturn/certs"
TURN_CONFIG="/etc/turnserver.conf"
# create a directory to store certs if it does not exists
if [ ! -d "$COTURN_CERT_DIR" ]; then
mkdir -p $COTURN_CERT_DIR
chown -R turnserver:turnserver /etc/coturn/
chmod -R 700 /etc/coturn/
fi
# This is a template and when copied to /etc/letsencrypt/renewal-hooks/deploy/
# during creating the Let's encrypt certs script
# jitsi-meet.example.com will be replaced with the real domain of deployment
for domain in $RENEWED_DOMAINS; do
case $domain in
jitsi-meet.example.com)
# Make sure the certificate and private key files are
# never world readable, even just for an instant while
# we're copying them into daemon_cert_root.
umask 077
cp "$RENEWED_LINEAGE/fullchain.pem" "$COTURN_CERT_DIR/$domain.fullchain.pem"
cp "$RENEWED_LINEAGE/privkey.pem" "$COTURN_CERT_DIR/$domain.privkey.pem"
# Apply the proper file ownership and permissions for
# the daemon to read its certificate and key.
chown turnserver "$COTURN_CERT_DIR/$domain.fullchain.pem" \
"$COTURN_CERT_DIR/$domain.privkey.pem"
chmod 400 "$COTURN_CERT_DIR/$domain.fullchain.pem" \
"$COTURN_CERT_DIR/$domain.privkey.pem"
if [ -f $TURN_CONFIG ] && grep -q "jitsi-meet coturn config" "$TURN_CONFIG" ; then
echo "Configuring turnserver"
sed -i "/^cert/c\cert=\/etc\/coturn\/certs\/${domain}.fullchain.pem" $TURN_CONFIG
sed -i "/^pkey/c\pkey=\/etc\/coturn\/certs\/${domain}.privkey.pem" $TURN_CONFIG
fi
service coturn restart
;;
esac
done

View File

@@ -16,6 +16,8 @@ no-tlsv1
no-tlsv1_1
# https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
cipher-list=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
# without it there are errors when running on Ubuntu 20.04
dh2066
# jitsi-meet coturn relay disable config. Do not modify this line
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255

View File

@@ -67,7 +67,6 @@
"utils.js",
"do_external_connect.js",
"interface_config.js",
"logging_config.js",
"lib-jitsi-meet.min.js",
"app.bundle.min.js",
"all.css"
@@ -185,7 +184,6 @@
<!--#include virtual="connection_optimization/connection_optimization.html" -->
<script src="libs/do_external_connect.min.js?v=1"></script>
<script><!--#include virtual="/interface_config.js" --></script>
<script><!--#include virtual="/logging_config.js" --></script>
<script src="libs/lib-jitsi-meet.min.js?v=139"></script>
<script src="libs/app.bundle.min.js?v=139"></script>
<!--#include virtual="title.html" -->

View File

@@ -27,7 +27,6 @@ var interfaceConfig = {
CLOSE_PAGE_GUEST_HINT: false, // A html text to be shown to guests on the close page, false disables it
DEFAULT_BACKGROUND: '#040404',
DEFAULT_LOGO_URL: 'images/watermark.svg',
DEFAULT_WELCOME_PAGE_LOGO_URL: 'images/watermark.svg',
DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
@@ -241,6 +240,9 @@ var interfaceConfig = {
// Please use defaultLocalDisplayName from config.js
// DEFAULT_LOCAL_DISPLAY_NAME: 'me',
// Please use defaultLogoUrl from config.js
// DEFAULT_LOGO_URL: 'images/watermark.svg',
// Please use defaultRemoteDisplayName from config.js
// DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',

View File

@@ -29,6 +29,14 @@ target 'JitsiMeetSDK' do
:app_path => "#{Pod::Config.instance.installation_root}/.."
)
# We use auto linking, but some dependencies are excluded from the lite build
# (see react-native.config.js) so we add them here.
pod 'giphy-react-native-sdk', :path => '../node_modules/@giphy/react-native-sdk'
pod 'RNCalendarEvents', :path => '../node_modules/react-native-calendar-events'
pod 'RNGoogleSignin', :path => '../node_modules/@react-native-google-signin/google-signin'
pod 'RNWatch', :path => '../node_modules/react-native-watch-connectivity'
# Native pod dependencies
#
@@ -36,6 +44,30 @@ target 'JitsiMeetSDK' do
pod 'ObjectiveDropboxOfficial', '6.2.3'
end
target 'JitsiMeetSDKLite' do
project 'sdk/sdk.xcodeproj'
# This is a more lightweight target, which removes some functionality.
# Check the react-native.config.js for the list of excluded packages.
# React Native and its dependencies
#
config = use_native_modules!
use_react_native!(
:path => config["reactNativePath"],
:hermes_enabled => false,
:fabric_enabled => false,
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/.."
)
# Native pod dependencies
#
pod 'CocoaLumberjack', '3.7.2'
end
post_install do |installer|
react_native_post_install(installer)
__apply_Xcode_12_5_M1_post_install_workaround(installer)

View File

@@ -149,6 +149,8 @@ PODS:
- nanopb/encode (2.30908.0)
- ObjectiveDropboxOfficial (6.2.3)
- PromisesObjC (2.1.1)
- PromisesSwift (2.1.1):
- PromisesObjC (= 2.1.1)
- RCT-Folly (2021.06.28.00-v2):
- boost
- DoubleConversion
@@ -374,10 +376,11 @@ PODS:
- React-Core
- react-native-splash-screen (3.3.0):
- React-Core
- react-native-video (5.2.0):
- react-native-video (6.0.0-alpha.1):
- React-Core
- react-native-video/Video (= 5.2.0)
- react-native-video/Video (5.2.0):
- react-native-video/Video (= 6.0.0-alpha.1)
- react-native-video/Video (6.0.0-alpha.1):
- PromisesSwift
- React-Core
- react-native-webrtc (1.100.1):
- React-Core
@@ -473,8 +476,8 @@ PODS:
- RNSound/Core (= 0.11.1)
- RNSound/Core (0.11.1):
- React-Core
- RNSVG (12.1.0):
- React
- RNSVG (12.4.3):
- React-Core
- RNWatch (1.0.11):
- React
- Yoga (1.14.0)
@@ -569,6 +572,7 @@ SPEC REPOS:
- nanopb
- ObjectiveDropboxOfficial
- PromisesObjC
- PromisesSwift
EXTERNAL SOURCES:
amplitude-react-native:
@@ -716,6 +720,7 @@ SPEC CHECKSUMS:
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
PromisesSwift: 99fddfe4a0ec88a56486644c0da106694c92a604
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
RCTRequired: 00581111c53531e39e3c6346ef0d2c0cf52a5a37
RCTTypeSafety: 07e03ee7800e7dd65cba8e52ad0c2edb06c96604
@@ -738,7 +743,7 @@ SPEC CHECKSUMS:
react-native-safe-area-context: 584dc04881deb49474363f3be89e4ca0e854c057
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
react-native-video: a4c2635d0802f983594b7057e1bce8f442f0ad28
react-native-video: bb6f12a7198db53b261fefb5d609dc77417acc8b
react-native-webrtc: 206a0ac12a5633d2ec4605174d7c9f12f0d674b2
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
React-perflogger: 30ab8d6db10e175626069e742eead3ebe8f24fd5
@@ -763,10 +768,10 @@ SPEC CHECKSUMS:
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
RNScreens: 40a2cb40a02a609938137a1e0acfbf8fc9eebf19
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
RNSVG: f3b60aeeaa81960e2e0536c3a9eef50b667ef3a9
RNWatch: dae6c858a2051dbdcfb00b9a86cf4d90400263b4
Yoga: 17cd9a50243093b547c1e539c749928dd68152da
PODFILE CHECKSUM: 0e8826a5cb9ee147354a83321ecb3104132f510b
PODFILE CHECKSUM: a437875b597d999a137c671b1da54153fe31d23f
COCOAPODS: 1.11.3

View File

@@ -8,13 +8,11 @@
<string>applinks:beta.meet.jit.si</string>
<string>applinks:meet.jit.si</string>
</array>
<key>com.apple.developer.siri</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.org.jitsi.meet.appgroup</string>
</array>
<key>com.apple.developer.siri</key>
<true/>
<key>com.apple.developer.avfoundation.multitasking-camera-access</key>
<true/>
</dict>
</plist>

View File

@@ -369,6 +369,7 @@
DEF4813D224925A2002AD03A /* Copy Google Plist file */,
DE11877A21EE09640078D059 /* Setup Google reverse URL handler */,
DE4F6D6E22005C0400DE699E /* Setup Dropbox */,
4E81688528A408E600F8FA9E /* Update App Entitlements */,
0BEA5C491F7B8F73000D0AB4 /* Embed Watch Content */,
4EC49B9025BED71300E76218 /* Embed App Extensions */,
);
@@ -522,6 +523,24 @@
shellPath = /bin/sh;
shellScript = "../scripts/run-packager.sh\n";
};
4E81688528A408E600F8FA9E /* Update App Entitlements */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Update App Entitlements";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if test \"$PRODUCT_BUNDLE_IDENTIFIER\" = \"com.atlassian.JitsiMeet.ios\"; then\n ENTITLEMENTS_PLIST=\"$PROJECT_DIR/app.entitlements\"\n \n /usr/libexec/PlistBuddy -c \"Add :com.apple.developer.avfoundation.multitasking-camera-access bool 1\" $ENTITLEMENTS_PLIST\nfi\n";
};
69BC5020DBE393B56BD76636 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;

View File

@@ -107,7 +107,7 @@ extension SocketConnection: StreamDelegate {
streamHasSpaceAvailable?()
}
case .errorOccurred:
print("client stream error occured: \(String(describing: aStream.streamError))")
print("client stream error occurred: \(String(describing: aStream.streamError))")
close()
notifyDidClose(error: aStream.streamError)

75
ios/scripts/release-sdk-lite.sh Executable file
View File

@@ -0,0 +1,75 @@
#!/bin/bash
set -e -u
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
PROJECT_REPO=$(realpath ${THIS_DIR}/../..)
RELEASE_REPO=$(realpath ${THIS_DIR}/../../../jitsi-meet-ios-sdk-releases)
DEFAULT_SDK_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${THIS_DIR}/../sdk/src/Lite-Info.plist)
SDK_VERSION=${OVERRIDE_SDK_VERSION:-${DEFAULT_SDK_VERSION}}
DO_GIT_TAG=${GIT_TAG:-0}
echo "Releasing Jitsi Meet SDK Lite ${SDK_VERSION}"
pushd ${RELEASE_REPO}
# Generate podspec file
cat JitsiMeetSDKLite.podspec.tpl | sed -e s/VERSION/${SDK_VERSION}-lite/g > JitsiMeetSDKLite.podspec
# Cleanup
rm -rf lite/Frameworks/*
popd
# Build the SDK
pushd ${PROJECT_REPO}
rm -rf ios/sdk/out
xcodebuild clean \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeetSDKLite
xcodebuild archive \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeetSDKLite \
-configuration Release \
-sdk iphonesimulator \
-destination='generic/platform=iOS Simulator' \
-archivePath ios/sdk/out/ios-simulator \
ENABLE_BITCODE=NO \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild archive \
-workspace ios/jitsi-meet.xcworkspace \
-scheme JitsiMeetSDKLite \
-configuration Release \
-sdk iphoneos \
-destination='generic/platform=iOS' \
-archivePath ios/sdk/out/ios-device \
ENABLE_BITCODE=NO \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework \
-framework ios/sdk/out/ios-device.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-framework ios/sdk/out/ios-simulator.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-output ios/sdk/out/JitsiMeetSDK.xcframework
if [[ $DO_GIT_TAG == 1 ]]; then
git tag ios-sdk-lite-${SDK_VERSION}
fi
popd
pushd ${RELEASE_REPO}
# Put the new files in the repo
cp -a ${PROJECT_REPO}/ios/sdk/out/JitsiMeetSDK.xcframework lite/Frameworks/
# Add all files to git
if [[ $DO_GIT_TAG == 1 ]]; then
git add -A .
git commit -m "${SDK_VERSION} lite"
git tag "${SDK_VERSION}-lite"
fi
popd
echo "Finished! Don't forget to push the tags and releases repo artifacts."
echo "The new pod can be pushed to CocoaPods by doing: pod trunk push JitsiMeetSDKLite.podspec"

View File

@@ -22,6 +22,17 @@
0BCA49601EC4B6C600B793EE /* POSIX.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495D1EC4B6C600B793EE /* POSIX.m */; };
0BCA49611EC4B6C600B793EE /* Proximity.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495E1EC4B6C600B793EE /* Proximity.m */; };
0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */; settings = {ATTRIBUTES = (Public, ); }; };
3453F4A32680898C4A40E821 /* libPods-JitsiMeetSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 927ED7DF018DE5E12C4C3404 /* libPods-JitsiMeetSDK.a */; };
4E0EF63028CA2FB3005D1B03 /* JMCallKitEmitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0EF62E28CA2FB3005D1B03 /* JMCallKitEmitter.h */; };
4E0EF63128CA2FB3005D1B03 /* JMCallKitEmitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0EF62E28CA2FB3005D1B03 /* JMCallKitEmitter.h */; };
4E0EF63228CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0EF62F28CA2FB3005D1B03 /* JMCallKitEmitter.m */; };
4E0EF63328CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0EF62F28CA2FB3005D1B03 /* JMCallKitEmitter.m */; };
4E0EF63528CA317E005D1B03 /* JMCallKitListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0EF63428CA317E005D1B03 /* JMCallKitListener.h */; settings = {ATTRIBUTES = (Public, ); }; };
4E0EF63628CA317E005D1B03 /* JMCallKitListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0EF63428CA317E005D1B03 /* JMCallKitListener.h */; settings = {ATTRIBUTES = (Public, ); }; };
4E0EF63928CA4069005D1B03 /* JMCallKitProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0EF63728CA4069005D1B03 /* JMCallKitProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };
4E0EF63A28CA4069005D1B03 /* JMCallKitProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0EF63728CA4069005D1B03 /* JMCallKitProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };
4E0EF63B28CA4069005D1B03 /* JMCallKitProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */; };
4E0EF63C28CA4069005D1B03 /* JMCallKitProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */; };
4E51B76425E5345E0038575A /* ScheenshareEventEmiter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */; };
4E51B76525E5345E0038575A /* ScheenshareEventEmiter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */; };
4EBA6E61286072E300B31882 /* JitsiMeetViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EBA6E5F286072E300B31882 /* JitsiMeetViewController.h */; };
@@ -32,13 +43,11 @@
4ED4FFF42721B9B90074E620 /* JitsiAudioSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */; };
4EEC9630286C73A2008705FA /* JitsiMeetView+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EEC962E286C73A2008705FA /* JitsiMeetView+Private.h */; };
4EEC9631286C73A2008705FA /* JitsiMeetView+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EEC962F286C73A2008705FA /* JitsiMeetView+Private.m */; };
6F08DF7D4458EE3CF3F36F6D /* libPods-JitsiMeetSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4376CA6886DE68FD7A4294B /* libPods-JitsiMeetSDK.a */; };
6F08DF7D4458EE3CF3F36F6D /* (null) in Frameworks */ = {isa = PBXBuildFile; };
9A8EE79C77C17743BB66E8BD /* libPods-JitsiMeetSDKLite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B46497DE9A95BDF5E312AF48 /* libPods-JitsiMeetSDKLite.a */; };
A4A934E9212F3ADB001E9388 /* Dropbox.m in Sources */ = {isa = PBXBuildFile; fileRef = A4A934E8212F3ADB001E9388 /* Dropbox.m */; };
C6245F5D2053091D0040BE68 /* image-resize@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5B2053091D0040BE68 /* image-resize@2x.png */; };
C6245F5E2053091D0040BE68 /* image-resize@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5C2053091D0040BE68 /* image-resize@3x.png */; };
C69EFA0C209A0F660027712B /* JMCallKitEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69EFA09209A0F650027712B /* JMCallKitEmitter.swift */; };
C69EFA0D209A0F660027712B /* JMCallKitProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69EFA0A209A0F660027712B /* JMCallKitProxy.swift */; };
C69EFA0E209A0F660027712B /* JMCallKitListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69EFA0B209A0F660027712B /* JMCallKitListener.swift */; };
C6A34261204EF76800E062DD /* DragGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6A3425E204EF76800E062DD /* DragGestureController.swift */; };
C6CC49AF207412CF000DFA42 /* PiPViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6CC49AE207412CF000DFA42 /* PiPViewCoordinator.swift */; };
C81E9AB925AC5AD800B134D9 /* ExternalAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = C81E9AB825AC5AD800B134D9 /* ExternalAPI.h */; };
@@ -54,6 +63,55 @@
DE81A2D92316AC7600AE1940 /* LogBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2D72316AC7600AE1940 /* LogBridge.m */; };
DE81A2DE2317ED5400AE1940 /* JitsiMeetBaseLogHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = DE81A2DC2317ED5400AE1940 /* JitsiMeetBaseLogHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE81A2DF2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2DD2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m */; };
DE9A0130289A9A9A00E41CBB /* JitsiMeetUserInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = DE762DB322AFDE76000DEBD6 /* JitsiMeetUserInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0131289A9A9A00E41CBB /* JitsiMeetView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B412F161EDEC65D00B1A0A6 /* JitsiMeetView.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0132289A9A9A00E41CBB /* RCTBridgeWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B93EF7C1EC9DDCD0030D24D /* RCTBridgeWrapper.h */; };
DE9A0133289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = DE81A2DC2317ED5400AE1940 /* JitsiMeetBaseLogHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0134289A9A9A00E41CBB /* JitsiMeetSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = DEA9F283258A5D9900D4CD74 /* JitsiMeetSDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0135289A9A9A00E41CBB /* ScheenshareEventEmiter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */; };
DE9A0136289A9A9A00E41CBB /* JitsiMeetBaseLogHandler+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DE65AACB2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h */; };
DE9A0137289A9A9A00E41CBB /* JitsiMeetRenderingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EBA6E632860B1E800B31882 /* JitsiMeetRenderingView.h */; };
DE9A0138289A9A9A00E41CBB /* JitsiMeetViewDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B412F1B1EDEC80100B1A0A6 /* JitsiMeetViewDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0139289A9A9A00E41CBB /* JitsiAudioSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ED4FFF12721B9B90074E620 /* JitsiAudioSession.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A013A289A9A9A00E41CBB /* JitsiMeetView+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EEC962E286C73A2008705FA /* JitsiMeetView+Private.h */; };
DE9A013B289A9A9A00E41CBB /* JitsiMeet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A013C289A9A9A00E41CBB /* JitsiMeetLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = DE81A2D22316AC4D00AE1940 /* JitsiMeetLogger.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A013D289A9A9A00E41CBB /* LogUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = DE65AAC92317FFCD00290BEC /* LogUtils.h */; };
DE9A013E289A9A9A00E41CBB /* JitsiMeetViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EBA6E5F286072E300B31882 /* JitsiMeetViewController.h */; };
DE9A013F289A9A9A00E41CBB /* JitsiMeetConferenceOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = DEAD3224220C497000E93636 /* JitsiMeetConferenceOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0140289A9A9A00E41CBB /* ExternalAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = C81E9AB825AC5AD800B134D9 /* ExternalAPI.h */; };
DE9A0141289A9A9A00E41CBB /* InfoPlistUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C8AFD27D2462C613000293D2 /* InfoPlistUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
DE9A0143289A9A9A00E41CBB /* CallKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BB9AD7A1F5EC8F4001C08DB /* CallKit.m */; };
DE9A0144289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2DD2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m */; };
DE9A0145289A9A9A00E41CBB /* JitsiMeetRenderingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EBA6E642860B1E800B31882 /* JitsiMeetRenderingView.m */; };
DE9A0146289A9A9A00E41CBB /* JitsiAudioSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED4FFF22721B9B90074E620 /* JitsiAudioSession.m */; };
DE9A0147289A9A9A00E41CBB /* AppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BB9AD7C1F60356D001C08DB /* AppInfo.m */; };
DE9A0148289A9A9A00E41CBB /* LogBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2D72316AC7600AE1940 /* LogBridge.m */; };
DE9A0149289A9A9A00E41CBB /* RNRootView.m in Sources */ = {isa = PBXBuildFile; fileRef = DEAFA778229EAD520033A7FA /* RNRootView.m */; };
DE9A014A289A9A9A00E41CBB /* JitsiMeetUserInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = DE762DB522AFDE8D000DEBD6 /* JitsiMeetUserInfo.m */; };
DE9A014B289A9A9A00E41CBB /* JitsiMeetConferenceOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = DEAD3225220C497000E93636 /* JitsiMeetConferenceOptions.m */; };
DE9A014C289A9A9A00E41CBB /* RCTBridgeWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B93EF7D1EC9DDCD0030D24D /* RCTBridgeWrapper.m */; };
DE9A014D289A9A9A00E41CBB /* ExternalAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BA13D301EE83FF8007BEF7F /* ExternalAPI.m */; };
DE9A014E289A9A9A00E41CBB /* POSIX.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495D1EC4B6C600B793EE /* POSIX.m */; };
DE9A014F289A9A9A00E41CBB /* InfoPlistUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C8AFD27E2462C613000293D2 /* InfoPlistUtil.m */; };
DE9A0150289A9A9A00E41CBB /* PiPViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6CC49AE207412CF000DFA42 /* PiPViewCoordinator.swift */; };
DE9A0151289A9A9A00E41CBB /* LocaleDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = DEFC743D21B178FA00E4DD96 /* LocaleDetector.m */; };
DE9A0152289A9A9A00E41CBB /* AudioMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495C1EC4B6C600B793EE /* AudioMode.m */; };
DE9A0153289A9A9A00E41CBB /* Proximity.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495E1EC4B6C600B793EE /* Proximity.m */; };
DE9A0155289A9A9A00E41CBB /* ReactUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DEFE535521FB2E8300011A3A /* ReactUtils.m */; };
DE9A0156289A9A9A00E41CBB /* JitsiMeetView+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EEC962F286C73A2008705FA /* JitsiMeetView+Private.m */; };
DE9A0157289A9A9A00E41CBB /* DragGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6A3425E204EF76800E062DD /* DragGestureController.swift */; };
DE9A0158289A9A9A00E41CBB /* ScheenshareEventEmiter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */; };
DE9A015A289A9A9A00E41CBB /* JitsiMeetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EBA6E60286072E300B31882 /* JitsiMeetViewController.m */; };
DE9A015C289A9A9A00E41CBB /* JitsiMeetLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = DE81A2D32316AC4D00AE1940 /* JitsiMeetLogger.m */; };
DE9A015E289A9A9A00E41CBB /* JitsiMeetView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B412F171EDEC65D00B1A0A6 /* JitsiMeetView.m */; };
DE9A015F289A9A9A00E41CBB /* JitsiMeet.m in Sources */ = {isa = PBXBuildFile; fileRef = DEFE535321FB1BF800011A3A /* JitsiMeet.m */; };
DE9A0160289A9A9A00E41CBB /* JavaScriptSandbox.m in Sources */ = {isa = PBXBuildFile; fileRef = DE438CD82350934700DD541D /* JavaScriptSandbox.m */; };
DE9A0162289A9A9A00E41CBB /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BB9AD781F5EC6D7001C08DB /* Intents.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
DE9A0163289A9A9A00E41CBB /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BB9AD761F5EC6CE001C08DB /* CallKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
DE9A0166289A9A9A00E41CBB /* CallKitIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0BC4B8681F8C01E100CE8B21 /* CallKitIcon.png */; };
DE9A0167289A9A9A00E41CBB /* image-resize@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5B2053091D0040BE68 /* image-resize@2x.png */; };
DE9A0168289A9A9A00E41CBB /* image-resize@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6245F5C2053091D0040BE68 /* image-resize@3x.png */; };
DEA9F284258A5D9900D4CD74 /* JitsiMeetSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = DEA9F283258A5D9900D4CD74 /* JitsiMeetSDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
DEAD3226220C497000E93636 /* JitsiMeetConferenceOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = DEAD3224220C497000E93636 /* JitsiMeetConferenceOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
DEAD3227220C497000E93636 /* JitsiMeetConferenceOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = DEAD3225220C497000E93636 /* JitsiMeetConferenceOptions.m */; };
@@ -83,6 +141,11 @@
0BD906E51EC0C00300C8C18E /* JitsiMeetSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JitsiMeetSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0BD906E81EC0C00300C8C18E /* JitsiMeet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeet.h; sourceTree = "<group>"; };
0BD906E91EC0C00300C8C18E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4E0EF62E28CA2FB3005D1B03 /* JMCallKitEmitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JMCallKitEmitter.h; sourceTree = "<group>"; };
4E0EF62F28CA2FB3005D1B03 /* JMCallKitEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JMCallKitEmitter.m; sourceTree = "<group>"; };
4E0EF63428CA317E005D1B03 /* JMCallKitListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JMCallKitListener.h; sourceTree = "<group>"; };
4E0EF63728CA4069005D1B03 /* JMCallKitProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JMCallKitProxy.h; sourceTree = "<group>"; };
4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JMCallKitProxy.m; sourceTree = "<group>"; };
4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScheenshareEventEmiter.h; sourceTree = "<group>"; };
4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScheenshareEventEmiter.m; sourceTree = "<group>"; };
4EBA6E5F286072E300B31882 /* JitsiMeetViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeetViewController.h; sourceTree = "<group>"; };
@@ -94,16 +157,17 @@
4ED4FFF52721BAE10074E620 /* JitsiAudioSession+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JitsiAudioSession+Private.h"; sourceTree = "<group>"; };
4EEC962E286C73A2008705FA /* JitsiMeetView+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JitsiMeetView+Private.h"; sourceTree = "<group>"; };
4EEC962F286C73A2008705FA /* JitsiMeetView+Private.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "JitsiMeetView+Private.m"; sourceTree = "<group>"; };
86389F55993FAAF6AEB3FA3E /* Pods-JitsiMeetSDKLite.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeetSDKLite.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite.release.xcconfig"; sourceTree = "<group>"; };
891FE43DAD30BC8976683100 /* Pods-JitsiMeetSDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeetSDK.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK.release.xcconfig"; sourceTree = "<group>"; };
8F48C340DE0D91D1012976C5 /* Pods-JitsiMeetSDKLite.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeetSDKLite.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite.debug.xcconfig"; sourceTree = "<group>"; };
927ED7DF018DE5E12C4C3404 /* libPods-JitsiMeetSDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JitsiMeetSDK.a"; sourceTree = BUILT_PRODUCTS_DIR; };
98E09B5C73D9036B4ED252FC /* 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>"; };
9C77CA3CC919B081F1A52982 /* Pods-JitsiMeet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.release.xcconfig"; path = "../Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.release.xcconfig"; sourceTree = "<group>"; };
A4A934E8212F3ADB001E9388 /* Dropbox.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Dropbox.m; sourceTree = "<group>"; };
A4A934EB21349A06001E9388 /* Dropbox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Dropbox.h; sourceTree = "<group>"; };
B46497DE9A95BDF5E312AF48 /* libPods-JitsiMeetSDKLite.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JitsiMeetSDKLite.a"; sourceTree = BUILT_PRODUCTS_DIR; };
C6245F5B2053091D0040BE68 /* image-resize@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "image-resize@2x.png"; path = "src/picture-in-picture/image-resize@2x.png"; sourceTree = "<group>"; };
C6245F5C2053091D0040BE68 /* image-resize@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "image-resize@3x.png"; path = "src/picture-in-picture/image-resize@3x.png"; sourceTree = "<group>"; };
C69EFA09209A0F650027712B /* JMCallKitEmitter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JMCallKitEmitter.swift; sourceTree = "<group>"; };
C69EFA0A209A0F660027712B /* JMCallKitProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JMCallKitProxy.swift; sourceTree = "<group>"; };
C69EFA0B209A0F660027712B /* JMCallKitListener.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JMCallKitListener.swift; sourceTree = "<group>"; };
C6A3425E204EF76800E062DD /* DragGestureController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DragGestureController.swift; sourceTree = "<group>"; };
C6CC49AE207412CF000DFA42 /* PiPViewCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PiPViewCoordinator.swift; sourceTree = "<group>"; };
C81E9AB825AC5AD800B134D9 /* ExternalAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExternalAPI.h; sourceTree = "<group>"; };
@@ -120,6 +184,8 @@
DE81A2D72316AC7600AE1940 /* LogBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LogBridge.m; sourceTree = "<group>"; };
DE81A2DC2317ED5400AE1940 /* JitsiMeetBaseLogHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeetBaseLogHandler.h; sourceTree = "<group>"; };
DE81A2DD2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JitsiMeetBaseLogHandler.m; sourceTree = "<group>"; };
DE9A016F289A9A9A00E41CBB /* JitsiMeetSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JitsiMeetSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DE9A0170289A9A9A00E41CBB /* Lite-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Lite-Info.plist"; path = "/Users/saghul/work/jitsi/jitsi-meet-prs/ios/sdk/src/Lite-Info.plist"; sourceTree = "<absolute>"; };
DEA9F283258A5D9900D4CD74 /* JitsiMeetSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeetSDK.h; sourceTree = "<group>"; };
DEAD3224220C497000E93636 /* JitsiMeetConferenceOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeetConferenceOptions.h; sourceTree = "<group>"; };
DEAD3225220C497000E93636 /* JitsiMeetConferenceOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JitsiMeetConferenceOptions.m; sourceTree = "<group>"; };
@@ -131,7 +197,6 @@
DEFE535521FB2E8300011A3A /* ReactUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ReactUtils.m; sourceTree = "<group>"; };
DEFE535721FB2E9E00011A3A /* ReactUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReactUtils.h; sourceTree = "<group>"; };
DEFE535821FB311F00011A3A /* JitsiMeet+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JitsiMeet+Private.h"; sourceTree = "<group>"; };
E4376CA6886DE68FD7A4294B /* libPods-JitsiMeetSDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JitsiMeetSDK.a"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -141,7 +206,18 @@
files = (
0BB9AD791F5EC6D7001C08DB /* Intents.framework in Frameworks */,
0BB9AD771F5EC6CE001C08DB /* CallKit.framework in Frameworks */,
6F08DF7D4458EE3CF3F36F6D /* libPods-JitsiMeetSDK.a in Frameworks */,
6F08DF7D4458EE3CF3F36F6D /* (null) in Frameworks */,
3453F4A32680898C4A40E821 /* libPods-JitsiMeetSDK.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DE9A0161289A9A9A00E41CBB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DE9A0162289A9A9A00E41CBB /* Intents.framework in Frameworks */,
DE9A0163289A9A9A00E41CBB /* CallKit.framework in Frameworks */,
9A8EE79C77C17743BB66E8BD /* libPods-JitsiMeetSDKLite.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -173,6 +249,7 @@
isa = PBXGroup;
children = (
0BD906E51EC0C00300C8C18E /* JitsiMeetSDK.framework */,
DE9A016F289A9A9A00E41CBB /* JitsiMeetSDK.framework */,
);
name = Products;
sourceTree = "<group>";
@@ -231,6 +308,7 @@
0BA13D301EE83FF8007BEF7F /* ExternalAPI.m */,
4E51B76225E5345E0038575A /* ScheenshareEventEmiter.h */,
4E51B76325E5345E0038575A /* ScheenshareEventEmiter.m */,
DE9A0170289A9A9A00E41CBB /* Lite-Info.plist */,
);
path = src;
sourceTree = "<group>";
@@ -241,7 +319,8 @@
0BB9AD761F5EC6CE001C08DB /* CallKit.framework */,
0B93EF7A1EC608550030D24D /* CoreText.framework */,
0BB9AD781F5EC6D7001C08DB /* Intents.framework */,
E4376CA6886DE68FD7A4294B /* libPods-JitsiMeetSDK.a */,
B46497DE9A95BDF5E312AF48 /* libPods-JitsiMeetSDKLite.a */,
927ED7DF018DE5E12C4C3404 /* libPods-JitsiMeetSDK.a */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -262,6 +341,8 @@
9C77CA3CC919B081F1A52982 /* Pods-JitsiMeet.release.xcconfig */,
09A78016288AF50ACD28A10D /* Pods-JitsiMeetSDK.debug.xcconfig */,
891FE43DAD30BC8976683100 /* Pods-JitsiMeetSDK.release.xcconfig */,
8F48C340DE0D91D1012976C5 /* Pods-JitsiMeetSDKLite.debug.xcconfig */,
86389F55993FAAF6AEB3FA3E /* Pods-JitsiMeetSDKLite.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
@@ -270,9 +351,11 @@
isa = PBXGroup;
children = (
0BB9AD7A1F5EC8F4001C08DB /* CallKit.m */,
C69EFA09209A0F650027712B /* JMCallKitEmitter.swift */,
C69EFA0B209A0F660027712B /* JMCallKitListener.swift */,
C69EFA0A209A0F660027712B /* JMCallKitProxy.swift */,
4E0EF62E28CA2FB3005D1B03 /* JMCallKitEmitter.h */,
4E0EF62F28CA2FB3005D1B03 /* JMCallKitEmitter.m */,
4E0EF63428CA317E005D1B03 /* JMCallKitListener.h */,
4E0EF63728CA4069005D1B03 /* JMCallKitProxy.h */,
4E0EF63828CA4069005D1B03 /* JMCallKitProxy.m */,
);
path = callkit;
sourceTree = "<group>";
@@ -302,7 +385,10 @@
DE65AACC2318028300290BEC /* JitsiMeetBaseLogHandler+Private.h in Headers */,
4EBA6E652860B1E800B31882 /* JitsiMeetRenderingView.h in Headers */,
0B412F221EDEF6EA00B1A0A6 /* JitsiMeetViewDelegate.h in Headers */,
4E0EF63528CA317E005D1B03 /* JMCallKitListener.h in Headers */,
4E0EF63028CA2FB3005D1B03 /* JMCallKitEmitter.h in Headers */,
4ED4FFF32721B9B90074E620 /* JitsiAudioSession.h in Headers */,
4E0EF63928CA4069005D1B03 /* JMCallKitProxy.h in Headers */,
4EEC9630286C73A2008705FA /* JitsiMeetView+Private.h in Headers */,
0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */,
DE81A2D42316AC4D00AE1940 /* JitsiMeetLogger.h in Headers */,
@@ -314,6 +400,34 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
DE9A012F289A9A9A00E41CBB /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
DE9A0130289A9A9A00E41CBB /* JitsiMeetUserInfo.h in Headers */,
DE9A0131289A9A9A00E41CBB /* JitsiMeetView.h in Headers */,
DE9A0132289A9A9A00E41CBB /* RCTBridgeWrapper.h in Headers */,
DE9A0133289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.h in Headers */,
DE9A0134289A9A9A00E41CBB /* JitsiMeetSDK.h in Headers */,
DE9A0135289A9A9A00E41CBB /* ScheenshareEventEmiter.h in Headers */,
DE9A0136289A9A9A00E41CBB /* JitsiMeetBaseLogHandler+Private.h in Headers */,
DE9A0137289A9A9A00E41CBB /* JitsiMeetRenderingView.h in Headers */,
DE9A0138289A9A9A00E41CBB /* JitsiMeetViewDelegate.h in Headers */,
4E0EF63628CA317E005D1B03 /* JMCallKitListener.h in Headers */,
4E0EF63128CA2FB3005D1B03 /* JMCallKitEmitter.h in Headers */,
DE9A0139289A9A9A00E41CBB /* JitsiAudioSession.h in Headers */,
4E0EF63A28CA4069005D1B03 /* JMCallKitProxy.h in Headers */,
DE9A013A289A9A9A00E41CBB /* JitsiMeetView+Private.h in Headers */,
DE9A013B289A9A9A00E41CBB /* JitsiMeet.h in Headers */,
DE9A013C289A9A9A00E41CBB /* JitsiMeetLogger.h in Headers */,
DE9A013D289A9A9A00E41CBB /* LogUtils.h in Headers */,
DE9A013E289A9A9A00E41CBB /* JitsiMeetViewController.h in Headers */,
DE9A013F289A9A9A00E41CBB /* JitsiMeetConferenceOptions.h in Headers */,
DE9A0140289A9A9A00E41CBB /* ExternalAPI.h in Headers */,
DE9A0141289A9A9A00E41CBB /* InfoPlistUtil.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
@@ -339,6 +453,28 @@
productReference = 0BD906E51EC0C00300C8C18E /* JitsiMeetSDK.framework */;
productType = "com.apple.product-type.framework";
};
DE9A012D289A9A9A00E41CBB /* JitsiMeetSDKLite */ = {
isa = PBXNativeTarget;
buildConfigurationList = DE9A016C289A9A9A00E41CBB /* Build configuration list for PBXNativeTarget "JitsiMeetSDKLite" */;
buildPhases = (
DE9A012E289A9A9A00E41CBB /* [CP] Check Pods Manifest.lock */,
DE9A012F289A9A9A00E41CBB /* Headers */,
DE9A0142289A9A9A00E41CBB /* Sources */,
DE9A0161289A9A9A00E41CBB /* Frameworks */,
DE9A0165289A9A9A00E41CBB /* Resources */,
DE9A0169289A9A9A00E41CBB /* Copy sounds */,
DE9A016A289A9A9A00E41CBB /* Package React bundle */,
DE9A016B289A9A9A00E41CBB /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
);
name = JitsiMeetSDKLite;
productName = "Jitsi Meet SDK";
productReference = DE9A016F289A9A9A00E41CBB /* JitsiMeetSDK.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -369,6 +505,7 @@
projectRoot = "";
targets = (
0BD906E41EC0C00300C8C18E /* JitsiMeetSDK */,
DE9A012D289A9A9A00E41CBB /* JitsiMeetSDKLite */,
);
};
/* End PBXProject section */
@@ -384,6 +521,16 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
DE9A0165289A9A9A00E41CBB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DE9A0166289A9A9A00E41CBB /* CallKitIcon.png in Resources */,
DE9A0167289A9A9A00E41CBB /* image-resize@2x.png in Resources */,
DE9A0168289A9A9A00E41CBB /* image-resize@3x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
@@ -459,6 +606,76 @@
shellPath = /bin/sh;
shellScript = "SOUNDS_DIR=\"${PROJECT_DIR}/../../sounds\"\n\ncp $SOUNDS_DIR/* ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/\n";
};
DE9A012E289A9A9A00E41CBB /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-JitsiMeetSDKLite-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
DE9A0169289A9A9A00E41CBB /* Copy sounds */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Copy sounds";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "SOUNDS_DIR=\"${PROJECT_DIR}/../../sounds\"\n\ncp $SOUNDS_DIR/* ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/\n";
};
DE9A016A289A9A9A00E41CBB /* Package React bundle */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Package React bundle";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export NODE_BINARY=node\nexport NODE_ARGS=\"--max_old_space_size=4096\"\n../../node_modules/react-native/scripts/react-native-xcode.sh\n";
};
DE9A016B289A9A9A00E41CBB /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources.sh",
"${PODS_ROOT}/Amplitude/Sources/Resources/ComodoRsaDomainValidationCA.der",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ComodoRsaDomainValidationCA.der",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -468,6 +685,7 @@
files = (
0BB9AD7B1F5EC8F4001C08DB /* CallKit.m in Sources */,
DE81A2DF2317ED5400AE1940 /* JitsiMeetBaseLogHandler.m in Sources */,
4E0EF63B28CA4069005D1B03 /* JMCallKitProxy.m in Sources */,
4EBA6E662860B1E800B31882 /* JitsiMeetRenderingView.m in Sources */,
4ED4FFF42721B9B90074E620 /* JitsiAudioSession.m in Sources */,
0BB9AD7D1F60356D001C08DB /* AppInfo.m in Sources */,
@@ -483,22 +701,55 @@
DEFC743F21B178FA00E4DD96 /* LocaleDetector.m in Sources */,
0BCA495F1EC4B6C600B793EE /* AudioMode.m in Sources */,
0BCA49611EC4B6C600B793EE /* Proximity.m in Sources */,
C69EFA0C209A0F660027712B /* JMCallKitEmitter.swift in Sources */,
4E0EF63228CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */,
DEFE535621FB2E8300011A3A /* ReactUtils.m in Sources */,
4EEC9631286C73A2008705FA /* JitsiMeetView+Private.m in Sources */,
C6A34261204EF76800E062DD /* DragGestureController.swift in Sources */,
4E51B76525E5345E0038575A /* ScheenshareEventEmiter.m in Sources */,
A4A934E9212F3ADB001E9388 /* Dropbox.m in Sources */,
4EBA6E62286072E300B31882 /* JitsiMeetViewController.m in Sources */,
C69EFA0D209A0F660027712B /* JMCallKitProxy.swift in Sources */,
DE81A2D52316AC4D00AE1940 /* JitsiMeetLogger.m in Sources */,
C69EFA0E209A0F660027712B /* JMCallKitListener.swift in Sources */,
0B412F191EDEC65D00B1A0A6 /* JitsiMeetView.m in Sources */,
DEFE535421FB1BF800011A3A /* JitsiMeet.m in Sources */,
DE438CDA2350934700DD541D /* JavaScriptSandbox.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DE9A0142289A9A9A00E41CBB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DE9A0143289A9A9A00E41CBB /* CallKit.m in Sources */,
DE9A0144289A9A9A00E41CBB /* JitsiMeetBaseLogHandler.m in Sources */,
DE9A0145289A9A9A00E41CBB /* JitsiMeetRenderingView.m in Sources */,
DE9A0146289A9A9A00E41CBB /* JitsiAudioSession.m in Sources */,
4E0EF63C28CA4069005D1B03 /* JMCallKitProxy.m in Sources */,
DE9A0147289A9A9A00E41CBB /* AppInfo.m in Sources */,
DE9A0148289A9A9A00E41CBB /* LogBridge.m in Sources */,
DE9A0149289A9A9A00E41CBB /* RNRootView.m in Sources */,
DE9A014A289A9A9A00E41CBB /* JitsiMeetUserInfo.m in Sources */,
DE9A014B289A9A9A00E41CBB /* JitsiMeetConferenceOptions.m in Sources */,
DE9A014C289A9A9A00E41CBB /* RCTBridgeWrapper.m in Sources */,
DE9A014D289A9A9A00E41CBB /* ExternalAPI.m in Sources */,
DE9A014E289A9A9A00E41CBB /* POSIX.m in Sources */,
DE9A014F289A9A9A00E41CBB /* InfoPlistUtil.m in Sources */,
DE9A0150289A9A9A00E41CBB /* PiPViewCoordinator.swift in Sources */,
DE9A0151289A9A9A00E41CBB /* LocaleDetector.m in Sources */,
DE9A0152289A9A9A00E41CBB /* AudioMode.m in Sources */,
DE9A0153289A9A9A00E41CBB /* Proximity.m in Sources */,
DE9A0155289A9A9A00E41CBB /* ReactUtils.m in Sources */,
DE9A0156289A9A9A00E41CBB /* JitsiMeetView+Private.m in Sources */,
DE9A0157289A9A9A00E41CBB /* DragGestureController.swift in Sources */,
DE9A0158289A9A9A00E41CBB /* ScheenshareEventEmiter.m in Sources */,
DE9A015A289A9A9A00E41CBB /* JitsiMeetViewController.m in Sources */,
DE9A015C289A9A9A00E41CBB /* JitsiMeetLogger.m in Sources */,
4E0EF63328CA2FB3005D1B03 /* JMCallKitEmitter.m in Sources */,
DE9A015E289A9A9A00E41CBB /* JitsiMeetView.m in Sources */,
DE9A015F289A9A9A00E41CBB /* JitsiMeet.m in Sources */,
DE9A0160289A9A9A00E41CBB /* JavaScriptSandbox.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
@@ -646,7 +897,8 @@
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = NO;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
@@ -675,7 +927,77 @@
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = NO;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5.0;
};
name = Release;
};
DE9A016D289A9A9A00E41CBB /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 8F48C340DE0D91D1012976C5 /* Pods-JitsiMeetSDKLite.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"COCOAPODS=1",
"JITSI_MEET_SDK_LITE=1",
);
INFOPLIST_FILE = "src/Lite-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = JitsiMeetSDK;
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = NO;
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
DE9A016E289A9A9A00E41CBB /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 86389F55993FAAF6AEB3FA3E /* Pods-JitsiMeetSDKLite.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = YES;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"COCOAPODS=1",
JITSI_MEET_SDK_LITE,
);
INFOPLIST_FILE = "src/Lite-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiMeetSDK.ios;
PRODUCT_NAME = JitsiMeetSDK;
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = NO;
SWIFT_INSTALL_OBJC_HEADER = NO;
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5.0;
};
name = Release;
@@ -701,6 +1023,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
DE9A016C289A9A9A00E41CBB /* Build configuration list for PBXNativeTarget "JitsiMeetSDKLite" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DE9A016D289A9A9A00E41CBB /* Debug */,
DE9A016E289A9A9A00E41CBB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 0BD906DC1EC0C00300C8C18E /* Project object */;

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1340"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DE9A012D289A9A9A00E41CBB"
BuildableName = "JitsiMeetSDK.framework"
BlueprintName = "JitsiMeetSDKLite"
ReferencedContainer = "container:sdk.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DE9A012D289A9A9A00E41CBB"
BuildableName = "JitsiMeetSDK.framework"
BlueprintName = "JitsiMeetSDKLite"
ReferencedContainer = "container:sdk.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -37,8 +37,10 @@ RCT_EXPORT_MODULE();
= [[NSBundle mainBundle] infoDictionary];
// calendarEnabled
BOOL calendarEnabled
= infoDictionary[@"NSCalendarsUsageDescription"] != nil;
BOOL calendarEnabled = NO;
#if !defined(JITSI_MEET_SDK_LITE)
calendarEnabled = infoDictionary[@"NSCalendarsUsageDescription"] != nil;
#endif
// name
NSString *name = infoDictionary[@"CFBundleDisplayName"];
@@ -63,19 +65,39 @@ RCT_EXPORT_MODULE();
}
}
// SDK version
NSDictionary<NSString *, id> *sdkInfoDictionary
= [[NSBundle bundleForClass:self.class] infoDictionary];
NSString *sdkVersion = sdkInfoDictionary[@"CFBundleShortVersionString"];
if (sdkVersion == nil) {
sdkVersion = sdkInfoDictionary[@"CFBundleVersion"];
if (sdkVersion == nil) {
sdkVersion = @"";
}
}
// build number
NSString *buildNumber = infoDictionary[@"CFBundleVersion"];
if (buildNumber == nil) {
buildNumber = @"";
}
// google services (sign in)
BOOL isGoogleServiceEnabled = [InfoPlistUtil containsRealServiceInfoPlistInBundle:[NSBundle mainBundle]];
// lite SDK
BOOL isLiteSDK = NO;
#if defined(JITSI_MEET_SDK_LITE)
isLiteSDK = YES;
#endif
return @{
@"calendarEnabled": [NSNumber numberWithBool:calendarEnabled],
@"buildNumber": buildNumber,
@"isLiteSDK": [NSNumber numberWithBool:isLiteSDK],
@"name": name,
@"sdkBundlePath": sdkBundlePath,
@"sdkVersion": sdkVersion,
@"version": version,
@"GOOGLE_SERVICES_ENABLED": [NSNumber numberWithBool:isGoogleServiceEnabled]
};

View File

@@ -15,10 +15,8 @@
*/
#import <Intents/Intents.h>
#import <RNGoogleSignin/RNGoogleSignin.h>
#import <WebRTC/RTCLogging.h>
#import "Dropbox.h"
#import "JitsiMeet+Private.h"
#import "JitsiMeetConferenceOptions+Private.h"
#import "JitsiMeetView+Private.h"
@@ -27,6 +25,11 @@
#import "RNSplashScreen.h"
#import "ScheenshareEventEmiter.h"
#if !defined(JITSI_MEET_SDK_LITE)
#import <RNGoogleSignin/RNGoogleSignin.h>
#import "Dropbox.h"
#endif
@implementation JitsiMeet {
RCTBridgeWrapper *_bridgeWrapper;
NSDictionary *_launchOptions;
@@ -76,7 +79,9 @@
_launchOptions = [launchOptions copy];
#if !defined(JITSI_MEET_SDK_LITE)
[Dropbox setAppKey];
#endif
return YES;
}
@@ -98,6 +103,7 @@
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
#if !defined(JITSI_MEET_SDK_LITE)
if ([Dropbox application:app openURL:url options:options]) {
return YES;
}
@@ -107,6 +113,7 @@
options:options]) {
return YES;
}
#endif
if (_customUrlScheme == nil || ![_customUrlScheme isEqualToString:url.scheme]) {
return NO;

View File

@@ -22,3 +22,5 @@
#import <JitsiMeetSDK/JitsiMeetBaseLogHandler.h>
#import <JitsiMeetSDK/JitsiAudioSession.h>
#import <JitsiMeetSDK/InfoPlistUtil.h>
#import <JitsiMeetSDK/JMCallKitListener.h>
#import <JitsiMeetSDK/JMCallKitProxy.h>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>99.0.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@@ -29,8 +29,8 @@
#import <React/RCTLog.h>
#import <WebRTC/WebRTC.h>
#import <JitsiMeetSDK/JitsiMeetSDK-Swift.h>
#import "JitsiAudioSession.h"
#import "../JitsiAudioSession.h"
#import "JMCallKitProxy.h"
// The events emitted/supported by RNCallKit:

View File

@@ -0,0 +1,35 @@
/*
* Copyright @ 2022-present 8x8, Inc.
* Copyright @ 2018-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <CallKit/CallKit.h>
#import <Foundation/Foundation.h>
#import "JMCallKitListener.h"
NS_ASSUME_NONNULL_BEGIN
@interface JMCallKitEmitter : NSObject <CXProviderDelegate>
#pragma mark Add/Remove listeners
- (void)addListener:(id<JMCallKitListener>)listener;
- (void)removeListener:(id<JMCallKitListener>)listener;
#pragma mark Add mute action
- (void)addMuteAction:(NSUUID *)actionUUID;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,116 @@
/*
* Copyright @ 2022-present 8x8, Inc.
* Copyright @ 2018-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "JMCallKitEmitter.h"
@interface JMCallKitEmitter()
@property(nonatomic, strong) NSMutableArray<id<JMCallKitListener>> *listeners;
@property(nonatomic, strong) NSMutableSet<NSUUID *> *pendingMuteActions;
@end
@implementation JMCallKitEmitter
- (instancetype)init {
self = [super init];
if (self) {
self.listeners = [[NSMutableArray alloc] init];
self.pendingMuteActions = [[NSMutableSet alloc] init];
}
return self;
}
#pragma mark Add/Remove listeners
- (void)addListener:(id<JMCallKitListener>)listener {
if (![self.listeners containsObject:listener]) {
[self.listeners addObject:listener];
}
}
- (void)removeListener:(id<JMCallKitListener>)listener {
[self.listeners removeObject:listener];
}
#pragma mark Add mute action
- (void)addMuteAction:(NSUUID *)actionUUID {
[self.pendingMuteActions addObject:actionUUID];
}
#pragma mark CXProviderDelegate
- (void)providerDidReset:(CXProvider *)provider {
for (id listener in self.listeners) {
[listener providerDidReset];
}
[self.pendingMuteActions removeAllObjects];
}
- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action {
for (id listener in self.listeners) {
[listener performAnswerCallWithUUID:action.callUUID];
}
[action fulfill];
}
- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action {
for (id listener in self.listeners) {
[listener performEndCallWithUUID:action.callUUID];
}
[action fulfill];
}
- (void)provider:(CXProvider *)provider performSetMutedCallAction:(CXSetMutedCallAction *)action {
NSUUID *uuid = ([self.pendingMuteActions containsObject:action.UUID]) ? action.UUID : nil;
[self.pendingMuteActions removeObject:action.UUID];
// Avoid mute actions ping-pong: if the mute action was caused by
// the JS side (we requested a transaction) don't call the delegate
// method. If it was called by the provider itself (when the user presses
// the mute button in the CallKit view) then call the delegate method.
//
// NOTE: don't try to be clever and remove this. Been there, done that.
// Won't work.
if (uuid == nil) {
for (id listener in self.listeners) {
[listener performSetMutedCallWithUUID:action.callUUID isMuted:action.isMuted];
}
}
[action fulfill];
}
- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action {
for (id listener in self.listeners) {
[listener performStartCallWithUUID:action.callUUID isVideo:action.isVideo];
}
}
- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession {
for (id listener in self.listeners) {
[listener providerDidActivateAudioSessionWithSession:audioSession];
}
}
- (void)provider:(CXProvider *)provider didDeactivateAudioSession:(AVAudioSession *)audioSession {
for (id listener in self.listeners) {
[listener providerDidDeactivateAudioSessionWithSession:audioSession];
}
}
@end

View File

@@ -1,118 +0,0 @@
/*
* Copyright @ 2018-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import AVKit
import CallKit
import Foundation
internal final class JMCallKitEmitter: NSObject, CXProviderDelegate {
private let listeners = NSMutableArray()
private var pendingMuteActions = Set<UUID>()
internal override init() {}
// MARK: - Add/remove listeners
func addListener(_ listener: JMCallKitListener) {
if (!listeners.contains(listener)) {
listeners.add(listener)
}
}
func removeListener(_ listener: JMCallKitListener) {
listeners.remove(listener)
}
// MARK: - Add mute action
func addMuteAction(_ actionUUID: UUID) {
pendingMuteActions.insert(actionUUID)
}
// MARK: - CXProviderDelegate
func providerDidReset(_ provider: CXProvider) {
listeners.forEach {
let listener = $0 as! JMCallKitListener
listener.providerDidReset?()
}
pendingMuteActions.removeAll()
}
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
listeners.forEach {
let listener = $0 as! JMCallKitListener
listener.performAnswerCall?(UUID: action.callUUID)
}
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
listeners.forEach {
let listener = $0 as! JMCallKitListener
listener.performEndCall?(UUID: action.callUUID)
}
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) {
let uuid = pendingMuteActions.remove(action.uuid)
// Avoid mute actions ping-pong: if the mute action was caused by
// the JS side (we requested a transaction) don't call the delegate
// method. If it was called by the provider itself (when the user presses
// the mute button in the CallKit view) then call the delegate method.
//
// NOTE: don't try to be clever and remove this. Been there, done that.
// Won't work.
if (uuid == nil) {
listeners.forEach {
let listener = $0 as! JMCallKitListener
listener.performSetMutedCall?(UUID: action.callUUID, isMuted: action.isMuted)
}
}
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
listeners.forEach {
let listener = $0 as! JMCallKitListener
listener.performStartCall?(UUID: action.callUUID, isVideo: action.isVideo)
}
action.fulfill()
}
func provider(_ provider: CXProvider,
didActivate audioSession: AVAudioSession) {
listeners.forEach {
let listener = $0 as! JMCallKitListener
listener.providerDidActivateAudioSession?(session: audioSession)
}
}
func provider(_ provider: CXProvider,
didDeactivate audioSession: AVAudioSession) {
listeners.forEach {
let listener = $0 as! JMCallKitListener
listener.providerDidDeactivateAudioSession?(session: audioSession)
}
}
}

View File

@@ -0,0 +1,34 @@
/*
* Copyright @ 2022-present 8x8, Inc.
* Copyright @ 2018-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <AVKit/AVKit.h>
#import <CallKit/CallKit.h>
#import <Foundation/Foundation.h>
@protocol JMCallKitListener <NSObject>
@optional
- (void)providerDidReset;
- (void)performAnswerCallWithUUID:(nonnull NSUUID *)UUID;
- (void)performEndCallWithUUID:(nonnull NSUUID *)UUID;
- (void)performSetMutedCallWithUUID:(nonnull NSUUID *)UUID isMuted:(BOOL)isMuted;
- (void)performStartCallWithUUID:(nonnull NSUUID *)UUID isVideo:(BOOL)isVideo;
- (void)providerDidActivateAudioSessionWithSession:(nonnull AVAudioSession *)session;
- (void)providerDidDeactivateAudioSessionWithSession:(nonnull AVAudioSession *)session;
- (void)providerTimedOutPerformingActionWithAction:(nonnull CXAction *)action;
@end

View File

@@ -1,38 +0,0 @@
/*
* Copyright @ 2018-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import AVKit
import CallKit
import Foundation
@objc public protocol JMCallKitListener: NSObjectProtocol {
@objc optional func providerDidReset()
@objc optional func performAnswerCall(UUID: UUID)
@objc optional func performEndCall(UUID: UUID)
@objc optional func performSetMutedCall(UUID: UUID, isMuted: Bool)
@objc optional func performStartCall(UUID: UUID, isVideo: Bool)
@objc optional func providerDidActivateAudioSession(session: AVAudioSession)
@objc optional func providerDidDeactivateAudioSession(session: AVAudioSession)
@objc optional func providerTimedOutPerformingAction(action: CXAction)
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright @ 2022-present 8x8, Inc.
* Copyright @ 2018-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <CallKit/CallKit.h>
#import <Foundation/Foundation.h>
#import "JMCallKitListener.h"
NS_ASSUME_NONNULL_BEGIN
@protocol CXProviderProtocol <NSObject>
@property (nonatomic, readwrite, copy) CXProviderConfiguration* configuration;
- (void)setDelegate:(nullable id<CXProviderDelegate>)delegate queue:(nullable dispatch_queue_t)queue;
- (void)reportNewIncomingCallWithUUID:(NSUUID *)uuid update:(CXCallUpdate *)update completion:(void (^)(NSError *))completion;
- (void)reportCallWithUUID:(NSUUID *)uuid updated:(CXCallUpdate *)update;
- (void)reportCallWithUUID:(NSUUID *)uuid endedAtDate:(NSDate *)dateEnded reason:(CXCallEndedReason)endedReason;
- (void)reportOutgoingCallWithUUID:(NSUUID *)uuid startedConnectingAtDate:(NSDate *)dateStartedConnecting;
- (void)reportOutgoingCallWithUUID:(NSUUID *)uuid connectedAtDate:(NSDate *)dateConnected;
- (void)invalidate;
@end
#pragma mark -
@protocol CXCallControllerProtocol <NSObject>
@property (nonatomic, readonly) NSArray<CXCall*> *calls;
- (void)requestTransaction:(CXTransaction *)transaction completion:(void (^)(NSError *_Nullable))completion;
@end
#pragma mark -
/// JitsiMeet CallKit proxy
// NOTE: The methods this class exposes are meant to be called in the UI thread.
// All delegate methods called by JMCallKitEmitter will be called in the UI thread.
@interface JMCallKitProxy : NSObject
/// Enables the proxy in between CallKit and the consumers of the SDK.
/// Defaults to disabled. Set to true when you want to use CallKit.
@property (class) BOOL enabled;
@property (class) id<CXProviderProtocol> callKitProvider;
@property (class) id<CXCallControllerProtocol> callKitCallController;
+ (void)configureProviderWithLocalizedName:(nonnull NSString *)localizedName
ringtoneSound:(nullable NSString *)ringtoneSound
iconTemplateImageData:(nullable NSData*)imageData
NS_SWIFT_NAME(configureProvider(localizedName:ringtoneSound:iconTemplateImageData:));
+ (BOOL)isProviderConfigured;
+ (void)addListener:(nonnull id<JMCallKitListener>)listener NS_SWIFT_NAME(addListener(_:));
+ (void)removeListener:(nonnull id<JMCallKitListener>)listener NS_SWIFT_NAME(removeListener(_:));
+ (BOOL)hasActiveCallForUUID:(nonnull NSString *)callUUID NS_SWIFT_NAME(hasActiveCallForUUID(_:));
+ (void)reportNewIncomingCallWithUUID:(nonnull NSUUID *)uuid
handle:(nullable NSString*)handle
displayName:(nullable NSString*)displayName
hasVideo:(BOOL)hasVideo
completion:(nonnull void (^)(NSError *_Nullable))completion
NS_SWIFT_NAME(reportNewIncomingCall(UUID:handle:displayName:hasVideo:completion:));
+ (void)reportCallUpdateWith:(nonnull NSUUID *)uuid
handle:(nullable NSString *)handle
displayName:(nullable NSString *)displayName
hasVideo:(BOOL)hasVideo;
+ (void)reportCallWith:(nonnull NSUUID *)uuid
endedAt:(nullable NSDate *)dateEnded
reason:(CXCallEndedReason)endedReason;
+ (void)reportOutgoingCallWith:(nonnull NSUUID *)uuid startedConnectingAt:(nullable NSDate *)dateStartedConnecting;
+ (void)reportOutgoingCallWith:(nonnull NSUUID *)uuid connectedAt:(nullable NSDate *)dateConnected;
+ (void)request:(nonnull CXTransaction *)transaction completion:(nonnull void (^)(NSError *_Nullable))completion;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,284 @@
/*
* Copyright @ 2022-present 8x8, Inc.
* Copyright @ 2018-present Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "JMCallKitProxy.h"
#import "JMCallKitEmitter.h"
#pragma mark -
@interface CXProvider(CXProviderProtocol) <CXProviderProtocol>
@end
@implementation CXProvider(CXProviderProtocol)
@end
#pragma mark -
@interface CXCallController(CXCallControllerProtocol) <CXCallControllerProtocol>
@property (nonatomic, readonly) NSArray<CXCall*> *calls;
@end
@implementation CXCallController(CXCallControllerProtocol)
@dynamic calls;
- (NSArray<CXCall*> *)calls {
return self.callObserver.calls;
}
@end
#pragma mark -
@interface JMCallKitProxy ()
@property (class) CXProvider *defaultProvider;
@property (class) CXProviderConfiguration *providerConfiguration;
@end
@interface JMCallKitProxy (Helpers)
+ (CXCallUpdate *)makeCXUpdateWithHandle:(nullable NSString *)handle displayName:(nullable NSString *)displayName hasVideo:(BOOL)hasVideo;
@end
@implementation JMCallKitProxy
@dynamic callKitProvider, callKitCallController, enabled;
@dynamic defaultProvider, providerConfiguration;
static id<CXProviderProtocol> _callKitProvider = nil;
static id<CXCallControllerProtocol> _callKitCallController = nil;
static BOOL _enabled = false;
static CXProvider *_defaultProvider = nil;
static CXProviderConfiguration *_providerConfiguration = nil;
#pragma mark CallJit proxy
+ (id<CXProviderProtocol>)callKitProvider {
return _callKitProvider;
}
+ (void)setCallKitProvider:(id<CXProviderProtocol>)callKitProvider {
if (_callKitProvider != callKitProvider) {
_callKitProvider = callKitProvider;
}
}
+ (id<CXCallControllerProtocol>)callKitCallController {
return _callKitCallController;
}
+ (void)setCallKitCallController:(id<CXCallControllerProtocol>)callKitCallController {
if (_callKitCallController != callKitCallController) {
_callKitCallController = callKitCallController;
}
}
+ (BOOL)enabled {
return _enabled;
}
+ (void)setEnabled:(BOOL)enabled {
_enabled = enabled ;
if (!self.callKitProvider) {
[self.provider invalidate];
}
if (enabled) {
CXProviderConfiguration *configuration = self.providerConfiguration? self.providerConfiguration : [[CXProviderConfiguration alloc] initWithLocalizedName:@""];
if (!self.callKitProvider) {
self.defaultProvider = [[CXProvider alloc] initWithConfiguration: configuration];
}
[self.provider setDelegate:self.emitter queue:nil];
} else {
[self.provider setDelegate:nil queue:nil];
}
}
+ (CXProvider *)defaultProvider {
return _defaultProvider;
}
+ (void)setDefaultProvider:(CXProvider *)defaultProvider {
if (_defaultProvider != defaultProvider) {
_defaultProvider = defaultProvider;
}
}
+ (id<CXProviderProtocol>)provider {
return self.callKitProvider != nil ? self.callKitProvider : self.defaultProvider;
}
+ (id<CXCallControllerProtocol>)callController {
return self.callKitCallController != nil ? self.callKitCallController : self.defaultCallController;
}
+ (CXProviderConfiguration *)providerConfiguration {
return _providerConfiguration;
}
+ (void)setProviderConfiguration:(CXProviderConfiguration *)providerConfiguration {
if (_providerConfiguration != providerConfiguration) {
_providerConfiguration = providerConfiguration;
if (providerConfiguration) {
self.provider.configuration = providerConfiguration;
[self.provider setDelegate:self.emitter queue:nil];
}
}
}
+ (CXCallController *)defaultCallController {
static dispatch_once_t once;
static CXCallController *defaultCallController;
dispatch_once(&once, ^{
defaultCallController = [[CXCallController alloc] init];
});
return defaultCallController;
}
+ (JMCallKitEmitter *)emitter {
static dispatch_once_t once;
static JMCallKitEmitter *emitter;
dispatch_once(&once, ^{
emitter = [[JMCallKitEmitter alloc] init];
});
return emitter;
}
+ (void)configureProviderWithLocalizedName:(nonnull NSString *)localizedName
ringtoneSound:(nullable NSString *)ringtoneSound
iconTemplateImageData:(nullable NSData*)imageData {
if (!self.enabled) {
return;
}
CXProviderConfiguration *configuration = [[CXProviderConfiguration alloc] initWithLocalizedName:localizedName];
configuration.iconTemplateImageData = imageData;
configuration.maximumCallGroups = 1;
configuration.maximumCallsPerCallGroup = 1;
configuration.ringtoneSound = ringtoneSound;
configuration.supportedHandleTypes = [NSSet setWithArray:@[@(CXHandleTypeGeneric)]];
configuration.supportsVideo = true;
self.providerConfiguration = configuration;
}
+ (BOOL)isProviderConfigured {
return self.providerConfiguration != nil;
}
+ (void)addListener:(nonnull id<JMCallKitListener>)listener {
[self.emitter addListener:listener];
}
+ (void)removeListener:(nonnull id<JMCallKitListener>)listener {
[self.emitter removeListener:listener];
}
+ (BOOL)hasActiveCallForUUID:(nonnull NSString *)callUUID {
CXCall *activeCallForUUID = [[self.callController calls] filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(CXCall *evaluatedObject, NSDictionary<NSString *,id> *bindings) {
return evaluatedObject.UUID.UUIDString == callUUID;
}]].firstObject;
if (!activeCallForUUID) {
return false;
}
return true;
}
+ (void)reportNewIncomingCallWithUUID:(nonnull NSUUID *)uuid
handle:(nullable NSString*)handle
displayName:(nullable NSString*)displayName
hasVideo:(BOOL)hasVideo
completion:(nonnull void (^)(NSError *_Nullable))completion {
if (!self.enabled) {
return;
}
CXCallUpdate *callUpdate = [self makeCXUpdateWithHandle:handle displayName:displayName hasVideo:hasVideo];
[self.provider reportNewIncomingCallWithUUID:uuid update:callUpdate completion:completion];
}
+ (void)reportCallUpdateWith:(nonnull NSUUID *)uuid
handle:(nullable NSString *)handle
displayName:(nullable NSString *)displayName
hasVideo:(BOOL)hasVideo {
if (!self.enabled) {
return;
}
CXCallUpdate *callUpdate = [self makeCXUpdateWithHandle:handle displayName:displayName hasVideo:hasVideo];
[self.provider reportCallWithUUID:uuid updated:callUpdate];
}
+ (void)reportCallWith:(nonnull NSUUID *)uuid
endedAt:(nullable NSDate *)dateEnded
reason:(CXCallEndedReason)endedReason {
[self.provider reportCallWithUUID:uuid endedAtDate:dateEnded reason:endedReason];
}
+ (void)reportOutgoingCallWith:(nonnull NSUUID *)uuid startedConnectingAt:(nullable NSDate *)dateStartedConnecting {
[self.provider reportOutgoingCallWithUUID:uuid startedConnectingAtDate:dateStartedConnecting];
}
+ (void)reportOutgoingCallWith:(nonnull NSUUID *)uuid connectedAt:(nullable NSDate *)dateConnected {
[self.provider reportOutgoingCallWithUUID:uuid connectedAtDate:dateConnected];
}
+ (void)request:(nonnull CXTransaction *)transaction completion:(nonnull void (^)(NSError *_Nullable))completion {
if (!self.enabled) {
return;
}
// XXX keep track of muted actions to avoid "ping-pong"ing. See
// JMCallKitEmitter for details on the CXSetMutedCallAction handling.
for (CXAction *action in transaction.actions) {
if ([CXAction isKindOfClass:[CXSetMutedCallAction class]]) {
[self.emitter addMuteAction:action.UUID];
}
}
[self.callController requestTransaction:transaction completion:completion];
}
@end
@implementation JMCallKitProxy (Helpers)
+ (CXCallUpdate *)makeCXUpdateWithHandle:(nullable NSString *)handle displayName:(nullable NSString *)displayName hasVideo:(BOOL)hasVideo {
CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.supportsDTMF = false;
update.supportsHolding = false;
update.supportsGrouping = false;
update.supportsUngrouping = false;
update.hasVideo = hasVideo;
update.localizedCallerName = displayName;
if (handle) {
update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle];
}
return update;
}
@end

View File

@@ -1,231 +0,0 @@
/*
* Copyright @ 2018-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 CallKit
import Foundation
public protocol CXProviderProtocol: AnyObject {
var configuration: CXProviderConfiguration { get set }
func setDelegate(_ delegate: CXProviderDelegate?, queue: DispatchQueue?)
func reportNewIncomingCall(with UUID: UUID, update: CXCallUpdate, completion: @escaping (Error?) -> Void)
func reportCall(with UUID: UUID, updated update: CXCallUpdate)
func reportCall(with UUID: UUID, endedAt dateEnded: Date?, reason endedReason: CXCallEndedReason)
func reportOutgoingCall(with UUID: UUID, startedConnectingAt dateStartedConnecting: Date?)
func reportOutgoingCall(with UUID: UUID, connectedAt dateConnected: Date?)
func invalidate()
}
public protocol CXCallControllerProtocol: AnyObject {
var calls: [CXCall] { get }
func request(_ transaction: CXTransaction, completion: @escaping (Error?) -> Swift.Void)
}
extension CXProvider: CXProviderProtocol {}
extension CXCallController: CXCallControllerProtocol {
public var calls: [CXCall] {
return callObserver.calls
}
}
/// JitsiMeet CallKit proxy
// NOTE: The methods this class exposes are meant to be called in the UI thread.
// All delegate methods called by JMCallKitEmitter will be called in the UI thread.
@objc public final class JMCallKitProxy: NSObject {
private override init() {}
// MARK: - CallKit proxy
public static var callKitProvider: CXProviderProtocol?
public static var callKitCallController: CXCallControllerProtocol?
private static var defaultProvider: CXProvider?
private static var provider: CXProviderProtocol? {
callKitProvider ?? defaultProvider
}
private static var callController: CXCallControllerProtocol {
callKitCallController ?? defaultCallController
}
private static var providerConfiguration: CXProviderConfiguration? {
didSet {
guard let configuration = providerConfiguration else { return }
provider?.configuration = configuration
provider?.setDelegate(emitter, queue: nil)
}
}
private static let defaultCallController: CXCallController = {
return CXCallController()
}()
private static let emitter: JMCallKitEmitter = {
return JMCallKitEmitter()
}()
/// Enables the proxy in between CallKit and the consumers of the SDK.
/// Defaults to disabled. Set to true when you want to use CallKit.
@objc public static var enabled: Bool = false {
didSet {
if callKitProvider == nil {
provider?.invalidate()
}
if enabled {
let configuration = providerConfiguration ?? CXProviderConfiguration(localizedName: "")
if callKitProvider == nil {
defaultProvider = CXProvider(configuration: configuration)
}
provider?.setDelegate(emitter, queue: nil)
} else {
provider?.setDelegate(nil, queue: nil)
}
}
}
@objc public static func configureProvider(localizedName: String,
ringtoneSound: String?,
iconTemplateImageData: Data?) {
guard enabled else { return }
let configuration = CXProviderConfiguration(localizedName: localizedName)
configuration.iconTemplateImageData = iconTemplateImageData
configuration.maximumCallGroups = 1
configuration.maximumCallsPerCallGroup = 1
configuration.ringtoneSound = ringtoneSound
configuration.supportedHandleTypes = [CXHandle.HandleType.generic]
configuration.supportsVideo = true
providerConfiguration = configuration
}
@objc public static func isProviderConfigured() -> Bool {
return providerConfiguration != nil
}
@objc public static func addListener(_ listener: JMCallKitListener) {
emitter.addListener(listener)
}
@objc public static func removeListener(_ listener: JMCallKitListener) {
emitter.removeListener(listener)
}
@objc public static func hasActiveCallForUUID(_ callUUID: String) -> Bool {
let activeCallForUUID = callController.calls.first {
$0.uuid == UUID(uuidString: callUUID)
}
guard activeCallForUUID != nil else { return false }
return true
}
@objc public static func reportNewIncomingCall(UUID: UUID,
handle: String?,
displayName: String?,
hasVideo: Bool,
completion: @escaping (Error?) -> Void) {
guard enabled else { return }
let callUpdate = makeCXUpdate(handle: handle,
displayName: displayName,
hasVideo: hasVideo)
provider?.reportNewIncomingCall(with: UUID,
update: callUpdate,
completion: completion)
}
@objc public static func reportCallUpdate(with UUID: UUID,
handle: String?,
displayName: String?,
hasVideo: Bool) {
guard enabled else { return }
let callUpdate = makeCXUpdate(handle: handle,
displayName: displayName,
hasVideo: hasVideo)
provider?.reportCall(with: UUID, updated: callUpdate)
}
@objc public static func reportCall(
with UUID: UUID,
endedAt dateEnded: Date?,
reason endedReason: CXCallEndedReason) {
guard enabled else { return }
provider?.reportCall(with: UUID,
endedAt: dateEnded,
reason: endedReason)
}
@objc public static func reportOutgoingCall(
with UUID: UUID,
startedConnectingAt dateStartedConnecting: Date?) {
guard enabled else { return }
provider?.reportOutgoingCall(with: UUID,
startedConnectingAt: dateStartedConnecting)
}
@objc public static func reportOutgoingCall(
with UUID: UUID,
connectedAt dateConnected: Date?) {
guard enabled else { return }
provider?.reportOutgoingCall(with: UUID, connectedAt: dateConnected)
}
@objc public static func request(
_ transaction: CXTransaction,
completion: @escaping (Error?) -> Swift.Void) {
guard enabled else { return }
// XXX keep track of muted actions to avoid "ping-pong"ing. See
// JMCallKitEmitter for details on the CXSetMutedCallAction handling.
for action in transaction.actions {
if (action as? CXSetMutedCallAction) != nil {
emitter.addMuteAction(action.uuid)
}
}
callController.request(transaction, completion: completion)
}
// MARK: - Callkit Proxy helpers
private static func makeCXUpdate(handle: String?,
displayName: String?,
hasVideo: Bool) -> CXCallUpdate {
let update = CXCallUpdate()
update.supportsDTMF = false
update.supportsHolding = false
update.supportsGrouping = false
update.supportsUngrouping = false
update.hasVideo = hasVideo
if let handle = handle {
update.remoteHandle = CXHandle(type: .generic,
value: handle)
}
if let displayName = displayName {
update.localizedCallerName = displayName
}
return update
}
}

View File

@@ -22,6 +22,7 @@
"sl": "Sloweens",
"sv": "Sweeds",
"tr": "Turks",
"uk": "Oekraïens",
"vi": "Viëtnamees",
"zhCN": "Sjinees (Sjina)"
}

View File

@@ -28,6 +28,7 @@
"ru": "Расійская",
"sv": "Шведская",
"tr": "Турэцкая",
"uk": "Украінская",
"vi": "В'етнамская",
"zhCN": "Кітайская (Кітай)",
"zhTW": "Кітайская (Тайвань)"

View File

@@ -26,6 +26,7 @@
"ru": "Руски",
"sv": "Шведски",
"tr": "Турски",
"uk": "Украински",
"vi": "Виетнамски",
"zhCN": "Китайски (Китай)",
"zhTW": "Тайвански"

View File

@@ -27,6 +27,7 @@
"ru": "Russisk",
"sv": "Svensk",
"tr": "Tyrkisk",
"uk": "Ukrainsk",
"vi": "Vietnamesisk",
"zhCN": "Kinesisk (China)",
"zhTW": "Kinesisk (Taiwan)"

View File

@@ -34,6 +34,7 @@
"sr": "Serbish",
"sv": "Schwedisch",
"tr": "Türkisch",
"uk": "Ukrainisch",
"vi": "Vietnamesisch",
"zhCN": "Chinesisch (China)",
"zhTW": "Chinesisch (Taiwan)"

View File

@@ -34,6 +34,7 @@
"sr": "Serbian",
"sv": "Swedish",
"tr": "Turkish",
"uk": "Ukrainian",
"vi": "Vietnamese",
"zhCN": "Chinese (China)",
"zhTW": "Chinese (Taiwan)"

View File

@@ -22,6 +22,7 @@
"sl": "Slovena",
"sv": "Sveda",
"tr": "Turka",
"uk": "Ukraina",
"vi": "Vjetnama",
"zhCN": "Ĉina (Ĉinuja)"
}

View File

@@ -30,6 +30,7 @@
"sk": "Eslovaco",
"sv": "Sueco",
"tr": "Turco",
"uk": "Ucraniano",
"vi": "Vietnamita",
"zhCN": "Chino (China)",
"zhTW": "Chino (Taiwán)"

View File

@@ -28,6 +28,7 @@
"sk": "Eslovaco",
"sv": "Sueco",
"tr": "Turco",
"uk": "Ucraniano",
"vi": "Vietnamita",
"zhCN": "Chino (China)",
"zhTW": "Chino (Taiwan)"

View File

@@ -27,6 +27,7 @@
"ru": "Vene keel",
"sv": "Roosi keel",
"tr": "Türgi keel",
"uk": "Ukraina keel",
"vi": "Vietnami keel",
"zhCN": "Hiina keel (Hiina)",
"zhTW": "Hiina keel (Tai)"

View File

@@ -32,6 +32,7 @@
"sl": "",
"sv": "ruotsi",
"tr": "turkki",
"uk": "ukraina",
"vi": "vietnam",
"zhCN": "kiina (Kiina)",
"zhTW": "kiina (Taiwan)"

View File

@@ -29,6 +29,7 @@
"sk": "Slovaque",
"sv": "Suédois",
"tr": "Turc",
"uk": "Ukrainien",
"vi": "Vietnamien",
"zhCN": "Chinois (Chine)",
"zhTW": "Chinois (Taiwan)"

View File

@@ -29,6 +29,7 @@
"sk": "Slovaque",
"sv": "Suédois",
"tr": "Turc",
"uk": "Ukrainien",
"vi": "Vietnamien",
"zhCN": "Chinois (Chine)",
"zhTW": "Chinois (Taiwan)"

View File

@@ -29,6 +29,7 @@
"sk": "Szlovákul",
"sv": "Svéd",
"tr": "Török",
"uk": "Ukrán",
"vi": "Vietnámi",
"zhCN": "Kínai (Kína)",
"zhTW": "Kínai (Tajvan)"

View File

@@ -22,6 +22,7 @@
"sl": "Սլովեներեն ",
"sv": "Շվեդերեն ",
"tr": "Թուրքերեն",
"uk": "Ուկրաիներեն",
"vi": "",
"zhCN": "Չիներեն"
}

View File

@@ -33,6 +33,7 @@
"sk": "Bahasa Slovakia",
"sv": "Bahasa Swedia",
"tr": "Bahasa Turki",
"uk": "Bahasa Ukraina",
"vi": "Bahasa Vietnam",
"zhCN": "Bahasa Mandarin",
"zhTW": "Bahasa Mandarin - Taiwan"

View File

@@ -28,6 +28,7 @@
"ru": "Rússneska",
"sv": "Sænska",
"tr": "Tyrkneska",
"uk": "Úkraínska",
"vi": "Víetnamska",
"zhCN": "Kínverska (Kína)",
"zhTW": "Kínverska (Taívan)"

View File

@@ -29,6 +29,7 @@
"ru": "Rusų",
"sv": "Švedų",
"tr": "Turkų",
"uk": "Ukrainiečių",
"vi": "Vietnamiečių",
"zhCN": "Kinų (China)",
"zhTW": "Kinų (Taivanas)"

View File

@@ -28,6 +28,7 @@
"ru": "krievu",
"sv": "zviedru",
"tr": "turku",
"uk": "ukraiņu",
"vi": "vjetnamiešu",
"zhCN": "ķīniešu (Ķīna)",
"zhTW": "ķīniešu (Taivana)"

View File

@@ -26,6 +26,7 @@
"sl": "",
"sv": "Svensk",
"tr": "Tyrkisk",
"uk": "Ukrainsk",
"vi": "Vietnamesisk",
"zhCN": ""
}

View File

@@ -32,6 +32,7 @@
"sl": "Sloveens",
"sv": "Zweeds",
"tr": "Turks",
"uk": "Oekraïens",
"vi": "Vietnamees",
"zhCN": "Chinees (China)",
"zhTW": "Chinees (Taiwan)"

View File

@@ -26,6 +26,7 @@
"ru": "Russo",
"sv": "Sueco",
"tr": "Turco",
"uk": "Ucraniano",
"vi": "Vietnamita",
"zhCN": "Chinês (China)",
"zhTW": "Chinês (Taiwan)"

View File

@@ -29,6 +29,7 @@
"sr": "Сербский",
"sv": "Шведский",
"tr": "Турецкий",
"uk": "Украинский",
"vi": "Вьетнамский",
"zhCN": "Китайский (Китай)",
"zhTW": "Китайский (Тайвань)"

View File

@@ -28,6 +28,7 @@
"sc": "Sardu",
"sv": "Isvedesu",
"tr": "Turcu",
"uk": "Ucràinu",
"vi": "Vietnamita",
"zhCN": "Tzinesu (Tzina)",
"zhTW": "Tzinesu (Taiwan)"

View File

@@ -29,6 +29,7 @@
"sk": "Slovenčina",
"sv": "Švédčina",
"tr": "Turečtina",
"uk": "Ukrajinčina",
"vi": "Vietnamčina",
"zhCN": "Čínština (Čína)",
"zhTW": "Čínština (Taiwan)"

View File

@@ -22,6 +22,7 @@
"sl": "Slovenščina",
"sv": "Švedščina",
"tr": "Turščina",
"uk": "Ukrajinščina",
"vi": "Vietnamščina",
"zhCN": "kitajščina (poenostavljena)"
}

View File

@@ -33,6 +33,7 @@
"sr": "Српски",
"sv": "Шведски",
"tr": "Турски",
"uk": "Украјински",
"vi": "Вијетнамски",
"zhCN": "Кинески (Кина)",
"zhTW": "Кинески (Тајван)"

View File

@@ -32,6 +32,7 @@
"sl": "Slovenska",
"sv": "Svenska",
"tr": "Turkiska",
"uk": "Ukrainska",
"vi": "Vietnamesiska",
"zhCN": "Kinesiska (Kina)",
"zhTW": "Kinesiska (Taiwan)"

View File

@@ -32,6 +32,7 @@
"sl": "Slovence",
"sv": "Isveççe",
"tr": "Türkçe",
"uk": "Ukraynaca",
"vi": "Vietnamca",
"zhCN": "Çince (Çin)",
"zhTW": "Çince (Tayvan)"

View File

@@ -1,5 +1,6 @@
{
"af": "Африкаанс",
"ar": "Арабська",
"bg": "Болгарська",
"ca": "Каталонська",
"cs": "Чеська",
@@ -7,27 +8,48 @@
"de": "Німецька",
"el": "Грецька",
"en": "Англійська",
"enGB": "Англійська (Велика Британія)",
"enGB": "Англійська (Сполучене Королівство)",
"eo": "Есперанто",
"es": "Іспанська",
"esUS": "Іспанська (Латинська Америка)",
"et": "Естонська",
"eu": "Баскська",
"fa": "Перська",
"fi": "Фінська",
"fr": "Французька",
"frCA": "Французька (Канада)",
"he": "Іврит",
"hi": "Гінді",
"hr": "Хорватська",
"hsb": "Верхньолужицька",
"hu": "Угорська",
"hy": "Вірменська",
"id": "Індонезійська",
"it": "Італійська",
"ja": "Японська",
"kab": "Кабільська",
"ko": "Корейська",
"lt": "Литовська",
"lv": "Латвійська",
"ml": "Малаялам",
"mr": "Маратхі",
"nl": "Голландська",
"oc": "Окситанська",
"pl": "Польська",
"pt": "Португальська",
"ptBR": "Португальська (Бразилія)",
"ro": "Румунська",
"ru": "Російська",
"sc": "Сардинська",
"sk": "Словацька",
"sl": "Словенська",
"sq": "Албанська",
"sr": "Сербська",
"sv": "Шведська",
"te": "Телуґу",
"th": "Тайська",
"tr": "Турецька",
"uk": "Українська",
"vi": "В'єтнамська",
"zhCN": "Китайська (Китай)",
"zhTW": "Китайська (Тайвань)"

View File

@@ -11,7 +11,6 @@
"defaultEmail": "بريدك الافتراضي",
"disabled": "لا يمكنك دعوة أحد.",
"failedToAdd": "فشل إضافة مشاركين",
"footerText": "الاتصال لدعوة الغير مُعطَّل.",
"googleEmail": "بريد غوغل",
"inviteMoreHeader": "أنت بمفردك في هذا المُلتقى",
"inviteMoreMailSubject": "ضم {{appName}} للمُلتقى",
@@ -79,7 +78,6 @@
},
"carmode": {
"actions": {
"leaveMeeting": "اترك الاجتماع",
"selectSoundDevice": "حدد جهاز الصوت"
},
"labels": {
@@ -98,6 +96,7 @@
"messageAccessibleTitleMe": "أنا أقول:",
"messageTo": "أرسل رسالة خاصة إلى {{recipient}}",
"messagebox": "اكتب رسالة",
"newMessages": "رسائل جديدة",
"nickname": {
"popover": "اختر لقبًا",
"title": "اكتب لقبًا لاعتماده في المحادثة",
@@ -147,7 +146,6 @@
"bridgeCount": "عدد المخدِّمات: ",
"codecs": "المرماز (A/V): ",
"connectedTo": "وصل إلى:",
"e2e_rtt": "E2E RTT:",
"framerate": "مُعدَّل الإطارات:",
"less": "اخف",
"localaddress": "العنوان المحلي:",
@@ -199,8 +197,8 @@
"deviceError": {
"cameraError": "فشل الوصول إلى كاميرتك",
"cameraPermission": "خطأ في تحصيل إذن استخدام كاميرتك",
"microphoneError": "فشل الوصول إلى مجهارك (المايكروفون)",
"microphonePermission": "خطأ في تحصيل إذن استخدام المجهار (المايكروفون)"
"microphoneError": "فشل الوصول إلى المايكروفون",
"microphonePermission": "خطأ في تحصيل إذن استخدام المايكروفون"
},
"deviceSelection": {
"noPermission": "لم يُمنَح الإذن",
@@ -286,7 +284,6 @@
"linkMeetingTitle": "ربط المُلتقى بـ Salesforce",
"liveStreaming": "البث المباشر الحي",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "غير ممكن أثناء التسجيل",
"liveStreamingDisabledTooltip": "بدء بثٍ حيٍّ مُعطَّل",
"localUserControls": "ضوابط المستخدم المحلي",
"lockMessage": "فشل جعل المؤتمر مغلقًا.",
"lockRoom": "أضف المُلتقى $t(lockRoomPasswordUppercase)",
@@ -296,11 +293,11 @@
"logoutTitle": "الخروج",
"maxUsersLimitReached": "وصل عدد المشاركين إلى الحد الأقصى. المؤتمر مكتمل الحضور. اتصل رجاءً براعي المؤتمر أو جرب مرة أخرى لاحقًا.",
"maxUsersLimitReachedTitle": "وصل عدد المشاركين إلى الحد الأقصى",
"micConstraintFailedError": "لا يوافق المجهار (المايكروفون) لديك بعض القيود المطلوبة.",
"micNotFoundError": "لم يُعثَر على أي مجهار (مايكروفون)",
"micNotSendingData": "اذهب إلى إعدادات حاسوبك لإلغاء كتم المجهار (المايكروفون) وضبط مستواه",
"micNotSendingDataTitle": "كتم ضبط الإعدادات لديك المجهار (المايكروفون)",
"micPermissionDeniedError": "لم تعط إذن استعمال المجهار (المايكروفون) الخاص بك. ما يزال بإمكانك الإنضمام إلى المؤتمر ولكن دون أن يسمعك الآخرون. جرب استعمال زر الكاميرا في شريط العنوان لإصلاح هذه المشكلة.",
"micConstraintFailedError": "لا يوافق المايكروفون لديك بعض القيود المطلوبة.",
"micNotFoundError": "لم يُعثَر على أي مايكروفون",
"micNotSendingData": "اذهب إلى إعدادات حاسوبك لإلغاء كتم المايكروفون وضبط مستواه",
"micNotSendingDataTitle": "كتم ضبط الإعدادات لديك المايكروفون",
"micPermissionDeniedError": "لم تعط إذن استعمال المايكروفون الخاص بك. ما يزال بإمكانك الإنضمام إلى المؤتمر ولكن دون أن يسمعك الآخرون. جرب استعمال زر الكاميرا في شريط العنوان لإصلاح هذه المشكلة.",
"micTimeoutError": "تعذر بدء مصدر الصوت. انقضت المهلة!",
"micUnknownError": "لا يمكن استخدام الميكروفون لسبب غير معروف.",
"moderationAudioLabel": "السماح للحاضرين بإعادة الصوت بأنفسهم",
@@ -341,7 +338,6 @@
"recentlyUsedObjects": "الأشياء المستخدمة مؤخرًا",
"recording": "قيد التسجيل",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "ليس بالإمكان ما دمت قيد البث المباشر",
"recordingDisabledTooltip": "عملية التسجيل معطلة.",
"rejoinNow": "انضم مجدَّدًا الآن",
"remoteControlAllowedMessage": "قبل {{user}} طلب إمكانية التحكم البعيد!",
"remoteControlDeniedMessage": "رفض {{user}} طلب إمكانية التحكم البعيد!",
@@ -507,7 +503,7 @@
"giphyMenu": "تبديل قائمة GIPHY",
"keyboardShortcuts": "اختصارات لوحة المفاتيح",
"localRecording": "اظهِر أو اخفِ التحكم بالتسجيل المحلي",
"mute": "اكتم أو ألغ كتم المجهار (المايكروفون) الخاص بك",
"mute": "اكتم أو ألغ كتم المايكروفون الخاص بك",
"pushToTalk": "اضغط للتحدث",
"raiseHand": "ارفع/اخفض يدك",
"showSpeakerStats": "اظهر حالة مكبر الصوت",
@@ -518,6 +514,10 @@
"toggleShortcuts": "أظهِر/اخفِ اختصارات لوحة المفاتيح",
"videoMute": "ابدأ/أوقف كاميرتك"
},
"largeVideo": {
"screenIsShared": "أنت تشارك شاشتك",
"showMeWhatImSharing": "أرني ما أشاركه"
},
"liveStreaming": {
"busy": "نعمل على تحرير موارد البث. حاول مرة أخرى رجاءً بعض بضعة دقائق.",
"busyTitle": "جميع من يبث الفيديو مشغولون حاليًا",
@@ -647,7 +647,7 @@
"focusFail": "إنَّ {{component}} غير متاح. ستعاد المحاولة مرة أخرى خلال {{ms}} ثانية.",
"gifsMenu": "GIPHY",
"groupTitle": "إشعارات",
"hostAskedUnmute": "The moderator would like you to speak",
"hostAskedUnmute": "يريدك مدير اللقاء أن تتحدث.",
"invitedOneMember": "دُعِي {{name}}",
"invitedThreePlusMembers": "دُعِي {{name}} وعدد {{count}} آخرين",
"invitedTwoMembers": "دُعِي {{first}} و {{second}}",
@@ -708,8 +708,8 @@
"suboptimalBrowserWarning": "نخشى أن لا تكون تجربة المُلتقى جيدة. نعمل على تحسين الكثير من الأمور، لكن ننصحك حتى ذلك الحين باستعمال باستعمال أحد <a href='static/recommendedBrowsers.html' target='_blank'>المتصفحات المدعومة</a>.",
"suboptimalExperienceTitle": "تحذير من المتصفح",
"unmute": "إلغاء الكتم",
"videoMutedRemotelyDescription": "You can always turn it on again.",
"videoMutedRemotelyTitle": "Your video has been turned off by {{participantDisplayName}}",
"videoMutedRemotelyDescription": "يمكنك دائمًا تشغيله مرة أخرى.",
"videoMutedRemotelyTitle": "تم إيقاف الفيديو الخاص بك بواسطة {{participantDisplayName}}",
"videoUnmuteBlockedDescription": "تم حظر عملية إلغاء كتم الكاميرا مؤقتًا بسبب قيود النظام.",
"videoUnmuteBlockedTitle": "تم حظر إعادة الكاميرا!",
"viewLobby": "مشاهدة اللوبي",
@@ -798,7 +798,7 @@
"goodQuality": "رائع! الجودة في تحسن للأفضل!",
"noMediaConnectivity": "لم نتمكن من إيجاد وسيلة لإنشاء اتصال لهذه التجربة، وسبب هذا عائد إلى الجدار الناري أو مترجم عناوين الشبكة NAT في أغلب الأحيان.",
"noVideo": "نتوقع أن تكون جودة الفيديو تعيسة.",
"undetectable": "إن مازلت غير قادر على إجراء اتصالات من المتصفح، ننصح بالتأكد من حالة مكبرات الصوت والمجهار (المايكروفون) والكاميرا، وأنَّك منحت المتصفح إذن الوصول إليها وأن المتصفح محدَّث إلى أحدث إصدار. إن ما زلت تواجه مشاكل في الاتصال بعد ذلك، حاول التواصل مع مطوري تطبيق الويب.",
"undetectable": "إن مازلت غير قادر على إجراء اتصالات من المتصفح، ننصح بالتأكد من حالة مكبرات الصوت والمايكروفون والكاميرا، وأنَّك منحت المتصفح إذن الوصول إليها وأن المتصفح محدَّث إلى أحدث إصدار. إن ما زلت تواجه مشاكل في الاتصال بعد ذلك، حاول التواصل مع مطوري تطبيق الويب.",
"veryPoorConnection": "نتوقع أن تكون جودة الاتصال تعيسة.",
"videoFreezing": "نتوقع حصول جمود في الفيديو أو تحول الصورة للسواد",
"videoHighQuality": "نتوقع أن تكون جودة الفيديو جيدة",
@@ -826,7 +826,7 @@
"joinWithoutAudio": "انضم دون صوت",
"keyboardShortcuts": "تفعيل اختصارات لوحة المفاتيح",
"linkCopied": "نُسِخ الرابط",
"lookGood": "يبدو أن المجهار لديك تعيس",
"lookGood": "يبدو أن الميكروفون لديك سيء",
"or": "أو",
"premeeting": "ما قبل المُلتقى",
"screenSharingError": "خطأ في مشاركة الشاشة:",
@@ -956,7 +956,7 @@
"language": "اللغة",
"loggedIn": "الدخول باسم {{name}}",
"maxStageParticipants": "الحد الأقصى لعدد المشاركين الذين يمكن تثبيتهم في المرحلة الرئيسية",
"microphones": "المجهار (المايكروفون)",
"microphones": "المايكروفون",
"moderator": "رئيس الجلسة",
"more": "المزيد",
"name": "الاسم",
@@ -970,7 +970,7 @@
"screenTitle": "إعدادات",
"selectAudioOutput": "خرج الصوت",
"selectCamera": "الكاميرا",
"selectMic": "المجهار (المايكروفون)",
"selectMic": "المايكروفون",
"selfView": "عرض ذاتي",
"sounds": "اصوات",
"speakers": "المذياع (مكبر الصوت)",
@@ -1033,7 +1033,7 @@
"startupoverlay": {
"genericTitle": "يحتاج المُلتقى إلى استخدام الميكروفون والكاميرا.",
"policyText": " ",
"title": "يريد {{app}} استعمال المجهار والكاميرا خاصَّتك."
"title": "يريد {{app}} استعمال الميكروفون والكاميرا خاصَّتك."
},
"suspendedoverlay": {
"rejoinKeyTitle": "المنطقة",
@@ -1062,6 +1062,7 @@
"document": "اظهِر/اخفِ الملف المشارك",
"download": "نزِّل التطبيق",
"embedMeeting": "ضمِّن المُلتقى",
"endConference": "End meeting for all",
"expand": "وسّع",
"feedback": "أبدِ رأيك",
"fullScreen": "استعمل/اخرج من وضع الشاشة الكاملة",
@@ -1072,6 +1073,7 @@
"invite": "ادعُ آخرين",
"kick": "اطرد مشاركًا",
"laugh": "يضحك",
"leaveConference": "اترك الاجتماع",
"like": "رفع الإبهام متمنيا النجاح",
"linkToSalesforce": "ارتباط إلى Salesforce",
"lobbyButton": "فعِّل/عطِّل وضع غرفة الانتظار",
@@ -1134,6 +1136,7 @@
"download": "نزِّل التطبيق",
"e2ee": "تعمية طرف-لطرف",
"embedMeeting": "ضمِّن المُلتقى",
"endConference": "إنهاء الاجتماع للجميع",
"enterFullScreen": "تعمية طرف-لطرف",
"enterTileView": "عرض بشاشة كاملة",
"exitFullScreen": "أدخل عنوان العرض",
@@ -1146,6 +1149,7 @@
"joinBreakoutRoom": "انضم إلى غرفة الجانبية",
"laugh": "يضحك",
"leaveBreakoutRoom": "اترك إلى غرفة الجانبية",
"leaveConference": "اترك الاجتماع",
"like": "رفع الإبهام متمنيا النجاح",
"linkToSalesforce": "ارتباط إلى Salesforce",
"lobbyButtonDisable": "عطِّل وضع غرفة الانتظار",
@@ -1162,10 +1166,10 @@
"noAudioSignalDescSuggestion": "إن لم تكتمه عمدًا من إعدادات النظام لديك أو من الجهاز نفسه، بدِّله إلى الجهاز الموصى به.",
"noAudioSignalDialInDesc": "يمكن أيضًا الاتصال باستعمال:",
"noAudioSignalDialInLinkDesc": "أرقام الاتصال",
"noAudioSignalTitle": "لا يصلنا شيئًا من المجهار (المايكروفون) الخاص بك",
"noAudioSignalTitle": "لا يصلنا شيئًا من المايكروفون الخاص بك",
"noiseSuppression": "قمع الضوضاء",
"noisyAudioInputDesc": "يبدو أنَّ المجهار (المايكروفون) لديك يصدر الكثير من الضجة، اكتمه رجاءً أو استعمل مجهارًا آخر.",
"noisyAudioInputTitle": "يبدو أنَّ المجهار (المايكروفون) لديك يصدر الكثير من الضجة!",
"noisyAudioInputDesc": "يبدو أنَّ المايكروفون لديك يلتقط الكثير من الضجة، اكتمه رجاءً أو استعمل ميكروفونًا آخر.",
"noisyAudioInputTitle": "يبدو أنَّ المايكروفون لديك يلتقط الكثير من الضجة!",
"openChat": "فتح الدرشة",
"openReactionsMenu": "افتح قائمة التفاعلات",
"participants": "مشاركون",
@@ -1195,7 +1199,7 @@
"stopSharedVideo": "أوقف فيديو يوتيوب المشارك",
"stopSubtitles": "أخفِ الترجمة",
"surprised": "مندهش",
"talkWhileMutedPopup": "أتحاول التحدث؟ المجهار مكتوم لديك.",
"talkWhileMutedPopup": "أتحاول التحدث؟ الميكروفون لديك مكتوم.",
"tileViewToggle": "بدِّل عنوان العرض",
"toggleCamera": "بدِّل الكاميرا",
"undock": "فك في نافذة منفصلة",
@@ -1212,16 +1216,18 @@
"pending": "التحضير لإذاعة المُلتقى...",
"start": "بدء إظهار الترجمة",
"stop": "إيقاف عرض الترجمة",
"subtitles": "ترجمات",
"subtitlesOff": "إيقاف",
"tr": "يذاع"
},
"userMedia": {
"androidGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"chromeGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"edgeGrantPermissions": "اختر <b><i>نعم</i></b> عندما يطلب المتصفح الأذونات.",
"electronGrantPermissions": "امنح إذنًا باستعمال الكاميرا والمجهار (المايكروفون).",
"electronGrantPermissions": "امنح إذنًا باستعمال الكاميرا والمايكروفون.",
"firefoxGrantPermissions": "اختر <b><i>مشاركة الجهاز المحدَّد</i></b> عندما يطل بالمتصفح الأذونات.",
"iexplorerGrantPermissions": "اختر <b><i>تمام</i></b> عندما يطلب المتصفح الأذونات.",
"nwjsGrantPermissions": "امنح إذنًا باستعمال الكاميرا والمجهار (المايكروفون).",
"nwjsGrantPermissions": "امنح إذنًا باستعمال الكاميرا والمايكروفون.",
"operaGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"react-nativeGrantPermissions": "اختر <b><i>السماح</i></b> عندما يطلب المتصفح الأذونات.",
"safariGrantPermissions": "اختر <b><i>تمام</i></b> عندما يطلب المتصفح الأذونات."

View File

@@ -90,7 +90,6 @@
"bitrate": "Бітрэйт:",
"bridgeCount": "Колькасць сервераў: ",
"connectedTo": "Падключаны да:",
"e2e_rtt": "E2E RTT:",
"framerate": "Частата кадраў:",
"less": "Кароткая інфармацыя",
"localaddress_0": "Мясцовы адрас:",

View File

@@ -79,7 +79,6 @@
},
"carmode": {
"actions": {
"leaveMeeting": "Abandona la reunió",
"selectSoundDevice": "Seleccioneu l'aparell d'àudio"
},
"labels": {
@@ -146,7 +145,6 @@
"bridgeCount": "Nombre de servidors: ",
"codecs": "Còdecs (A/V):",
"connectedTo": "Connectat a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Taxa de fotogrames:",
"less": "Menys informació",
"localaddress": "Adreça local:",
@@ -1039,6 +1037,7 @@
"invite": "Convida-hi persones",
"kick": "Expulsa el participant",
"laugh": "Riure",
"leaveConference": "Abandona la reunió",
"like": "Polzes amunt",
"linkToSalesforce": "Enllaç a Salesforce",
"lobbyButton": "Activa o desactiva la sala d'espera",
@@ -1111,6 +1110,7 @@
"joinBreakoutRoom": "Entra a la sala de descans",
"laugh": "Riure",
"leaveBreakoutRoom": "Surt de la sala de descans",
"leaveConference": "Abandona la reunió",
"like": "Polzes amunt",
"linkToSalesforce": "Enllaç a Salesforce",
"lobbyButtonDisable": "Desactiva el mode de sala d'espera",

View File

@@ -108,7 +108,6 @@
"bridgeCount": "Počet serverů: ",
"codecs": "Kodeky (A/V): ",
"connectedTo": "Připojeno k:",
"e2e_rtt": "E2E RTT:",
"framerate": "Rychlost snímkování:",
"less": "Zobrazit méně",
"localaddress_0": "Místní adresa:",

View File

@@ -90,7 +90,6 @@
"bitrate": "Bitrate:",
"bridgeCount": "Server antal: ",
"connectedTo": "Forbundet til:",
"e2e_rtt": "E2E RTT:",
"framerate": "Frame rate:",
"less": "Vis mindre",
"localaddress": "Lokal adresse:",

View File

@@ -11,7 +11,6 @@
"defaultEmail": "Ihre Standard-E-Mail",
"disabled": "Sie können keine Personen einladen.",
"failedToAdd": "Fehler beim Hinzufügen von Personen",
"footerText": "Abgehender Ruf ist deaktiviert.",
"googleEmail": "Google-E-Mail",
"inviteMoreHeader": "Sie sind alleine in der Sitzung",
"inviteMoreMailSubject": "An {{appName}} Meeting teilnehmen",
@@ -79,7 +78,6 @@
},
"carmode": {
"actions": {
"leaveMeeting": "Konferenz verlassen",
"selectSoundDevice": "Audiogerät auswählen"
},
"labels": {
@@ -98,6 +96,7 @@
"messageAccessibleTitleMe": "Ich sage:",
"messageTo": "Private Nachricht an {{recipient}}",
"messagebox": "Nachricht eingeben",
"newMessages": "Neue Nachrichten",
"nickname": {
"popover": "Wähle einen Alias",
"title": "Geben Sie einen Alias zum Chatten ein",
@@ -147,7 +146,6 @@
"bridgeCount": "Serverzahl: ",
"codecs": "Codecs (A/V): ",
"connectedTo": "Verbunden mit:",
"e2e_rtt": "Ende-zu-Ende-Paketumlaufzeit:",
"framerate": "Bildwiederholrate:",
"less": "Weniger anzeigen",
"localaddress": "Lokale Adresse:",
@@ -286,7 +284,6 @@
"linkMeetingTitle": "Konferenz mit Salesforce verlinken",
"liveStreaming": "Livestreaming",
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Während einer Aufnahme nicht möglich",
"liveStreamingDisabledTooltip": "Starten des Livestreams deaktiviert.",
"localUserControls": "Lokale Benutzersteuerung",
"lockMessage": "Die Konferenz konnte nicht gesperrt werden.",
"lockRoom": "Konferenz$t(lockRoomPassword) hinzufügen",
@@ -341,7 +338,6 @@
"recentlyUsedObjects": "Ihre zuletzt verwendeten Objekte",
"recording": "Aufnahme",
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Während eines Livestreams nicht möglich",
"recordingDisabledTooltip": "Start der Aufzeichnung deaktiviert.",
"rejoinNow": "Jetzt erneut beitreten",
"remoteControlAllowedMessage": "{{user}} hat die Anfrage zur Fernsteuerung angenommen!",
"remoteControlDeniedMessage": "{{user}} hat die Anfrage zur Fernsteuerung verweigert!",
@@ -518,6 +514,10 @@
"toggleShortcuts": "Tastenkombinationen ein- oder ausblenden",
"videoMute": "Kamera starten oder stoppen"
},
"largeVideo": {
"screenIsShared": "Ihr Bildschirm wird freigegeben",
"showMeWhatImSharing": "Anzeigen, was freigegeben wird"
},
"liveStreaming": {
"busy": "Es werden Ressourcen zum Streamen bereitgestellt. Bitte in ein paar Minuten erneut versuchen.",
"busyTitle": "Alle Streaming-Instanzen sind in Gebrauch",
@@ -994,12 +994,17 @@
"displayName": "Anzeigename",
"displayNamePlaceholderText": "z.B. Erika Musterfrau",
"email": "E-Mail",
"goTo": "Gehe zu",
"header": "Einstellungen",
"help": "Hilfe",
"links": "Links",
"privacy": "Datenschutz",
"profileSection": "Profil",
"serverURL": "Server-URL",
"showAdvanced": "Erweiterte Einstellungen anzeigen",
"startWithAudioMuted": "Stumm beitreten",
"startWithVideoMuted": "Ohne Video beitreten",
"terms": "Nutzungsbedingungen",
"version": "Version"
},
"share": {
@@ -1056,6 +1061,7 @@
"document": "Geteiltes Dokument schließen",
"download": "Unsere Apps herunterladen",
"embedMeeting": "Konferenz einbetten",
"endConference": "Konferenz für alle beenden",
"expand": "Ausklappen",
"feedback": "Feedback hinterlassen",
"fullScreen": "Vollbildmodus ein-/ausschalten",
@@ -1066,6 +1072,7 @@
"invite": "Person einladen",
"kick": "Person entfernen",
"laugh": "Lachen",
"leaveConference": "Konferenz verlassen",
"like": "Daumen nach oben",
"linkToSalesforce": "Mit Salesforce verlinken",
"lobbyButton": "Lobbymodus ein-/ausschalten",
@@ -1128,6 +1135,7 @@
"download": "Unsere Apps herunterladen",
"e2ee": "Ende-zu-Ende-Verschlüsselung",
"embedMeeting": "Konferenz einbetten",
"endConference": "Konferenz für alle beenden",
"enterFullScreen": "Vollbildmodus",
"enterTileView": "Kachelansicht einschalten",
"exitFullScreen": "Vollbildmodus verlassen",
@@ -1140,6 +1148,7 @@
"joinBreakoutRoom": "In Breakout-Raum wechseln",
"laugh": "Lachen",
"leaveBreakoutRoom": "Breakout-Raum verlassen",
"leaveConference": "Konferenz verlassen",
"like": "Daumen hoch",
"linkToSalesforce": "Mit Salesforce verknüpfen",
"lobbyButtonDisable": "Lobbymodus deaktivieren",
@@ -1206,6 +1215,8 @@
"pending": "Transkribieren des Meetings wird vorbereitet…",
"start": "Anzeige der Untertitel starten",
"stop": "Anzeige der Untertitel stoppen",
"subtitles": "Untertitel",
"subtitlesOff": "Ausschalten",
"tr": "TR"
},
"userMedia": {

View File

@@ -105,7 +105,6 @@
"bitrate": "Ρυθμός μετάδοσης:",
"bridgeCount": "Αριθμός server: ",
"connectedTo": "Συνδεδεμένος με:",
"e2e_rtt": "E2E RTT:",
"framerate": "Ρυθμός ανανέωσης:",
"less": "Δείξε λιγότερα",
"localaddress": "Τοπική διεύθυνση:",

View File

@@ -92,7 +92,6 @@
"bridgeCount": "Server count: ",
"codecs": "Codecs (A/V): ",
"connectedTo": "Connected to:",
"e2e_rtt": "",
"framerate": "Frame rate:",
"less": "Show less",
"localaddress": "Local address:",

View File

@@ -90,7 +90,6 @@
"bitrate": "Bitrate:",
"bridgeCount": "Server count: ",
"connectedTo": "Connected to:",
"e2e_rtt": "E2E RTT:",
"framerate": "Frame rate:",
"less": "Show less",
"localaddress": "Local address:",

View File

@@ -114,7 +114,6 @@
"bridgeCount": "Contador del servidor: ",
"codecs": "Codecs (A/V):",
"connectedTo": "Conectado a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Fotogramas por segundo:",
"less": "Mostrar menos",
"localaddress": "Dirección local:",

View File

@@ -122,7 +122,6 @@
"bridgeCount": "Contador del servidor: ",
"codecs": "Codecs (A/V):",
"connectedTo": "Conectado a:",
"e2e_rtt": "E2E RTT:",
"framerate": "Fotogramas por segundo:",
"less": "Mostrar menos",
"localaddress": "Dirección local:",

View File

@@ -90,7 +90,6 @@
"bitrate": "Andmeedastuskiirus:",
"bridgeCount": "Serverite arv: ",
"connectedTo": "Ühendatud:",
"e2e_rtt": "E2E RTT:",
"framerate": "Ekraani eraldusvõime:",
"less": "Näita vähem",
"localaddress": "Lokaalne aadress:",

View File

@@ -110,7 +110,6 @@
"bridgeCount": "Zerbitzari kopurua: ",
"codecs": "Kodekak (A/B): ",
"connectedTo": "Konektatua hona:",
"e2e_rtt": "E2E RTT:",
"framerate": "Marko-abiadura:",
"less": "Erakutsi gutxiago",
"localaddress": "Helbide lokala:",

View File

@@ -134,7 +134,6 @@
"bridgeCount": "تعداد سرور: ",
"codecs": "کدک‌ها (A/V): ",
"connectedTo": "متصل به:",
"e2e_rtt": "E2E RTT:",
"framerate": "نرخ فریم:",
"less": "خلاصه",
"localaddress": "نشانی داخلی:",

View File

@@ -134,7 +134,6 @@
"bridgeCount": "Nombre de serveurs :",
"codecs": "Codecs (A/V) :",
"connectedTo": "Connecté à :",
"e2e_rtt": "E2E RTT :",
"framerate": "Images par seconde :",
"less": "Cacher les détails",
"localaddress": "Adresse locale :",

View File

@@ -90,7 +90,6 @@
"bitrate": "קצב סיביות:",
"bridgeCount": "מספר שרתים: ",
"connectedTo": "מחובר אל:",
"e2e_rtt": "E2E RTT:",
"framerate": "קצב מסגרת:",
"less": "הצג פחות",
"localaddress": "כתובת מקומית:",

View File

@@ -109,7 +109,6 @@
"bridgeCount": "सर्वर गणना: ",
"codecs": "कोडेक (ए/वी): ",
"connectedTo": "से जुड़ा हुआ है :",
"e2e_rtt": "ई.2ई. आर.टी.टी.:",
"framerate": "फ्रेम दर:",
"less": "कम दिखाएं",
"localaddress": "स्थानीय पता:",

View File

@@ -147,7 +147,6 @@
"bridgeCount": "Broj poslužitelja: ",
"codecs": "Kodeki (A/V): ",
"connectedTo": "Povezan na:",
"e2e_rtt": "E2E RTT:",
"framerate": "Broj sličica u sekundi:",
"less": "Pokaži manje",
"localaddress": "Adresa lokalnog uređaja:",

View File

@@ -79,7 +79,6 @@
},
"carmode": {
"actions": {
"leaveMeeting": "konferencu wopušćić",
"selectSoundDevice": "nastroj za zwuk wuzwolić"
},
"labels": {
@@ -146,7 +145,6 @@
"bridgeCount": "ličba serwera: ",
"codecs": "kody (A/V): ",
"connectedTo": "zwjazane z:",
"e2e_rtt": "E2E RTT:",
"framerate": " wobrazowospjetna frekwenca:",
"less": "mjenje pokazać",
"localaddress": "lokalna adresa:",
@@ -1045,6 +1043,7 @@
"invite": "wobdźělnika přeprosyć",
"kick": " wobdźělnika wuzamknyć",
"laugh": "so smjeć",
"leaveConference": "konferencu wopušćić",
"like": "palc horje",
"linkToSalesforce": "ze Salesforce zwjazać",
"lobbyButton": "lobby-modus zapnyć/hasnyć",
@@ -1117,6 +1116,7 @@
"joinBreakoutRoom": "do breakout rumnosće měnić",
"laugh": "so smjeć",
"leaveBreakoutRoom": "breakout rumnosć wopusćić",
"leaveConference": "konferencu wopušćić",
"like": "palc horje",
"linkToSalesforce": "ze Salesforce zwjazać",
"lobbyButtonDisable": "lobby-modus deaktiwěrować",

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