Compare commits

...

1794 Commits

Author SHA1 Message Date
Raider700
470fda3467 lang: add missing fields to German translation 2020-05-27 11:48:51 +02:00
Saúl Ibarra Corretgé
edea6316ab Update config.js 2020-05-27 08:43:48 +02:00
Saúl Ibarra Corretgé
adac9ee5f8 config: don't enable H.264 by default on P2P
We are not actively testing it and it currently crashes Chrome 83+ when insertable streams are used.
2020-05-27 08:43:48 +02:00
Saúl Ibarra Corretgé
af8bd876e6 deps: run npm audit fix
Skipped webpack, requires further investigation.
2020-05-27 00:16:20 +02:00
Jaya Allamsetty
403c4a7ee7 chore(deps): update lib-jitsi-meet
c94f6a570f
2020-05-26 17:14:21 -04:00
marius-bardan
21fe3c87a6 lang: enable support for romanian lang (#6869)
Co-authored-by: Marius Bardan <marius.bardan@8x8.com>
2020-05-26 15:05:41 +02:00
lorddavidiii
6ddac3bddf debian,turn: fix getting an external ip in IPv6 enabled networks 2020-05-26 13:20:34 +02:00
Mihai Uscat
663a65ad81 fix(SecurityDialog): fix button overflow 2020-05-26 10:22:22 +02:00
marius-bardan
5977f09202 lang: complete Romanian translation
Co-authored-by: Marius Bardan <marius.bardan@8x8.com>
2020-05-26 09:18:38 +02:00
Riccardo Magliocchetti
6be2a8575f lang: update document to match current reality 2020-05-25 17:26:15 +02:00
Suguru Hirahara
0d14e2fa5c gh: update 1-bug-report template
* Update 1-bug-report.md

- Comment out the general notice
- Add the information that questions and posts asking for help will be
closed
- Sort sections based on action stream -- steps, expected behaviour, (yet) actual behaviour
- Replace environment information with server-side and client-side ones

* Update .github/ISSUE_TEMPLATE/1-bug-report.md

Co-authored-by: Saúl Ibarra Corretgé <s@saghul.net>

Co-authored-by: Saúl Ibarra Corretgé <s@saghul.net>
2020-05-25 16:45:21 +02:00
qwertiko GmbH
1e0669d33b lang: fixes for German 2020-05-25 14:40:10 +02:00
Ricardo Brisighelli
d69c2c84d7 lang: update Spanish translation 2020-05-25 14:38:44 +02:00
Suguru Hirahara
0ea7a31b08 lang: add Arabic translation 2020-05-25 14:05:46 +02:00
Oleksa
6284e5fab3 lang: update Ukranian translation 2020-05-25 13:58:17 +02:00
Philip Eriksson
647852bd82 lang: fixes for Swedish 2020-05-25 13:52:15 +02:00
nordlolek
4e0d6e56bc rn,lang: bundle Slovenian translations 2020-05-25 13:46:37 +02:00
Quentí
c02763a29e lang: update for Occitan 2020-05-25 13:45:17 +02:00
Vangelis Zacharioudakis
0b8ec5a342 lang: add Greek language translation 2020-05-25 13:40:36 +02:00
huzaifahj
1a4be30ea1 lang: make "OK" capitalization consistent 2020-05-25 13:24:06 +02:00
tolgakaratas
d53d6e5fa8 lang,rn: bundle Turkish language 2020-05-25 13:20:54 +02:00
zzoond
93b05d13c3 lang: fix for russian 2020-05-25 11:27:50 +02:00
Michael Telatynski
79f4531bd2 lang: allow translation of accessibility label string "Edit your profile" 2020-05-25 11:26:25 +02:00
Jaya Allamsetty
5348fa19c8 feat: show option to join via browser on supported mobile browsers
Currently Chromium based browsers and Firefox are supported on Android
Only Safari is supported on iOS
2020-05-22 10:52:59 -04:00
Felix C. Stegerman
b25319fd2e add missing build dependency on nodejs 2020-05-21 10:29:36 -05:00
Felix C. Stegerman
63ca419e76 improve "open in app" page 2020-05-21 08:39:17 -04:00
Jonathan Lennox
393fb692ca Make TLS configs in Debian sample files follow Mozilla security guidelines. 2020-05-20 12:03:41 -05:00
JB BUGEAUD
735b686b98 Update of main fr translation (#6141)
* Update of main fr translation

Correct some non french sounding sentenses.  One example welcomepage.title, before "fully featured" was translated as "entièrement en vedette"  (which is gibberish) and now "riche en fonctionnalités".

* Fixing typo

Fixing missing comma

* Another typo fix

Yet another missing comma fixed.
2020-05-20 11:29:06 -05:00
Bettenbuk Zoltan
0598e7369b ref: eslint-config-jitsi@1.0.3 2020-05-20 17:14:29 +02:00
Suguru Hirahara
8c30e43b5f Retry "external_api: fixed using deeplinks"
Set target='_top' inside anchor.

Courtesy of #6700
Follow-up to: #6784
2020-05-20 10:18:29 -04:00
Mihai Uscat
75c836c70c feat(AddPeopleDialog): Update design; feat(SecurityDialog): Implement 2020-05-20 16:14:47 +02:00
Saúl Ibarra Corretgé
70d8fe91c3 deps: replace jsrsasign
We were only using a couple of utility functionss to parse tokens, not to
validate them in any way.
2020-05-20 15:06:19 +02:00
Julian1203
c6d5e103f5 lang: fixes for German 2020-05-20 12:20:56 +02:00
christian-sh
7f1f92cdf0 lang: fix passwordLabel translation in German
The former translation contained a typo and incorrect grammar.
2020-05-20 12:15:32 +02:00
Suguru Hirahara
8c02ba5ee9 doc: update README.md
- Fix a broken link (fixes #6780)
- Set direct links
- Add a link to the Docker installation guide
2020-05-20 08:07:32 +02:00
Jaya Allamsetty
5591144693 Revert "external_api: fixed using deeplinks"
This breaks the mobile deeplinking page
This reverts commit 532dadb245.
2020-05-19 16:43:10 -04:00
damencho
fa43539718 chore(deps): lib-jitsi-meet, skips sending an extra presence on join. 2020-05-19 15:39:20 -05:00
Jaya Allamsetty
7e0a36e88e chore(deps): Update lib-jitsi-meet
fix(Firefox): Enable RTX support on Firefox
E2EE fixes/improvements
fix(screenshare): Add google conference flag only when simulcast is on
fix(video-quality): Apply pending video constraints on p2p originator
2020-05-19 12:28:05 -04:00
msalmasi
532dadb245 external_api: fixed using deeplinks
This update opens links in the full body of the window so deeplinks will work on iOS Safari when using the external API in an iFrame.
2020-05-19 14:09:42 +02:00
Felix C. Stegerman
55051cc203 dev: don't proxy /lang/ 2020-05-19 11:58:21 +02:00
Vlad Piersec
4975f15345 fix(prejoin_page): Always show 'join without audio' & add disabled button.
* The prejoin page always displays the 'join without audio' option.
* The join button will be disabled if there is no input.
* Fix some CSS for the case when the user is not anonymous.
2020-05-19 11:47:55 +02:00
Alejandro Blanco
2e2d40c1d0 external-api: add muteEveryone command 2020-05-19 08:50:21 +02:00
Bettenbuk Zoltan
c08638da51 feat: insecure room name warning 2020-05-18 17:59:07 +02:00
Bettenbuk Zoltan
9525cab60f feat: icon type circular label 2020-05-18 17:59:07 +02:00
Bettenbuk Zoltan
21d5c895fc fix: package.lock version mismatch 2020-05-18 16:30:24 +02:00
Saúl Ibarra Corretgé
305a63e8f9 deep-linking: fix generating links for external API
The ocnfig is not overridden early enough.

Fixes: https://github.com/jitsi/jitsi-meet/issues/6489
2020-05-18 16:06:13 +02:00
Emil Ivov
2fef06772b Merge pull request #6755 from saghul/e2ee-label
e2ee: update padlock label tooltip
2020-05-18 07:51:37 -05:00
Vlad Piersec
b2895b7095 feat(prejoin_page): Add ability for guest to join audio by phone 2020-05-18 14:47:44 +02:00
Saúl Ibarra Corretgé
41dc14d30c e2ee: update padlock label tooltip 2020-05-18 14:12:00 +02:00
Suguru Hirahara
2ddfead4f5 doc: fix links on README 2020-05-18 11:53:58 +02:00
Saúl Ibarra Corretgé
d55b49b2c3 doc: move mobile docs to the handbook 2020-05-18 11:44:53 +02:00
Saúl Ibarra Corretgé
64d74852e0 ios: fix PiP window sshowing conference controls
The dynamic size of it was causing trouble. Fix it by setting a fixed PiP window
size (150px) which makes it consisstent with what we have on Android.

Fixes: https://github.com/jitsi/jitsi-meet/issues/6562
2020-05-18 09:34:52 +02:00
Saúl Ibarra Corretgé
7c4c8384fd doc: replace documentation with the handbook
- Leave a link on doc/README,api,quick-install
- Moved the cloud API swagger file to resources/
- Merged the coding conventions with CONTRIBUTING.md
2020-05-17 08:02:29 +02:00
Hristo Terezov
262e855260 fix: recommended browser page link. 2020-05-15 15:06:41 -05:00
Jaya Allamsetty
3f679407a9 fix(video-quality): Get rid of the video qaulity warning for p2p
It is now possible to change the sender video quality for p2p calls as well
2020-05-15 09:49:55 -04:00
Saúl Ibarra Corretgé
4faeb84d2e build: fix using parallell make
We don't support it, so make sure targets run serially.

Fixe: https://github.com/jitsi/jitsi-meet/issues/6647
2020-05-14 11:14:43 +02:00
Philipp Hancke
eed5e31ec9 Merge pull request #6061 from jitsi/npmrc
dev: add npmrc with package-lock set to true
2020-05-14 10:17:27 +02:00
Felix C. Stegerman
4b1d8ba877 update react-emoji-render to v1.2.4 (#6674) 2020-05-13 21:14:27 +02:00
NicolasD
3043f50ce3 rn,flags: add "toolbox.alwaysVisible" flag 2020-05-13 16:25:06 +02:00
Saúl Ibarra Corretgé
b7f1f3c659 ios: try to leave the meeting when the app is terminating
Fixes: https://github.com/jitsi/jitsi-meet/issues/6665
2020-05-13 16:21:38 +02:00
tmoldovan8x8
07f64d94c0 android: set view listener in onCreate 2020-05-13 10:56:37 +02:00
Boris Grozev
76e1217439 ref: Make is_healthcheck_room more generic. 2020-05-12 18:22:14 -05:00
crouchingtigerhiddenadam
591ea0a44a doc: quick install guide updates
* optional fix for https port 5284 error

https://community.jitsi.org/t/no-certificate-present-in-ssl-tls-configuration-for-https-port-5284/47836/7

* usage of sudo and systemctl made more consistent

* jigasi download url changed to stable

Jigasi download url changed. Is this required in addition to apt install jigasi as part of the quick install guide?

* wget/dpkg removed from jagasi instructions
2020-05-12 16:32:37 +02:00
Edgard Messias
24052e9f9a fix: Fixed browser language detect (close #5987) 2020-05-12 09:26:53 -05:00
bgrozev
38b8772af0 docs: Fix video tutorial links. (#6655) 2020-05-11 11:23:35 -05:00
Mihai Uscat
5fdb7c176c feat(MobileDeepLinking): Enable custom deeplinking domain 2020-05-11 15:33:10 +02:00
Saúl Ibarra Corretgé
a8da6d4095 lang: improve Basque translation
Thanks @irontec, @librezale and @arraintxo for working on it!
2020-05-11 15:32:31 +02:00
Saúl Ibarra Corretgé
01fc098d4b prejoin: fixup mobile
Avoid importing components, which are not yet implemented on mobile.
2020-05-11 14:15:55 +02:00
Saúl Ibarra Corretgé
b50b30e3eb doc: recommend Node 12 2020-05-11 13:51:00 +02:00
Wuriyanto
1b8e5d0244 change cjson to cjson.safe and cath error from decode function 2020-05-11 05:46:07 -05:00
Vlad Piersec
908712b96f feat(prejoin_page): Rework prejoin page
* Add a checkbox for skipping the prejoin page on next use. (This is hidden for
now, until we also have a settings entry for it).
* Rework 'Join by Phone' buttons and add new overlay.
* Update the device status accordingly if there were errors while adding
devices.
* The input is filled with the display name if there was one previously used.
* Join the meeting on 'Enter' press.
2020-05-11 10:59:52 +02:00
Goacid
a41bda73ff doc: add more details about systemd limits 2020-05-11 09:33:50 +02:00
Fabian Rodriguez
75ea0070e2 lang: improve frCA 2020-05-11 09:23:53 +02:00
Saúl Ibarra Corretgé
65a8091e53 android: simplify code
- No need to handle the activity result in the fragment, since we already do in
  the Activity
- Automagically ddispose the view when destroyed
2020-05-10 08:03:29 +02:00
Saúl Ibarra Corretgé
7fea8e2e6c android: suppress lint warning 2020-05-10 08:03:29 +02:00
Hristo Terezov
d388a7bd3c feat(reload): Preserve local track mute state. 2020-05-07 18:18:21 -05:00
Jaya Allamsetty
a48aa2b999 feat(external_api): Add command for setting send/recv video quality 2020-05-07 18:10:41 -04:00
tmoldovan8x8
b3f16926d4 rn: add ability to disable crash reporting 2020-05-07 23:05:48 +02:00
Paweł Domas
f646bc7a7a ref: disable ICE restart by default (#6594)
* ref: disable ICE restart by default

The reason for that it's currently causing issues with signaling when
Octo is enabled. Also when we do an "ICE restart"(which is not a real
ICE restart), the client maintains the TCC sequence number counter, but
the bridge resets it. The bridge sends media packets with TCC sequence
numbers starting from 0.

The 'enableIceRestart' config option can be used to force it, but it's
not recommended.
2020-05-07 06:59:37 -05:00
Andrey Nedobylsky
e90b60d661 lang: fix Russian translation
Fixed Russian translation for audioVideoSwitch
2020-05-07 11:39:59 +02:00
ludovicm67
bdd129b9a2 feat(analytics): include MatomoHandler by default 2020-05-06 15:32:49 +02:00
ludovicm67
4c635a2a63 feat(analytics): add Matomo support 2020-05-06 15:32:49 +02:00
Saúl Ibarra Corretgé
2b526557e4 participants: fix accessing the local participant ID
getLocalParticipant returns a participant object stored in Redux, not a
JitsiParticipant object.
2020-05-06 15:27:08 +02:00
Saúl Ibarra Corretgé
eee1f50ed2 deps: update lib-jitsi-meet
Fix losing media when using insertable streams on track changes.
2020-05-06 09:20:16 -04:00
Saúl Ibarra Corretgé
e9562adddf lang: add Basque to the list of available languages 2020-05-06 14:53:11 +02:00
patidars
8accd9e433 rn,flags: feature flag to show/hide 'Tile View' button 2020-05-06 14:22:59 +02:00
Saúl Ibarra Corretgé
caabdadf19 rn,polyfills: refactor all mobile polyfills
Move all polyfills to a standalone feature, which gets imported before anything
else in the mobile entrypoint. This guarantees that any further import sees the
polyfilled environment.
2020-05-06 12:35:12 +02:00
Saúl Ibarra Corretgé
062bc13d4f rn,storage: fix not using a persistent localStorage
In
1ffd75c0a6
we switched to using the localStorage wrapper provided by js-utils, which
checks for window.localStorage's availability very early. Our polyfill must be
applied earlier that any such import.

Here we are importing it in the entrypoint, which means no code ran before this,
literally.
2020-05-06 12:35:12 +02:00
ktagbnaw
a56e451536 misc: fix typo 2020-05-06 09:50:11 +02:00
Jim Bullington
acbf641fb4 Add participantRoleChanged event to external API (#6573)
* Add participantRoleChanged event to external API

* Update API documentation

* Remove unneeded whitespace

* Remove more unneeded whitespace

* Fix jsdoc formatting

* Fix jsdoc formatting
2020-05-05 09:03:54 -05:00
patidars
a18fd1cdb3 rn,flags: add feature flag to show/hide the 'Raise Hand' button 2020-05-04 18:22:45 +02:00
Saúl Ibarra Corretgé
9be78c60eb rn,lang: fix language detection to take region into account
If we have a regional variant, prefer that.
2020-05-04 16:59:37 +02:00
Vlad Piersec
a45cbf41ef feat(prejoin_page): Add prejoin page 2020-05-04 12:49:35 +02:00
Emil Ivov
5b53232964 Merge pull request #6547 from jitsi/fix-mobile-imports
chore(package): update dependencies.
2020-05-02 22:26:21 -05:00
Hristo Terezov
d4d4490aa9 chore(package): update dependencies. 2020-05-02 22:10:54 -05:00
Emil Ivov
0fd0897531 Merge pull request #6529 from jitsi/local-storage
fix(localStorage): exception when disabled.
2020-05-02 19:39:07 -05:00
Hristo Terezov
360383440e chore(package): Update dependencies. 2020-05-02 19:36:28 -05:00
Rich Brown
1a40672427 Fix the command to update jitsi-stable.list (#5731)
* Fix the command to update jitsi-stable.list

This command uses the technique recommended below that will always work. (See "Safest Solution (#3)") 

https://askubuntu.com/questions/185268/permission-denied-etc-apt-sources-list

* Update quick-install.md

remove "-a" argument from `tee`  to remove merge conflict
2020-05-02 07:50:34 +02:00
Hristo Terezov
1ffd75c0a6 fix(localStorage): exception when disabled. 2020-05-01 14:48:08 -05:00
Julian1203
77d38731e9 Update main-de.json
Fixed typo
2020-05-01 10:25:21 -05:00
Hristo Terezov
13f76c2cce fix(follow-me): disable the auto pin on SS 2020-04-30 16:58:22 -05:00
Jaya Allamsetty
9ad87f3706 fix: Add safari to optimal browser lists 2020-04-30 17:39:07 -04:00
damencho
eea8fef044 Initial Lobby backend implementation. 2020-04-30 16:34:46 -05:00
Jaya Allamsetty
c2cb4ea6b6 deps: update ljm 2020-04-30 15:29:04 -04:00
Jaya Allamsetty
d6cf0c0afd deps: bump lib-jitsi-meet 2020-04-30 12:56:31 -04:00
Fabian Rodriguez
f5faf5bbaa Update main-es.json
Added missing strings for Mute Everyone feature, other small fixes.
2020-04-30 10:16:05 -05:00
Valso
363982fad4 Update languages-eo.json
Add correct translation for  "el": "Greka",
2020-04-30 10:15:37 -05:00
Julian1203
62f47d5b87 Update main-de.json
Small improvement
2020-04-30 10:15:14 -05:00
Julian1203
223e8560ca lang: fixes for German 2020-04-30 14:44:06 +02:00
tmoldovan8x8
2085851179 android: persist Amplitude device id when not set externally
Co-authored-by: Titus-Andrei Moldovan <moldovan.titus@gmail.com>
2020-04-30 13:12:09 +02:00
Ferdi Bayrak
47bc6f0470 Added Turkish language on BuiltinLanguages.native.js (#5965)
* Added Turkish lang

Added Turkish lang

* Update BuiltinLanguages.native.js

* Update BuiltinLanguages.native.js
2020-04-29 16:27:37 -05:00
Tao Sasaki
c5686386fa Fix strange Japanese text (#6303) 2020-04-29 15:41:34 -05:00
adrmzz
e1cededb76 Adding Sardinian (#5984)
* Create main-sc.json

* Create languages-sc.json

* Update languages.json

* Update main-sc.json

(just a couple of minor edits to the translation)

* Update BuiltinLanguages.native.js

adding Sardinian

* trailing spaces corrected

* Update BuiltinLanguages.native.js

* Update BuiltinLanguages.native.js

fixed spaces

* Update main-sc.json
2020-04-29 14:07:51 -05:00
t7yang
268dc33324 polish zh-TW translation (#5678)
* polish zh-TW translation

Fix typos, use the correct and localize terms, replace some translations to make it fluent for native speaker.

* fix syntax error
2020-04-29 11:19:59 -05:00
Oleksa
baaf55a2ab Update languages.json 2020-04-29 10:30:27 -05:00
James Baird
a8252103ea Fix grammar on unsupported browser message
It should read "Chrome or Firefox" not "Chrome and Firefox", as you only need to use a single browser, not both.
2020-04-29 10:30:06 -05:00
zibens
b0ab51af90 Add files via upload
Introducing Latvian language, to make it more widespread in Latvia
2020-04-29 10:29:08 -05:00
tzagim
69b20cd945 Add Hebrew Translation & Fix TYPO (#5907)
* Create languages-he.json

Hebrew list languages

* Update languages-he.json

TYPO

* Update main-he.json

1/5

* Update main-he.json

2/5

* Update main-he.json

4/5

* Update main-he.json

Pause

* Update main-he.json

* Update main-he.json

Finish

* Update main.json

TYPO

* Update main.json

TYPO

* Update main.json

TYPO

* Update main-he.json

Add missing strings

* Update languages-he.json
2020-04-29 10:26:31 -05:00
ariadi
8bb0141c1a Translation in Indonesian (#5913)
* Add Indonesian

* Indonesian translation

* Update languages-id.json

* Create main-id.json

* Update languages-id.json

* Update main-id.json

* Update main-id.json
2020-04-29 10:25:56 -05:00
James.zhu
ed766c6fe2 Update main-zhCN.json
I will update the files for some mistakes in chinese. I would late update whole file in chinese.
2020-04-29 10:25:05 -05:00
chipechop
d883bae925 Update main-it.json
Simplified Mobile mani menu, with more fluent wording.
2020-04-29 10:23:21 -05:00
Joan Montané
62d3d1f294 Update BuiltinLanguages.native.js 2020-04-29 10:22:59 -05:00
Joan Montané
dbfed573ac Add Catalan entry on BuiltinLanguages.native.js 2020-04-29 10:22:59 -05:00
Daniel Neumann
640b9bfd52 added missing translations 2020-04-29 10:20:26 -05:00
Saúl Ibarra Corretgé
dac6d9d63c aandroid: raise SDK version 2020-04-29 17:20:11 +02:00
Daniel Ortega
0662da58b4 Fixing wrong translation in muteParticipantButton button 2020-04-29 10:20:04 -05:00
Daniel Ortega
d7d4ea819f Adding missing question mark 2020-04-29 10:20:04 -05:00
Daniel Ortega
2c6cac6526 Adding mute action related missing translations in spanish 2020-04-29 10:20:04 -05:00
Milan Kral
f53251f104 Enable Slovak translation.
Add Slovak translation to BuiltinLanguages

Follow up to #5523
2020-04-29 10:19:40 -05:00
Jelrik van Hal
8e01f769d9 Adds Dutch translation for "toolbar.muteEveryone" 2020-04-29 10:19:21 -05:00
Özcan Oğuz
8c4656a3c8 Wrong translation fixed 2020-04-29 10:18:36 -05:00
cayenne17
a5a36aa1e1 lang: translation improvements for French 2020-04-29 10:18:16 -05:00
Saúl Ibarra Corretgé
6939939a0f deps: update lib-jitsi-meet
Fixes mobile when importing E2EE.
2020-04-29 17:17:22 +02:00
Marc Laporte
c60671e008 Fix a typo 2020-04-29 10:16:59 -05:00
Valso
8e4e1f139a Update languages-eo.json 2020-04-29 10:16:38 -05:00
Anugoon Chotigarn
b608051177 Add Thailand (th) translation 2020-04-29 10:16:18 -05:00
Дамян Минков
2dad7e920b Merge weblate translations (#6461)
* Translated using Weblate (French)

Currently translated at 96.1% (646 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 96.7% (650 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 96.7% (650 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 96.7% (650 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.6% (663 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.6% (663 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.5% (662 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.5% (662 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.6% (663 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.6% (663 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 99.2% (667 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 99.2% (667 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.9% (665 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 99.1% (666 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 99.1% (666 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French)

Currently translated at 98.9% (665 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (Italian)

Currently translated at 75.0% (24 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/it/

* Translated using Weblate (German)

Currently translated at 98.9% (665 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/de/

* Translated using Weblate (German)

Currently translated at 98.9% (665 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/de/

* Translated using Weblate (German)

Currently translated at 98.9% (665 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/de/

* Translated using Weblate (German)

Currently translated at 98.9% (665 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/de/

* Translated using Weblate (Russian)

Currently translated at 97.7% (657 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ru/

* Translated using Weblate (Russian)

Currently translated at 97.7% (657 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ru/

* Translated using Weblate (German)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/de/

* Translated using Weblate (German)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/de/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/hu/

* Translated using Weblate (Swedish)

Currently translated at 84.8% (570 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.8% (570 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 81.5% (548 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 81.8% (550 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 81.9% (551 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 81.9% (551 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 81.9% (551 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 82.1% (552 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 82.1% (552 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 82.2% (553 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 82.2% (553 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 83.4% (561 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 83.4% (561 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.3% (567 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.3% (567 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.5% (568 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.9% (571 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.9% (571 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.9% (571 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 84.9% (571 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 85.1% (572 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 85.1% (572 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 85.2% (573 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 85.2% (573 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 86.0% (578 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 86.0% (578 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 85.7% (576 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 86.3% (580 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 86.3% (580 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 86.7% (583 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 86.7% (583 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 87.7% (590 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 87.7% (590 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 86.9% (584 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 87.6% (589 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 91.5% (615 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 91.5% (615 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 88.8% (597 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 88.8% (597 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 90.9% (611 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 90.9% (611 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 90.9% (611 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 90.9% (611 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 91.3% (614 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Swedish)

Currently translated at 91.3% (614 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Basque)

Currently translated at 38.0% (256 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 38.6% (260 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 38.8% (261 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 39.2% (264 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 39.2% (264 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 39.5% (266 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 39.8% (268 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 40.1% (270 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 41.0% (276 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 41.3% (278 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 41.2% (277 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 41.8% (281 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 42.1% (283 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 43.3% (291 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 43.3% (291 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 43.7% (294 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 44.0% (296 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 44.1% (297 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 44.1% (297 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 44.3% (298 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 44.4% (299 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 44.9% (302 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 45.3% (305 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 45.5% (306 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 45.6% (307 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 45.6% (307 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 45.8% (308 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 46.1% (310 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 46.4% (312 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 46.7% (314 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 46.8% (315 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 47.1% (317 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 47.1% (317 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 47.4% (319 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 48.2% (324 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 47.9% (322 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 48.2% (324 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 48.2% (324 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 49.5% (333 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 48.9% (329 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 50.1% (337 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 50.2% (338 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 50.0% (336 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 50.4% (339 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 51.6% (347 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 51.1% (344 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 50.8% (342 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 51.1% (344 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 52.5% (353 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 51.7% (348 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 52.8% (355 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 51.9% (349 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 52.3% (352 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 54.4% (366 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 53.7% (361 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 53.8% (362 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 54.9% (369 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 54.4% (366 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 54.7% (368 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 93.8% (631 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/zh_Hant/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 93.8% (631 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/zh_Hant/

* Translated using Weblate (Basque)

Currently translated at 55.8% (375 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 56.8% (382 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 55.9% (376 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 57.7% (388 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 57.7% (388 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 58.9% (396 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 57.8% (389 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 58.1% (391 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 60.4% (406 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.0% (410 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 59.5% (400 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 59.9% (403 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 60.7% (408 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.0% (410 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 60.8% (409 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.7% (415 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.1% (411 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.0% (410 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.9% (416 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 62.6% (421 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.3% (412 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.7% (415 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 62.0% (417 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 62.2% (418 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 61.9% (416 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 62.2% (418 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 62.3% (419 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 62.3% (419 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 63.2% (425 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 63.3% (426 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 63.3% (426 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 63.5% (427 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 64.4% (433 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 63.9% (430 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 64.8% (436 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 64.8% (436 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 64.5% (434 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 65.7% (442 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 65.0% (437 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 66.2% (445 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 65.9% (443 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 66.2% (445 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 66.3% (446 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 67.1% (451 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 67.8% (456 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 67.5% (454 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 67.5% (454 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 69.7% (469 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 69.6% (468 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 70.0% (471 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 70.2% (472 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 70.5% (474 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Galician)

Currently translated at 93.8% (631 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/gl/

* Translated using Weblate (English (United Kingdom))

Currently translated at 91.3% (614 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/en_GB/

* Translated using Weblate (English (United Kingdom))

Currently translated at 91.3% (614 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/en_GB/

* Translated using Weblate (English (United Kingdom))

Currently translated at 86.4% (581 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/en_GB/

* Translated using Weblate (English)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/en/

* Translated using Weblate (Afrikaans)

Currently translated at 63.6% (428 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/af/

* Translated using Weblate (Bulgarian)

Currently translated at 98.5% (662 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/bg/

* Translated using Weblate (Catalan)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ca/

* Translated using Weblate (Czech)

Currently translated at 72.1% (485 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Danish)

Currently translated at 94.7% (637 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/da/

* Translated using Weblate (German)

Currently translated at 98.9% (665 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/de/

* Translated using Weblate (Esperanto)

Currently translated at 42.1% (283 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eo/

* Translated using Weblate (English (United Kingdom))

Currently translated at 88.8% (597 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/en_GB/

* Translated using Weblate (Spanish)

Currently translated at 95.6% (643 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/es/

* Translated using Weblate (Spanish (American))

Currently translated at 97.3% (654 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/es_US/

* Translated using Weblate (Spanish)

Currently translated at 95.6% (643 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/es/

* Translated using Weblate (Estonian)

Currently translated at 98.2% (660 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/et/

* Translated using Weblate (Finnish)

Currently translated at 80.6% (542 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fi/

* Translated using Weblate (French)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr/

* Translated using Weblate (French (Canada))

Currently translated at 93.6% (629 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/fr_CA/

* Translated using Weblate (Galician)

Currently translated at 94.4% (635 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/gl/

* Translated using Weblate (Croatian)

Currently translated at 53.7% (361 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/hr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/hu/

* Translated using Weblate (Armenian)

Currently translated at 36.4% (245 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/hy/

* Translated using Weblate (Italian)

Currently translated at 84.8% (570 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/it/

* Translated using Weblate (Japanese)

Currently translated at 70.8% (476 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ja/

* Translated using Weblate (Kabyle)

Currently translated at 20.5% (138 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/kab/

* Translated using Weblate (Korean)

Currently translated at 52.8% (355 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ko/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 73.0% (491 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/nb_NO/

* Translated using Weblate (Dutch)

Currently translated at 86.7% (583 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/nl/

* Translated using Weblate (Occitan)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/oc/

* Translated using Weblate (Polish)

Currently translated at 90.3% (607 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/pl/

* Translated using Weblate (Occitan)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/oc/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.1% (666 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/pt_BR/

* Translated using Weblate (Russian)

Currently translated at 97.9% (658 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ru/

* Translated using Weblate (Slovak)

Currently translated at 19.6% (132 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sk/

* Translated using Weblate (Slovenian)

Currently translated at 14.8% (100 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sl/

* Translated using Weblate (Swedish)

Currently translated at 93.4% (628 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sv/

* Translated using Weblate (Turkish)

Currently translated at 48.3% (325 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/tr/

* Translated using Weblate (Turkish)

Currently translated at 48.3% (325 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/tr/

* Translated using Weblate (Vietnamese)

Currently translated at 82.2% (553 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/vi/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 85.2% (573 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/zh_Hans/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/ca/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/zh_Hant/

* Translated using Weblate (German)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/de/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/es/

* Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/en_GB/

* Translated using Weblate (French)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/fr/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/fi/

* Translated using Weblate (French (Canada))

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/fr_CA/

* Translated using Weblate (Italian)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/it/

* Translated using Weblate (Galician)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/gl/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/tr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 56.2% (18 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/nb_NO/

* Translated using Weblate (Occitan)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/oc/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/sv/

* Translated using Weblate (Icelandic)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/is/

* Translated using Weblate (Sardinian)

Currently translated at 99.1% (666 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sc/

* Translated using Weblate (Ukrainian)

Currently translated at 97.9% (658 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/uk/

* Translated using Weblate (Belarusian)

Currently translated at 95.0% (639 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/be/

* Translated using Weblate (Basque)

Currently translated at 74.1% (498 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (English (United Kingdom))

Currently translated at 89.2% (600 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/en_GB/

* Translated using Weblate (Basque)

Currently translated at 86.1% (579 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

* Translated using Weblate (Basque)

Currently translated at 87.5% (588 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/eu/

Co-authored-by: anonymous <noreply@weblate.org>
Co-authored-by: Jeannette L <j.lavoie@net-c.ca>
Co-authored-by: Artem <KovalevArtem.ru@gmail.com>
Co-authored-by: Gyuris Gellért <bubu@ujevangelizacio.hu>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Leif-Jöran Olsson <info@friprogramvarusyndikatet.se>
Co-authored-by: khalasa47 <khalash@protonmail.com>
Co-authored-by: BiziA <adrianpena.hf@gmail.com>
Co-authored-by: Osoitz <oelkoro@gmail.com>
Co-authored-by: 麋悟BigELK176 <bigelk176@gmail.com>
Co-authored-by: Iñigo Zendegi Urzelai <izendegi@gmail.com>
Co-authored-by: Ciarán Ainsworth <ciaranainsworth@posteo.net>
Co-authored-by: BMN <weblate@yopmail.com>
Co-authored-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Co-authored-by: Xosé M <xosem@disroot.org>
Co-authored-by: Quentin PAGÈS <quentinantonin@free.fr>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Joan Montané <joan@montane.cat>
2020-04-29 10:15:22 -05:00
Daniil Gentili
be2d20e20e doc: fix echo when running with sudo 2020-04-29 14:57:21 +02:00
Potecaru Tudor
fd11c36bc3 fix: guard for cases where user hits leave before being connected to the room
Co-authored-by: Tudor-Ovidiu Avram <tudor.potecaru@8x8.com>
2020-04-29 14:52:44 +02:00
Saúl Ibarra Corretgé
60148b6439 interface_config: add trailing commas and end marker 2020-04-29 13:07:55 +02:00
Saúl Ibarra Corretgé
62b4c97423 rn: raise SDK version to 2.8.1 2020-04-29 11:44:17 +02:00
Saúl Ibarra Corretgé
f08fa1e374 deps: update lib-jitsi-meet 2020-04-29 11:33:42 +02:00
Saúl Ibarra Corretgé
e5b563ba46 rn,flags: add more feature flags to toggle specific behavior
- Invite funcionality (altogether)
- Recording
- Live streaming
- Meeting name
- Meeting password
2020-04-29 10:19:17 +02:00
Pablo Espinosa
c41047344f lang: fixes for Spanish translation 2020-04-29 10:04:49 +02:00
Saúl Ibarra Corretgé
6ae148403d misc: drop the pre-commit hook
GH Actions now runs the linter.
2020-04-28 17:43:11 +02:00
Jaya Allamsetty
b5676c3729 feat(video-quality):control sender resolution based on user pref 2020-04-28 10:17:06 -04:00
drimovecz
3ab6b97b8b Added module for filtering transcription requests from presence stanz… (#6404)
* Added module for filtering transcription requests from presence stanzas when the users making the requests do not have access to the transcription feature

* Add comments explaining the functionality and configuration for the transcription filtering module.

Co-authored-by: drimovecz <daniel.rimovecz@8x8.com>
2020-04-28 09:11:58 -05:00
Saúl Ibarra Corretgé
5ea8e198c7 e2ee: add label if all participants have E2EE enabled 2020-04-28 16:11:39 +02:00
Saúl Ibarra Corretgé
2ad6bfbc20 e2ee: broadcast e2ee enabled status using presnce 2020-04-28 16:11:39 +02:00
Saúl Ibarra Corretgé
6ce27ef10d misc: set worker names 2020-04-28 12:02:58 +02:00
Ricardo Santana
93ef8495ca fix locale detect error on mobile apps (#5956) 2020-04-27 17:38:57 +02:00
Hristo Terezov
94a15914d0 fix(document.title): use URL decoded room name. 2020-04-25 10:27:47 -05:00
Hristo Terezov
851976ebdf fix(RemoteVideo): .oncanplay -> addEventListener
Replaces the .oncanplay listener with addEventListener('canplay', ...).
This is needed because third party libraries (for example callstats)
are brutally overriding the .oncanplay property and replacing our
listener.
2020-04-24 16:04:32 -05:00
Ruben Kerkhof
57bb2ead36 Conference timer should start counting at 0
It's starting at 1 hour because os.time(os.date("!*t") returns the wrong
time depending on system timezone. os.time() already returns the number
of seconds since epoch in UTC so just use that.

Fixes #5595
2020-04-23 10:22:02 -05:00
Saúl Ibarra Corretgé
027c6ddad0 fastlane,ios: make contact information configurable 2020-04-23 12:43:59 +02:00
Emil Ivov
8648a5a998 Redirect security section to jitsi.org/security 2020-04-22 12:58:18 -05:00
Julian1203
c83b30558d lang: fixes for German 2020-04-22 15:44:09 +02:00
Julian1203
057dfc8194 lang: fixes for German 2020-04-22 15:42:18 +02:00
Fabian Rodriguez
5eae0b58e9 lang: fixes for Spanish (US) 2020-04-22 15:40:57 +02:00
Fabian Rodriguez
1538107e93 lang: fixes for Spanish translation 2020-04-22 15:28:46 +02:00
Bettenbuk Zoltan
cd1862a2d3 fix: private message open 2020-04-22 12:09:07 +02:00
Eduard Itrich
147a076f5d doc: fixed typo in port number of jicofo 2020-04-22 10:57:34 +02:00
Hristo Terezov
9bdaea4069 fix(avatar): use text instead of foreign object.
Reason: On Safari the foreign object is not scaled correctly.
2020-04-21 10:12:51 -05:00
Jonathan Scholz
547d1547bb fix(dialog): use height behavior in KeyboardAvoidingView 2020-04-21 15:13:08 +02:00
Jonathan Scholz
39853e048b fix(dialog): fix on-screen keyboard overlapping dialog boxes 2020-04-21 15:13:08 +02:00
Saúl Ibarra Corretgé
8b454b5196 deps: update lib-jitsi-meet
f97c37d0 e2ee: also enable on p2p connections
a832b39b fix(safari): construct track constraints from getSettings (#1104)
2020-04-21 15:05:40 +02:00
Saúl Ibarra Corretgé
e2788e0fb2 e2ee: show warning if not all participants support E2EE
Refs: https://github.com/jitsi/lib-jitsi-meet/pull/1108
2020-04-21 13:41:05 +02:00
Titus-Andrei Moldovan
b1d1599a1c android: add a consistent deviceId for Amplitude from SharedPreferences 2020-04-21 11:45:42 +02:00
Saúl Ibarra Corretgé
cef98f457f ios: bump CocoaPods dependency 2020-04-21 09:58:24 +02:00
Andrei Gavrilescu
6b0e8aab11 bugfix(remote-control): Remote control not working on linux 2020-04-21 10:33:25 +03:00
Jaya Allamsetty
086889ed70 deps: update lib-jitsi-meet 2020-04-20 18:05:49 -04:00
Saúl Ibarra Corretgé
516e5af118 doc: update supported platforms for building mobile apps 2020-04-20 20:25:24 +02:00
Saúl Ibarra Corretgé
afe1b4b0f9 rn: now working on 20.3 2020-04-20 16:01:25 +02:00
Saúl Ibarra Corretgé
8790ad6013 misc: update GH issue templates
- Use config.yml to prevent creating issues with a blank template
- Don't use a template to direct people to the forum
- Create a security policy template
2020-04-20 15:06:57 +02:00
antonbks
8bbc04d4db doc: fix dev server backend default 2020-04-20 14:02:23 +02:00
Hristo Terezov
4fda428be1 fix(largeVideo): update don't depend on thumbnails 2020-04-17 15:33:13 -05:00
Hristo Terezov
f972ebfe9e fix(thumbnail): videos on safari. 2020-04-17 13:15:25 -05:00
Jaya Allamsetty
3dfcc8d80e deps(ljm): Bump lib-jitsi-meet for Firefox ESR simulcast fix 2020-04-16 21:07:22 -04:00
Saúl Ibarra Corretgé
33ebd241a9 external_api: add command to set E2EE key 2020-04-16 20:25:56 +02:00
Saúl Ibarra Corretgé
cb6fbb0f03 e2ee: add UI elements
* Add dialog to set the E2EE key
* Use the Redux action / middleware to update the key even when set through the
  hash parameter
* Cleanup URL after processing the key so it's not recorded in browser history
2020-04-16 20:25:56 +02:00
Philipp Hancke
0077ee29c5 deps: bump lib-jitsi-meet
Changelog:
101fecbb Thu Apr 16 11:23:58 2020 +0200 Philipp Hancke: e2ee: decode static black frame for decryption errors (#1098)
c3fd3431 Thu Apr 16 13:09:18 2020 +0200 Philipp Hancke: e2ee: remove encodedFrameType workaround (#1099)

git log --no-merges --reverse --pretty="%h %ad %an: %s" 70a3298914f3905297e4e9dcc200b95e9b7a73e9..c3fd3431a66556de7b2ec7632f9f6d75b64aad0a
2020-04-16 17:20:08 +02:00
Bettenbuk Zoltan
551db30cc7 fix: modal keyboard avoiding view fix 2020-04-16 15:30:01 +02:00
Philipp Hancke
1bd930a3cb deps: update lib-jitsi-meet
Changelog:
6502bc67 Wed Apr 15 10:51:35 2020 +0200 Philipp Hancke: e2ee: generate silence in case of audio decryption errors
adc87bcf Mon Apr 6 15:07:48 2020 -0500 paweldomas: fix(strophe.jingle.js): exception on ICE config modification
2020-04-15 21:24:33 +02:00
Philipp Hancke
169906f4cb dev: add npmrc with package-lock set to true
adds a .npmrc file to create/update the package-lock.json file regardless
of a developers local settings.
2020-04-15 20:57:05 +02:00
Jaya Allamsetty
e0563a743f Revert "feat(browser-support): Add safari to list of optimal browsers"
This reverts commit 4824c8714a.
2020-04-15 11:24:04 -05:00
Saúl Ibarra Corretgé
a4ab7ea95f deps: upddate lib-jitsi-meet 2020-04-15 11:04:23 -05:00
Vlad Piersec
b50d6e43d0 fix(settings_buttons): Persist audio/video settings across sessions. 2020-04-15 08:33:19 -05:00
Saúl Ibarra Corretgé
f9fcb46036 pip: disable PiP on Android < 26
Fixes: https://github.com/jitsi/jitsi-meet/issues/6008
2020-04-15 12:12:58 +02:00
Jaya Allamsetty
4824c8714a feat(browser-support): Add safari to list of optimal browsers 2020-04-14 13:42:27 -04:00
damencho
be56521267 debian: Skips deploy-hook when there is no hook available. 2020-04-14 11:54:58 -05:00
Jaya Allamsetty
b7eda8df7a fix(safari): set playsInline attribute to true on the video element
The playsInline attribute needs to be set to true for video to be rendered on Safari on iOS
2020-04-14 12:28:09 -04:00
Jaya Allamsetty
d632b6e13e deps: Update ljm for FF simulcast, js-utils for detecting Edge on Android 2020-04-14 11:07:09 -04:00
Bettenbuk Zoltan
dff7d661ca doc: add documentation to some url params 2020-04-14 16:05:04 +02:00
Julian1203
edb8ecd542 Update main-de.json (#5905)
The word "Weitere" implied that there are already people in the meeting so I replaced it with "andere". 
I also made line 775 gender-neutral as "der Einzige" would technically only refer to males which isn't an unusual thing to do but some people might consider it discriminatory against women.
2020-04-11 12:31:36 -05:00
Mantas Kriaučiūnas
b64112432d Add Lithuanian (lt) translation (#5903)
* Add Lithuanian (lt) language

Add Lithuanian (lt) language

* Added Lithuanian translation

Add Lithuanian translation by Mantas Kriaučiūnas (Baltix) and Raminta Stasaitytė

* Dropping by  damencho request
2020-04-11 12:30:19 -05:00
Daniel Ortega
d8963bc903 Fixing wrong text at key "done" in main-es.json (#5900) 2020-04-11 11:33:14 -05:00
Julian1203
5c39a2f6a6 Update main-de.json (#5895)
Fixed same mistake again as it was in there twice, also made the phrase a bit shorter as otherwise it wouldn't fit in the screen.
Changed "Wollen" to "Möchten" as it's more polite.
2020-04-11 09:32:04 -05:00
Daniel Ortega
a72928a9e7 Adding Spanish translation of "Hebrew" literal (#5893)
* Adding Spanish translation of "Hebrew" literal

* Adding Spanish translation (esUS) of "Hebrew" literal
2020-04-11 09:00:45 -05:00
devSJR
e2ea26eb1f Update main-de.json (#5892)
sie -> Sie
ihre -> Ihre
100% -> 100 %
2020-04-11 08:59:31 -05:00
Saúl Ibarra Corretgé
9962a2ea61 config: whitelist disableSimulcast 2020-04-11 11:37:02 +02:00
Hristo Terezov
07e203ce8d fix(youtube-policy-links): Alignment. 2020-04-10 17:55:50 -05:00
yanas
638fdf0370 Revert "Improve accessibility of Buttons in Webapp (#5432)"
This reverts commit 953f838a2a.
2020-04-10 16:12:21 -05:00
Hristo Terezov
6ce1eaba24 feat(old-electron-app-notification): Implement
Detects if Jitsi Meet is running in old jitsi-meet-electron app and
warns the user for scurity issues.
2020-04-10 14:39:31 -05:00
ferdibayrak
4780e48be8 Update main-tr.json (#5876)
Hello. I am an iOS developer. Jitsi's Turkish translation is now 100% completed. Please update the translation file.
2020-04-10 14:37:05 -05:00
Jaya Allamsetty
7776f0a98c deps(ljm): Update ljm, add safari support and disable simulcast on Firefox 2020-04-10 14:31:06 -04:00
Julian1203
2eede7e76b Update main-de.json (#5873)
Fixed very small mistake in the programming. I don't need to sign the CLA for this, do I?
2020-04-10 13:03:58 -05:00
adrmzz
72a7bd0a68 Adding Sardinian translation (#5386)
* Create main-sc.json

* Create languages-sc.json

* Update languages.json

* Update main-sc.json

(just a couple of minor edits to the translation)
2020-04-10 13:03:26 -05:00
Selyan Slimane Amiri
9085cbf363 Update languages-kab.json (#5871) 2020-04-10 12:22:18 -05:00
Nicolas
be80f26086 Update main-ru.json (#5861)
+lonelyMeetingExperience for russian
2020-04-10 12:19:59 -05:00
Neil Brown
a876f78fd7 Update quick-install.md (#5819)
Add information about firewall ports.
2020-04-10 12:19:39 -05:00
Pierre Pronchery
73d948d150 Also ship robots.txt in the source package (#5811) 2020-04-10 12:19:11 -05:00
Philippe Jtreize
c5aa555816 lang: translation improvements and corrections for French (#5807) 2020-04-10 12:18:43 -05:00
Peter Martin
7902223f09 lang: add Dutch (NL) translation (#5804)
* lang: add Dutch (NL) translation

* lang: add Dutch (NL) translation - fix
2020-04-10 12:18:07 -05:00
Hanno Böck
ac117cd50d Update browser links to HTTPS (#5788)
* Update recommended browser links to https

* Update browser URLs to https
2020-04-10 12:17:10 -05:00
Jens-Christian Fischer
f2df5906f6 Document a scalable installation with multiple videobridges (#5783) 2020-04-10 12:16:18 -05:00
Vyacheslav
0fcecaf18f fix Russian translation (#5746)
Co-authored-by: vbukharin <buhv@skbkontur.ru>
2020-04-10 12:13:34 -05:00
yamakz5555
8cc4b73722 Issue #5741 (#5742)
Japanese mistranslation in speaker stats screen.
2020-04-10 12:13:14 -05:00
Joris Bodin
c08f5c7e18 Fix french (#5721) 2020-04-10 12:13:00 -05:00
Daniel Ortega
2e0f3ae84f Using "Japonés" instead of "Jopones" (#5715) 2020-04-10 12:12:46 -05:00
Marco Manenti
41bfb4c7ec Update main-it.json (#5688)
* Update main-it.json

Some revision

* Update main-it.json

other language revision
2020-04-10 12:12:31 -05:00
Stav Levi
4a12cdfac7 Add Lang Hebrew (#5662)
* Update languages.json

* Create main-he.json
2020-04-10 12:07:12 -05:00
Neil Brown
7b34fb89d1 Update quick-install.md (#5658)
Clarify that a Let’s Encrypt cert is sufficient for iOS and Android clients.
2020-04-10 12:06:40 -05:00
Felix Wolfsteller
4ec438d3f3 i18n: german, fix translation key. (#5657) 2020-04-10 12:06:16 -05:00
Khatanbaatar
e79633b0ca translated Mongolian language (#5646)
* translated Mongolia language

* app translated Mongolian language

* sorry, lint not checked

* lint checked
2020-04-10 12:04:48 -05:00
Ricardo Simões
49a9934c41 Added Portuguese European (Portugal) pt language (#5642)
* Create main-pt.json

Started Portuguese European pt-PT translation

* Created Portuguese European Language pt

Created Portuguese European Language (pt-PT) Portugal
2020-04-10 12:04:09 -05:00
Christian Gräfe
193d19ce21 Update main-de.json (#5634)
simple Typo
2020-04-10 12:03:18 -05:00
Claudius Ellsel
fe83d87d2d Tiny correction in README (#5582) 2020-04-10 12:03:02 -05:00
Julian1203
b4a2327264 Update main-de.json (#5564)
Just checked and Firefox calls the button "Erlauben" in their official German translation while Chrome, Chrome on Android and Opera call it "Zulassen".
"Host" should now be translated consistently
Added two hyphens because "meeting password" is one word in German
2020-04-10 12:00:59 -05:00
MilanKral
d9edf661dd lang: Slovak translation (#5523) 2020-04-10 12:00:26 -05:00
Marco Zehe
e32f367b0c React Native accessibility fixes (#5825)
* Accessibility: Make the native toolbox item communicate that it is a button.

* Accessibility: If an item is toggled, mark it as selected for accessibility

* Accessibility: Make the toolbox a toolbar for accessibility

* Accessibility: Mark the bottom sheet as a menu for accessibility

* Fix typo, AccessibilityRole, not AccessibleRole

* Statement fix

* Appease the linter

* Fix linting errors for real this time
2020-04-10 08:07:48 -05:00
Volker Braun
2b181673b5 android: arcel the serverURL in the Android SDK
In the Android SDK, the setServerURL option is erroneously
ignored. The meeting's serverURL always defaults to
https://meet.jit.si because the serverURL is not parceled.
2020-04-10 14:53:47 +02:00
Emil Ivov
87a058eaa4 Merge pull request #5838 from jitsi/project-hps
Project HiPS, first pass
2020-04-10 07:44:38 -05:00
Saúl Ibarra Corretgé
eef0f5ed97 Project HPS, first pass 2020-04-10 14:40:58 +02:00
Saúl Ibarra Corretgé
1751fc7635 deps: lib-jitsi-meet@latest 2020-04-10 14:40:58 +02:00
pan93412
4aa58f041f i18n: zh_TW: new translation (#5827)
* i18n: zh_TW: new translation

* Delete strings.xml

* Delete strings.xml
2020-04-09 22:27:56 -05:00
Bettenbuk Zoltan
39d789a088 feat: add url params: config.disableInviteFunctions, config.doNotStoreRoom and userInfo.displayName 2020-04-09 17:14:16 +02:00
Peter Martin
2654c77f2c lang: Duch language fixes 2020-04-09 11:29:07 +02:00
Jaya Allamsetty
7af88e5c4f fix(safari): Update the check for Safari
In preparation for the lib-jitsi-meet PR for Safari support, isSafariWithWebrtc() will no longer be available
2020-04-08 15:06:29 -04:00
Дамян Минков
ffdd4f2eed debian: updates around coturn package and order of install (#5729)
* debian: Update coturn udp port to non-privileged one.

* debian: Turnserver config requires jitsi-meet-web-config files.

* doc: Updates doc, removing `--no-install-recommends`.

* debian: Moves checks and configs to default to prosody 0.11.

* debian: Disable room locking on internal muc.

* add scripts for deploying coturn with certbot

* turnserver: Removes unused variable showing error.

* debian: updates let's encrypt and coturn scripts.

* debian: Detect failure to retrieve external ip address.

* debian: Always configure turn when the turnserver package is installed.

Co-authored-by: Julien Fastré <julien.fastre@champs-libres.coop>
2020-04-08 13:06:49 -05:00
Paul Menzel
0b0a19ea5c doc/debian/jitsi-meet-turn: Correct file name to README 2020-04-08 10:59:30 -05:00
Russell Graves
b10aa422ca Add gzip to nginx server config. (#5700)
* Add gzip and expiration to nginx server config.

* Add application/json to gzip_types line to cover translations.

* Add gzip_vary for content caches, remove expires section.

Per discussion, expiration seems likely to cause more confusion than it solves.  Add gzip_vary to prevent content caches from caching un-compressed versions of the content and confusing browsers.
2020-04-07 09:42:27 -05:00
Bettenbuk Zoltan
b706972acb fix: re-add android only chat input padding 2020-04-07 11:18:50 +02:00
Bettenbuk Zoltan
5574221044 ref: SharedDocument to JitsiModal 2020-04-07 11:18:50 +02:00
Bettenbuk Zoltan
0f4369a9a9 ref: AddPeopleDialog to JitsiModal 2020-04-07 11:18:50 +02:00
Bettenbuk Zoltan
0c2e13a453 ref: DialInSummary to JitsiModal 2020-04-07 11:18:50 +02:00
Bettenbuk Zoltan
2f817b6633 ref: Settings to JitsiModal 2020-04-07 11:18:50 +02:00
Bettenbuk Zoltan
678ed605d7 ref: change JitsiModal to better fit to needs 2020-04-07 11:18:50 +02:00
vp8x8
84714ba3bd settings: enable settings buttons on permission grant
Some CSS fixes are also included.
2020-04-07 09:14:23 +02:00
Tim Ruffing
b8963629bf Pass upper case country codes to i18n-iso-countries
Related to #5697.
2020-04-06 22:17:27 -05:00
Damian Goeldi
47cffeb00a add missing IPv6 listener to nginx jitsi module 2020-04-06 21:27:40 -05:00
Paul Mestrum
b70633ef24 tile-view: fix number of columns calculation 2020-04-06 19:42:53 +02:00
Hristo Terezov
145596ac6a fix(tile-view): hidden thumbnails on scroll 2020-04-06 12:22:43 -05:00
moses gunesch
76607bbad8 doc: mention privacy error in Chrome for development 2020-04-06 10:25:13 +02:00
bgrozev
36113fd54f debian: clean up password generation, use 16 characters 2020-04-06 10:22:56 +02:00
Дамян Минков
f86ace17d8 Fix weblate2 (#5695)
* Added translation using Weblate (Icelandic)

* Added translation using Weblate (Icelandic)

* Added translation using Weblate (Sardinian)

* Deleted translation using Weblate (Sardinian)

* Added translation using Weblate (Sardinian)

* Translated using Weblate (Sardinian)

Currently translated at 0.0% (0 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sc/

* Added translation using Weblate (Sardinian)

* Translated using Weblate (Sardinian)

Currently translated at 0.0% (0 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/sc/

* Translated using Weblate (Icelandic)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/is/

* Translated using Weblate (Icelandic)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/is/

* Translated using Weblate (Bulgarian)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/bg/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ca/

* Translated using Weblate (Bulgarian)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/bg/

* Translated using Weblate (Czech)

Currently translated at 36.7% (247 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Turkish)

Currently translated at 23.3% (157 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/tr/

* Translated using Weblate (ptbr (generated))

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ptbr/

* Translated using Weblate (Sardinian)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sc/

* Translated using Weblate (Czech)

Currently translated at 39.8% (268 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 46.8% (315 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 46.8% (315 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 46.8% (315 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 47.0% (316 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 47.0% (316 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 50.5% (340 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 50.7% (341 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 50.8% (342 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 52.8% (355 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 72.6% (488 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/tr/

* Translated using Weblate (Danish)

Currently translated at 95.6% (643 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/da/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 40.6% (13 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/nb_NO/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 20.8% (140 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/nb_NO/

* Added translation using Weblate (Arabic)

* Added translation using Weblate (Arabic)

* Added translation using Weblate (Serbian)

* Added translation using Weblate (Serbian)

* Added translation using Weblate (Ukrainian)

* Translated using Weblate (Ukrainian)

Currently translated at 96.8% (651 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 96.8% (651 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 97.0% (652 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 97.1% (653 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 97.4% (655 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/uk/

* Added translation using Weblate (Belarusian)

* Added translation using Weblate (Romanian)

* Added translation using Weblate (Ukrainian)

Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: Václav Zbránek <vaclav@weblate.org>
Co-authored-by: Joan Montané <joan@montane.cat>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Co-authored-by: Adrià Martín <adriamartinmor@gmail.com>
Co-authored-by: Tomas Apeltauer <tomas.apeltauer@gmail.com>
Co-authored-by: anonymous <noreply@weblate.org>
Co-authored-by: Lukáš Jelínek <devel@aiken.cz>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Ahmed Abdelhamid <dralawady@gmail.com>
Co-authored-by: Nenad Nikolic <nikbit2015@gmail.com>
Co-authored-by: Oleksa Stasevych <oleksiy.stasevych@gmail.com>
Co-authored-by: Антон Костюченко <1292729@gmail.com>
Co-authored-by: marius-bardan <marius.bardan@gmail.com>
2020-04-05 17:24:20 -05:00
Dara Poon
0e16008085 Use regexes to match ALPN protocols (#5651)
nginx presents the client's list of ALPN protocols as
$ssl_preread_alpn_protocols, a comma-separated string.  Use regular
expressions to match each item in the list, rather than the exact value
of the entire list at once.
2020-04-05 09:23:43 -05:00
Дамян Минков
f66a919e08 Fix weblate (#5672)
* Added translation using Weblate (Icelandic)

* Added translation using Weblate (Icelandic)

* Added translation using Weblate (Sardinian)

* Deleted translation using Weblate (Sardinian)

* Added translation using Weblate (Sardinian)

* Translated using Weblate (Sardinian)

Currently translated at 0.0% (0 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sc/

* Added translation using Weblate (Sardinian)

* Translated using Weblate (Sardinian)

Currently translated at 0.0% (0 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/sc/

* Translated using Weblate (Icelandic)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/is/

* Translated using Weblate (Icelandic)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/is/

* Translated using Weblate (Bulgarian)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/bg/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ca/

* Translated using Weblate (Bulgarian)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/bg/

* Translated using Weblate (Czech)

Currently translated at 36.7% (247 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Turkish)

Currently translated at 23.3% (157 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/tr/

* Translated using Weblate (ptbr (generated))

Currently translated at 100.0% (672 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/ptbr/

* Translated using Weblate (Sardinian)

Currently translated at 99.8% (671 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/sc/

* Translated using Weblate (Czech)

Currently translated at 39.8% (268 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 46.8% (315 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 46.8% (315 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 46.8% (315 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 47.0% (316 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 47.0% (316 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 50.5% (340 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 50.7% (341 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 50.8% (342 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 52.8% (355 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Czech)

Currently translated at 72.6% (488 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/cs/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (32 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/tr/

* Translated using Weblate (Danish)

Currently translated at 95.6% (643 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/da/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 40.6% (13 of 32 strings)

Translation: Jitsi/languages
Translate-URL: https://hosted.weblate.org/projects/jitsi/languages/nb_NO/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 20.8% (140 of 672 strings)

Translation: Jitsi/main
Translate-URL: https://hosted.weblate.org/projects/jitsi/main/nb_NO/

Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: Václav Zbránek <vaclav@weblate.org>
Co-authored-by: Joan Montané <joan@montane.cat>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Co-authored-by: Adrià Martín <adriamartinmor@gmail.com>
Co-authored-by: Tomas Apeltauer <tomas.apeltauer@gmail.com>
Co-authored-by: anonymous <noreply@weblate.org>
Co-authored-by: Lukáš Jelínek <devel@aiken.cz>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2020-04-05 08:58:21 -05:00
Saúl Ibarra Corretgé
8115fb5e78 config: remove aspect ratio constraint from config example
Some cameras may not be able to satisfy it and gUM will fail.

Refs: https://github.com/jitsi/lib-jitsi-meet/pull/1066
2020-04-05 08:46:51 +02:00
Weblate (bot)
c9f26dc7ac lang: improved translattions with weblate
Icelandic, Sardinian, Bulgarian, Czech, Catalan, Turkish.

Translate-URL: https://hosted.weblate.org/projects/jitsi/main/

Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: Václav Zbránek <vaclav@weblate.org>
Co-authored-by: Damian Minkov <damencho@jitsi.org>
Co-authored-by: Joan Montané <joan@montane.cat>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Co-authored-by: Adrià Martín <adriamartinmor@gmail.com>
Co-authored-by: Tomas Apeltauer <tomas.apeltauer@gmail.com>
2020-04-04 22:14:00 +02:00
damencho
7321f706bb Fix wrong UTF file. 2020-04-03 18:21:04 -05:00
Hristo Terezov
9b5f135dae fix(livestreaming): window.open params
The target parameter from window.open was missing which was causing
reload in electron.
2020-04-03 16:55:05 -05:00
Hristo Terezov
dbbdcb0b00 feat(live-streaming): Add T&C. 2020-04-03 16:54:50 -05:00
Ruben Kerkhof
06ae1861ee log: fix showing verbatim %s
So turn 'hover in %s 1a5cd940' into 'hover in 1a5cd940'
2020-04-03 15:41:30 +02:00
Alexander Neumann
e0afd8fadb lang: fix german translation
This commit fixes a few translation errors, especially in the
kickParticipantTitle.
2020-04-03 15:39:38 +02:00
Michael Telatynski
953f838a2a Improve accessibility of Buttons in Webapp (#5432)
* Expose toggle buttons better via ARIA

* Wire up the divs/li as role=button as per ARIA patterns

* Add flow annotations to appease the linter

* For role=button use aria-pressed not aria-checked
2020-04-03 08:19:32 -05:00
ljo
bf5f1f0168 lang: improve sv translation 2020-04-03 15:13:26 +02:00
Saúl Ibarra Corretgé
cdf977ff3f doc: add documentation index 2020-04-03 14:57:40 +02:00
Joris Bodin
ee1dc9dd8e lang: update translation for fr, de, es, it for mobile app 2020-04-03 12:14:21 +02:00
Ali Karpuzoglu
7bec68e492 doc: fix typo 2020-04-03 12:13:20 +02:00
Bettenbuk Zoltan
97fff02c15 web: use password i18n placeholder 2020-04-03 11:22:11 +02:00
Дамян Минков
b372b2ccf2 Fix turn file link (#5601)
* debian: Does not add a link of turnserver will not be configured. Fixes #5596.

* debian: Partially reverts 990c77bd.

* debian: Skip filename duplication, use variable.
2020-04-02 18:20:41 -05:00
Bettenbuk Zoltan
d00ead932b feat: better room lock prompt 2020-04-02 17:27:22 +02:00
Saúl Ibarra Corretgé
bb2b1b58ec conference: add room name to browser title
Re-do of
86ebfe8dad
2020-04-02 16:33:39 +02:00
GK2
ceeea7314c debian: fix typo 2020-04-02 15:27:19 +02:00
Andrei Gavrilescu
9d6a93119b feat(screenSharing): Add support for audio screen sharing on electron 2020-04-02 16:18:10 +03:00
GK2
08be68cda4 debian: fix install-letsencrypt-cert.sh to create misssing directory
Update install-letsencrypt-cert.sh to fix missing cron.weekly
REFS : https://github.com/jitsi/jitsi-meet/issues/5576
2020-04-02 15:10:27 +02:00
Bettenbuk Zoltan
3a2081ffed ref: change Chat to JitsiModal 2020-04-02 12:40:12 +02:00
Bettenbuk Zoltan
57d14d9517 feat: help centre 2020-04-02 12:40:12 +02:00
Saúl Ibarra Corretgé
c5e693f14a rn,invite: use custom clear button also on iOS
Otherwise it won't be visible if Dark Mode is enabled.
2020-04-02 11:46:29 +02:00
Saúl Ibarra Corretgé
a9da047d3a rn,invite: fix bottom padding on AddPeopleDialog on Android 2020-04-02 11:46:29 +02:00
bgrozev
171b065db1 Revert "Add room name to browser tab title" (#5560)
Because it displays "undefined" in the title.

This reverts commit 86ebfe8dad.
2020-04-01 22:03:14 -05:00
Jaya Allamsetty
9da0b7fee3 deps(ljm): Bump adapter.js to 7.5.0 and validate ice candidate info 2020-04-01 18:28:30 -04:00
damencho
716c9eb46f debian: Change coturn unit file to start on 443. 2020-04-01 17:11:55 -05:00
Stefan
a85c72d859 doc: use sudo 2020-04-01 22:57:08 +02:00
Kenneth Peiruza
0ba567856e lang: fix catalan translation
There was a huge mistake in Catalan translation. Stop streaming and recording said "start" (inicia) instead of "stop" (atura).

Then, 1 small fix on a more polite way of refering to "using a software" -> *emprar* rather than *usar*.
2020-04-01 22:51:38 +02:00
Horatiu Muresan
7f1eb83dbd feat(notifications): Manage audio notifications 2020-04-01 22:40:07 +02:00
damencho
6e4c1f64d8 debian: Adds syslog logging. 2020-04-01 15:18:49 -05:00
damencho
82aa51770a debian: Skip turn config if other sites are available listening on 443. 2020-04-01 15:18:49 -05:00
damencho
990c77bd3d debian: Skip turnserver config if it is already configured. 2020-04-01 15:18:49 -05:00
bgrozev
5bb23b2d17 chore(package.json): Update js-utils (#5541) 2020-04-01 15:09:11 -05:00
Saúl Ibarra Corretgé
9cc05ef838 config: remove unneeded option 2020-04-01 20:40:18 +02:00
Saúl Ibarra Corretgé
a21e3a1946 Merge pull request #5510 from rubenk/add-roomname-to-title
Add room name to browser tab title
2020-04-01 20:08:05 +02:00
Vlad Piersec
c05ca1d9fc fix(prejoin_page) Add labels for video & more UI fixes 2020-04-01 19:57:04 +02:00
Vlad Piersec
1b05d7269c feat(prejoin_page) Add settings buttons
This reverts commit faf24ca7ec.
2020-04-01 19:57:04 +02:00
paweldomas
c170970992 feat(Filmstrip): accessibility label for toggle filmstrip button 2020-04-01 08:49:12 -05:00
Saúl Ibarra Corretgé
d19a659871 ios: update Crasshlytics and fix uploadding symbols 2020-04-01 15:31:28 +02:00
Saúl Ibarra Corretgé
955b24be9d rn,cc: add feature-flag to disable close captions 2020-04-01 15:29:21 +02:00
Saúl Ibarra Corretgé
de6c7e0117 rn,invite: add share button to add people dialog 2020-04-01 15:26:29 +02:00
Bettenbuk Zoltan
feb8fe9e34 api: add private message flag to outgoingMessage 2020-04-01 11:58:48 +02:00
Steve Frécinaux
aff6d4b36d Fix mod_muc_max_occupants to properly ignore whitelisted users
In a typical Jitsi Meet setup, this plugin can be used to limit the number of
occupants in a meeting room, while ignoring "utility" users. Such a
configuration could be:

    muc_max_occupants = 2
    muc_access_whitelist = {
        "focus@auth.meet.jitsi";
    }

It would be expected that this configuration allows two users to attend the
meeting room, but in practice only one is allowed, because the whitelist is not
honoured.

This commit fixes it by actually updating the `user` and `domain` variables
being checked. After this change, the scenario above works just fine.
2020-03-31 16:38:23 -05:00
damencho
45c60717d6 debian: add post remove script for jitsi-meet-turnserver package
Reloads the webserver as the config had changed.
2020-03-31 16:27:25 -05:00
Saúl Ibarra Corretgé
6596e27f69 Prevent meetings from being crawled by Google 2020-03-31 21:45:28 +02:00
Saúl Ibarra Corretgé
8cba7e91d3 ci: build the frontend in GH actions
It should help catch bugs such as bundle bloat easier.
2020-03-31 21:44:48 +02:00
Hristo Terezov
3a871cbed8 feat(remote-menu):option for disable mute and kick 2020-03-31 10:06:30 -05:00
Bettenbuk Zoltan
a46fd60788 fix: accented room name display 2020-03-31 14:16:21 +02:00
Ruben Kerkhof
86ebfe8dad Add room name to browser tab title
Fixes #5480

Signed-off-by: Ruben Kerkhof <ruben@rubenkerkhof.com>
2020-03-31 13:58:12 +02:00
Juri
97735ff548 lang: fix Estonian translations 2020-03-31 13:10:38 +02:00
James Baird
9fdc18d1ec welcome: hide tabs if nothing to show 2020-03-31 13:06:04 +02:00
Bartosz Dziewoński
4a21882345 lang: translation improvements and corrections for Polish 2020-03-31 09:43:13 +02:00
damencho
cb0cea4ebd Adds a note to re-run Let’s Encrypt script on jetty upgrade. 2020-03-31 09:36:30 +02:00
damencho
b894daa9cf Cleans created users on purging. 2020-03-31 09:36:30 +02:00
damencho
06641a7dd6 This is to prevent item-not-found when multiple users try to join at the same time.
This is to prevent item-not-found when multiple users try to join while jicofo is still configuring the room. Credits @paweldomas
2020-03-31 09:36:30 +02:00
Saúl Ibarra Corretgé
94f7b570d7 debian: fix creating internal MUC 2020-03-30 17:01:27 -05:00
Saúl Ibarra Corretgé
ca5605620a rn: update versions, apps 20.2, sdk 2.7 2020-03-30 15:45:16 +02:00
nicolae-stroncea
8d0202113a doc: clarify required Node / npm versions 2020-03-30 15:09:43 +02:00
Julian1203
f2e59226c0 lang: update german translation 2020-03-30 15:05:31 +02:00
Julian1203
951086e499 lang: update german translation
Added the missing languages
2020-03-30 15:03:39 +02:00
Saúl Ibarra Corretgé
d3a26f9b4e rn,welcome-page: use random room name generator 2020-03-30 14:40:29 +02:00
Asura Enkhbayar
e1a4478a06 doc: jitsi-videobridge -> jitsi-videobridge2
Update commands provided to reload and check the status of videobridge.
2020-03-30 11:48:32 +02:00
Saúl Ibarra Corretgé
ed8009883b avatars: ensure no remote avatar is loaded when disableThirdPartyRequests is set 2020-03-29 08:42:25 +02:00
Saúl Ibarra Corretgé
4fd5dc0ee0 analytics: don't enable callstats when disableThirdPartyRequests is set 2020-03-29 08:42:25 +02:00
Saúl Ibarra Corretgé
1bbb937d9d analytics: fix enabling analytics when disableThirdPartyRequests is set 2020-03-29 08:42:25 +02:00
Saúl Ibarra Corretgé
c1fb276937 config: whitelist disableThirdPartyRequests 2020-03-29 08:42:25 +02:00
Keunes
3867d5d62e lang: update Dutch translation 2020-03-28 15:48:00 +01:00
damencho
08ab513d4e Updates nat config and uninstall part in qi guide. 2020-03-28 08:29:05 +01:00
Esteban Badilla A
a2eca4f029 lang: fixes for the spanish translation
Signed-off-by: Esteban Badilla A <ebadilla10@gmail.com>
2020-03-27 23:30:34 +01:00
Saúl Ibarra Corretgé
3121494d4b config: use Jitsi's STUN servers by default, instead of Google's 2020-03-27 22:55:16 +01:00
Juri
92e81c3dbf lang: added estonian translation 2020-03-27 22:19:42 +01:00
damencho
2761a6dbb3 Warn that turn will need port 443. 2020-03-27 15:13:19 -05:00
Saúl Ibarra Corretgé
faf24ca7ec Revert "feat(prejoin_page) Add settings buttons" (#5424)
This reverts commit 08f55ccb94.
2020-03-27 12:17:27 -05:00
James Addison
c5ce44f09d doc(quick install): streamline documentation (#5227)
* Prioritize messaging re: using hosted Jitsi if self-hosted is not required

* Update wording for self-hosting vs hosted

* Expand requirements sentence into document section

* Simplify Ubuntu universe step

* Condense repository and package installation steps

* Add comments for package installation steps

* Simplify wording around hostname configuration

* Simplify lets-encrypt wording

* Move certificate generation step before package installation

* Expand certificate instructions

* Move conference test step to post-installation

* Rephrase installation testing / confirmation step

* Extract platform-specific installation notes

* Rephrase superuser guidance

* Replace lists.jitsi.org link with web.archive.org pointer

* Place /etc/hosts example in code block

* Remove space before colon

* Add spacing before/after 'or' (improves github markdown rendering)

* Revert "Add spacing before/after 'or' (improves github markdown rendering)"

This reverts commit 9f33beb2ab.

* Nit: clarify apt/HTTPS relationship

* Revert "Expand requirements sentence into document section"

This reverts commit cf630983c0.

* Relocate Ubuntu universe repository advice

* More concise Ubuntu universe messaging

* Revert "Extract platform-specific installation notes"

This reverts commit 7161a700cb.

* Revert "Expand certificate instructions"

This reverts commit 5c479e7ffb.

* Revert "Move conference test step to post-installation"

This reverts commit a0ee279b7c.

* Revert "Simplify wording around hostname configuration"

This reverts commit ceab0ab9cf.

* Revert "Revert "Simplify wording around hostname configuration""

This reverts commit a7127d03dc.

* Revert "Revert "Revert "Simplify wording around hostname configuration"""

This reverts commit 1e5413690e.

* Revert "Remove space before colon"

This reverts commit 35cae52722.

* Mark Let's Encrypt step as optional

* Mark Let's Encrypt step as recommended

* Clarify Jitsi repository-add heading

* Nit: remove superfluous newline

* Fixup: restore Let's Encrypt descriptive text from master branch

* Update supported Ubuntu version to 18.04 (LTS)

* Add Ubuntu release codename

* Update minimum supported Debian version to 9 (Stretch)

* Undo relocation of Let's Encrypt script instructions

* Add Jitsi Meet mobile app certificate requirement notice

* 'Note' formatting consistency

* Rephrase sudo language
2020-03-27 12:15:43 -05:00
lenhart
6969114675 lang: Fix "toggleCamera" description
Fix "toggleCamera" description. switch instead of turn off/on
2020-03-27 16:56:29 +01:00
Wikinaut
1aba57e6bb config: change language detection to "true" 2020-03-27 16:40:17 +01:00
Kaor
e9785c8b3d lang: correct bad translation
"toggle camera" is to switch front to rear or rear to front.
The french translation said "on/off camera", it's not exactly that
2020-03-27 16:36:18 +01:00
Paul Menzel
03215d8906 config: fix wording in comment 2020-03-27 15:50:04 +01:00
Дамян Минков
9a5b19babe Migrates jetty config to nginx one (#5413)
* Completely removes jetty config and defaults to nginx.

* Force configuring nginx or apache.

* Fixes certs when upgrading from jetty.

* Fixes certs and restarts jvb.

* Turnserver config conflicts apache2.

* Multi-domain sed only for nginx.

* Updates docs removing jetty.
2020-03-27 09:07:47 -05:00
Sean McBride
e5d87e66bf Various improvements to quick-install document
- removed paragraph about old Debian Wheezy, the link is broken, and Wheezy doesn't even get security updates anymore, so seems unlikely anyone would do a new install with it.
- clarified that Let's Encrypt script uses only the HTTP challenge.
- added links to a few things that newbies might want to look up (nginx, apache, jetty, SIP, FQDN, Let's Encrypt, etc.
- added some basic debugging starting points, based on my experience
- some minor grammatical tweaks
- other minor tweaks
2020-03-26 23:30:12 -05:00
Дамян Минков
e00036d44a Merge pull request #5216 from gbonfiglio/master
fix broken nginx ipv6 listeners
2020-03-26 18:22:41 -05:00
Saúl Ibarra Corretgé
d8059fd0ee lang: fix italian translation 2020-03-26 18:22:24 -05:00
Jaya Allamsetty
6fc7456196 fix(blur): Decrease the blur amount and improve the accuracy 2020-03-26 16:49:51 -04:00
Hristo Terezov
0bd96b9c0e fix(static): Add base. 2020-03-26 12:34:00 -05:00
Andrei Gavrilescu
f502e13edc feat(screenSharing): Add system audio screen sharing 2020-03-26 14:17:44 +02:00
Vlad Piersec
08f55ccb94 feat(prejoin_page) Add settings buttons 2020-03-25 10:50:47 -05:00
Joan Montané
17ca9722b7 lang: update Catalan translation 2020-03-25 12:16:05 +01:00
Bettenbuk Zoltan
8cc9b78e21 feat: add column layout to settings fields 2020-03-25 11:59:48 +01:00
Bettenbuk Zoltan
25b4843327 fix: irregular cursor movement in settings 2020-03-25 11:48:06 +01:00
bgrozev
d13edd8f63 Updates js-utils (pruning the word list). (#5371) 2020-03-24 21:06:41 -05:00
Saúl Ibarra Corretgé
cdc14586de invite: remove duplicated code
Add ability to invite users which will use the share sheet or dialog
dynamically.
2020-03-24 14:28:26 +01:00
Saúl Ibarra Corretgé
a7f8bf2d8f rn,overflowmenu: reorder 2020-03-24 14:28:26 +01:00
Saúl Ibarra Corretgé
8cd881945a invite: merge InviteButton and InfoDialogButton on mobile 2020-03-24 14:28:26 +01:00
Saúl Ibarra Corretgé
579d08e27e bottom-sheet: tweak UI
- re-add thepand icon, shaped like a pill
- round top corners
2020-03-24 14:28:26 +01:00
Ansgar Burchardt
5148c81dd8 doc: quick-install.md: link to english version of doc how to change hostname 2020-03-24 14:09:45 +01:00
skiqoapsdt20
40bc844caa Update README.md (#5347) 2020-03-24 11:57:46 +01:00
Saúl Ibarra Corretgé
c990a64ba9 blur: don't persist settings 2020-03-24 11:56:01 +01:00
damencho
f5a0a1ef8c Use community forum for support not github. 2020-03-24 06:31:15 +01:00
Jaya Allamsetty
58018a086c fix(blur): Disable blur on conference leave 2020-03-23 20:55:46 -04:00
damencho
b3a7f5f38b Removes not needed file. 2020-03-23 17:33:10 -05:00
damencho
435d11793d Updates debian compat level. 2020-03-23 17:33:10 -05:00
Saúl Ibarra Corretgé
9ec3faa6b3 lint: run linter using GH Actions 2020-03-23 22:13:22 +01:00
Kenneth Thorman
959d61468e lang: add danish translation 2020-03-23 20:19:37 +01:00
bgrozev
9f28048742 Fix eslint errors. (#5341) 2020-03-23 13:56:32 -05:00
Ravinou
19c9a808cf Update main-fr.json (#5301)
"cryptée" does not exist in french, it's "chiffrée" here. More informations about this here : https://chiffrer.info/
2020-03-23 14:56:25 +01:00
Felix Wolfsteller
7576f850e9 config: add trailing commas and 'end' entry for peacy JSON
Prevent possible json parse errors when the configuration values are
commented or commented out.
2020-03-23 14:06:51 +01:00
Anna-Katharina Wickert
7970b38823 lang: change inaccurate translation of toggle camera (german)
Change inaccurate translation of toggle camera.
2020-03-23 14:01:34 +01:00
simevo
b40363be31 doc: make clear that /etc/hostname must match /etc/hosts
fixes #5260 (#5279)
2020-03-23 13:53:27 +01:00
yanas
9a0b924f99 Merge pull request #5322 from jitsi/update-js-utils
chore(package.json): Update js-utils.
2020-03-22 13:49:53 -05:00
Hristo Terezov
52def54cd9 chore(package.json): Update js-utils. 2020-03-22 13:13:22 -05:00
Zoltan Bettenbuk
8d3b59a0d0 rn: lonely meeting experience 2020-03-20 18:30:46 +01:00
Saúl Ibarra Corretgé
b0e7471a83 android: revert back to SW decoding
We see tons of crashes on Samsung and Huawei devices. It's really not worth the
headache anymore.
2020-03-20 13:39:48 +01:00
horymury
4616065b1d external_api: add ability to send a text message through datachannels 2020-03-20 12:51:26 +01:00
paweldomas
14855f3255 fix(features/notifications): crash on undefined participant 2020-03-20 05:43:44 -05:00
Julian1203
c40a7f736e Update main-de.json
Fixed a lot of punctuation and spelling mistakes. "Speaker" means "Lautsprecher" in the context of audio devices. Rephrased a sentence to make it sound better.
2020-03-20 05:42:49 -05:00
Martin Myska
8ffd226159 updated translation and added missing strings 2020-03-19 12:30:12 -05:00
filippogiordano
b8dda4c6c2 Update main-it.json
Error correction in "appDescription" (open course instead of open source).
2020-03-19 12:50:34 +01:00
Дамян Минков
fca4977987 Merge pull request #5235 from chipechop/patch-2
ITALIAN translation - added last missing string
2020-03-18 14:50:38 -05:00
chipechop
7bcece52ea Missing and wrong Italian translation
Hi,
I added some missing translations and changed some that were wrong, or improvable: from a 70% translation and a 30% missing, to what I think should be an 85%-90% of translated lines.

I really wish to express my personal compliments to the persons that made the core translation, because it is very fluid, original and smart.

(tell me what I should have to do: I'm pretty new to GitHub)
2020-03-18 14:50:28 -05:00
chipechop
155c6de822 ITALIAN translation - added last missing string
I added Afrikaans missing string
2020-03-18 18:48:42 +01:00
Horatiu Muresan
d0bc3da0f5 Disable kick participant button for guests 2020-03-18 15:26:11 +01:00
Arzar
011b7f9d00 fix(external_api): Pass Feature-Policy display-capture to the iframe
Starting from version 74, firefox need to be explicitly allowed to capture the screen from an iframe for screensharing. This new Feature-Policy is called "display-capture".
See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy/display-capture
2020-03-18 08:57:11 -04:00
James Addison
9b0f5b0299 doc(quick install) Minor typo fixup (#5222) 2020-03-18 13:19:51 +01:00
Falco Nogatz
7e21c277b3 lang: fix spelling mistake in translations of "feedback" 2020-03-18 11:43:03 +01:00
raphj
e6ade2cf84 doc (quick install): Add the domain to /etc/hosts 2020-03-18 11:40:27 +01:00
Cyril Brulebois
99b21cdb2a doc: fix typos in quick install guide 2020-03-18 10:52:09 +01:00
sicherist
677752c78d lang: fix inaccurate translation of "toggleCamera" 2020-03-18 10:14:32 +01:00
Giorgio Bonfiglio
4e81a7abd3 fix turnserver postinst for ipv6 listener 2020-03-17 22:37:39 +00:00
Giorgio Bonfiglio
5d8d0b9a01 fix broken ipv6 listener 2020-03-17 22:31:56 +00:00
yanas
2dd5d0a180 Merge pull request #5205 from jitsi/update-lib
chore(package.json): Update lib-jitsi-meet.
2020-03-17 09:54:53 -05:00
Hristo Terezov
ccdfff8e9a chore(package.json): Update lib-jitsi-meet. 2020-03-17 09:23:55 -05:00
Martin
829e3bfe15 doc: add nginx config for the electron version in manual install doc 2020-03-17 11:41:21 +01:00
Jaya Allamsetty
e90cc0a615 fix(Amplitude): Blacklist 'peer.conn.status.duration' stats 2020-03-16 15:55:11 -04:00
KwadroNaut
b6ccc91038 Correct link regarding FAQ NAT install
Broken link, I presume this one was meant.
2020-03-16 12:57:38 -05:00
Jaya Allamsetty
beb4487044 deps: update LJM for adding p2p status to transport.stats in Amplitude 2020-03-16 13:46:16 -04:00
damencho
add84af7b6 deps: update LJM, updates the params passed to statistics (disable app logs) 2020-03-15 17:13:59 -05:00
damencho
cb0d10fbe1 deps: update LJM for adding new option to disable callstats app logs 2020-03-15 15:48:41 -05:00
Jaya Allamsetty
9a162c266c deps: update LJM for adding the transport type Amplitude event 2020-03-13 18:56:49 -04:00
paweldomas
6654531112 desp: update LJM to bring in fix for a crash on BOSH item-not-found
Updates lib-jitsi-meet to e3533220023cb3f5c727ac5b27dc18552acef5c9
2020-03-13 11:57:11 -07:00
Mihai Uscat
b9cc6b6f96 fix(mute): Replace icon 2020-03-13 14:55:29 +01:00
paweldomas
6cbc04175c deps: update LJM to bring in unload fix
Updates lib-jitsi-meet to b8f68b98be21dd1956238da6a53d1503b7ceaf7d
which brings in feature discovery optimization and the unload handler
fix for BOSH.
2020-03-12 13:21:05 -07:00
paweldomas
fb23aa54e8 ref(VideoLayout): log participant name on feature discovery failure 2020-03-12 13:21:05 -07:00
Дамян Минков
b73d98f863 Updates jvb pid file path. 2020-03-12 14:58:27 -05:00
Tudor-Ovidiu Avram
0289a93e5a feat(close) Add promotional close page 2020-03-12 20:07:23 +01:00
paweldomas
401003b907 deps: update LJM to fix Strophe.attach not handled correctly
Updates lib-jitsi-meet to aadfce2283cad4de3cb58c2eed8e14d2ce62c465 in
order to fix "not connected" error when jiconop is enabled.
2020-03-11 10:01:44 -07:00
Saúl Ibarra Corretgé
025e2b1ecb android: simplify the creation of AudioManager
Do so on the main thread at startup and pass it along.
2020-03-11 16:27:42 +01:00
Saúl Ibarra Corretgé
05a8591110 android: make sure all AudioMode operations run in the audio thread 2020-03-11 16:27:42 +01:00
paweldomas
d2e6d57be8 deps: update LJM to fix ATTACHED state not connected
Updates lib-jitsi-meet to 567ba72675b1bfd5931e7d4936a4e53ebb4ef5f2 in
order to fix "not connected" error when jiconop is enabled.
2020-03-11 08:14:23 -07:00
paweldomas
41fd142977 deps: update LJM to bring in XMPP resume
Updates lib-jitsi-meet to 8a41d024077d1e19e41bf15ea2edd8ed8b02b85f in
order to bring in the XMPP stream resume functionality.
2020-03-11 06:56:40 -07:00
paweldomas
04c0945930 add mod_websocket_smacks.patch
The patch and Prosody 0.11 is required for the XMPP stream resume
2020-03-11 06:56:40 -07:00
paweldomas
5f2acb70de add mod_smacks.lua version c49fea05772e
https://hg.prosody.im/prosody-modules/raw-file/c49fea05772e/mod_smacks/mod_smacks.lua
2020-03-11 06:56:40 -07:00
paweldomas
4dc10e82f1 feat(mod_auth_token): add support for 'previd' query param
The 'previd' query parameter will be use to match user id of the session
being resumed when the smacks module and token authentication are
enabled in Prosody. Otherwise user gets new random id every time and
this doesn't work with the smacks module.
2020-03-11 06:56:40 -07:00
Saúl Ibarra Corretgé
582d4aff1c deps: sync package-lock.json 2020-03-10 21:04:01 +01:00
Saúl Ibarra Corretgé
b13200ac92 video-layout: fix calculating tile size for recorder
When the reccorder joins, they have a local participant, which is not rendered,
so don't count it towards the partcipant count used for computing the tile
sizes.
2020-03-10 21:04:01 +01:00
C0rn3j
53f937ba4e Update and improve manual install doc 2020-03-09 08:00:23 -05:00
paweldomas
b9addaed71 ref(log): logs device list and selected devices
Logs the device list when is updated in the reducer and removes
"button enabled" logging which used to dump the device list, but
in a useless way(Object[Object]).

Makes an attempt to log currently selected device, but because of
multiple possible paths it's impossible to find one reliable spot to log
selected device. One has to rely on device list and the GUM call logged
to figure things out.
2020-03-06 16:19:20 +01:00
Luca Bösch
fd8fb58eaf Missing german translations.
Due to the outage it wasn't possible to submit them using https://translate.jitsi.org.
Please consider adding them this way.
2020-03-06 13:19:57 +01:00
Saúl Ibarra Corretgé
38d1032fec android: disable HW accelerated decoding on Samsung
They just keep crashing.
2020-03-06 12:42:16 +01:00
Saúl Ibarra Corretgé
073fdc7b0e sperakerstats: prevent access of nil object (#5112)
If the dominant speaker leaves their object will be gone from the mapping.
2020-03-06 12:33:41 +01:00
PanderMusubi
fedaa0ae6e minimized size without quality loss via optipng 2020-03-05 15:19:26 +01:00
Gabriel Imre
f06fe69167 fix(mute): remove interface config bypass for mute-everyone button 2020-03-05 13:54:58 +01:00
bgrozev
16c09c9645 Upadte ljm (configurable pc stats interval), whitelist config options. (#5106) 2020-03-04 15:11:27 -06:00
Gabriel Imre
24a1a60f04 feat(mute): mute everyone / everyone else 2020-03-04 17:07:12 +01:00
Saúl Ibarra Corretgé
d7ece58c6f fix(optimise): cope with URL interface config overrides
Regresssion from bd8a7edbd2.

When the toolbar buttons are overridden with URL parameters, our computed set of
buttons will be wrong. Thus, compute it every time and check for the
differences.
2020-03-04 07:43:52 -06:00
Andrei Gavrilescu
aa11535db7 change you are nosiy message (#5101) 2020-03-04 15:35:22 +02:00
Hristo Terezov
eea87be801 fix(electron7):memory leak when the page is hidden
It happens when you are drawing into hidden canvas.
2020-03-03 09:28:23 +00:00
Hristo Terezov
809ac42e4c fix(largeVideo-bg):render canvas only when visible 2020-03-03 09:28:23 +00:00
Hristo Terezov
cf27ad0dde fix(stream-presenter-effect): Prevent memory leak.
On electron 7 drawing on hidden canvas will trigger a memory leak.
Not appending the canvas for the DOM seems to solve the problem.
2020-03-03 09:28:23 +00:00
Mihai Uscat
2064fc8937 fix(screenshot-capture): Prevent effect initialization on each toggle 2020-03-02 10:24:02 -05:00
Saúl Ibarra Corretgé
95eb551156 android: disable ConnectionService for the Jitsi Meet app
It's the source of uncountable problems for which we don't have a good
solution, since they are caused by buggy implementations of self-managed
connection services by manufacturers.
2020-02-26 17:09:39 +01:00
Hristo Terezov
a7ac7790a8 fix(avatars): optimise 2020-02-26 14:32:37 +00:00
Leonard Kim
94c48ec838 chore(deps): update lib to 47c2bc6
To get a workaround in for wired desktop
screensharing in spot in electron 8. With
the change, no "exact" is used in gum
constraints while attempting to get the
wired screensharing device, as that
triggers overconstrainederror.
2020-02-25 15:22:03 -08:00
Jaya Allamsetty
da68b9882d fix(screenshot-capture): Do not switch streams at the conference level.
This effect doesn't modify the media stream, so its safe to start/stop effect and not apply it on the JitsiLocalTrack. This way we can make sure that this effect is not switched out when presenter effect is applied.
2020-02-25 10:51:44 -05:00
Hristo Terezov
bd8a7edbd2 fix(optimise): mapStateToProps for some components (#5085) 2020-02-25 15:09:52 +00:00
Saúl Ibarra Corretgé
bde2343951 filmstrip: don't display toolbar for SIP gateways
Note that in the usual (vertical) setup, the "toolbar" is just the hide button.
2020-02-25 15:45:41 +01:00
Saúl Ibarra Corretgé
9b141816d6 filmstrip: hide scrollbar on SIP gateways 2020-02-25 15:45:41 +01:00
Saúl Ibarra Corretgé
6a7594cd9c toolbox: always hide for SIP gateways 2020-02-25 15:45:41 +01:00
Saúl Ibarra Corretgé
cdbc5976a0 notifications: hdie all (visual) notifications for SIP gateways 2020-02-25 15:45:41 +01:00
Saúl Ibarra Corretgé
8fd0f56be7 info-dialog: don't show when a SIP gateway joins alone 2020-02-25 15:45:41 +01:00
Saúl Ibarra Corretgé
5b0c6e088a deps: node-sass@4.13.1 2020-02-25 15:45:41 +01:00
horymury
202abf2a9a chrome-banner: add analytics 2020-02-25 13:41:13 +01:00
Horatiu Muresan
fb8ef366c6 Pass room name to IE page 2020-02-21 13:37:58 +01:00
Saúl Ibarra Corretgé
7446e6165e rn: now working on version 20.1 2020-02-21 12:47:07 +01:00
Hristo Terezov
5feaa421a8 fix(tests): bring back APP.conference.listMembers 2020-02-21 11:16:33 +00:00
Saúl Ibarra Corretgé
a4333d3a80 rn,overflow-menu: add a "more options" button 2020-02-20 17:23:13 +01:00
Saúl Ibarra Corretgé
02131f3346 full-screen: fix not re-entering full-screen after dialog is shown
This has the side effect of showing the bottom navbar when the toolbox is open,
which is a nice thing since back is accessible.
2020-02-20 16:49:20 +01:00
Jaya Allamsetty
8dbd1ba1b7 fix(presenter): go back to using standard resolutions for presenter 2020-02-19 16:02:42 -05:00
Saúl Ibarra Corretgé
4c065f2de1 android: fix getting RN version in release script 2020-02-19 15:05:32 +01:00
Saúl Ibarra Corretgé
df895e5a61 deps: react-native@custom-patched
Update the version to 0.61.5-jitsi.1 to avoid build aching problems due to the
version not changing.
2020-02-19 15:05:17 +01:00
Hristo Terezov
bbf1927c70 fix(thumbnail): Optimize status bar moderator icon (#5076)
* fix(thumbnail): Optimize status bar moderator icon

Moved all moderator functionality to react to optimize the number of
status bar updates.

* fix(RemoteVideoMenuTriggerButton): Use nullish coalescing

Co-Authored-By: Saúl Ibarra Corretgé <saghul@jitsi.org>

* ref(StatusBar): rename to StatusIndicators

* fix(RemoteVideoMenu): isModerator value.

* fix(notification): mobile.

Co-authored-by: Saúl Ibarra Corretgé <s@saghul.net>
2020-02-18 16:31:04 +00:00
horymury
86130c1478 chrome-banner: log success of retrieving configs 2020-02-18 10:56:09 +01:00
damencho
15fb8a1525 Adds a disco feature to distinguish jibri participants. 2020-02-14 21:44:19 +00:00
Saúl Ibarra Corretgé
64cbfb648f deps: react-native@custom-patched
Use RN 0.61.5 + a custom patch (submitted upstream) for fixing a crash in JSI.
2020-02-14 17:22:58 +01:00
Vincent Hou
3e40bb19cd fixed the encoded tiltle issue in chinese
Checked the code of react.native part, there's no issue by using safeDecodeURIComponent.
So fixed it in same way.
2020-02-12 15:50:55 +01:00
Bettenbuk Zoltan
bbca0fc357 allow setting the feedback percentage 2020-02-12 10:59:54 +01:00
Дамян Минков
9bb789472e Uses correct scopes for google API based on config.js values. (#5066)
* Uses correct scopes for google API based on config.js values.

* Lower the number of parameters that we pass around.

* Fixes googleAPIState state checking.
2020-02-11 15:14:01 +00:00
Hristo Terezov
06fa175a6c fix(large-video): Resize calculations.
Since the verical filmstrip doesn't set its width explicitly anymore,
calculating the available area for the large video based on the
filmstrip width retrieved from the HTML element was wrong
in the cases when the rendering and cleanup of the filmstrip hasn't
finish yet. For example when switching from tile view to stage view.
2020-02-10 20:23:37 +02:00
Hristo Terezov
5940f2890a fix(remote-control): mouse events 2020-02-07 18:57:59 +02:00
Saúl Ibarra Corretgé
7d09088186 android: turn on HW video decoder
In 49e3b03885 we turned on SW encoders / decoders
on account of some devices having broken HW *encoders* and also our desire for
using simulcast.

Well, the astute reader may have noticed that only *encoding* was mentioned.
Indeed, we should be able to keep using the HW decoder just fine.
2020-02-07 15:27:12 +01:00
damencho
34be081d87 Commit from translate.jitsi.org by user damencho.: 571 of 626 strings translated (47 fuzzy). 2020-02-07 13:45:58 +00:00
damencho
3c36eece5e Commit from translate.jitsi.org by user damencho.: 620 of 626 strings translated (0 fuzzy). 2020-02-07 13:45:40 +00:00
damencho
8eb0acada6 Commit from translate.jitsi.org by user damencho.: 620 of 626 strings translated (0 fuzzy). 2020-02-07 13:45:25 +00:00
damencho
8307a8be2d Commit from translate.jitsi.org by user damencho.: 620 of 626 strings translated (0 fuzzy). 2020-02-07 13:45:12 +00:00
damencho
d62190c644 Commit from translate.jitsi.org by user damencho.: 559 of 626 strings translated (12 fuzzy). 2020-02-07 13:45:01 +00:00
damencho
58c4248da0 Commit from translate.jitsi.org by user damencho.: 620 of 626 strings translated (0 fuzzy). 2020-02-07 13:44:51 +00:00
jitsi-pootle
74af70a1d5 New files added from translate.jitsi.org based on templates 2020-02-07 13:44:51 +00:00
Jaya Allamsetty
7b25b847ba fix(presenter): resize desktop track to 720p when presenter starts 2020-02-06 13:44:40 -05:00
paweldomas
18536cb14c ref: remove grayscale filter from participants thumbnails 2020-02-06 07:54:09 -06:00
paweldomas
01e36e1c56 ref: remove connectivity issues indication for remote participants
It's been considered too disruptive and will often misfire especially
if there are issues with the data channels.
2020-02-06 07:54:09 -06:00
Horatiu Muresan
5d96a226ed Prevent chrome extension banner from spanning the console when disabled 2020-02-06 12:59:36 +00:00
Jaya Allamsetty
9855fac805 fix(screenshot-capture): Move the flag for enabling/disabling the feature to config.js
This will let us enable/disable the feature based on environment/deployment
2020-02-05 16:47:21 -05:00
Andrei Gavrilescu
ed5351d250 Add dial-in link to no audio notification (#5026)
* Add dial-in link to no audio notification

* refactor react link component

* fix tests
2020-02-05 18:10:57 +00:00
Hristo Terezov
b64260e554 ref(Amplitude): device id syncing 2020-02-05 18:10:38 +00:00
Saúl Ibarra Corretgé
7d67cb583e rn,connection: fix autogenerated BOSH address
When the location URL contains a nonstandard port, it won't be included in
URL.hostname, but it will in URL.host.
2020-02-05 16:05:11 +01:00
Saúl Ibarra Corretgé
8e3c301d03 misc: use longer lines 2020-02-05 15:04:23 +01:00
Saúl Ibarra Corretgé
f9071b8b6b rn,recording: fix not displaying Dropbox storage text 2020-02-05 15:04:23 +01:00
Saúl Ibarra Corretgé
01abc4e8a8 lint: fix warning 2020-02-05 15:04:23 +01:00
Jaya Allamsetty
c5bddda781 fix(blur): Increase the background blur value 2020-02-04 14:07:17 -05:00
Jaya Allamsetty
c2bc92ae05 deps(blur): Bump tfjs to 1.5.1 2020-02-04 13:20:35 -05:00
damencho
a425e9c92e Disable status change notifications when join/leave notifications are disabled. 2020-02-04 17:26:27 +00:00
Saúl Ibarra Corretgé
3bfa4744c8 rn,tracks: fix loadEffects
The resolved promise is expected to return an array.
2020-02-04 18:06:11 +01:00
Saúl Ibarra Corretgé
bd5901d59c notifications,presence-status: check if interfaceConfig is declared
Protectt ourselves against interfaceConfig being undeclared. typeof
interfaceConfig will return "undefined", but that's different than having some
window.interfaceConfig = undefined, even though the valus is the same. The
former will give a ReferenceError.
2020-02-04 15:51:59 +01:00
Saúl Ibarra Corretgé
306c8ba8c2 android: prepare SDK build for Hermes
We need to push the Hermes AAR to Maven and have the SDK depend on it.
2020-02-04 14:25:56 +01:00
Saúl Ibarra Corretgé
5a6335207f android: raise frament library version dependency 2020-02-04 14:25:56 +01:00
Paweł Domas
97e8a6c3f3 Remove UI for local connectivity issues (#5016)
* ref(web): removes video blur when ICE is disconnected.

Removes the blur effect from the large video and stops showing
the network connectivity issues message when ICE disconnects.

The feature has been considered too disruptive and there's a plan to
have it replaced with a more subtle indication.

* remove RECONNECTING key from main.json
2020-02-04 08:25:13 +01:00
Jaya Allamsetty
523926d598 deps(ljm) - detect old Edge browser and mark it as unsupported 2020-02-03 14:29:39 -05:00
Vlad Piersec
ab5627212d Add ability to invite contact by phone number 2020-01-30 13:34:06 +00:00
Pedro Henrique Linhares
1b6c5a7141 Set SASL username when using anonymous mechanism with auth_token (#5025) 2020-01-30 00:25:15 +00:00
horymury
a9767eda72 Fix chrome extension banner (#5011)
* Fix chrome extension banner

* Address reviews
2020-01-29 12:30:17 +00:00
paweldomas
6c3a5793b4 fix(webpack.config.js): specify Host header in the webpack proxy pass
Without changing the 'Host' header, a standalone instance we use for
jitsi dev work will generate:

config.websocket = 'wss://localhost:8080/xmpp-websocket'

This was fine with BOSH, but a Websocket will not connect.

With this change it will be(based on the default devServerProxyTarget):

config.websocket = 'wss://alpha.jitsi.net/xmpp-websocket'
2020-01-28 09:55:54 -06:00
Saúl Ibarra Corretgé
c05b4a43e8 rn,tracks: do not load stream effects on mobile 2020-01-28 16:21:11 +01:00
Saúl Ibarra Corretgé
385669cbb8 misc: use default values for parameters 2020-01-28 16:21:11 +01:00
Leonard Kim
5cfae2c419 fix(config): make SHOW_CHROME_EXTENSION_BANNER overridable 2020-01-27 21:26:38 -08:00
bgrozev
92740707f0 Removes firefox from the list of recommended browsers. (#5017) 2020-01-27 14:09:37 -06:00
damencho
775c531fe7 Enables all recording/livestreaming notifications in sip gw mode. 2020-01-27 16:20:32 +00:00
Jaya Allamsetty
b8eda2b68d deps: update ljm, do not use window.chrome to identify webOS as chrome 2020-01-27 11:04:39 -05:00
paweldomas
470c115e7c feat(analytics): add 'websocket' property 2020-01-24 15:21:10 -06:00
paweldomas
d9cf7aef3a doc: add more websocket examples 2020-01-24 15:21:10 -06:00
paweldomas
c20c4bd5a3 ref(do_external_connect): do not use jiconop if websocket is enabled 2020-01-24 15:21:10 -06:00
paweldomas
74a5eb2d81 add websocket templates to nginx example config 2020-01-24 15:21:10 -06:00
paweldomas
b25db3ce2e feat(config.js): add 'websocket' config option
Config.js will allow to specify both BOSH and Websocket URLs. In such
case the web app will prefer Websocket over BOSH. The reason is that it
appears to be more stable and a bit fast on web, while on mobile
websocket is dropped fast(killed by the OS) on network changes.
2020-01-24 15:21:10 -06:00
Hristo Terezov
31d9fb12c8 ref(Filmstrip): Optimize resizes. (#4992)
* ref(Filmstrip): Optimize resizes.

* fix(thumbnails): resize.

* fix(thumbnails): Issue with height 0, width 0.

* doc(Filmstrip): Improve JSDoc.
2020-01-24 16:28:47 +00:00
Saúl Ibarra Corretgé
ca9ca04d0f rn,tracks: fix accessing value on undefined object 2020-01-24 16:26:32 +01:00
Saúl Ibarra Corretgé
5a027f1585 rn,media: avoid creating presenter tracks
When ensureTrack is set to true a track will be created with the given media
type. 'presenter' is not supported on RN.
2020-01-24 16:14:29 +01:00
Aaron van Meerten
5d86d202bd initial session for bosh and websockets (#5006)
* hook on websocket events

* initial session for bosh and websockets
2020-01-24 14:59:29 +00:00
Saúl Ibarra Corretgé
7ea7afebfb deps: react-native-sound@latest
Fixes an issue with not loading sounds on iOS when the bundle name contains
spaces.

See:
3fe5480fce
2020-01-24 14:29:09 +01:00
Aaron van Meerten
710307725b fixes async_handler_wrapper (#5001)
* fixes async_handler_wrapper

adds missing runner variable from async to async_handler_wrapper
removes redundant have_async definition in wrap_async_run, defined at top of module

* only use async handler wrapper,
remove async_wrap_run
2020-01-23 19:31:05 +00:00
Hristo Terezov
1cde7e63c7 feat(Amplitude): Set device id from cookie. (#4997) 2020-01-23 18:36:31 +00:00
Saúl Ibarra Corretgé
a53d284bbe lint: fix eslint warning 2020-01-23 15:48:57 +01:00
Saúl Ibarra Corretgé
579e650a1d lint: fix eslint error 2020-01-23 15:48:57 +01:00
Andrei Gavrilescu
ee525ae569 Whitelist audio detection related configs 2020-01-23 15:15:55 +01:00
horymury
63a411168e Add Install chrome extension banner (#4996) 2020-01-23 09:32:52 +00:00
Vlad Piersec
ad68a87dba Add config options for presence & join/leave message visibility 2020-01-22 11:08:31 +01:00
Jaya Allamsetty
45aafe5432 deps: update lib-jitsi-meet and js-utils 2020-01-21 14:46:09 -05:00
Jaya Allamsetty
ac0f3979b0 Remove isEdge check from the client 2020-01-21 11:55:52 -05:00
Andrei Gavrilescu
d2c2919aef feat: display noise detection notification (#4952)
* feat: display noise detection notification

* address code review p1

* Address code review p2

* bump lib-jitsi-meet version
2020-01-20 18:00:12 +00:00
Mihai Uscat
a18ed3a779 feat(ScreenshotCaptureEffect) Implement. 2020-01-20 10:02:19 -05:00
Jaya Allamsetty
22871f15d0 update LJM for Edge change 2020-01-15 18:07:14 +00:00
damencho
91fb4665d6 Fixes conference duration config to use valid IDNA. 2020-01-14 12:16:39 +00:00
paweldomas
f6c94fffc4 fix(conference.js): prevent presenter track leak
A duct tape fix for presenter track leak for a case when presenter GUM
is in progress when screensharing is being turned off.
2020-01-13 14:54:33 -06:00
paweldomas
c8939a133d fix(conference.js): crash on undefined this.localPresenterVideo
...if camera device is changed in the settings while screen sharing.
2020-01-13 14:54:33 -06:00
paweldomas
f810483ff6 fix(conference.js): prevent multiple GUM calls on presenter unmute
Chain _mutePresenterVideo async calls in order to prevent calling GUM
multiple times.
2020-01-13 14:54:33 -06:00
theunafraid
c2cf09a2ca Add conference timer (#4958) 2020-01-13 17:12:25 +00:00
Дамян Минков
c73ba37202 Introduces installing coturn as turn server for jitsi-meet (#4959)
* Adds package that can configure using turnserver for jitsi-meet.

Activates http2 on the nginx host and uses the alpn send with the web requests to multiplex traffic to be served as web of proxied to the turn server.
It needs nginx at least v1.13.10.
Adds turncredentials module from Philipp Hancke, with small modification (all int values for hosts need to be strings/tostring()) in order to be able to use the module with prosody 0.11.

* Moves loading of stream after loading stream module (50-..).

* Leaves DISABLE_TCP_HARVESTER to be handled by jvb.

* Fixes comments.

* Properly detect first time coturn install and configure it.

* Handles upgrading from jetty serving web.

* Does not create jvb user if already exists.

* Fixes let's encrypt and adds turnserver handling.

* Enables use of turn server in config.js if available.

* Adds a check whether prosody config exists.

There are cases where deployments can still have configured prosody in the main prosody config in /etc/prosody.
2020-01-09 16:51:27 +00:00
Saúl Ibarra Corretgé
659eb6b789 android: add a consistent device ID in Amplitude
Use ANDROID_ID:
https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID
2020-01-09 16:38:13 +00:00
Saúl Ibarra Corretgé
87821eb2c0 android: unmute microphone on the ConnectionService handler
This shouldn't be needed, as ConnectionService should take care of it, but we
suspect some devices don't do it since we got reports of people not hearing
users, and the problem went away when CS was disabled.
2020-01-09 14:37:15 +00:00
Saúl Ibarra Corretgé
8291f4597c deps: react-native-webrtc@1.75.3
Fixes datachannels not working.
2020-01-08 22:15:37 +00:00
Saúl Ibarra Corretgé
fddaf7c8a8 android: handle ConnectionService failures more resiliently
Fallback to the non-ConnectionService case for any error. Also, handle errors
when registering the phone account; Pixel C devices throw UnsupportedException.
2020-01-08 16:50:39 +00:00
Saúl Ibarra Corretgé
960ffa7e78 android: switch to the Hermes JavaScript engine 2020-01-08 14:29:25 +00:00
Saúl Ibarra Corretgé
779ed6bb5e deps: react-native@0.61.5 2020-01-08 14:29:25 +00:00
Yana Stamcheva
47984d3ec1 Fixes more number page underlining. 2020-01-08 11:20:40 +00:00
damencho
d9282f873c Migrate to using mucs for jvb. 2020-01-08 11:18:36 +00:00
damencho
9344138303 Fixes reloading on remove to always succeed. 2020-01-08 11:18:36 +00:00
paweldomas
6c3968a434 ref: remove features/base/conference -> /app cycle
Move call to reloadNow() on CONNECTION_FAILED to
the ./features/app/middleware to avoid importing higher order feature
from the lower level one.
2020-01-07 17:44:39 +00:00
paweldomas
e8e70d9d27 ref(base/connection/actions.native): JitsiConnection.connect returns void
Do not return anything from JitsiConnection.connect, because it's not
a promise and returns void. Doing so is confusing to the reader.
2020-01-07 17:44:22 +00:00
Emil Ivov
0be68b59b7 Merge pull request #4973 from jitsi/hristoterezov-patch-1
feat(thumbnailMenu):Change remoteControl item text
2020-01-07 14:17:12 +00:00
Hristo Terezov
d5ab3da9f2 feat(thumbnailMenu):Change remoteControl item text 2020-01-07 14:15:54 +00:00
Saúl Ibarra Corretgé
5ef0f527f9 android: handle exception when unregistering account
Pixel C devices have been seen crashing here, oh well.
2020-01-07 12:03:02 +01:00
damencho
e60a14d5af Commit from translate.jitsi.org by user damencho.: 621 of 621 strings translated (0 fuzzy). 2019-12-20 16:22:31 +00:00
damencho
03abb244df Commit from translate.jitsi.org by user damencho.: 570 of 621 strings translated (48 fuzzy). 2019-12-20 16:22:20 +00:00
damencho
f9ea8b034f Commit from translate.jitsi.org by user damencho.: 621 of 621 strings translated (0 fuzzy). 2019-12-20 16:22:09 +00:00
damencho
ee551ea0a0 Commit from translate.jitsi.org by user damencho.: 621 of 621 strings translated (0 fuzzy). 2019-12-20 16:21:57 +00:00
damencho
0b22f8e449 Commit from translate.jitsi.org by user damencho.: 621 of 621 strings translated (0 fuzzy). 2019-12-20 16:21:46 +00:00
damencho
e21f99d9d6 Commit from translate.jitsi.org by user damencho.: 621 of 621 strings translated (0 fuzzy). 2019-12-20 16:21:36 +00:00
damencho
edb56200d5 Commit from translate.jitsi.org by user damencho.: 621 of 621 strings translated (0 fuzzy). 2019-12-20 16:21:23 +00:00
damencho
04313a4aa3 Commit from translate.jitsi.org by user damencho.: 538 of 621 strings translated (8 fuzzy). 2019-12-20 16:21:11 +00:00
damencho
cdb606e7ee Commit from translate.jitsi.org by user damencho.: 611 of 621 strings translated (0 fuzzy). 2019-12-20 16:21:00 +00:00
damencho
28781965ed Commit from translate.jitsi.org by user damencho.: 102 of 621 strings translated (6 fuzzy). 2019-12-20 16:20:49 +00:00
damencho
cbe396be55 Commit from translate.jitsi.org by user damencho.: 595 of 621 strings translated (0 fuzzy). 2019-12-20 16:20:35 +00:00
damencho
a3befe336f Commit from translate.jitsi.org by user damencho.: 611 of 621 strings translated (0 fuzzy). 2019-12-20 16:20:24 +00:00
damencho
63ea496bcd Commit from translate.jitsi.org by user damencho.: 106 of 621 strings translated (16 fuzzy). 2019-12-20 16:20:13 +00:00
damencho
db6547f48d Commit from translate.jitsi.org by user damencho.: 558 of 621 strings translated (13 fuzzy). 2019-12-20 16:20:00 +00:00
damencho
34e329a4f2 Commit from translate.jitsi.org by user damencho.: 255 of 621 strings translated (24 fuzzy). 2019-12-20 16:19:49 +00:00
Hristo Terezov
42b71fc4b9 feat(horizontal-filmstrip): scroll 2019-12-19 19:17:04 +00:00
Jaya Allamsetty
dd99268461 fix(blur): update to bodyPix 2.0 2019-12-19 09:18:39 -05:00
Saúl Ibarra Corretgé
692c6a47b4 rn: now working on versions 20.0 / 2.6 2019-12-17 16:19:42 +01:00
Saúl Ibarra Corretgé
b3983aa766 android: add ability to make test signed release builds 2019-12-17 16:11:50 +01:00
Saúl Ibarra Corretgé
a79ae9b576 android: guard against potential exceptions when dealing with log handlers 2019-12-17 16:11:36 +01:00
Saúl Ibarra Corretgé
e69da98348 android,ios: add store screenshots
While Fastlane recommends automagic screenshots, we cannot really do that since
we require a specific setup for a video call and so on.
2019-12-17 16:09:57 +01:00
damencho
e01d891bba Disables tcp harvester if bridge is installed on same machine. 2019-12-17 12:05:54 +00:00
damencho
f904626f5e Removes jetty and makes nginx default webserver. 2019-12-17 12:05:54 +00:00
Hristo Terezov
1333fd1975 fix(thumbnails): es6 support & cleanup. 2019-12-16 16:51:59 +00:00
Saúl Ibarra Corretgé
af918f8dc5 Merge pull request #4939 from saghul/fix-sdk-build
ios: fix SDK build after dropping iOS 10
2019-12-16 12:01:10 +01:00
Jaya Allamsetty
b7baf8fe98 Update lib-jitsi-meet (#4940)
* Update lib-jitsi-meet and js-utils
2019-12-13 17:08:48 -05:00
Saúl Ibarra Corretgé
4ebab6f9c0 ios: fix SDK build after dropping iOS 10
Since we only support iOS 11, 32 bit architectures must not be built.
2019-12-13 13:06:09 +01:00
Hristo Terezov
8f93acb464 chore(package.json): Update lib-jitsi-meet. 2019-12-12 16:58:41 +00:00
Bettenbuk Zoltan
9b60537e0f feat: add swipe handler to entire bottom sheet 2019-12-12 17:15:11 +01:00
Jaya Allamsetty
7b9abd34a0 fix(presenter-mode): notify external API when presenter is unmuted for the first time 2019-12-10 21:34:49 -05:00
Jaya Allamsetty
ed82443ffa clean-up 2019-12-10 15:59:06 -05:00
Jaya Allamsetty
a3cd331369 fix: Workaround on FF for getting the resolution of the desktop track 2019-12-10 15:59:06 -05:00
Leonard Kim
9c77ab7f4d ref(api): use Transport modules from js-utils
PostMessageTransportBackend and Transport, along
with the constants file they both use, were
moved int js-utils for jitsi-meet-spot.
2019-12-10 06:48:19 -08:00
Saúl Ibarra Corretgé
55983ff62a rn,welcome: update join button text 2019-12-10 15:13:37 +01:00
damencho
b4be1bcd05 Adds some checks about async.
There are modules that will not work with prosody 0.10 as they depend on util.async. Adds a safeguard and print error about it in the logs.
And others that just do not work because of the muc module API that they use.
2019-12-10 10:55:56 +01:00
damencho
2420a68be9 Enables speakerstats component and module by default. 2019-12-10 10:55:56 +01:00
damencho
ebfc5a95ff Activates multidomain by default when installing with nginx. 2019-12-10 10:55:56 +01:00
Leonard Kim
68cad276bd fix(lock): ensure lock prompt is closed on password submit
This addresses a bug, in which submitting a password
through the iframe api no longer closes RoomLockPrompt,
by explicitly closing prompts for a lock or password.
2019-12-09 08:44:18 -08:00
Bettenbuk Zoltan
e683d70a18 Add support for avatar status badge (presence) 2019-12-09 11:58:23 +01:00
Andrei Gavrilescu
9645391180 update package links 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
851b1a76a9 Address code review 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
4890390ea2 fix action uid name / remove imports 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
7828bf8d46 setNoSrcDataNotificationUid 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
191da551e3 refactor / address code review 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
55f35933e8 address code review 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
b125bff7c7 refactor / enable VAD talk while muted 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
c1d261445e Initial commit 2019-12-06 11:37:08 +00:00
Andrei Gavrilescu
c494d6c48b feat: show no audio signal notification 2019-12-06 11:37:08 +00:00
Saúl Ibarra Corretgé
4134d47f6e recording: remove beta label from LiveStreamButton 2019-12-05 16:23:27 +01:00
Jaya Allamsetty
0b25e62c5c fix: Reuse the existing JitsiLocalTrack on presenter unmute 2019-12-05 09:25:34 -05:00
damencho
4d0cbff5a1 Ignore errors when restarting services.
Sometimes conflicting or wrong configuration can leave the package in broken state and users cannot even uninstall/purge the packages, and it also breaks any other package installation.
2019-12-04 17:21:12 +00:00
damencho
c79463aaee Fixes including config.js template. 2019-12-04 17:21:12 +00:00
damencho
339e1c5fab Moves config template files out of doc folder. 2019-12-04 09:50:55 +00:00
Saúl Ibarra Corretgé
36455c24c8 auth: fix rendering error and progress messages
Also removed some no longer used styles.
2019-12-03 14:33:26 +01:00
Saúl Ibarra Corretgé
a622a4c713 android: handle ConnectionService failures more resiliently
Some Samsung devices will fail to fully engage ConnectionService if no SIM card
was ever installed on the device. We could check for it, but it would require
the CALL_PHONE permission, which is not something we want to do, so fallback to
not using ConnectionService.
2019-12-03 11:56:04 +01:00
Hristo Terezov
1aaaae24ee feat(Amplitude): enable referrer 2019-11-29 15:43:14 +00:00
Hristo Terezov
9191000da4 chore(package.json): Update lib-jitsi-meet 2019-11-29 13:41:14 +00:00
Bettenbuk Zoltan
8eb93086bd fix: set an avatar icon size relative to the container 2019-11-29 14:37:35 +01:00
Bettenbuk Zoltan
b64294af6d fix: emoji in links 2019-11-29 14:36:42 +01:00
Hristo Terezov
bbf33a8895 feat(welcome-page): Add viewed analytics event. 2019-11-28 15:36:12 +00:00
Jaya Allamsetty
bcc1289a23 feat(presenter): Modify the default behavior for presenter mode, it set to off when screensharing is turned on. Also, revert video to the original state when screensharing is turned off. 2019-11-27 11:13:36 -08:00
Saúl Ibarra Corretgé
58bd48c1ae android: disable ConnectionService if permissions are not granted
Some devices seem to have a bug in their Android versions and startCall fails
with SecurityError because the CALL_PHONE permissions is not granted. This is
not a requirement for self-managed connection services as per the official
documentation though:
https://developer.android.com/guide/topics/connectivity/telecom/selfManaged

Alas, connection services takes over audio device management too, so let's
handle the error and disable CS if we get SecurityError.
2019-11-27 14:33:25 +01:00
Saúl Ibarra Corretgé
1a3736bf98 android: unregister phone account if startCall fails 2019-11-27 14:33:25 +01:00
Saúl Ibarra Corretgé
0eec182df4 android: remove old code for accepting SDK license
It can now be automated in a CI environment as follows:

yes | sdkmanager --licenses
2019-11-27 14:24:29 +01:00
Saúl Ibarra Corretgé
c526844eb2 chore: remove unused images 2019-11-26 21:20:50 +01:00
Saúl Ibarra Corretgé
d856c1f328 ios: add apple-touch-icon icon
Ref: https://webhint.io/docs/user-guide/hints/hint-apple-touch-icons/
2019-11-26 21:13:02 +01:00
Saúl Ibarra Corretgé
15e47a9eb3 android: update native dependencies 2019-11-26 20:33:38 +01:00
Saúl Ibarra Corretgé
da98d39b61 doc: add app download badges to README 2019-11-26 14:58:35 +01:00
Bettenbuk Zoltan
411bafb5a6 feat: minimized bottom menu 2019-11-26 12:08:43 +01:00
Jaya Allamsetty
0a64bf2068 feat(presenter): add Presenter Mode
- Adds the ability to share video as a "PiP" when screenshare is in progress.
- Add a method for creating a local presenter track.
- Make sure isLocalVideoTrackMuted returns the correct mute state when only screenshare is present.
- Make sure we get the updated window size of the window being shared before painting it on the canvas.
- Make sure we check if the shared window has been resized
2019-11-26 11:57:03 +01:00
damencho
db6a2673de Handles unique Id for a meeting. 2019-11-26 10:37:19 +00:00
damencho
e11d4d3101 Installs prosody plugins with jitsi-meet-prosody package. 2019-11-26 10:37:19 +00:00
Saúl Ibarra Corretgé
8fd3bb2302 android: fallbacck to speaker in ConnectionService handler
It has been our default for a while.
2019-11-26 11:30:18 +01:00
theunafraid
fb3a832a52 Add shortcut key for toggle tile view (#4882)
* Add shortcut key for toggle tile view

* Toggle tile view shortcut - undo main-enGB.json

* Add analytics

* Use already defined toolbar translations
2019-11-22 16:15:39 +00:00
Saúl Ibarra Corretgé
9c146c1245 subject: hide participant count for 1-1 calls
refs: https://github.com/jitsi/jitsi-meet/issues/4871
2019-11-22 10:49:24 +01:00
Saúl Ibarra Corretgé
792f506425 ios: drop support for iOS 10 2019-11-22 10:46:02 +01:00
Bettenbuk Zoltan
6121e9fc65 feat: improve chat UX 2019-11-21 18:11:58 +01:00
Bettenbuk Zoltan
955fa1f49f fix: undefined is not an object on bitrate 2019-11-21 18:11:58 +01:00
damencho
2544d0a084 Fixes the message for who kicked you. 2019-11-20 17:01:00 +02:00
Bettenbuk Zoltan
8f0a12016a fix: return room lock conference, when there is no other 2019-11-20 13:28:47 +01:00
Leonard Kim
34ccd3524f fix(chat): preserve intentional linebreaks in message display 2019-11-20 08:58:02 +01:00
Leonard Kim
563e99ecd3 fix(chat): wrap long text 2019-11-18 09:31:47 -08:00
Leonard Kim
70f14be50f fix(large-video): center dominant speaker avatar using css
The vertical alignment was being set with javascript.
Recent changes might make the setting of alignment exit
early due to height 0 video. As position can be set
declaratively with css, use css to set position.
2019-11-15 07:51:59 -08:00
Bettenbuk Zoltan
8bd0da886e feat: safe decodeURIComponent 2019-11-15 15:18:20 +01:00
damencho
1fd326f980 Fixes nginx match rule, containing wrong chars.
Also adds a missing '/'.
2019-11-15 14:10:55 +00:00
yanas
d9cc664ea6 Merge pull request #4865 from jitsi/position-status-message
fix(remote-status-message): position
2019-11-15 14:10:34 +00:00
Hristo Terezov
d65e241056 fix(remote-status-message): position 2019-11-15 12:33:01 +00:00
Saúl Ibarra Corretgé
fe2b1f3d9f rn: refactor aspect ratio and reduced UI detectors 2019-11-15 12:54:44 +01:00
virtuacoplenny
17c1f50fc3 fix(mobile-landing): do not attempt opening download link in new window
Instead let the mobile OS take care of opening the URL
in the appropriate application. Without target _blank,
iOS 13.2.2 on Chrome will open about:blank and immediately
close the tab instead of opening the store.
2019-11-15 09:43:18 +01:00
Saúl Ibarra Corretgé
5c1c022291 doc: add open beta links to README 2019-11-15 09:30:42 +01:00
Boris Grozev
72435dee56 Order fields alphabetically. 2019-11-14 17:49:06 -06:00
Boris Grozev
42f2eff02a Whitelists the "stereo" flag. 2019-11-14 17:49:06 -06:00
Saúl Ibarra Corretgé
0b68bef0be ios: set Fastlane test groups 2019-11-14 18:21:37 +01:00
Saúl Ibarra Corretgé
676e943d81 ios: fix typo in Fastlane file 2019-11-14 16:02:39 +01:00
Saúl Ibarra Corretgé
2b4307dee9 ios: fix Fastlane beta build submissions 2019-11-14 15:49:09 +01:00
Hristo Terezov
f3f936c196 fix(large-video): missing video. 2019-11-14 06:29:27 -08:00
Saúl Ibarra Corretgé
eb900ddbe1 android: fix track name in Fastlane 2019-11-14 15:27:32 +01:00
Saúl Ibarra Corretgé
c2c323347a rn: skip logging potentially sensitive data 2019-11-14 15:01:29 +01:00
Saúl Ibarra Corretgé
af6642b91b rn: allow for userInfo and token to be set from the SDK 2019-11-14 12:30:15 +01:00
drimovecz
ffded8d82a Drimovecz/speakerstats (#4851)
* Correctly process speaker stats events when the conference contains a subdomain
2019-11-13 15:37:09 +00:00
Saúl Ibarra Corretgé
00b57c7983 fix(transport): remove legacy code
It has been around bor > 2.5 years already.
2019-11-13 16:15:29 +01:00
Saúl Ibarra Corretgé
5d40a8992a ios: disable bitcode when building the SDK for a release
This makes it possible to compile the SDK with Xcode 10 and 11. The problem is
that the Google SDK (used for sign-in) is compiled with Xcode 11. This avoids
the issue.
2019-11-13 13:17:51 +01:00
Saúl Ibarra Corretgé
e543625295 rn,settings: set the placeholder text color 2019-11-13 10:38:05 +01:00
Saúl Ibarra Corretgé
0b25ff649e ios: fix not displaying TextInput values in SettingsView 2019-11-13 10:38:05 +01:00
Saúl Ibarra Corretgé
63344ac62d deps: react-native-webrtc@1.75.2
Fixes an Android crash on craptacular devices.
2019-11-13 08:31:05 +01:00
Saúl Ibarra Corretgé
2e60aafebf fastlane,ios: add ability to set the changelog 2019-11-12 18:14:02 +01:00
Saúl Ibarra Corretgé
131e8f4aea fastlane: prepare for open beta access 2019-11-12 16:06:15 +01:00
Bettenbuk Zoltan
53f01a39c9 feat: private message interface config flag 2019-11-12 15:48:53 +01:00
Дамян Минков
50f4796144 Adds an option to set email through iframe API init and to stats. (#4842)
* Adds an option to set email through iframe API init and to stats.

* Simplifies configuring email and displayName in stats.

Removes enableStatsID as not needed as when off we are sending as callstats id xmpp resource which is unique per call and id must be something that sticks between calls (callstatsUsername).

* Adds email and displayName in stats config for mobile.

* chore(deps): Updates lib-jitsi-meet to latest dd31f0a.

* Removes enableStatsID from config and whitelist.
2019-11-12 13:37:54 +00:00
Дамян Минков
5bdfae377f Adds a hook to insert body & head html. (#4843)
* Adds a hook to insert body html.

* Adds a hook to insert head html.
2019-11-12 13:37:48 +00:00
Saúl Ibarra Corretgé
44970648ea rn: now working on versions 19.5 / 2.5 2019-11-08 15:21:55 +01:00
Saúl Ibarra Corretgé
3cd7f0b77d settings: fix loading disableCallIntegration 2019-11-08 12:15:49 +01:00
Saúl Ibarra Corretgé
4d243f9b92 android: fix selecting the Bluetooth route
Samsung devices (of course) seem to stick with the earpiece if we first select
Bluetooth but then set speaker to false. Reverse the order to make everyone
happy.

This only applies to the generic and legacy handlers.
2019-11-08 12:15:49 +01:00
Saúl Ibarra Corretgé
6b716f8f56 android: fix initializing audio device handler modules too early
When ConnectionService is used (the default) we were attaching the handlers too
early, and since attaching them requires that the RNConnectionService module is
loaded, it silently failed. Instead, use the initialize() method, which gets
called after all the Catalyst (aka native) modules have been loaded.
2019-11-08 12:15:49 +01:00
Saúl Ibarra Corretgé
5b99219f29 android: log a warning if listeners could not be attached 2019-11-08 12:15:49 +01:00
Saúl Ibarra Corretgé
f0dcb51915 android: make code a bit more readable 2019-11-08 12:15:49 +01:00
Bettenbuk Zoltan
3ff658a13b fix: respect safe area in conference on ios 2019-11-07 12:26:54 +01:00
Bettenbuk Zoltan
3a46513d4b ref: remove unused code 2019-11-07 12:26:54 +01:00
Saúl Ibarra Corretgé
ad0064993d ios: enable Swift mobule stability for the SDK target
Supersedes: https://github.com/jitsi/jitsi-meet/pull/4818
Fixes: https://github.com/jitsi/jitsi-meet/issues/4812
2019-11-06 18:30:26 +01:00
Saúl Ibarra Corretgé
458d4acd22 ios: use the "new" Xcode build system
It was introduced in Xcode 9 and made the default in Xcode 10. We were forcing
the use of the legacy version, which doesn't support some new features that we
wish to enable, such as building the SDK for distribution.
2019-11-06 18:30:26 +01:00
Saúl Ibarra Corretgé
8ebc99175c ios: set deployment target on Pods to 10.0
Matches the app / SDK deployment target and avoids compilation warnings.
2019-11-06 18:30:26 +01:00
Vlad Piersec
9889cb2b69 Add conference name as fallback for subject 2019-11-06 17:23:18 +01:00
Saúl Ibarra Corretgé
191e530071 uri: avoid using String.prototype.normalize
It crashes on Android. Well, on the JSC version React Native uses on Android.

While we could use this fallback only on Android, we have decided to use it
on all mobile platforms for consistency.
2019-11-06 15:37:14 +01:00
Mihai Uscat
ae30d39b4d feat(PromotionalFooter): Implement 2019-11-06 03:29:49 -08:00
Leonard Kim
c354e46846 chore(deps): update lib so newer FF does not need click for gum 2019-11-06 07:47:14 +00:00
Hristo Terezov
5da4e43e50 fix(settings): respect configWhitelist 2019-11-05 02:13:54 -08:00
Hristo Terezov
eae6f7760f fix(configWhitelist): add startWithAudioMuted. 2019-11-05 02:13:54 -08:00
Mihai Uscat
00161212c8 feat(welcome): Add responsive text to go button 2019-11-04 05:48:55 -08:00
Mark Anthony Sison
8976b92842 doc(install): adds cd command to jitsi-meet installation 2019-11-03 19:46:34 +00:00
Vlad Piersec
c3a6a8fb17 Add participants count 2019-10-31 09:08:59 -07:00
Saúl Ibarra Corretgé
391e5ca483 deps: react-native@0.61.3 2019-10-31 16:44:31 +01:00
Saúl Ibarra Corretgé
36654cb808 rn: disable H.264 on select devices even when not in P2P
iOS 10 crashes, so don't use it there, in any case.
2019-10-31 16:41:08 +01:00
Saúl Ibarra Corretgé
6d16e087d9 rn: add a new advanced settings section
Currently only 2 options are implemented, mainly aimed at helping troubleshoot
audio related problems:

- Disable native call integration (it disables CallKit / ConnectionService)
- Disable P2P
2019-10-31 16:41:08 +01:00
Saúl Ibarra Corretgé
fe90e5aa8f rn,settings: remove top margin 2019-10-31 16:41:08 +01:00
Saúl Ibarra Corretgé
3c22cd8ef4 rn,android: refactor audio device handling module
Separate each implementation (3 as of this writing) into each own "handler"
class.

This should make the code easier to understand, maintain and extend.
2019-10-31 16:41:08 +01:00
Bettenbuk Zoltan
5429b8568e feat: feature flag for invite functionalities 2019-10-29 11:27:25 +01:00
George Politis
0eccaf9a21 bumps ljm@5521a40aa85cb6f128f8a6dad9b72a5646132484 (#4791) 2019-10-24 14:52:38 +02:00
Aaron van Meerten
be0950c1ec multidomain mapper functionality and examples (#4773)
* first pass at mod_muc_domain open source plus example

* doc - prosody config and config.js examples for mapper
2019-10-24 12:42:11 +01:00
drimovecz
6ecd150f75 Add context user on speaker stats 2019-10-23 09:24:43 +01:00
Mihai Uscat
02fb37189b fix(welcome): Add extra variables 2019-10-22 13:24:44 -07:00
Jaya Allamsetty
8fe2536996 Update LJM for taking the changes for capScreenshareBitrate 2019-10-22 13:28:14 -05:00
Paweł Domas
4b9e156c5d Generic iOS .ipa build script (#4775) 2019-10-22 12:45:28 -05:00
Bettenbuk Zoltan
9265e1ffec ui: web chat facelift 2019-10-22 13:16:00 +02:00
Bettenbuk Zoltan
d11735b04c feat: make the hangup button first 2019-10-21 19:00:12 +02:00
Saúl Ibarra Corretgé
d33b700477 rn,blank-page: refactor BlankPage
- Remove network-activity "feature"
    - It wasn't in use
    - It relied on internal React Native components, bound to break anytime
- Show an infinite loading indicator
- Style it just like the LoadConfigOverlay
    - Since it kinda represents the opposite, an "unload" then SDK is done
2019-10-21 11:17:56 +02:00
Saúl Ibarra Corretgé
97d75c2cb9 android: fix SDK release script for new dependency syntax
Skip the first character, since it's now like ^123456.0.0
2019-10-21 11:12:26 +02:00
Saúl Ibarra Corretgé
287115f4c3 deps: react-native-webrtc@latest
Fixes a crash on iOS when disposing streams.
2019-10-18 14:05:18 +02:00
Saúl Ibarra Corretgé
63a221212b ios: add ability to manually toggle WebRTC logging 2019-10-18 14:05:18 +02:00
Bettenbuk Zoltan
6a916fd0e1 fix: fix filmstrip-only toolbar 2019-10-18 13:16:15 +02:00
yanas
220691d61d Merge pull request #4762 from jitsi/fix-etherpad-follow-me
Fixes showing etherpad in follow-me mode.
2019-10-17 13:44:10 +01:00
damencho
5cafc4bcbd Fixes showing etherpad in follow-me mode. 2019-10-17 13:39:01 +01:00
yanas
b3a78dc2e6 Merge pull request #4761 from zbettenbuk/aot-icons
fix: fix and refactor AoT css
2019-10-17 12:34:13 +01:00
Bettenbuk Zoltan
bebc6eabe5 fix: fix and refactor AoT css 2019-10-17 12:15:29 +02:00
paweldomas
26dc6a4ac2 update logger and LJM to support log timestamps 2019-10-16 15:59:58 -05:00
Hristo Terezov
ff2626723a fix(HelpButton): Improvements. 2019-10-16 13:34:43 -07:00
Mihai Uscat
72bb897269 feat(DownloadOverflowButton): Implement. 2019-10-16 11:30:06 -07:00
damencho
f46387a226 Adds room name validation logic for web. 2019-10-16 17:52:24 +01:00
damencho
a4cbbccb2a Fixes loading recent lists on wrong meeting name stored.
decodeURIComponent is not needed any more and after adding a validation such meeting name should not happen to be stored.
2019-10-16 17:52:24 +01:00
damencho
3e1a008399 Adds copy icon next to the meeting url in info dialog. 2019-10-16 17:52:24 +01:00
Bettenbuk Zoltan
7e70a8c1de feat: make mobile chat messages selectable 2019-10-16 16:05:10 +02:00
Hristo Terezov
8efee04a10 feat(package.json): Node 12 support. 2019-10-16 06:34:44 -07:00
Bettenbuk Zoltan
a35099f949 feat: add chat color scheming 2019-10-16 10:38:28 +02:00
Mihai Uscat
8be02f9ca1 Implement review changes 2019-10-15 06:54:54 -07:00
Mihai Uscat
3c25a4c08c Naming conventions; Add variables 2019-10-15 06:54:54 -07:00
Mihai Uscat
5ade0cad8b feat(welcome): add posibility to extend settings toolbar 2019-10-15 06:54:54 -07:00
Saúl Ibarra Corretgé
0fa6ffc439 deps: react-native-google-signin@3.0.1 2019-10-14 19:12:45 +02:00
Saúl Ibarra Corretgé
c2ed296178 android: make check more resilient
If action is null (observed on some old devices) we'll get an exception.
Reversing the check fixes it since Actions.XXX is statically defined.
2019-10-14 17:45:43 +02:00
Saúl Ibarra Corretgé
febd12b871 ci: use Xcode 11.1 on Travis 2019-10-14 16:47:07 +02:00
Hristo Terezov
0a06e256b7 feat(HelpButton): Mobile support. 2019-10-14 07:35:39 -07:00
Hristo Terezov
f295f60bea feat(HelpOverflowButton): Implement. 2019-10-14 07:35:39 -07:00
Saúl Ibarra Corretgé
4a8f787519 rn: evaluate config.js in a sandboxed environment
We are downloading code off the Internet and executing it on the user's device,
so run it sandboxed to avoid potential bad actors.

Since it's impossible to eval() safely in JS and React Native doesn't offer
something akin to Node's vm module, here we are rolling our own.

On Android it uses the Duktape JavaScript engine and on iOS the builtin
JavaScriptCore engine. The extra JS engine is *only* used for evaluating the
downloaded code and returning a JSON string which is then passed back to RN.
2019-10-14 12:20:58 +02:00
Saúl Ibarra Corretgé
d85b869934 rn: skip loading configured scriptUrls
None of them work on mobile.
2019-10-14 12:20:58 +02:00
Saúl Ibarra Corretgé
35130f0736 rn: refactor loadScript
- use AbortController for setting the fetch timeout
- use async / await syntax for clarify
- set the default timeout to 5s (previously non-existent, aka 0)
- add ability to load but not evaluate a script
2019-10-14 12:20:58 +02:00
Saúl Ibarra Corretgé
1feff9709c config: drop configLocation and getroomnode options
They never worked on mobile and pose an impediment for makinf config.js more
future proof. Specially if we want to move to a non-executable form of
configuration.
2019-10-14 12:20:58 +02:00
Leonard Kim
1010f53a84 fix(config): add whitelisting for interface config
For now all keys are whitelisted.
2019-10-11 09:38:56 -07:00
Saúl Ibarra Corretgé
f7a526f488 rn: fix rendering unnecessary stuff when in PiP mode 2019-10-11 17:17:53 +02:00
Bettenbuk Zoltan
245eb89b85 fix BottomSheet shaking 2019-10-11 15:14:51 +02:00
Hristo Terezov
99de9d0bfa fix(remoteVideo): Attaching video stream. 2019-10-11 04:58:01 -07:00
Saúl Ibarra Corretgé
98698ba89a etherpad: refactor to share code with mobile
- simplify initialization procedure
- set user display name as the Etherpad name\
- use SharedDocumentButton
2019-10-10 11:19:38 +02:00
Saúl Ibarra Corretgé
19d1e3829d rn: add shared document support using Etherpad 2019-10-10 11:19:38 +02:00
Saúl Ibarra Corretgé
612586ed1f deps: react-native-webview@7.4.1 2019-10-10 11:19:38 +02:00
Saúl Ibarra Corretgé
2609e43f29 ios: misc Xcode changes due to an update 2019-10-10 11:19:38 +02:00
Saúl Ibarra Corretgé
c5cd4f534c dial-in-summary: center the loading indicator 2019-10-10 11:19:38 +02:00
Bettenbuk Zoltan
6e10ca5dd2 fix: chat error message 2019-10-09 18:35:09 +02:00
Bettenbuk Zoltan
0fff1c3534 ref: serve makefile libs locally 2019-10-09 11:56:06 +02:00
Bettenbuk Zoltan
42271b1b89 feat: private messages 2019-10-08 18:22:45 +02:00
Bettenbuk Zoltan
f270b50972 fix: remove unnecessary escaping 2019-10-08 18:22:45 +02:00
Saúl Ibarra Corretgé
ab4b6be9d7 rn: throw exception if default conference options set the room
See: https://github.com/jitsi/jitsi-meet/issues/4720
2019-10-08 14:31:13 +02:00
Saúl Ibarra Corretgé
c45ee0230f android: add getters to JitsiMeetConferenceOptions 2019-10-08 14:31:13 +02:00
George Politis
d210f2f2e7 Adds a noAutoPlayVideo configuration option (used in testing). (#4714)
This adds an option to disable video autoplay that will be used mostly with maleus (our selenium-based load testing tool for testing the new bridge). Disabling video rendering lowers the resource utilisation of the selenium nodes.
2019-10-08 11:34:25 +02:00
Bettenbuk Zoltan
13d78d6b49 fix: utf-8 room name case sensitivity 2019-10-08 10:35:19 +02:00
damencho
34a71042c6 Enables Hungarian translation. 2019-10-05 00:11:25 +01:00
damencho
47ecf7d035 Commit from translate.jitsi.org by user damencho.: 601 of 601 strings translated (0 fuzzy). 2019-10-04 23:15:36 +00:00
damencho
bbe8c52778 Commit from translate.jitsi.org by user damencho.: 600 of 601 strings translated (1 fuzzy). 2019-10-04 23:15:24 +00:00
damencho
2011421e9d Commit from translate.jitsi.org by user damencho.: 582 of 601 strings translated (3 fuzzy). 2019-10-04 23:15:08 +00:00
damencho
ce55952ca9 Commit from translate.jitsi.org by user damencho.: 524 of 601 strings translated (5 fuzzy). 2019-10-04 23:14:58 +00:00
damencho
f93482e815 Commit from translate.jitsi.org by user damencho.: 582 of 601 strings translated (0 fuzzy). 2019-10-04 23:14:45 +00:00
Andrei Gavrilescu
761ac6a730 feat: integrate rnnoise based service for voice activity (VAD) detection 2019-10-04 12:55:18 +02:00
Djorkaeff Alexandre
11d3a343e5 ios: use iPhone 8 simulator when archiving JitsiMeet framework
It's available on both Xcode 10 and 11.
2019-10-04 11:00:31 +02:00
Saúl Ibarra Corretgé
9666bf836e ios: update CocoaPods to version 1.8 2019-10-04 11:00:31 +02:00
Saúl Ibarra Corretgé
a6d3b09796 ios: support building with Xcode 11 2019-10-04 11:00:31 +02:00
Дамян Минков
bb0036fdab Adds notifications for who stop/start recording/live streaming. (#4708)
* Adds notifications for who stop/start recording/live streaming.

* Updates to latest lib-jitsi-meet.
2019-10-03 20:35:21 +01:00
paweldomas
8dc0f30a49 ref(NAT64AddrInfoModule): use 'ipv4only.arpa' well known host
defined in RFC7050 instead of 'nat64.jitsi.net' as suggested by
Jonathan Lennox.
2019-10-02 10:49:39 -05:00
Saúl Ibarra Corretgé
1aed08f460 deps: react-native-webrtc@latest
Fixes iOS crashes when restarting the AudioUnit in case of interruption.
2019-10-02 14:44:15 +02:00
Saúl Ibarra Corretgé
afccf6f06d rn: disable H.264 on iOS 10 devices
It crashes like hell. See:
https://bugs.chromium.org/p/webrtc/issues/detail?id=11002
2019-10-02 14:10:37 +02:00
damencho
5cd351a46f Updates rayo filter to add user token info to dial messages.
Adds option to limit number of outgoing calls per user.
2019-09-30 16:53:38 +01:00
damencho
51f257e894 chore(deps): update LJM to 3f7613748d7669cd3fd031bbdf9069e4309f6f56 2019-09-30 11:53:30 +01:00
Saúl Ibarra Corretgé
ac06892bb4 android,ios: now working on versions 19.4 / 2.4 2019-09-26 17:33:52 +02:00
Saúl Ibarra Corretgé
fd8473cb52 deps: react-native-webrtc@latest
Avoid Android crashes.
2019-09-26 17:33:52 +02:00
damencho
3f40257f89 chore(deps): update LJM to a61941fc9a1927daedc1c9446e4036702964b38a
Uses sendBeacon to send xmpp presence unavailable on unloading the window(leaving the conference).
2019-09-26 16:20:57 +01:00
paweldomas
14509adff2 chore(deps): update LJM to dda16f607ed190a0664d643d511cc87f9bfceaf1
It was referencing LJM from a PR branch instead of the master.
2019-09-25 16:57:06 -05:00
Bettenbuk Zoltan
c472537ecf update RN to 61 2019-09-25 17:31:52 +02:00
Jaya Allamsetty
d40fce741a Fix the WebGL memory leak for Blur effect in Chrome 77 and up (#4652) 2019-09-24 06:50:10 -07:00
Saúl Ibarra Corretgé
944e8f8353 android: fix NPE when handling onHostPause
If the Activity is put into the background before the ReactContext is created we
get an NPE here. While the window might be short, it's thechnically possible to
hit this, as our Crashlytics reports show.
2019-09-24 09:49:52 +02:00
Saúl Ibarra Corretgé
7d972a50f2 ios: set logger subsystem and category
The subsystem is set to the bundle ID and the category to "JitsiMeetSDK".
2019-09-24 09:49:33 +02:00
Leonard Kim
92e7be34e3 fix(icons): scope white svgs to Icon components 2019-09-20 07:50:41 -07:00
Bettenbuk Zoltan
f5dba929a5 fix: add support for functional component type icons 2019-09-20 16:35:56 +02:00
Saúl Ibarra Corretgé
64d2885233 android: raise SDK version 2019-09-20 10:25:42 +02:00
Saúl Ibarra Corretgé
4ce65ae7a7 android: make reportConnectedOutgoingCall return a Promise
The call-integration middleware relies on it returning it, as iOS does.
2019-09-20 10:25:42 +02:00
Saúl Ibarra Corretgé
07bf95f838 doc: add info on reporting security issues 2019-09-19 13:49:46 +02:00
Saúl Ibarra Corretgé
3469d5dc4f doc: move development sections to standalone file 2019-09-19 13:49:46 +02:00
Leonard Kim
8c0f942ae1 add more logging around attaching videos to thumbnails 2019-09-19 10:46:36 +02:00
Leonard Kim
b8aa74f212 fix(large-video): bring back workaround for selecting on conference join
Bring back the workaround introduced in afd2aea7
but removed in 21dcc41d. On conference join,
several other actions have already been fired
that try to set the large video participant
and select the participant on the bridge.
The problem is there is no conference during
these actions so the select participant
never fires. Then subsequent actions do not
fire select participant because the large
video participant has not changed.
2019-09-18 15:00:13 -07:00
George Politis
2a7c6681ad ref: Changes how isVideoPlayable is computed.
This commit changes how the SmallVideo.isVideoPlayable method works.

1st we remove the check on the video stream muted field (materialized with the
!this.videoStream.isMuted() guard). This check is redundant as it is
already materialized in the !this.isVideoMuted check (the isVideoMuted
field is updated with the return value of the videoStream.isMuted()
method).

2nd we return false if we're in audio only mode, because it's
(obviously) undesirable to have a playable video when in audio only
mode.
2019-09-17 18:18:44 +02:00
George Politis
324a9eba91 minor change in debug log wording 2019-09-17 18:18:44 +02:00
George Politis
fb1ed22c6c ref: Tweak logging logic for thumbnail display mode and tile view. 2019-09-17 18:18:44 +02:00
Saúl Ibarra Corretgé
00c8409e31 ios,android: update SDK version to 2.3.0 2019-09-17 13:42:08 +02:00
Leonard Kim
1b43c22940 fix(chat): update thumbs emoji strings
react-emoji-renderer 1.0.0 removed the
thumbsup and thumbsdown aliases.
2019-09-16 09:55:36 -07:00
Saúl Ibarra Corretgé
efddb36164 thumbnail: fix accessing props 2019-09-16 13:27:10 +02:00
Saúl Ibarra Corretgé
385e1c1047 media: fix creating video track when toggling the welcome page switch 2019-09-13 19:07:26 +02:00
Saúl Ibarra Corretgé
3cc181a2e5 rn,config: create a fake config if we cannot load one on the welcome page
We try to load the configuration with every room change, even when there is no
room. There is a bad (corner) case: when we have no config cached (first boot or
wiped app data). In such case the user is trapped in an infinite loop because we
require the config to show the welcome page, oh well.

Pretend we have a configuration by creating the most minimal one to at least get
to the welcome page.
2019-09-13 19:07:26 +02:00
Saúl Ibarra Corretgé
bcc1be675f thumbnail: use a functional component
Simplifies the code a bit, and we use no lifecycle methods.
2019-09-13 17:37:23 +02:00
Saúl Ibarra Corretgé
d1be5742ba thumbnail: remove dead code
Audio streams are automatically played by WebRTC and this won't change, probably
ever. There is no point in having checks and an Audio component which does
nothing.
2019-09-13 17:37:23 +02:00
Saúl Ibarra Corretgé
1b27e331da thumbnail: use a more explicit prop 2019-09-13 17:37:23 +02:00
Saúl Ibarra Corretgé
c1f7bf75c1 thumbnail: don't render dominant speaker indicator on 1-1 calls 2019-09-13 17:37:23 +02:00
Bettenbuk Zoltan
382ec011eb ref: reduce device popup bundle size 2019-09-13 17:25:32 +02:00
Bettenbuk Zoltan
8a3ddd8596 feat: SVG icons 2019-09-13 14:07:53 +02:00
Saúl Ibarra Corretgé
738a199b4c welcome: tame the linter 2019-09-13 12:28:53 +02:00
Saúl Ibarra Corretgé
40a1af5302 dev: use alpha as the default proxy target 2019-09-13 11:51:22 +02:00
Maximilian Ruta
be5dba7eea welcome: add room validation pattern
Fixes: #312
2019-09-13 11:18:58 +02:00
Saúl Ibarra Corretgé
eb15f73e59 android: don't use proguard on debug builds
It's not necessary and makes the build faster.
2019-09-12 19:43:05 +02:00
Saúl Ibarra Corretgé
2f7b485b8f android: remove unneded code 2019-09-12 19:43:05 +02:00
Saúl Ibarra Corretgé
3a885c893a android: fix running on Android 5
For some reason ART complains about these methods being overrides of package
private ones from Timber.
2019-09-12 19:43:05 +02:00
Saúl Ibarra Corretgé
6c4901a826 ios,callkit: delay updating the muted state until conference starts
In iOS 13 if the call is not unmuted when we report it to the system as started,
an action to unmute it is dispatched automagically. Thanks, Apple.

So, delay synchronizing the muted state until the conference is started (after
the join action). This creates a small window for de-synchronization, but it's
very short and it seems unavoidable.

This change is only applied to operating systems built by the fruit company in
Cupertino.
2019-09-12 12:55:02 +02:00
Saúl Ibarra Corretgé
91c1c91950 android: fix log formatting issues 2019-09-11 14:29:37 +02:00
Saúl Ibarra Corretgé
1091ac7e7d log: fix log formatting 2019-09-10 10:34:52 +02:00
damencho
0c0bd001e5 Removes disableSuspendVideo option. Updates @jitsi/lib-jitsi-meet. 2019-09-10 08:58:55 +02:00
Bettenbuk Zoltan
256994e1f8 fix: webpack proxy fix 2019-09-09 18:27:30 +02:00
Saúl Ibarra Corretgé
f6fb859531 build: exit with an error if bundle sizes increase too much
The currently selected values are a bit above the actual sizes, so if a PR
increases the bundle size enough to trigger the failure, it should bump it.
It better have a good reason for it though!
2019-09-06 17:46:25 +02:00
Saúl Ibarra Corretgé
7deb2006c3 build: add integration with webpack-bundle-analyzer
Build as follows to build (production) bundle size stats:

npx webpack -p --progress --analyze-bundle

Then open the report:

npx webpack-bundle-analyzer build/stats.json build/
2019-09-06 17:46:25 +02:00
Saúl Ibarra Corretgé
2aea24ffad dial-in-info: fix bundle bloat
The direct import sidesteps many chained-effect imports, halving the bundle
size.
2019-09-06 16:29:23 +02:00
Saúl Ibarra Corretgé
b5aae0b58d build: style 2019-09-06 16:29:23 +02:00
Saúl Ibarra Corretgé
d436825a45 flacworker: don't use the Grand Unified Logger
There are just a couple of logs in this feature, and it's a standalone bundle,
which would bloat it due to cascaded dependencis.
2019-09-06 16:29:23 +02:00
Saúl Ibarra Corretgé
5276cb6bc8 alwaysontop: don't use the Grand Unified Logger
There are just a couple of logs in this feature, and it's a standalone bundle,
which would bloat it due to cascaded dependencis.
2019-09-06 16:29:23 +02:00
Saúl Ibarra Corretgé
f863733dd3 base/util: don't use the Grand Unified Logger
There are just a couple of logs in this feature, and it's included in bundles
like external_api, which would bloat it due to cascaded dependencis.
2019-09-06 16:29:23 +02:00
Saúl Ibarra Corretgé
2ccd4968a4 external_api: don't use the Jitsi Meet logger
This is for other applications to use, and it's currently only used for logging
1 line, so use console.error.
2019-09-06 16:29:23 +02:00
Saúl Ibarra Corretgé
c233433243 deps: react-native-webrtc@latest 2019-09-05 16:37:51 +02:00
Saúl Ibarra Corretgé
6861f463b3 android: update SDK release script to publish JSC artifacts
In
b53a034aaf (diff-0339cf92cc68bc5981fe6df601316c1c)
I removed this, because RN has updated the builtin JSC version. On the next
release, however, RN introduced a new JS interpreter (Hermes) so JSC is now a RN
dependency. Thus, add the magic spells to publish the AARs to Maven.
2019-09-05 16:32:53 +02:00
Hristo Terezov
ac065f0225 chore(package.json): Update LJM 2019-09-05 04:33:02 -07:00
Saúl Ibarra Corretgé
b4b33c94dd ios: update Podfile.lock 2019-09-05 12:53:26 +02:00
Saúl Ibarra Corretgé
c8753230a4 deps: react-native-webrtc@latest 2019-09-04 20:27:33 +02:00
paweldomas
dbf569e29e chore(deps): update LJM to 00920c0f655a74c757c7fef2cdbd053ae4d1f485 2019-09-04 10:46:18 -05:00
Saúl Ibarra Corretgé
27205e3119 ios: divert RN logs to our logger 2019-09-04 17:45:18 +02:00
Saúl Ibarra Corretgé
f2fdef8361 ios: log fatal errors, don't swallow exceptions 2019-09-04 17:45:18 +02:00
George Politis
d4dd5ab46a deps: lib-jitsi-meet@latest 2019-09-04 17:29:28 +02:00
Saúl Ibarra Corretgé
902da8cc4f rn: add native loggers
These provide the ability to integrate the SDK with some other application
loggers.

At the time this was written we use Timber on Android and CocoaLumberjack on iOS.

In addition to the integration capabilities, a LogBridge React Native module
provides log transports for JavaScript code, thus centralizing all logs on the
native loggers.
2019-09-04 10:50:30 +02:00
Saúl Ibarra Corretgé
c0a5e4f203 rn: fix crash when serializing calendar entries on iOS
Original PR: https://github.com/wmcmahan/react-native-calendar-events/pull/253
2019-09-03 12:37:31 +02:00
virtuacoplenny
55ff9dbe80 feat(api): expose method for playing touch tones (#4584) 2019-08-30 14:17:22 -07:00
Hristo Terezov
bd99108e8e feat(analytics):Add white/black list functionality 2019-08-30 10:26:22 -07:00
damencho
0c042b4078 Adds config to auto turn on captions when recording is started. 2019-08-30 15:46:29 +01:00
damencho
743bbcb846 Commit from translate.jitsi.org by user damencho.: 548 of 596 strings translated (3 fuzzy). 2019-08-30 14:47:00 +00:00
damencho
4ef2f0211a Commit from translate.jitsi.org by user damencho.: 436 of 596 strings translated (18 fuzzy). 2019-08-30 14:46:52 +00:00
damencho
86f765a01f Commit from translate.jitsi.org by user damencho.: 596 of 596 strings translated (0 fuzzy). 2019-08-30 14:46:23 +00:00
damencho
9e8b8313e0 Commit from translate.jitsi.org by user damencho.: 438 of 586 strings translated (16 fuzzy). 2019-08-30 14:46:11 +00:00
damencho
f4a8115b00 Commit from translate.jitsi.org by user damencho.: 552 of 586 strings translated (3 fuzzy). 2019-08-30 14:46:01 +00:00
Bettenbuk Zoltan
a93bd422d3 feat: new invite layout 2019-08-28 13:57:33 +02:00
Bettenbuk Zoltan
c1598b7376 feat: make display name prompt platform independent 2019-08-26 22:20:22 +02:00
Leonard Kim
bc403adb46 feat(api): allow for explicit screenshare state toggling 2019-08-26 06:53:28 -07:00
Bettenbuk Zoltan
1941275f93 feat: mobile chat emojis 2019-08-26 15:37:58 +02:00
paweldomas
6ae9bbe0c5 feat: report analytics for the network connection
Will emit new 'network.info' action with the online/offline status and
extra details for native like the network type and
'isConnectionExpensive' flag.
2019-08-23 13:36:33 -05:00
Jip-Hop
2c70388a9e Get participant specific video element
* Get participant specific video element

We now have the ability to select the video element for specific participants. I'm tweaking the jitsi-meet-electron app for my use case. I need to open Always On Top windows for specific participants, so the current _getLargeVideo() wont suffice.

I made a post about this in the Developers section on the Jitsi Community Forum, but it got blocked by Akismet.

* Add dots at end of sentence.

* Fixed ESlint errors and add additional check for iframe.

* Use _myUserID instead of string.

* Return the local video by default if participantId is undefined.

* Fixed mistake in string template.
2019-08-23 08:35:10 -07:00
Saúl Ibarra Corretgé
e0815de2ad rn,welcome: fix accessing local participant
It need not always exist, since it's created asynchronousluy on app
initiualization. Make sure we are ready for it.

I've seen backtraces because of this.
2019-08-23 17:16:22 +02:00
Saúl Ibarra Corretgé
02e058370e logging: disable caller info globally 2019-08-23 17:11:29 +02:00
Saúl Ibarra Corretgé
8a7b795d37 deps: lib-jitsi-meet@latest 2019-08-23 17:11:29 +02:00
Saúl Ibarra Corretgé
d24ca796ad deps: jitsi-meet-logger@latest 2019-08-23 17:11:29 +02:00
Leonard Kim
af2c61fd96 fix(pinning): dynamically check auto-pin setting
Any overrides set on interfaceConfig are not
applied on module load. As such, call to get
the value of the auto pin setting, providing
time for the bootstrapping to set overrides.
Otherwise iframe api users cannot override
the setting.
2019-08-23 07:36:27 -07:00
Saúl Ibarra Corretgé
5a934c071a logging: use individual, names loggers
React Native doesn't define __filename nor __dirname so do it artisanally. In
addition, this helps with centralizing the configuration passed to loggers.
2019-08-23 10:57:38 +02:00
Saúl Ibarra Corretgé
bfe4237430 deps: update jitsi-meet-logger 2019-08-23 10:57:38 +02:00
damencho
84c60a5fdf Removes i18n strings for p2p and turn. 2019-08-22 15:44:13 +01:00
Bettenbuk Zoltan
cfc7210ac8 feat: add send message button 2019-08-22 12:03:39 +02:00
damencho
57ac951192 Commit from translate.jitsi.org by user damencho.: 533 of 597 strings translated (3 fuzzy). 2019-08-21 12:26:23 +00:00
Saúl Ibarra Corretgé
36fee03d5e deps: update lib-jitsi-meet 2019-08-21 12:52:09 +02:00
paweldomas
14b747e0a4 fix(ios/xcode): increase node heap space for the bundle JS step 2019-08-21 11:12:56 +02:00
Saúl Ibarra Corretgé
c113b2e765 ios: update Podfile.lock 2019-08-21 11:12:56 +02:00
Saúl Ibarra Corretgé
560e65da37 deps: update lib-jitsi-meet 2019-08-21 11:12:56 +02:00
Saúl Ibarra Corretgé
861cf7d842 deps: react-redux@7.1.0
RN 0.60 loudly complains (loudly) about deprecated methods which react-redux was using.
2019-08-21 11:12:56 +02:00
Saúl Ibarra Corretgé
dd23ed09ad deps: react-native@0.60 2019-08-21 11:12:56 +02:00
Saúl Ibarra Corretgé
64897b9c91 rn,toolbox: simplify logic for showing Toolbox on mobile 2019-08-20 20:04:27 +02:00
Saúl Ibarra Corretgé
0dc8c687f2 rn,filmstrip: ignore the 'visible' parameter on mobile
Mobile uses a different logic for deciding whether to show the filmstrip or not:
if there are more than 1 participants or not, and there is no way to manually
toggle it.
2019-08-20 20:04:27 +02:00
paweldomas
c65d29d1a7 travis: wait 10 seconds after script to catch the error logged
Adds wait time suggested by Travis support in order to see the last
error logged.
2019-08-20 10:20:59 -05:00
Saúl Ibarra Corretgé
6aa895b679 android: attempt to fix assertion errors in ReactInstanceManager
This is the main one:
df4e67fe75/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java (L512)

Why this happens is a mystery wrapped in an enigma.
2019-08-16 17:59:47 +02:00
Saúl Ibarra Corretgé
dae451e6fa android: fix crash when parsing calendar events
Upstream PR: https://github.com/wmcmahan/react-native-calendar-events/pull/268
2019-08-16 17:46:53 +02:00
Hristo Terezov
3c1f056d2a fix(dialog): Don't steal focus 2019-08-16 07:40:47 -07:00
Leonard Kim
663e0a6693 fix(deep-linking): add back description copy 2019-08-16 16:30:16 +03:00
Saúl Ibarra Corretgé
53f98df8f3 deps: react-native@0.59.10 2019-08-16 07:26:54 +02:00
Saúl Ibarra Corretgé
6616f728f6 proximity: enable the proximity sensor when the device is set to earpiece 2019-08-14 18:57:03 +02:00
Saúl Ibarra Corretgé
1c1e8a942b audio-mode: refactor device handling
This commit refactors device selection (more heavily on iOS) to make it
consistent across platforms.

Due to its complexity I couldn't break out each step into separate commits,
apologies to the reviewer.

Changes made to device handling:

- speaker is always the default, regardless of the mode
- "Phone" shows as a selectable option, even in video call mode
- "Phone" is not displayed when wired headphones are present
- Shared device picker between iOS and Android
- Runtime device updates while the picker is open
2019-08-14 18:57:03 +02:00
George Politis
9721d99918 Updates lib-jitsi-meet. 2019-08-14 16:00:46 +02:00
Saúl Ibarra Corretgé
69c21cbb11 avatar: make code a bit clearer
Uses nullish coalescing and optional chaining.
2019-08-14 15:36:40 +02:00
Saúl Ibarra Corretgé
abefc56750 deps: add babel plugins for optional chaining and nullish coalescing
They are in Stage 3 and are already dependencies or the React Native preset.

References:
https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining
https://babeljs.io/docs/en/babel-plugin-proposal-nullish-coalescing-operator
2019-08-14 15:36:40 +02:00
damencho
a4a1685224 chore(lib-jitsi-meet): Update. 2019-08-13 10:16:20 -07:00
damencho
21fb225726 Adds a retry logic when fetching conference numbers and pin. 2019-08-13 19:00:18 +03:00
damencho
75ab890707 Uses the wrapped fetch from base/util. 2019-08-13 19:00:18 +03:00
damencho
2ded8363ad Leaves room only when it is already joined.
In case of hitting errors like max participant limit reached and when clicking hangup, the attempt to leave room second time results error and reload screen.
2019-08-13 16:04:43 +03:00
Leonard Kim
c0a8a386a5 fix(pinning): debounce autopin subscriber
The store's remote tracks get cleared
and re-added when switching in and out
of p2p, which can cause pinning thrashing.
Avoid that with a debounce.
2019-08-12 17:31:53 -07:00
Leonard Kim
7af081ea99 fix(avatars): re-render avatar on any resize 2019-08-12 12:41:57 -07:00
Дамян Минков
8800cb4580 Adds live streaming sound notification. (#4532)
* Adds live streaming sound notification.

* Adds ios resources for the new files.
2019-08-12 18:34:38 +03:00
Karthik Muralidharan
b658f20a30 feat(API): add dominant speaker changed event
Fixes: https://github.com/jitsi/jitsi-meet/issues/4049
2019-08-09 10:09:33 +02:00
Hristo Terezov
c3e52f32f9 feat: Add logging for thumbnail display mode and tile view. 2019-08-09 01:08:19 -07:00
George Politis
ab73d808fe Updates lib-jitsi-meet. 2019-08-08 18:05:50 +02:00
dependabot[bot]
e110460793 Bump jquery from 3.3.1 to 3.4.0
Bumps [jquery](https://github.com/jquery/jquery) from 3.3.1 to 3.4.0.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Commits](https://github.com/jquery/jquery/compare/3.3.1...3.4.0)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-08 14:37:18 +02:00
dependabot[bot]
c0ee451ca1 Bump lodash from 4.17.11 to 4.17.13
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.13.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.13)

Signed-off-by: dependabot[bot] <support@github.com>
2019-08-08 10:34:51 +02:00
Saúl Ibarra Corretgé
67dca97d1d rn,participants: don't render thumbnnail for screen-shares 2019-08-07 20:16:13 +02:00
Saúl Ibarra Corretgé
fd0ca76255 web,avatar: fix setting avatar size
Use the width of its container as the size, so the font icons can be rendered at
a good size.
2019-08-07 20:16:13 +02:00
Saúl Ibarra Corretgé
149e53af76 avatar: render a special avatar if the user is sharing their screen 2019-08-07 20:16:13 +02:00
Saúl Ibarra Corretgé
f3e7952e51 audio-only: implement initial "low bandwidth mode"
It's an evolution of audio-only mode, where we also allow for receiving a remote
screen-share.

Diving deeper: this basically sets last N to 1 or 0 depending on the
availability of a screen-share.
2019-08-07 20:16:13 +02:00
Saúl Ibarra Corretgé
0f77cf9e0c android: use adaptive icons 2019-08-07 14:40:20 +02:00
damencho
66eb09fb63 Revert raisedHand thumb tooltip i18n string. 2019-08-07 14:59:24 +03:00
Hristo Terezov
b7f2c7d487 chore(lib-jitsi-meet): Update. 2019-08-06 01:59:01 -07:00
Bettenbuk Zoltan
bed3f62536 feat: make links in chat clickable 2019-08-06 08:48:37 +02:00
Leonard Kim
e8eb7e1e1f fix(suboptimal-browser): remove inserting of app name in notification
This prevents inserting any user overridden APP_NAME
values into html. A new translation key is being used
to immediately stop non-english languages from using the
problematic string.

Also tweaked the copy to remove the "eer" and fix
some grammar.
2019-08-05 06:47:44 -07:00
Leonard Kim
1409d6fb5e fix(deep-linking): do not accept native app name as raw html
There is no need to display the native app name as
raw html.
2019-08-04 06:45:00 -07:00
Bettenbuk Zoltan
a2cbd9229a fix: render notification description on mobile 2019-08-02 21:14:19 +02:00
Saúl Ibarra Corretgé
bf50a110c7 lastn: simplify computing the effective last N value 2019-08-02 15:54:47 +02:00
Saúl Ibarra Corretgé
467c9d36cf audio-only,lastn: move audio-only and last N handling to standalone features
This refactors all handling of audio-only and last N to 2 features in preparation
for "low bandwidth mode".

The main motivation to do this is that lastN is a "global" setting so it helps
to have all processing for it in a single place.
2019-08-02 15:54:47 +02:00
damencho
6ddd17c769 Removes resolveAppName postprocess we do not need.
i18next.options are initialized before interfaceConfig overwrites are processed which leads to wrong translations.
2019-08-01 12:47:58 +01:00
virtuacoplenny
732f2c1963 ref(feedback): emit api feedback submitted on completion (#4499)
* ref(feedback): emit api feedback submitted on completion

Compared to firing the event on submission because
the submission ajax will not be completed at that
time..

* squash: update package.json
2019-07-31 10:59:22 -07:00
Bettenbuk Zoltan
e7144eb674 Get chat message display name from backend 2019-07-31 10:48:22 +02:00
Saúl Ibarra Corretgé
b5489b7c81 rn,filmstrip: don't unpin participant when hiding filmstrip
The filmstrip is currently only hidden when PiP mode is entered. There is no
real reason not to leave the large view as it was.
2019-07-30 18:51:40 +02:00
Saúl Ibarra Corretgé
4d5332cadf rn,conference: log pin participant analytics events also on mobile 2019-07-30 17:11:43 +02:00
Saúl Ibarra Corretgé
5261f61110 conference: don't pin participants on the JVB
When a participant is pinned in the UI we then proceed to mark it as selected on
the JVB. This will make the participant part of the last N set and will receive
the highest (or configured highest) video quality.

Pinning a participant at the JVB level just makes sure it will be part of the
last N set.

Since only one participant can be pinned in the UI, there is no point in pinning
it at the JVB level, since selecting it already achieved the same result.
2019-07-30 17:11:43 +02:00
paweldomas
8c7d6da5d5 deps: update LJM to get analytics fixes
Bumps LJM to 3c8058743177b6b6963d3bc3df14f4ea650ef310.
2019-07-30 15:45:43 +02:00
Leonard Kim
6d91728a74 fix(proxy): stop screenshare when the connection stops 2019-07-30 06:40:57 -07:00
Hristo Terezov
9b32fc95eb chore(package): update lib-jitsi-meet version. 2019-07-30 01:55:02 -07:00
Leonard Kim
6bc1d87753 feat(shortcuts): add shortcut for opening video quality modal 2019-07-29 11:40:07 -07:00
damencho
a5fc62b920 Updates correct loading and fix checking is dominant speaker. 2019-07-26 11:18:55 +01:00
Saúl Ibarra Corretgé
49f6010905 pagedlist: fix refresh on wrapped components 2019-07-26 10:38:54 +02:00
paweldomas
1c27f567ee feat: send analytics event when conference is rejoined 2019-07-26 08:25:53 +02:00
paweldomas
7684b2bf98 ref: move getCurrentConferenceUrl to base/connection
Moves getCurrentConferenceUrl method to base/connection to allow reuse.
The new location is not ideal, but looks the best based on the imports
required (trying to avoid circular dependencies).
2019-07-26 08:25:53 +02:00
damencho
8886bcdb73 Fixes missing strings. 2019-07-26 07:07:31 +01:00
Saúl Ibarra Corretgé
437bdb92be deps: update react-native-webrtc and lib-jitsi-meet
Support for the MediaStream constructor has been added to react-native-webrtc.
2019-07-25 23:52:54 +02:00
Saúl Ibarra Corretgé
6943659dc9 rn: enable auto-pinning on screenshare on mobile 2019-07-25 14:27:04 +02:00
Saúl Ibarra Corretgé
35f934e197 config: remove old backwards compatibility shim
It was added for
3ea2f00578
over 2 years ago. That's long enough!
2019-07-25 11:45:16 +02:00
damencho
aca0469bd0 Fixes mobile wifi stats timestamp value type. 2019-07-25 10:20:48 +01:00
Дамян Минков
11f2e7291e Talk while muted sound notification (#4473)
* Moves talk while muted as a new feature.

* Adds sound notification for talk while muted.

* Reorder imports and changes the dispatch of the notification.

* Introduces sounds.js for talk while muted.
2019-07-23 21:56:05 +01:00
Bettenbuk Zoltan
7a985dd843 fix: disable reduced UI on welcome page 2019-07-23 17:52:03 +02:00
damencho
e09ea36055 Maps available locales for countries to the doubled languages.
This maps the tow letter languages as enGB to the country file for en.
Copies countries-en.json as countries-enGB.json.
2019-07-23 10:10:03 +01:00
damencho
ad3a087091 Commit from translate.jitsi.org by user damencho.: 532 of 586 strings translated (9 fuzzy). 2019-07-22 23:06:01 +00:00
damencho
d379b4d53b Commit from translate.jitsi.org by user damencho.: 546 of 586 strings translated (0 fuzzy). 2019-07-22 23:05:43 +00:00
damencho
7a99d57274 Commit from translate.jitsi.org by user damencho.: 478 of 586 strings translated (6 fuzzy). 2019-07-22 23:00:06 +00:00
damencho
85bc0ed5fc Commit from translate.jitsi.org by user damencho.: 535 of 586 strings translated (6 fuzzy). 2019-07-22 22:57:36 +00:00
damencho
f4dda6e7ce Commit from translate.jitsi.org by user damencho.: 434 of 586 strings translated (15 fuzzy). 2019-07-22 22:54:29 +00:00
damencho
5c8dfabf7c Commit from translate.jitsi.org by user damencho.: 538 of 586 strings translated (0 fuzzy). 2019-07-22 22:50:47 +00:00
damencho
20d03f3228 Commit from translate.jitsi.org by user damencho.: 343 of 586 strings translated (18 fuzzy). 2019-07-22 22:46:35 +00:00
damencho
268137bb97 Commit from translate.jitsi.org by user damencho.: 342 of 586 strings translated (19 fuzzy). 2019-07-22 22:44:50 +00:00
damencho
f87463780c Commit from translate.jitsi.org by user damencho.: 506 of 586 strings translated (1 fuzzy). 2019-07-22 22:42:16 +00:00
damencho
6b2ced63c7 Commit from translate.jitsi.org by user damencho.: 506 of 586 strings translated (0 fuzzy). 2019-07-22 22:40:00 +00:00
damencho
d6fbe55360 Commit from translate.jitsi.org by user damencho.: 411 of 586 strings translated (9 fuzzy). 2019-07-22 22:38:36 +00:00
damencho
0feeb94fc7 Commit from translate.jitsi.org by user damencho.: 491 of 586 strings translated (5 fuzzy). 2019-07-22 22:36:34 +00:00
damencho
c9c509ec51 Commit from translate.jitsi.org by user damencho.: 539 of 586 strings translated (4 fuzzy). 2019-07-22 22:34:45 +00:00
damencho
f7ff457a3b Commit from translate.jitsi.org by user damencho.: 536 of 586 strings translated (3 fuzzy). 2019-07-22 22:32:29 +00:00
damencho
72127aaa0b Commit from translate.jitsi.org by user damencho.: 505 of 586 strings translated (4 fuzzy). 2019-07-22 22:30:42 +00:00
damencho
b8854a3b45 Commit from translate.jitsi.org by user damencho.: 538 of 586 strings translated (4 fuzzy). 2019-07-22 22:27:01 +00:00
damencho
e6e7001857 Commit from translate.jitsi.org by user damencho.: 535 of 586 strings translated (7 fuzzy). 2019-07-22 22:19:53 +00:00
damencho
6d4601fe66 Updates used languages and fixes loading them. 2019-07-22 17:48:44 +01:00
damencho
8ecb01ec21 Commit from translate.jitsi.org by user damencho.: 545 of 586 strings translated (1 fuzzy). 2019-07-22 14:48:34 +00:00
damencho
14ccb41015 Commit from translate.jitsi.org by user damencho.: 545 of 586 strings translated (1 fuzzy). 2019-07-22 14:29:08 +00:00
damencho
348cde54e7 Commit from translate.jitsi.org by user damencho.: 545 of 586 strings translated (1 fuzzy). 2019-07-22 14:24:36 +00:00
damencho
430bd3f141 Commit from translate.jitsi.org by user damencho.: 535 of 586 strings translated (7 fuzzy). 2019-07-22 13:03:23 +00:00
damencho
b36f419e86 Commit from translate.jitsi.org by user damencho.: 122 of 586 strings translated (28 fuzzy). 2019-07-22 13:03:11 +00:00
damencho
ed1d03db71 Commit from translate.jitsi.org by user damencho.: 524 of 586 strings translated (5 fuzzy). 2019-07-22 13:02:58 +00:00
damencho
5d837571c0 Commit from translate.jitsi.org by user damencho.: 538 of 586 strings translated (5 fuzzy). 2019-07-22 13:02:46 +00:00
damencho
f23532d7f4 Commit from translate.jitsi.org by user damencho.: 78 of 586 strings translated (12 fuzzy). 2019-07-22 13:02:33 +00:00
damencho
0280294a8f Commit from translate.jitsi.org by user damencho.: 80 of 586 strings translated (12 fuzzy). 2019-07-22 13:02:19 +00:00
damencho
fdd1418236 Commit from translate.jitsi.org by user damencho.: 433 of 586 strings translated (16 fuzzy). 2019-07-22 13:02:05 +00:00
damencho
bae47434b1 Commit from translate.jitsi.org by user damencho.: 531 of 586 strings translated (10 fuzzy). 2019-07-22 13:01:52 +00:00
damencho
3c98cfc136 Commit from translate.jitsi.org by user damencho.: 216 of 586 strings translated (36 fuzzy). 2019-07-22 13:01:25 +00:00
damencho
17e5bc7b73 Commit from translate.jitsi.org by user damencho.: 89 of 586 strings translated (5 fuzzy). 2019-07-22 13:01:11 +00:00
damencho
6092655099 Commit from translate.jitsi.org by user damencho.: 503 of 586 strings translated (6 fuzzy). 2019-07-22 13:00:59 +00:00
damencho
721cca669f Commit from translate.jitsi.org by user damencho.: 0 of 586 strings translated (0 fuzzy). 2019-07-22 13:00:49 +00:00
damencho
c62ff0939d Commit from translate.jitsi.org by user damencho.: 505 of 586 strings translated (1 fuzzy). 2019-07-22 12:58:57 +00:00
damencho
ecf050c2d9 Commit from translate.jitsi.org by user damencho.: 344 of 586 strings translated (15 fuzzy). 2019-07-22 12:58:46 +00:00
damencho
069137b02a Commit from translate.jitsi.org by user damencho.: 25 of 586 strings translated (0 fuzzy). 2019-07-22 12:58:34 +00:00
damencho
f053cad66c Commit from translate.jitsi.org by user damencho.: 123 of 586 strings translated (20 fuzzy). 2019-07-22 12:58:22 +00:00
damencho
4be3042cb0 Commit from translate.jitsi.org by user damencho.: 445 of 586 strings translated (25 fuzzy). 2019-07-22 12:58:09 +00:00
damencho
593235d683 Commit from translate.jitsi.org by user damencho.: 490 of 586 strings translated (6 fuzzy). 2019-07-22 12:57:56 +00:00
damencho
7bd8ddbba2 Commit from translate.jitsi.org by user damencho.: 39 of 586 strings translated (2 fuzzy). 2019-07-22 12:57:44 +00:00
damencho
14232b1d93 Commit from translate.jitsi.org by user damencho.: 515 of 586 strings translated (17 fuzzy). 2019-07-22 12:57:25 +00:00
damencho
ff4887a3c8 Commit from translate.jitsi.org by user damencho.: 535 of 586 strings translated (4 fuzzy). 2019-07-22 12:57:12 +00:00
damencho
0289aacd4f Commit from translate.jitsi.org by user damencho.: 505 of 586 strings translated (2 fuzzy). 2019-07-22 12:57:01 +00:00
damencho
99c13eaec0 Commit from translate.jitsi.org by user damencho.: 254 of 586 strings translated (22 fuzzy). 2019-07-22 12:56:48 +00:00
damencho
1a713dfa27 Commit from translate.jitsi.org by user damencho.: 536 of 586 strings translated (4 fuzzy). 2019-07-22 12:56:36 +00:00
damencho
7e84b51ee0 Commit from translate.jitsi.org by user damencho.: 534 of 586 strings translated (4 fuzzy). 2019-07-22 12:56:22 +00:00
damencho
86fa442d0e Commit from translate.jitsi.org by user damencho.: 148 of 586 strings translated (18 fuzzy). 2019-07-22 12:55:58 +00:00
damencho
93b88f1a16 Commit from translate.jitsi.org by user damencho.: 342 of 586 strings translated (19 fuzzy). 2019-07-22 12:55:46 +00:00
damencho
2041d4fffb Commit from translate.jitsi.org by user damencho.: 534 of 586 strings translated (0 fuzzy). 2019-07-22 12:54:35 +00:00
jitsi-pootle
83c3e7c725 New files added from translate.jitsi.org based on templates 2019-07-22 12:53:40 +00:00
damencho
a34331891a Commit from translate.jitsi.org by user damencho.: 477 of 586 strings translated (7 fuzzy). 2019-07-22 12:46:37 +00:00
damencho
56dd83740c Commit from translate.jitsi.org by user damencho.: 533 of 586 strings translated (8 fuzzy). 2019-07-22 12:46:23 +00:00
damencho
debe50c3f4 Commit from translate.jitsi.org by user damencho.: 227 of 586 strings translated (22 fuzzy). 2019-07-22 12:46:08 +00:00
damencho
d9985c786c Commit from translate.jitsi.org by user damencho.: 5 of 586 strings translated (0 fuzzy). 2019-07-22 12:42:06 +00:00
damencho
ed910947d4 Commit from translate.jitsi.org by user damencho.: 268 of 586 strings translated (27 fuzzy). 2019-07-22 12:41:32 +00:00
damencho
c4c5eace25 Commit from translate.jitsi.org by user damencho.: 206 of 586 strings translated (29 fuzzy). 2019-07-22 12:40:07 +00:00
damencho
c6bf646fe8 Commit from translate.jitsi.org by user damencho.: 410 of 586 strings translated (10 fuzzy). 2019-07-22 12:37:36 +00:00
jitsi-pootle
ab2bb7686e New files added from translate.jitsi.org based on templates 2019-07-22 10:14:05 +00:00
jitsi-pootle
12b53c38b9 New files added from translate.jitsi.org based on templates 2019-07-22 10:14:05 +00:00
jitsi-pootle
ca31c8b199 New files added from translate.jitsi.org based on templates 2019-07-22 10:14:05 +00:00
jitsi-pootle
1b331ce090 New files added from translate.jitsi.org based on templates 2019-07-22 10:14:05 +00:00
jitsi-pootle
edd55e7798 New files added from translate.jitsi.org based on templates 2019-07-22 10:14:05 +00:00
Дамян Минков
9f4da84701 I18next update (#4456)
* Removes unused translations.

* Fixes using translated strings.

* Moves using latest i18next versions and stop using compatibility modes.

* Sorts i18next options.

* Fixes defaultNS used by i18next.

This is used when translating html tags with data-i18n keys as attributes, used by jQuery-Impromptu.
2019-07-22 11:10:25 +01:00
Leonard Kim
0097360396 feat(deep-linking): allow disabling through override 2019-07-19 14:48:46 -07:00
Hristo Terezov
b5cef05941 fix(AOT): imports. 2019-07-19 07:17:15 -07:00
George Politis
ddab9224b2 Merge pull request #4460 from jitsi/analytics-event-for-connectivity-issues
deps: update lib-jitsi-meet
2019-07-18 18:26:28 +02:00
George Politis
a5693c6e96 updates package-lock.json 2019-07-18 17:25:46 +02:00
George Politis
8dd345b192 deps: update lib-jitsi-meet
With the update we get a new analytics event that sends connectivity
issues events to the analytics backend.
2019-07-18 17:10:29 +02:00
Leonard Kim
130ab886ee fix(chat): show toolbar on open 2019-07-18 06:08:27 -07:00
Leonard Kim
c0e9f2b95a fix(chat): workaround for chat scroll causing layout misalignment 2019-07-18 06:08:27 -07:00
Leonard Kim
011972872e fix(blur): add beta label to toolbar button 2019-07-16 10:35:31 -07:00
Saúl Ibarra Corretgé
ef5720a3f0 deps: update react-native-webrtc
Fixes: https://github.com/jitsi/jitsi-meet/issues/4436
2019-07-16 17:55:37 +01:00
Bettenbuk Zoltan
ec30af2844 feat: always show labels 2019-07-16 17:32:58 +02:00
Bettenbuk Zoltan
e08aeca28c feat: use css to place the toolbox buttons 2019-07-16 17:01:24 +02:00
Bettenbuk Zoltan
ad7892ebce aot: jigasi participant icon 2019-07-16 13:04:17 +02:00
Saúl Ibarra Corretgé
cbc7e1b6be android: fix crash if UserInfo is not set
Fixes: https://github.com/jitsi/jitsi-meet-sdk-samples/issues/11
2019-07-16 07:29:07 +01:00
Saúl Ibarra Corretgé
da7d959b9a android: raise SDK version 2019-07-16 07:29:07 +01:00
virtuacoplenny
ada57ebcd0 ref(user-interaction): do not store listener, move browser check to lib (#4441)
* ref(user-interaction): remove storing of listener

* ref(user-interaction): move browser requirement check to lib-jitsi-meet

* ref(user-interaction): no inner function for listener, use module scope
2019-07-13 06:59:58 -07:00
Bettenbuk Zoltan
1993ad10eb feat: apply color brand guidelines 2019-07-12 20:48:49 +02:00
Bettenbuk Zoltan
d305caf910 feat: borderless toolbox icons 2019-07-12 20:48:49 +02:00
Bettenbuk Zoltan
a25a504a59 feat: add bottom gradient 2019-07-12 20:48:49 +02:00
damencho
250c61279b Updates react-native callstats dependency, to use siteID on mobile. 2019-07-12 18:24:44 +01:00
Saúl Ibarra Corretgé
1e18af2d1a rn: fix not showing a prompt when permissions have been denied
This only shows up if we cannot prompt again, like when turning permissions off
in the Settings app in iOS.
2019-07-12 17:50:54 +02:00
Дамян Минков
eb1fd4fd88 Merge pull request #4438 from jitsi/cs-siteid
Passes confID when initializing JitsiConference.
2019-07-12 14:25:35 +01:00
Matthias Herzog
e0c8b6b3c0 fix welcome page title fixes #4273 2019-07-12 14:25:26 +01:00
Дамян Минков
9071cd4813 Listens for suspend events from jitsi-power-monitor on postis channel. (#4428)
* Listens for suspend events from jitsi-power-monitor on postis channel.

* Removes duplicated type and actions.

* Moves suspendDetected state from overlay to power-monitor feature.
2019-07-12 14:08:34 +01:00
Saúl Ibarra Corretgé
9bf650c700 android: keep okio classes
Fixes running profile builds.
2019-07-12 14:22:36 +02:00
Saúl Ibarra Corretgé
49e3b03885 android: custom initialization of the WebRTC module
Set our own audio device manager so we can tweak it if need be (enabling /
disabling the HW AEC on specific devices).

Switch to using the software video encoder / decoder. This may feel like a
downgrade, but it has advantages:

- simulcast is now working (on par with iOS)
- certain devices have broken VP8 HW encoders (I'm looking at you Samsung Galaxy
S7) so this fixes that
2019-07-12 14:22:36 +02:00
Saúl Ibarra Corretgé
31e996ac3f android: always run adb reverse when starting the packager
It tends to close, so always open the reverse tunnel.
2019-07-12 14:22:36 +02:00
Saúl Ibarra Corretgé
d1c447e97b deps: update react-native-webrtc
- Fix crash in PeerConnection.close (Android)
- Add ability to customize PeerConnectionFactory (Android)
2019-07-12 14:22:36 +02:00
damencho
8a34c0a80f Updates lib-jitsi-meet. 2019-07-12 11:17:53 +01:00
virtuacoplenny
2f626ea474 ref(api): move participant join and left to middleware (#4365) 2019-07-11 12:44:27 -07:00
Bettenbuk Zoltan
0a76eebca7 feat: central back button registry 2019-07-11 16:14:08 +02:00
damencho
0e9e695251 Passes confID when initializing JitsiConference.
The confID is domain.com/RoomName or domain.com/tenant/RoomName, adds the tenant if any and also keeps the room name case.
2019-07-11 14:58:14 +01:00
Leonard Kim
b86df7a8e3 fix(remote-control): do not assume failed query is missing support
Multiple requests for checkUserRemoteControlSupport can be in
flight simultaneously. Order of promise resolution is not
guaranteed. It is possible for Request A and Request B to be
in flight and then Request B's promise chain resolves first.
Request A could have encountered errors and then resolve. Then
what could happen is checkUserRemoteControlSupport returns true
for remote control support due to Request B and the UI updates.
But then checkUserRemoteControlSupport returns false for
remote control support due to Request A's error and the UI
updates to hide remote control.
2019-07-11 07:25:08 +01:00
Bettenbuk Zoltan
5b25e02e26 feat: use dialog instead of alert when inviting 2019-07-10 20:50:14 +02:00
Bettenbuk Zoltan
0e6f14bb7c fix: avoid false triggering CDU in SlidingView 2019-07-10 20:49:50 +02:00
Leonard Kim
57b9954d9c fix(api): support params with value of undefined 2019-07-10 11:09:11 -07:00
virtuacoplenny
249dd7b8b8 fix(invite): decode the meeting name (#4411)
* fix(invite): decode the meeting name

* squash: try to make mobile join same encoded meeting name as web

* Decodes and generated texts for share and copy meeting info.

Decodes in all cases except when it contains a space, as it will generate wrong links when pasted/shared in external applications.
2019-07-10 10:27:11 -07:00
Bettenbuk Zoltan
b31d7b4451 ref: remove createStyleSheet from dialog styles 2019-07-10 16:42:56 +02:00
Bettenbuk Zoltan
8dea3389ee fix: avoid clicking behind dialogs 2019-07-10 16:42:56 +02:00
virtuacoplenny
e7f9e8e7f7 fix(conference): require user interaction to unmute in iframe (#4429)
* fix(conference): require user interaction to unmute in iframe

* squash: explicitly whitelist react native
2019-07-10 12:02:27 +01:00
Bettenbuk Zoltan
a53a86ee7a feat: add room lock pwd error message 2019-07-10 11:01:49 +02:00
Saúl Ibarra Corretgé
598b6f0598 deps: update react-native-webrtc
WebRTC is now at M75
2019-07-09 17:22:32 +02:00
Saúl Ibarra Corretgé
b245945c4a android: be explicit about starting a foreground service
After calling startService we are supposed to have a bit of time before turning
the service into a foreground service, but certain devices seem to be more
spartan and we've seen the following failure:

Caused by java.lang.IllegalStateException: Not allowed to start service Intent { act=JitsiMeetOngoingConferenceService:START cmp=org.jitsi.meet/.sdk.JitsiMeetOngoingConferenceService }: app is in background uid UidRecord{f6778d5 u0a220 CAC  bg:+1m1s417ms idle change:idle procs:1 proclist:15604, seq(0,0,0)}
       at android.app.ContextImpl.startServiceCommon + 1600(ContextImpl.java:1600)
       at android.app.ContextImpl.startService + 1546(ContextImpl.java:1546)
       at android.content.ContextWrapper.startService + 669(ContextWrapper.java:669)
       at org.jitsi.meet.sdk.JitsiMeetOngoingConferenceService.launch + 50(JitsiMeetOngoingConferenceService.java:50)

Be expliocit and call startForegroundService, on supported platforms.
2019-07-09 16:14:39 +02:00
Bettenbuk Zoltan
301a8e319a fix: reduce avatar font size 2019-07-09 15:45:38 +02:00
Saúl Ibarra Corretgé
820abfd059 ios: sync Podfile.lock 2019-07-09 12:58:07 +02:00
Hristo Terezov
1d42420a36 fix(font): Bring back the missing icons. 2019-07-08 20:03:04 +01:00
Hristo Terezov
1b4bdb5142 fix(blur): on FF 2019-07-08 20:03:04 +01:00
Hristo Terezov
f030a3f1fb fix(blur): when switching video tracks. 2019-07-08 20:03:04 +01:00
Hristo Terezov
8f79779ca7 fix(blur): Disable for SS 2019-07-08 20:03:04 +01:00
Saúl Ibarra Corretgé
c5111bb359 rn: update default color scheme 2019-07-08 20:27:44 +02:00
Bettenbuk Zoltan
42814eac7d feat: add icon based avatar and icon for pstn 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
74d0013acc feat: use participant id for avatar color 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
88e4850c4d fix: remove locally generated avatar ID 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
87f9b1cf92 ref: remove unnecesary functions 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
fe1187d7b7 ref: remove unused libs 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
a35b36d6df feat: dynamic avatar font size 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
a04982fd96 fix: AlwaysOnTop avatar 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
658679f89e fix: undefined participant in avatar call 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
f90fc665f8 ui: bigger padding to default avatar 2019-07-08 16:53:30 +02:00
Bettenbuk Zoltan
0c8130af41 fix: default avatar relative url 2019-07-08 16:53:30 +02:00
paweldomas
e4c5968459 fix: bring back the add meeting URL button
Brings back the button for generating meeting URLs for calendar events.
2019-07-08 09:26:33 -05:00
damencho
a148cd41a4 Fixes loading wifi-stats when used from jitsi-meet electron utils. 2019-07-08 14:30:20 +01:00
Saúl Ibarra Corretgé
f8a049759d android: fix crash if notification is null
I cannot see a path leading to it being null, but Crashlytics demonstrated it's
possible (so far in a small subset of old devices). Be defensive then.
2019-07-05 10:11:00 +02:00
Hristo Terezov
4b4225e14f chore(lib-jitsi-meet): Update. 2019-07-04 06:26:32 -07:00
Hristo Terezov
3b0c5d0b6a fix(blur): many small issues. 2019-07-04 06:26:32 -07:00
Cristian Florin Ghita
3b750ddd5a Add video background blur 2019-07-04 06:26:32 -07:00
Saúl Ibarra Corretgé
6383d000a9 rn: raise version to 19.3 2019-07-03 21:09:15 +02:00
Bettenbuk Zoltan
a48d67bdc7 fix: inconsistent state when quickly closing a sliding view 2019-07-03 13:43:56 +02:00
Saúl Ibarra Corretgé
2f92e72858 android: raise SDK version 2019-07-03 13:28:31 +02:00
Saúl Ibarra Corretgé
d2c85ada1b android: fix deadlock in uncaught exception handler
The app is about to crash at that stage so it was a moot point to try to leave
the conference anyway.

Stopping ConnectionServers is still a good idea though, since a crash may leave
the device in a bad state otherwise.
2019-07-03 13:28:18 +02:00
Saúl Ibarra Corretgé
55b95c52d6 android: fix synchronized access to listeners set
Fixes this issue:

~~~
    java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextNode(HashMap.java:1441)
        at java.util.HashMap$KeyIterator.next(HashMap.java:1465)
        at org.jitsi.meet.sdk.OngoingConferenceTracker.updateListeners(OngoingConferenceTracker.java:89)
        at org.jitsi.meet.sdk.OngoingConferenceTracker.onExternalAPIEvent(OngoingConferenceTracker.java:74)
        at org.jitsi.meet.sdk.ExternalAPIModule.sendEvent(ExternalAPIModule.java:71)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
        at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:158)
        at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:29)
        at android.os.Looper.loop(Looper.java:214)
        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:232)
        at java.lang.Thread.run(Thread.java:764)
~~~
2019-07-03 13:28:18 +02:00
Chris Hansen
52362c4675 Fix spelling mistake on pragma mark
It causes a compiler error in Xcode 11 because it doesn't know how to parse it.
2019-07-02 14:11:01 -07:00
netaskd
8da0552541 microsoftCalendar: add showing calendar events in local timezone. 2019-07-02 21:20:00 +01:00
Hristo Terezov
7ce0def995 fix(mobile): After PR #4396 2019-07-02 10:36:37 -07:00
Hristo Terezov
48285e8a2d fix(conference): Don't use this._room.
this._room should be used only by jitsi-meet-torture and for test purposes. Also this._room is assigned later than room. This may cause some issues, for example conference.getMyUserId() may return undefined while the user id is already available beacuse this._room hasn't been assigned yet.
2019-07-02 07:38:57 -07:00
Hristo Terezov
21dcc41d31 ref(large-video): switch LargeVideo logic to react 2019-07-02 07:38:57 -07:00
Дамян Минков
625d268373 Room lock update (#4394)
* Adds a notification when remote lock happens.

* Updates translations.

Removes unused strings and extracts room password to separate translation, to be able to change it when deployment uses only digits.

* Formats the conference pin when showing it.

* Removes member from translation in favour of participant.

* Updates formatting of the pin.

* Adds a notification when password is remotely removed.
2019-07-02 14:14:58 +01:00
Дамян Минков
681782ed20 Adds back talk while muted notification. (#4392)
* Adds back talk while muted notification.

* Adds unmute button to the notification.
2019-07-02 12:59:25 +01:00
Saúl Ibarra Corretgé
1baa85b649 rn: hide invite button if the functionality is not available 2019-07-02 12:30:50 +02:00
Bettenbuk Zoltan
72137a2811 feat: initial based avatars 2019-07-01 23:59:16 +02:00
Leonard Kim
0734ce7ae3 feat(api): add notifications for kicked participants 2019-07-01 12:53:25 -07:00
Дамян Минков
2dc06c28e3 Adds option to be able to cancel locked rooms and leave. (#4391)
* Adds option to be able to cancel locked rooms and leave.

* Removes not needed operations when canceling password prompt.
2019-07-01 13:02:25 +01:00
paweldomas
5848669552 feat(analytics): time since last success in connection dropped
Update LJM to 9bcc2a26cc94683b8ed302418695a331b450df97 in order to bring
in the analytics update which will add a property indicating how much
time has passed since the last successful XMPP request came through.
2019-06-28 13:30:50 -05:00
Leonard Kim
c0376d238a ref(notifications): do not notify of local participant left
Join notifications are already supressed for the local
participant, so hide the left notification. For now
the notification is not being shown on mobile to keep
the same existing behavior and because a copy change
will be needed, but will be added once batching is
implemented.
2019-06-28 09:18:18 -07:00
Leonard Kim
979b773c3c ref(notifications): move join notification firing to notifications feature 2019-06-27 17:29:02 -07:00
Leonard Kim
3195a449ca ref(conference): web and native exercise same redux flow for kicked out 2019-06-27 09:34:05 -07:00
Bettenbuk Zoltan
d7483f07e3 feat: add possibility to clear invite search field 2019-06-27 18:17:37 +02:00
Дамян Минков
9c1b802997 Device selection now always shows the device that it managed to open. (#4384)
* Device selection now always shows the device that managed to open.

* Simplifies implementation, skips using state.
2019-06-27 17:04:47 +01:00
damencho
bb3a10b0fc Safe guard for removed parent node of the iframe. 2019-06-27 14:23:59 +01:00
paweldomas
97e8b31cee fix: update LJM to fix reload on hangup
Updates LJM to c0af82a215d0893f1999df299cfdfcbc9ce9e72a
2019-06-26 22:11:12 +02:00
Saúl Ibarra Corretgé
55218de779 rn: add a reduced UI mode for the welcome page
The only way to render the welcome page in reduced UI mode currently is to
hangup a call from the Android ongoing notification while in PiP mode.
2019-06-26 21:45:27 +02:00
Saúl Ibarra Corretgé
714e0e045d android: add notification while there is an ongoing meeting
The notification is posted by a foreground service, which also has the nice
side-effect of keeping the app alive for a long time.
2019-06-26 21:45:27 +02:00
Saúl Ibarra Corretgé
0bc369afb4 android: add ability to get the current Activity running RN
This helper method gets the current Activity attached to React Native (via the
ReactContext). This is useful for modules which need access to it, without being
actual React Native modules.
2019-06-26 21:45:27 +02:00
Saúl Ibarra Corretgé
f71ec55170 android: add ability to keep track of the current ongoing conference 2019-06-26 21:45:27 +02:00
yanas
760885437a Merge pull request #4369 from jitsi/quality-text-change
Changes call quality strings to video quality.
2019-06-26 17:24:34 +01:00
damencho
f77976b742 Notify for detecting suspend. 2019-06-26 17:10:34 +01:00
Saúl Ibarra Corretgé
9e95e7cd97 rn: bump SDK version to 2.2.0 2019-06-26 12:04:17 +02:00
Leonard Kim
9d94257e79 ref(api): move conference join notification to middleware 2019-06-26 10:47:18 +02:00
Leonard Kim
13cfd61c83 fix(index): set reload link as attribute, not raw html 2019-06-25 12:48:31 -07:00
Leonard Kim
fa818bc386 feat(screenshare): allow auto-pin remote only 2019-06-25 11:21:23 +01:00
Saúl Ibarra Corretgé
a73a642c64 rn: fix CallKit failure screen flash when kicked
Pretend we have left instead of triggering a call failure. The user was already
told in the dialog.
2019-06-25 10:25:33 +02:00
Leonard Kim
94b3f6410d ref(api): move local participant name change 2019-06-24 13:15:02 -07:00
Leonard Kim
3d30f6e9cd ref(api): move filmstrip display notification 2019-06-24 13:15:02 -07:00
Leonard Kim
40c16f0bac ref(api): move tile view subscriber to api dir 2019-06-24 13:15:02 -07:00
Leonard Kim
a1db63a8c2 ref(api): move feedbackSubmitted notification to api middleware 2019-06-24 13:15:02 -07:00
Leonard Kim
59a9c2d947 fix(notifications): show notifications after reducers update to get name
Otherwise the participant will not have been added yet
to state so the participant name will not display in
the notification.
2019-06-24 10:51:17 -07:00
Yana Stamcheva
fc897b9bac Changes call quality to video quality. 2019-06-24 14:39:22 +01:00
damencho
96f013c549 Fixes few undefined errors on standby. 2019-06-24 12:06:27 +01:00
damencho
742905e05a Removes duplicated text. 2019-06-24 12:06:27 +01:00
damencho
bde44a94e8 Changes display name prompt to non modal, so people can mute/unmute. 2019-06-24 12:06:27 +01:00
Saúl Ibarra Corretgé
1786bfadce android: make some activity attributes private
They are only meant to be used internally. This reduces the risk of SDK users
sending garbage when we expect a specific type.
2019-06-21 21:48:46 +02:00
Saúl Ibarra Corretgé
b2e840636a sounds: lower log severity
When native SDK users end a meeting the view gets disposed and detached from
React, and then the entire app gets destroyed and these errors get printed at
the error level, throwing some people off.
2019-06-21 21:48:46 +02:00
Saúl Ibarra Corretgé
ddaa22048f android: make sure we left the current meeting when the activity is destroyed
If the user swipes the activity from the recents list there is no other chance,
onDestroy gets called directly.
2019-06-21 21:48:46 +02:00
Saúl Ibarra Corretgé
3e77890387 android: fix not calling super in onNewIntent 2019-06-21 21:48:46 +02:00
Leonard Kim
1e39c12963 fix(suboptimal): allow checks for chromium based browsers 2019-06-21 09:55:43 -07:00
Saúl Ibarra Corretgé
243fdba80f android: fix exception when sending events without URL
ENTER_PIP_MODE, for example, does not have it.
2019-06-21 15:42:10 +02:00
Дамян Минков
08c4933c1b Fixes inviting more than one participant (#4352)
* Fixes inviting more than one participant.

* Shows a notification when participants are invited.

* Adds support for both .id and .user_id props for people query results.
2019-06-21 13:17:47 +01:00
Leonard Kim
d5e0dea469 fix(suboptimal): ignore mobile browsers in whitelists/blacklists 2019-06-21 11:01:40 +01:00
paweldomas
033aa0dd6e fix(base/conference/reducer): check if room is defined
This was hit on a corner case when ConnectionService will deny
the request to start the call. I am not sure, but it could have been
that the conference object has been disposed or closed or something
else, but the fact is that 'conference.room' was not defined and things
crashed. It is not safe to access conference's private field 'room'. It
is true JitsiConference doesn't follow the practice of marking this
field as private with the underscore '_', but it is not a public field.
2019-06-20 13:19:04 -05:00
Saúl Ibarra Corretgé
803870ef8f android: add a uncaught exception handler
Its main task is to cleanup conferences (specially the connection services
stuff) to make sure the system is left in a working state even when the
unexpected happens.
2019-06-20 17:03:24 +02:00
virtuacoplenny
bf67a4a675 Configurable (sub)optimal and unsupported browsers (#4351)
* Configurable (sub)optimal and unsupported browsers

* maybe this helps somehow
2019-06-20 14:02:15 +01:00
Bettenbuk Zoltan
ee2036a2a7 feat: show on stage function 2019-06-20 11:05:34 +02:00
Bettenbuk Zoltan
4c3ed190f3 feat: add ability to toggle toolbox from tile view 2019-06-20 11:05:34 +02:00
Hristo Terezov
a91b49c2c1 feat(reload): on offer / answer error. 2019-06-19 05:25:43 -07:00
Saúl Ibarra Corretgé
186ba70cb7 participants: skip local participant join notification
Also, use the helper function to get the display name for a participant.
2019-06-19 13:15:17 +02:00
Leonard Kim
12c18657d5 fix(welcome-page): make Tabs more resilient to bad props
In case wrong props are passed in, such as pointing to
an index that does not contain a value in the tabs
array.
2019-06-18 17:55:21 -07:00
Leonard Kim
9f8e7d4050 chore(deps): bump lib to a89d673 for caps version fixes 2019-06-18 17:24:12 -07:00
Leonard Kim
4cea7018f5 fix(tile-view): back to single click to pin
Undoes the logic added in:
ebcde745ef
2019-06-18 15:14:20 -07:00
Saúl Ibarra Corretgé
54a9b9199e rn: adapt to API changes in google signin 2019-06-18 14:51:44 +02:00
Saúl Ibarra Corretgé
4591b36c3e android: handle onActivityResult Activity lifecycle method
It may be called in the Activity instead of in the Fragment. Handle both.
2019-06-18 14:51:44 +02:00
Saúl Ibarra Corretgé
db862b5b3b misc: add Android debug builds to .gitignore 2019-06-18 14:51:44 +02:00
Saúl Ibarra Corretgé
70b864f00b deps: react-native-google-signin@2.0.0 2019-06-18 14:51:44 +02:00
Saúl Ibarra Corretgé
73b6a7a134 android: fix React packager not working on debug builds on a device 2019-06-18 14:51:44 +02:00
Saúl Ibarra Corretgé
8b5b112c6a android: don't default to making libre builds 2019-06-18 14:51:44 +02:00
Leonard Kim
2f7f9f24c4 fix(display-name): dismiss prompt if name gets set 2019-06-17 15:10:53 +01:00
Leonard Kim
1197c26529 fix(always-on-top): enforce circle avatar 2019-06-17 16:08:39 +02:00
Дамян Минков
6eb66b639e Notify for kick and mute (#4328)
* Updates kick showing who kicked us.

* Notify participants that someone was kicked.

* Shows notification to user who is remotely muted.

* Updates the notification type.

* Muted by notification for mobile.

* Moves code to react and adds the kick notifications to mobile.

* Updates lib-jitsi-meet.
2019-06-17 16:00:09 +02:00
Saúl Ibarra Corretgé
fa88db6897 ios: update CocoaPods to 1.7.1 2019-06-14 13:24:14 +02:00
Дамян Минков
64eb4b5609 Updates start silent, turning on startWithAudioMuted and few UI tweaks. (#4314)
* Updates start silent, turning on startWithAudioMuted and few UI tweaks.

Disabled mic unmute button and removes remote participants volume slider.

* Adds analytics for start silent.

* Removes extra semi colon.

* Updates lib-jitsi-meet and updates meeting info text.
2019-06-14 12:16:08 +01:00
Emil Ivov
ef2455caea Merge pull request #4333 from saghul/display-name-copy
lang: update display name request copy
2019-06-14 11:13:22 +01:00
Saúl Ibarra Corretgé
ca11cbf6cc calendar-sync: fix loading calendar entries
Checking if the calendar support in the reducer is not only useless but wrong,
since we don't have access to the entire store (the calendar support is checked
in the base/config feature). If calendar support is not enabled the actions
being reduced won't be dispatched anyway, so no harm is done by removing the
check.
2019-06-14 11:32:39 +02:00
Saúl Ibarra Corretgé
f15a2aea68 lang: update display name request copy 2019-06-14 11:03:32 +02:00
paweldomas
e6c3d7ded7 chore(deps): bump LJM version to increase frozen video timeout
Update LJM to 25ca5cbd2a93150e74f029075bc7ac734ed97a2f
2019-06-13 12:32:25 -05:00
Hristo Terezov
2861198251 ref(no-data-from-source): logic. 2019-06-13 09:52:10 -07:00
Hristo Terezov
226c0bb084 ref(track-error): Remove NO_DATA_FROM_SOURCE 2019-06-13 09:52:10 -07:00
Saúl Ibarra Corretgé
30c0bfc108 rn: disable vertical scrollbars on bottom sheets 2019-06-13 10:07:55 +02:00
Leonard Kim
df50e7fa69 fix(large-video): make blurred background fit whole screen 2019-06-12 20:27:04 -07:00
Saúl Ibarra Corretgé
f85ac3ef91 rn: fix video unmuting when disabling audio-only
When the video unmute button disabled audio-only, also unmute video. This fixes
a weird case in which the user need to "unmute twice" if they were muted beofre
they enabled audio-only mode. That's ok if the audio-only button was used, but
not if the video-unmute button was used, since the expectation is to have video,
of course.
2019-06-12 18:54:35 +02:00
Saúl Ibarra Corretgé
e33b334307 rn: add SDK API to set user information
At the moment it includes:

- display name
- email
- avatar URL

This information is used *only* if no token was specified.
2019-06-11 17:27:16 +00:00
Bettenbuk Zoltan
ce6f7308ad fix: avoid keyboard with search results list 2019-06-11 19:14:15 +02:00
Bettenbuk Zoltan
f66478fa34 feat: don't auto-stage bot type participants 2019-06-11 17:55:44 +02:00
Bettenbuk Zoltan
bf99051885 fix: invite search result sorting 2019-06-11 17:55:44 +02:00
Bettenbuk Zoltan
7234ca69c8 feat: invite field autofocus 2019-06-11 17:55:44 +02:00
Bettenbuk Zoltan
ae965877f3 fix: invite list needs double tap to select 2019-06-11 17:55:44 +02:00
Leonard Kim
ae3b70eb13 feat(api): notify of password required 2019-06-11 08:12:37 -07:00
Saúl Ibarra Corretgé
97e0303065 feature-flags: add flag for enabling calendar integration 2019-06-11 13:37:50 +00:00
Saúl Ibarra Corretgé
35ffbe1720 feature-flags: add flag for enabling chat 2019-06-11 13:37:50 +00:00
Saúl Ibarra Corretgé
f7b92f65ca ios: add feature flag to enable recording on iOS 2019-06-11 13:37:50 +00:00
Saúl Ibarra Corretgé
cf7b10d53d feature-flags: initial implementation
The welcomePageEnabled and pictureInPictureEnabled props on mobile have been
converted to feature flags.
2019-06-11 13:37:50 +00:00
Saúl Ibarra Corretgé
d798f93614 deps: check-in the diff when npm 6.9.0 is used 2019-06-11 13:08:23 +00:00
Saúl Ibarra Corretgé
4ddfcaf584 toolbox: disable audio-mode when video-unmuting
If audio-only was engaged, use the video (un)mute button to disengage it. This
should simplify the flow for getting back to video.
2019-06-11 13:08:23 +00:00
Saúl Ibarra Corretgé
431a221c63 ios: be resilient to invalid UUIDs 2019-06-11 10:04:15 +00:00
Mihai Damian
477826089c ios: Added property for setting PiP initial position 2019-06-11 09:25:23 +00:00
Hristo Terezov
a46369cf22 chore(package.json): Update lib-jitsi-meet 2019-06-10 06:53:36 -07:00
Hristo Terezov
651791b8df feat(deeplinking): Pass state to openDesktopApp. 2019-06-10 04:14:41 -07:00
virtuacoplenny
09cc738219 fix(recording): do not prompt hidden participants for name (#4309)
* fix(recording): do not prompt hidden participants for name

* squash: update package.json
2019-06-10 11:27:08 +01:00
Leonard Kim
6d8ec4d147 fix(unsupported): stop recommending safari 2019-06-07 07:36:20 -07:00
Leonard Kim
d65a068fdb feat(deep-linking): hide web button on unsupported browsers 2019-06-07 07:36:20 -07:00
Leonard Kim
cf23045f8d feat(unsupported): provide custom blacklist for branding 2019-06-07 07:36:20 -07:00
Leonard Kim
e47d2d13ce fix(deep-linking): deep link first, then show unsupported
Re-structure the custom routing to split between
platforms instead of between intended route features.
This made it easier for me to understand where to
do the checks for unsupported browser after deep-linking
had been checked.
2019-06-07 07:36:20 -07:00
Aaron van Meerten
07b7f03aa7 Merge pull request #4308 from jitsi/prosody-token-allow-asap-server-override
allows override of asap key server in token utility
2019-06-06 14:26:25 -06:00
Aaron van Meerten
7ce44f85ca changed to using a setter for the asapKeyServer 2019-06-06 15:22:38 -05:00
Aaron van Meerten
41e0d782ce allows override of asap key server in token utility 2019-06-06 14:41:46 -05:00
Aaron van Meerten
2a8fafdd36 Merge pull request #4303 from jitsi/start-silent
Adds a config param startSilent to disable audio output.
2019-06-05 12:29:57 -06:00
damencho
faee1c139e Adds a config param startSilent to disable audio output. 2019-06-05 18:01:18 +01:00
virtuacoplenny
eb644987ce fix(settings): do not use non-set localStorage values (#4299)
If a value is not set in localStorage then null is
returned. null should not be converted to an empty
string (via _.escape) because that will then be
stored in localStorage as the user set preference
and will keep overriding any other values set
in localStorage for the displayname.
2019-06-04 17:42:48 -07:00
damencho
de60a70daf Commit from translate.jitsi.org by user damencho.: 555 of 625 strings translated (8 fuzzy). 2019-06-03 11:19:10 +00:00
damencho
2904dfa794 Commit from translate.jitsi.org by user damencho.: 584 of 625 strings translated (2 fuzzy). 2019-06-03 11:19:01 +00:00
damencho
d51cf7c581 Commit from translate.jitsi.org by user damencho.: 625 of 625 strings translated (0 fuzzy). 2019-06-03 10:58:25 +00:00
Hristo Terezov
f25e6c6a5d chore(package.json): Update lib-jitsi-meet version 2019-06-01 02:28:04 -07:00
Hristo Terezov
5fb9422513 feat(API): Add show feedback parameter to hangup 2019-06-01 02:28:04 -07:00
Hristo Terezov
d01cfc8466 fix(conference): API left event. 2019-06-01 02:28:04 -07:00
Saúl Ibarra Corretgé
fa3888991f rn: avoid logging initial props in release builds
They may contain sensitive information.
2019-05-31 11:49:36 +02:00
virtuacoplenny
ded355a807 fix(settings): use moderator check helper (#4292) 2019-05-30 14:10:40 -07:00
Leonard Kim
b655c8d54a fix(large-video): clear remote video stream on track removal
VideoLayout schedules a large video update by passing in
the video stream on the small video instance. When a stream
is removed, the UI is removed from the small video instance
but a reference to the stream is left. So when VideoLayout
schedules the large video update after a stream removal,
the old stream from the small video instance is re-used,
even though it has been removed.

This change also brings balance with RemoteVideo method
"addRemoteStreamElement" which sets the stream on the
small video instance, so now "removeRemoteStreamElement
unsets it.
2019-05-30 09:46:35 -07:00
Leonard Kim
42a6e6faaf ref(large-video): remove redundant call to update on stream removal 2019-05-30 09:46:35 -07:00
Leonard Kim
c7954c284d ref(large-video): move layout update on stream removal to layout middleware 2019-05-30 09:46:35 -07:00
virtuacoplenny
251da1861a feat(api): notify api of mic and camera errors (#4289)
- Use actions to notify the rest of the app that
  a mic or camera error has occurred
- Use middleware to respond to those notifications
  of errors by showing in-app notifications and
  notifying the external api
2019-05-29 14:17:07 -07:00
Hristo Terezov
9712804040 fix(Amplitude): user id 2019-05-29 09:53:31 -07:00
Hristo Terezov
fecbef0aff fix(AmplitudeModule): class name 2019-05-29 17:22:50 +02:00
Saúl Ibarra Corretgé
d65b71b584 rn: add ability to set the conference subject 2019-05-29 14:48:02 +02:00
Saúl Ibarra Corretgé
579d291bca config: add ability to pass the subject as a URL parameter 2019-05-29 14:48:02 +02:00
Saúl Ibarra Corretgé
871026f4ba conference: clear the pending subject after it has been set 2019-05-29 14:48:02 +02:00
Saúl Ibarra Corretgé
9a8a070c62 rn: show conference subject if set 2019-05-29 14:48:02 +02:00
Leonard Kim
7cf4c7bd78 Revert "feat(screenshare): enable auto-pin of latest and last screenshare"
This reverts commit f42d0411b1.

The UX provided by this feature flag in its current state is not
desired. Also, I noticed filmstrip sometimes failing to properly
update small video display mode on pin/unpin. The feature is
being left in for consumers of jitsi-meet to enable as needed.
2019-05-28 15:28:50 -07:00
Hristo Terezov
72a1def571 feat(config): whitelist config.analytics 2019-05-24 13:42:12 -07:00
damencho
0dad99c3b7 Enables local video flip menu by default. 2019-05-24 23:09:24 +03:00
Hristo Terezov
840c0190c4 fix(deep-linking): Don't rely on custom scheme 2019-05-24 12:51:14 -07:00
Leonard Kim
e0fdeea69b fix(large-video): do not stretch dominant speaker avatar 2019-05-24 12:00:35 -07:00
Leonard Kim
e3612929f8 fix(avatar): dynamically size avatar in dynamically sizable filmstrip 2019-05-24 12:00:35 -07:00
Hristo Terezov
70921bb6ef feat(analytics): local tracks duration event. 2019-05-24 10:09:25 -07:00
Saúl Ibarra Corretgé
371ca4eef1 ios: don't require bitcode for Debug builds 2019-05-24 14:11:08 +02:00
Bettenbuk Zoltan
54fdb7066f feat: scrollable bottom sheet 2019-05-24 14:06:17 +02:00
Bettenbuk Zoltan
85bcb0c757 fix: auth dialog button labels 2019-05-24 11:35:56 +02:00
Bettenbuk Zoltan
d387cbe5bd fix: iOS 10 bottom sheet style 2019-05-24 11:28:28 +02:00
paweldomas
1bc28e4904 watchos: display a message if the recent list is empty 2019-05-24 09:41:31 +02:00
Saúl Ibarra Corretgé
cb3419ba2a android: enter PiP mode when pressing back button
When in a conference, try to enter PiP when pressing the back button. If this is
not possible (because it's unsupported, not enabled, etc.) fall back to the
previous behavior of simply hanging up.
2019-05-23 16:00:12 +02:00
Saúl Ibarra Corretgé
a2f8e156da app: avoid loading config when going back to the welcome page 2019-05-23 15:16:31 +02:00
Saúl Ibarra Corretgé
a4cf79c161 rn: fix losing audio if call is hangup too quickly
This PR changes the logic for connecting / disconnecting conferences. Instead of
doing it in mount / unmount events from the Conference component, it moves the
logic to the appNavigatee action.

This fixes a regression introduced in 774c5ecd when trying to make sure the
conference terminated event is always sent.

By moving the logic to appNavigate we no longer depend on side-effects for
connecting / disconnecting, and the code should be more maintainable moving
forward.

An improvement to this is the concept of sessions, which, while not tackled
here, was taken into consideration.
2019-05-23 15:16:31 +02:00
Saúl Ibarra Corretgé
9352517705 ios: always log delegate method calls 2019-05-23 15:16:31 +02:00
Saúl Ibarra Corretgé
47d5163c52 rn: don't tag builds by default
People run these in their own checkout and will run into problems because
tagging will fail.
2019-05-23 12:07:04 +02:00
Bettenbuk Zoltan
def22b01bb fix: set explicit color for search field to avoid theme override 2019-05-23 12:06:50 +02:00
Saúl Ibarra Corretgé
9445cf99fd Revert "ios: remove no longer needed code"
This reverts commit 603d161788.
2019-05-22 18:10:35 +02:00
paweldomas
96b226de24 watchos: change the icons
Inverts the icons to follow more what's in the phone app instead of
CallKit.
2019-05-22 17:25:35 +02:00
Bettenbuk Zoltan
5101f69e4e feat: don’t render moderator icon if everyone is moderator 2019-05-22 14:08:52 +02:00
François Benaiteau
61b66e0edf doc: fix incorrect code examples for universal / deep linking 2019-05-22 14:08:37 +02:00
Bettenbuk Zoltan
700051f809 fix: device selection colour scheme support 2019-05-22 12:29:28 +02:00
Дамян Минков
d16e10baec room-lock: adds ability to allow only digits for room locking 2019-05-22 09:43:17 +02:00
ibauersachs
11e5c14f83 Commit from translate.jitsi.org by user ibauersachs.: 317 of 625 strings translated (31 fuzzy). 2019-05-21 17:02:23 +00:00
ibauersachs
ded58d77d1 Commit from translate.jitsi.org by user ibauersachs.: 319 of 613 strings translated (26 fuzzy). 2019-05-21 16:58:20 +00:00
ibauersachs
8642c372c4 Commit from translate.jitsi.org by user ibauersachs.: 323 of 583 strings translated (4 fuzzy). 2019-05-21 16:56:52 +00:00
ibauersachs
edbf591059 Commit from translate.jitsi.org by user ibauersachs.: 430 of 583 strings translated (18 fuzzy). 2019-05-21 16:55:09 +00:00
jitsi-pootle
ded4291d6a New files added from translate.jitsi.org based on templates 2019-05-21 14:09:04 +00:00
Дамян Минков
a14fead0f3 Groups devices notifications by type audio/video. (#4238)
* Groups devices notifications by type audio/video.

* Fixes passing correct device array.
2019-05-20 21:35:42 +01:00
Saúl Ibarra Corretgé
466e1e3eb8 android: fix publishing new async storage package
The naming didn't match, so adjust it. @ cannot be used for maven artifact
names.
2019-05-20 17:33:36 +02:00
Saúl Ibarra Corretgé
8a90f0dab1 android: include SDK version in Maven repo commit message 2019-05-20 17:33:17 +02:00
Leonard Kim
d7e0aa3f61 fix(api): enable the external api before the first redux update
For the external api to fire update events out of the iframe, it
must first be initialized within the jitsi app. Any invocations
by the app to send updates events before initialization will
cause the api to swallow the events. The chosen fix is to
initialize the api earlier so the first update of app's redux
store fires update events that the api will also fire out of
the iframe.

This change will affect current behavior in that right now
the update event of the initial set of the avatar url is
blocked, but the change will make that event fire out of the
iframe.
2019-05-20 11:56:08 +02:00
Leonard Kim
37b343a797 feat(api): add ability to toggle tile view 2019-05-20 02:53:16 -07:00
Leonard Kim
149485905c fix(api): store passed in devices as user selected
Currently devices set through the api are stored
as ids, and not user selected. This can cause
other existing user selected devices to take
precedence over the devices passed into the api.
2019-05-17 10:47:31 +01:00
Aaron van Meerten
7f1df5629e Merge pull request #4229 from jitsi/poltergeist-prefix-support
updates bosh to support optional prefix
2019-05-16 15:40:28 -06:00
Leonard Kim
f42d0411b1 feat(screenshare): enable auto-pin of latest and last screenshare 2019-05-16 14:19:34 -07:00
Aaron van Meerten
8d1d573266 updates bosh to support optional prefix
use optional prefix in poltergeist room lookup
2019-05-16 14:23:36 -05:00
Leonard Kim
d86b60ea72 fix(chat): maintain bottom scroll on input resize 2019-05-15 08:06:35 -07:00
Leonard Kim
dfe5fbb702 ref(chat): change initial input size to 1 line 2019-05-15 08:06:35 -07:00
Leonard Kim
09f881c0f5 ref(chat): bring in package for text area auto-resizing 2019-05-15 08:06:35 -07:00
Leonard Kim
f1546008f9 ref(chat): removed unused getChatInputRef callback for input 2019-05-15 08:06:35 -07:00
Leonard Kim
d8df7fde84 ref(chat): clean up public blur/focus methods on input
Method blur is not called. Method blur is called
internally only.
2019-05-15 08:06:35 -07:00
Saúl Ibarra Corretgé
1c809eb428 ios: strip bitcode when releasing the SDK 2019-05-15 14:07:25 +02:00
Saúl Ibarra Corretgé
e94edcd4ae ios: automagically download a bitcode WebRTC build if needed 2019-05-15 09:54:17 +02:00
paweldomas
b48651396f fix(travis): upload through ssh proxy 2019-05-14 19:37:37 -05:00
Leonard Kim
e2044074ad Revert "fix(welcome-page): remove watermark container to avoid z-index wars"
This reverts commit 890151fa72.
2019-05-14 12:42:54 -07:00
Saúl Ibarra Corretgé
f060ac9db1 ios: notify RTCAudioSession about CallKit AVAudioSession activation 2019-05-14 21:09:39 +02:00
Leonard Kim
5a53d7f32a fix(chat): re-fix letting long messages wrap 2019-05-14 09:20:25 -07:00
Leonard Kim
4eec13da1c ref(chat): de-parameterize AbstractMessageContainer 2019-05-14 09:20:25 -07:00
Leonard Kim
cb8282dfe5 ref(chat): remove unused method 2019-05-14 09:20:25 -07:00
Leonard Kim
5cd0b1a9be fix(chat): fix auto-scrolling to bottom
Empower the parent.
2019-05-14 09:20:25 -07:00
Leonard Kim
504fadaf71 ref(chat): on web, move timestamp to chat message 2019-05-14 09:20:25 -07:00
Leonard Kim
7187e540a8 ref(chat): on native, show messages as grouped by sender 2019-05-14 09:20:25 -07:00
Leonard Kim
34dffbfc5e ref(chat): on native, group messages by sender (no styling) 2019-05-14 09:20:25 -07:00
Leonard Kim
a9637f93c3 ref(chat): create AbstractMessageContainer
So mobile and web can share logic for grouping chat
messages by sender.
2019-05-14 09:20:25 -07:00
Leonard Kim
0e8b0a9c5c ref(chat): create web MessageContainer component 2019-05-14 09:20:25 -07:00
Saúl Ibarra Corretgé
e66b596a0d ios: add ability to override SDK version when releasing 2019-05-14 17:00:02 +02:00
Saúl Ibarra Corretgé
6f320f463d rn: don't use annotated tags when building the SDKs 2019-05-14 17:00:02 +02:00
Saúl Ibarra Corretgé
02955ab57c deps: react-native@0.59.8
https://github.com/react-native-community/releases/blob/master/CHANGELOG.md#v0598
2019-05-14 10:22:50 +02:00
Leonard Kim
a9d76a2577 fix(large-video): vertically align center screenshare
Stop using special case logic for aligning screenshare videos.
It may be possible to have positioning all done using CSS but that
seems to be a more significant refactoring.
2019-05-10 08:09:56 -07:00
Bettenbuk Zoltan
dcf31baf3a doc: update google auth doc 2019-05-10 13:22:05 +02:00
Bettenbuk Zoltan
1e346f10ab rn: fix streaming key input color 2019-05-10 13:22:05 +02:00
Leonard Kim
a114d55fac fix(chat): ensure really long words can trigger wrapping 2019-05-09 08:25:47 -07:00
Leonard Kim
afde717ca4 ref(chat): use message type as classname 2019-05-09 07:06:27 -07:00
Leonard Kim
fb5a45f714 feat(chat): on web, group messages by sender 2019-05-09 07:06:27 -07:00
Дамян Минков
f5ac18da18 Add option to allow guest(moderators) to add a room password 2019-05-09 13:30:38 +02:00
Saúl Ibarra Corretgé
103ae363f6 ios: fix CallKit crash in development mode
It's possible a CallKit event arrives when the React Bridge has been torn down
and there is an assert that checks this. In order to avoid a crash, just skip
the event.
2019-05-09 13:22:58 +02:00
damencho
9bde673397 Updates copy info with parltcipant name info if available. 2019-05-09 10:33:55 +01:00
paweldomas
ff6b27eafa fix(travis): add watch dev prov profile 2019-05-08 19:01:28 -05:00
paweldomas
8cb19ccbf6 fix(travis): download WebRTC bitcode 2019-05-08 19:01:28 -05:00
damencho
198eba3682 Does not play sound notifications on the recording side. 2019-05-08 10:27:05 -07:00
Leonard Kim
a49f62238b ref(chat): clean up extra dom 2019-05-08 08:57:00 -07:00
Leonard Kim
a8233bdb84 ref(chat): move some colors to css variables 2019-05-08 08:57:00 -07:00
Leonard Kim
ec2826e0fc ref(chat): make wider 2019-05-08 08:57:00 -07:00
Leonard Kim
3d9606f6da ref(chat): use somewhat transparent background 2019-05-08 08:57:00 -07:00
Leonard Kim
01458eeff9 ref(chat): add a header for holding the close button 2019-05-08 08:57:00 -07:00
Leonard Kim
0318568a30 ref(chat): add light top border on input for visual separation 2019-05-08 08:57:00 -07:00
Leonard Kim
4d04141f24 ref(chat): change input placeholder 2019-05-08 08:57:00 -07:00
Leonard Kim
afbc622fb9 ref(chat): differentiate local and remote messages with background color 2019-05-08 08:57:00 -07:00
Leonard Kim
fbc7f865ec ref(chat): change chat bubble borders based on sender
For remote chat messages, all corners should be rounded
except the top left. For local messages all corners
should be rounded except the top right.
2019-05-08 08:57:00 -07:00
Leonard Kim
2a4bac7a27 ref(chat): remove chat bubble arrow 2019-05-08 08:57:00 -07:00
Saúl Ibarra Corretgé
b45a5da6e2 rn: use new AsyncStorage package
It was extracted from the RN core to a community maintained package.
2019-05-08 16:03:09 +02:00
Saúl Ibarra Corretgé
2fad9f9ba8 ios: update Podfile.lock 2019-05-08 12:12:54 +01:00
Saúl Ibarra Corretgé
8b0e5b9d15 android: set system navbar color to match the header 2019-05-08 12:44:17 +02:00
paweldomas
0889ffdf27 android fix: do not enter PiP mode when the permissions alert is shown
Entering PiP mode while the permissions dialog is display will not only
fail, but also mess up the Activity lifecycle on some OS versions.
We may end up with two activity/fragment instances and a situation where
the onStop callback was not called yet on the instance #1 while
the onResume has been already called on instance #2.
2019-05-08 10:15:14 +02:00
Bettenbuk Zoltan
86d0d4fc22 rn: add DialInSummary 2019-05-07 18:02:14 +02:00
Bettenbuk Zoltan
7e9df74e60 rn: add generic alert dialog 2019-05-07 18:02:14 +02:00
Bettenbuk Zoltan
3eca67e1ad rn: add HeaderWithNavigation component 2019-05-07 18:02:14 +02:00
Дамян Минков
c040b3a7dd Fall back to using label for preferred devices (#4171)
* Skips setting undefined device id to sink in audio preview.

* Fallbacks to use labels for user selected devices.

* Fixes comment.
2019-05-07 09:53:01 +01:00
Leonard Kim
3f4a71c26d fix(welcome-page): remove watermark container to avoid z-index wars
By making the container 100% height and position relative, that
would cause it to overlap any static-positioned  elements below it.
The 100% makes it so that any watermarks intended for the bottom
of the page show up on the bottom of the page. However, it's not
needed because watermark stylings already try to position the
watermarks at the bottom.
2019-05-04 11:03:48 -07:00
Leonard Kim
e7db8d6812 fix(chat): save chat error messages into redux
The proper field name is "messageType",
not "type." Also using "type" would
override the actionType.
2019-05-03 14:06:36 -07:00
Saúl Ibarra Corretgé
7d2ac0244d deps: react-native-webrtc@4064c6f2db4f8b961daaaa8dafc6a896d7cfbc43
New M69 build with Metal crash fixes.
2019-05-03 19:29:30 +02:00
Saúl Ibarra Corretgé
c0efea5168 ios: enable bitcode
Time has come. We need to enable bitcode. It's optional for iOS targets, but
mandatory for the entire project if there is a watchOS target. Since we have a
watchOS target, it's time to enable it.
2019-05-03 19:29:30 +02:00
Saúl Ibarra Corretgé
5ed53dcef5 ios: update Fastlane for watchOS app 2019-05-03 19:29:30 +02:00
Saúl Ibarra Corretgé
746159a1ac ios: set compilation mode to "wholemodule" for release builds 2019-05-03 19:29:30 +02:00
Saúl Ibarra Corretgé
43a8fd2a53 ios: set iOS deployment target correctly everywhere 2019-05-03 19:29:30 +02:00
Saúl Ibarra Corretgé
a26bb2c1a6 watchos: add watchOS app
Co-authored-by: Pawel Domas <pawel.domas@jitsi.org>
2019-05-03 19:29:30 +02:00
paweldomas
e4af5ddbe9 feat(base/connection): throw error and add isInviteURLReady 2019-05-03 19:29:30 +02:00
Дамян Минков
768cff48a4 Notify for new device (#4165)
* Fix detecting preferred audio output.

Fixes detecting when a new output device is found and we have stored user preference of using that device.

* Does not store which is the currently open device on save.

Does not save the currently opened device when saving settings dialog, this will be done once we successfully replace the tracks to use the new devices.

* Saves opened audio device after successfully changing it.

If we do it earlier _updateAudioDeviceId is using localAudio and can store wrong value.

* Adds notification for new non preferred devices.

A notification is shown which gives an option to the user to select and use the newly plugged devices.
Adding custom button and handler for the action to the notifications.

* Changes logic to search and handle all newly added devices from array.

* Moves some utility methods to features/base/devices.
2019-05-03 18:25:33 +01:00
damencho
384f0d4317 Removes hardcoded defaulting to US number from the code. 2019-05-03 16:55:22 +01:00
damencho
0ec4e6a805 Makes numbers clickable on the more numbers page when opened on mobile. 2019-05-03 16:55:22 +01:00
Saúl Ibarra Corretgé
5cc01b074e ios: update Podfile.lock for RN update 2019-05-03 10:27:17 +02:00
damencho
deaf5ba612 Always uses the id for the device extrackted from the track.
When updating the currently used devices always uses the id that is used by the local track instance.
2019-05-02 11:55:46 +01:00
damencho
740c1eb84f Adds new persistent state for devices user selection.
The state about currently opened devices is filtered and not stored, where we only store when user selects a device preferences.
Also allow changing input devices for Firefox when we are not in a conference.
2019-05-02 11:55:46 +01:00
Saúl Ibarra Corretgé
2d45709a6a android: add the ability to make a "libre" build
A libre build will exclude the following:

- Analytics modules
- Google Play services GMS
- Crashlytics
- Firebase
2019-05-02 09:26:20 +02:00
Saúl Ibarra Corretgé
6bbc2927ab analytics: don't initialize handlers if they are not properly configured 2019-05-02 09:26:20 +02:00
Saúl Ibarra Corretgé
08891b17b6 android: expose JitsiMeetActivity.leave() 2019-05-02 09:26:20 +02:00
Saúl Ibarra Corretgé
aab3428347 android: make JitsiMeetActivity.join public 2019-05-02 09:26:20 +02:00
Saúl Ibarra Corretgé
bf7b1c5cfc rn: add support for alpha.jitsi.net 2019-05-01 23:23:24 +02:00
Saúl Ibarra Corretgé
7b347baab6 deps: react-native@0.59.5 2019-05-01 19:16:08 +02:00
Saúl Ibarra Corretgé
f9b3d470e9 cc: fix showing CC button if config option is undefined 2019-04-30 14:50:56 +02:00
Saúl Ibarra Corretgé
7b78fa45f4 invite: don't consider "add people" enabled if there is no search URL
This avoids showing the + button when there is no service configured, ie with
the default Jitsi Meet install.
2019-04-30 14:50:56 +02:00
Saúl Ibarra Corretgé
34dcbd991e rn: wait for animation before hiding SlidingView 2019-04-30 12:45:53 +02:00
Saúl Ibarra Corretgé
70dc22c107 rn: refactor BottomSheet
Avoid using a Modal since those create trouble with the view hierarchy.
2019-04-30 12:45:53 +02:00
damencho
89719520e2 Disposes the tracks in component was unmounted while creating those.
The issue is if you quickly click Devices and then another tab, we may leave open tracks (video light stays on even when you are video muted).
2019-04-29 14:38:17 +00:00
Дамян Минков
ce7bdb35ac Merge pull request #4152 from jitsi/prosody-0.10-update
Updates config if prosody 0.10 is used.
2019-04-29 14:36:55 +00:00
Дамян Минков
bf8c716477 Merge pull request #4150 from jitsi/invitation-update
Update copy invite text.
2019-04-29 14:36:46 +00:00
Дамян Минков
93e8d755d3 Merge pull request #4148 from zbettenbuk/recording-web-css-fix
Safeguard Container style when used cross-platform
2019-04-29 14:36:35 +00:00
damencho
c09eee0985 Disables chat when we are in recorder mode. 2019-04-29 14:36:22 +00:00
damencho
4f6a0d7d3a Updates config if prosody 0.10 is used. 2019-04-29 15:24:55 +01:00
damencho
dd5233d31b Update copy invite text. 2019-04-29 15:06:36 +01:00
Bettenbuk Zoltan
31638133b7 Safeguard Container style when used cross-platform 2019-04-29 13:37:30 +02:00
Bettenbuk Zoltan
b886f8d72d rn: specify chat text field font color 2019-04-26 21:33:11 +02:00
Дамян Минков
a6555c5d24 Singleton follow me (#4144)
* Prints errors in case of wrong initialization.

Not printing can masks some errors in the code.

* Allow only one Follow Me moderator in a meeting.

* Sends Follow Me state with all presences of the moderator.

This fixes an issue where the moderator sends the Follow Me state and then for example mute or unmute video (this will produce a presence without Follow Me state) and the new comers will not reflect current Follow Me state till a change of it comes.

* Changes fixing comments.

* Changes fixing comments.
2019-04-26 18:11:53 +00:00
Hristo Terezov
98c8fb09c4 feat(package.json): Update lib-jitsi-meet. 2019-04-26 07:54:38 -07:00
Leonard Kim
b76b261cab fix(invite): show telephone icon 2019-04-26 07:46:41 -07:00
Bettenbuk Zoltan
0b6c51f666 rn: replace 3rd party chat library with custom implementation 2019-04-26 15:17:36 +02:00
Sylvia van Os
1cb9bbc7a4 Fix wrong filename change 2019-04-26 09:06:43 +00:00
Sylvia van Os
fee9bdb98c Fix NAT documentation 2019-04-26 09:06:43 +00:00
virtuacoplenny
fb82cf4517 fix(modal): bump dep to 8.0.1 to remove scrollbars (#4139) 2019-04-25 11:58:11 -07:00
Saúl Ibarra Corretgé
85388b8d23 ios: handle some corner cases with Firebase Dynamic Links
- handle some weird bug
(https://github.com/firebase/firebase-ios-sdk/issues/233)
- use a common function to extract the URL off a dynamic link
2019-04-25 18:18:09 +02:00
Saúl Ibarra Corretgé
33f133ac25 ios: simplify code for handling CallKit listeners
Replace the Swift array with an Objective-C one, since it's going to store
Objective-C objects and not Swift objects (or Swift objects which inherit from
NSObject, which is equivalent).

This avoids the need for JMCallKitEventListenerWrapper entirely, since an
NSArray can store NSObjectProtocol objects, unlike a Swift array, which prompted
the creation of the wrapper in the first place.
2019-04-25 18:17:55 +02:00
Saúl Ibarra Corretgé
774c5ecd18 rn: ensure the conference terminated event is always sent
Dear reader, I'm not proud at all of what you are about to read, but sometimes
life just gives you lemons, so enjoy some lemonade!

Joining a conference implies first creating the XMPP connection and then joining
the MUC. It's very possible the XMPP connection was made but there was no chance
for the conference to be created.

This patch fixes this case by artificially genrating a conference terminated
event in such case. In order to have all the necessary knowledge for this event
to be sent the connection now keeps track of the conference that runs it.

In addition, there is an even more obscure corner case: it's not impossible to
try to disconnect when there is not even a connection. This was fixed by
creating a fake disconnect event. Alas the location URL is lost at this point,
but it's better than nothing I guess.
2019-04-25 14:04:26 +02:00
Saúl Ibarra Corretgé
ccc5e19e3c rn: fix filling LoadConfigOverlay's background 2019-04-24 17:41:28 +02:00
Saúl Ibarra Corretgé
32a81b0be5 rn: add our benevolent employer to the list of known domains 2019-04-24 17:36:41 +02:00
Saúl Ibarra Corretgé
59db39d4d9 rn: cleanup old code
This legacy code was added about a year ago to ease the migration between
releases:
631f51d627

I consider this not to be needed anymore.
2019-04-24 17:36:41 +02:00
damencho
2219298501 Updates web styling for file recording service sharing option. 2019-04-24 14:54:33 +00:00
Bettenbuk Zoltan
f92d530b0a Fix double file recording sharing switch 2019-04-24 10:35:43 +00:00
Bettenbuk Zoltan
e98c169c2f [RN] Fix iOS keyboard bug on invite search dialog 2019-04-24 11:48:09 +02:00
Saúl Ibarra Corretgé
6bf962817b ios: add a CallKit icon
The SDK will now search for an asset called "CallKitIcon" on the main bundle,
and fallback to a built-in asset it it's not there, allowing SDK users to
customize it by just adding asset with that name.
2019-04-24 10:03:46 +02:00
virtuacoplenny
4c286b8580 chore(deps): bump lib to get fixed rtc.destroy call (#4122) 2019-04-23 15:38:32 -07:00
Дамян Минков
37639a5614 Merge pull request #4121 from jitsi/remove-edge-support
Removes Edge support.
2019-04-23 20:32:17 +00:00
Bettenbuk Zoltan
b7198ba4b3 Add recording file sharing switch 2019-04-23 20:32:10 +00:00
damencho
2180d33e3d Adds alias for external_api.js in all default web config. 2019-04-23 20:31:53 +00:00
damencho
43a0ae578e Removes Edge support. 2019-04-23 17:55:07 +01:00
Bettenbuk Zoltan
154200460d Add some other paths to proxy bypass 2019-04-23 18:00:27 +02:00
Saúl Ibarra Corretgé
9a92dc578c ios: fix resetting CallKit's CXProvider
When CallKit is enabled / disabled, a new CXProvider must be created in order to
not confuse CallKit (it misbehaves otherwise).
2019-04-23 09:55:01 +02:00
paweldomas
eb38300c0d chore: update LJM to 1bfc96a2876d6527bfa27cf46d4f1e9f6e65edbc
Updates LJM in order to stop printing few obsolete error messages.
2019-04-18 12:24:23 -05:00
paweldomas
37b1ccbe61 ios: update react-native-werbtc in order to fix leaking streams 2019-04-18 12:24:23 -05:00
Bettenbuk Zoltan
725f9b1961 [RN] Rename lock room button 2019-04-18 14:18:08 +01:00
Leonard Kim
b172639237 fix(follow-me): remove duplicate default state 2019-04-17 15:58:55 -05:00
virtuacoplenny
c7013f5c4b ref(follow-me): hook into redux (#3991)
Use subscribers to detect state change and emit those
out to other participants. Use middleware to register
the command listener.
2019-04-17 08:05:32 -07:00
Saúl Ibarra Corretgé
aefa836406 Revert "misc: don't show a warning on Safari with VP8"
This reverts commit 9625be1db3.
2019-04-17 15:15:48 +02:00
virtuacoplenny
f6c410610a fix(toolbar): let click through gradient (#4107)
Otherwise it can eat clicks on elements it is above,
like YouTube and Etherpad controls.
2019-04-17 06:15:08 -07:00
Saúl Ibarra Corretgé
603d161788 ios: remove no longer needed code
Ever since we switched to handling track events instead of mute actions this has
been dead code. It was also added in the wrong place, since it's responsibility
of the JS code to solve the ping-pong problem.
2019-04-17 13:24:42 +02:00
Saúl Ibarra Corretgé
c1f8a35156 doc: add links to the sample SDK applications repo 2019-04-17 09:37:28 +02:00
virtuacoplenny
866dc4dbc6 ref(subtitles): remove logic around dialing transcriber (#4011) 2019-04-16 12:27:17 -07:00
damencho
69a12395d2 Removes debug log and adds safety check whether config exists. 2019-04-16 21:16:38 +02:00
virtuacoplenny
17627291e8 ref(css): use var for desktop drag area margin (#4104) 2019-04-16 11:45:25 -07:00
Hristo Terezov
30669c7699 feat(lib-jitsi-meet): Update version. 2019-04-16 17:05:02 +01:00
Hristo Terezov
4abc2db24a fix(device-selection): Default device change. 2019-04-16 17:05:02 +01:00
Bettenbuk Zoltan
2b4ace75ae [RN] Add connection indicator 2019-04-16 17:33:23 +02:00
Saúl Ibarra Corretgé
3217ef2bb4 ios: make sure symbols are uploaded to TestFlight
While that option should default to true, let's be explicit about it.
2019-04-16 15:43:15 +02:00
Bettenbuk Zoltan
e5caca9cfd [RN] Add display name label to tile view 2019-04-15 18:58:15 +02:00
Bettenbuk Zoltan
42c85c22a9 [RN] rearrange display-name files for later refactor 2019-04-15 18:58:15 +02:00
Leonard Kim
fd0eef4c84 fix(chat): change margins to avoid different background color 2019-04-12 22:39:09 +01:00
Leonard Kim
ab022c62f5 fix(filmstrip): bring down height to avoid electron drag area 2019-04-12 22:39:09 +01:00
Leonard Kim
f9c0c3e2f6 fix(chat): bring down elements to avoid electron drag area 2019-04-12 22:39:09 +01:00
paweldomas
70ec7c5b3d ios: bump travis osx_image to 10.2 2019-04-12 16:16:57 -05:00
virtuacoplenny
ca38bd53fe fix(chat): use css for arrow (#4097) 2019-04-12 13:59:03 -07:00
Leonard Kim
b3cae9a962 fix(chat): allow smiley opener to expand in width
The chat icons are different on windows and mac, with
windows icons being bigger. By settings a specific
width on the smiley container, windows would see
part of the smiley cut off.
2019-04-12 18:29:04 +01:00
Saúl Ibarra Corretgé
b768b88491 android: add ability to override SDK version when releasing 2019-04-12 15:39:29 +02:00
Saúl Ibarra Corretgé
9f339c452b android: raise SDK version 2019-04-12 15:39:29 +02:00
Leonard Kim
c34f9cf233 fix(screenshare): properly gate autopin behavior behind flag check 2019-04-11 09:09:48 -07:00
virtuacoplenny
76642b7c4b feat(screenshare): add auto pin of latest screen share (#4076) 2019-04-11 08:53:34 -07:00
Saúl Ibarra Corretgé
b78989f5f2 android: improve SDK release script
- don't hardcode defaults in gradle files
- allow for uploading also to HTTP URLs
- support HTTP authentication when publishing
2019-04-11 17:43:33 +02:00
virtuacoplenny
088b5d95c2 chore(deps): update lib for listener leak fix (#4084) 2019-04-11 08:00:05 -07:00
virtuacoplenny
c6e5adbe0e fix(large-video): respect update in progress when queuing update (#4078)
When a fade in/out animation is in progress, another large
video update can be queued but can try to force itself onto
large video. For example a pin can be in progress and while
the fade in/out animation plays, local video can change its
video type during the animation and forcing an update of
large video. This results in local video getting forcible
updated onto large video while the pinned video is left on
small video only.
2019-04-10 08:16:02 -07:00
Bettenbuk Zoltan
8bb56be317 [RN] Add conference connecting overlay 2019-04-10 15:47:36 +02:00
Bettenbuk Zoltan
84b917d708 Reorg overlay feature files 2019-04-10 15:47:36 +02:00
Bettenbuk Zoltan
18d908ce84 Fix flow errors from base/connection 2019-04-10 15:47:36 +02:00
Bettenbuk Zoltan
3987655f2a Refactor config loading 2019-04-10 15:47:36 +02:00
Saúl Ibarra Corretgé
ee3b8af4cf ios: remove PiP sample application
It now lives here: https://github.com/jitsi/jitsi-meet-sdk-samples
2019-04-10 15:10:47 +02:00
Saúl Ibarra Corretgé
9625be1db3 misc: don't show a warning on Safari with VP8 2019-04-10 14:15:02 +02:00
Saúl Ibarra Corretgé
21c0745504 android,ios: now working on version 19.2 2019-04-10 14:14:04 +02:00
Saúl Ibarra Corretgé
26c9ee5f9c deps: lib-jitsi-meet@9659b4e413b12c637810fb2ab52354f1357a177e 2019-04-10 12:32:57 +02:00
Saúl Ibarra Corretgé
9b7af64e11 ios: raise SDK version 2019-04-09 16:08:45 +02:00
Saúl Ibarra Corretgé
f26c5570df ios: update sample PiP app
- Xcode 10.2 + Swift 5
- Latest SDK API
- Fix warnings
2019-04-09 16:08:45 +02:00
Saúl Ibarra Corretgé
d37a0eee3a ios: fix compilation warnings 2019-04-09 16:08:45 +02:00
Saúl Ibarra Corretgé
024fc73e63 ios: update to Xcode 5 and Swift 5 2019-04-09 16:08:45 +02:00
Saúl Ibarra Corretgé
bdaabf6d3d odeps: react-native@0.59.4
Fixes a crash on some old Android devices.
2019-04-09 16:08:45 +02:00
virtuacoplenny
7a677ead93 ref(device-selection): set audio output sink id after receiving ref (#4066)
The Audio.js setRef callback does not behave like react ref callback
in that the former will not have fired before componentDidMount
but the later will have. So for audio output preview, trying to set
sink id on mount will no-op because it does not have a ref yet to
Audio.js, possibly leading to audio output previews playing on
the default speaker device. This generally has not been a user
visible problem due to coincidence; other re-renders necessary
by the parent of audio output preview will have triggered
componentDidUpdates on the audio out preview, which would then
set the sink id on the Audio.js ref it should have received
by then.
2019-04-08 10:38:06 -07:00
virtuacoplenny
e7812c7d84 fix(device-selection): search for device by label and kind (#4064)
Searching for a device (id) by label alone can result in
false results when devices share labels, such as a mic
and speaker having the same label. To prevent such,
specify the device kind to be found instead of iterating
over all device kinds.
2019-04-08 10:03:45 -07:00
damencho
ea54713f9a Supports prosody 0.11 when configuring.
Doing few changes needed for general config and for tokens.
2019-04-05 17:18:17 +02:00
virtuacoplenny
5a99697ae2 fix(toolbox): fix typo in action type for hide timeout (#4069) 2019-04-04 10:53:14 -07:00
virtuacoplenny
ec09085a50 fix(device-selection): set audio output device on initial configuration
When the iFrame api is used to set a preferred audio output using
options passed into the JitsiMeetExternalAPI constructor, no logic
fires to actually change the audio output destination.
2019-04-04 08:10:01 -07:00
virtuacoplenny
b731459ea4 fix(device-selection): use device kind when getting current devices (#4059)
Devices of different kinds can have the same id, such as speaker
and mic both being default. Using id only can then lead to
incorrectly setting device descriptions in the current devices
object.
2019-04-03 08:06:41 -07:00
Saúl Ibarra Corretgé
f73d3a4063 ios: add SDK release script 2019-04-03 16:15:11 +02:00
Saúl Ibarra Corretgé
4c3cf8c14a android: add an improved SDK release script
It releases the SDK and all dependencies (including React Native) to the
specified Maven repo.
2019-04-03 16:15:11 +02:00
Saúl Ibarra Corretgé
1f371ab055 android: simplify qualifying dependencies when publishing
Use an ever increasing number so no manual updates are necessary.
2019-04-03 16:15:11 +02:00
Saúl Ibarra Corretgé
dfeb26597b android: make Maven repo used for publising configurable 2019-04-03 16:15:11 +02:00
Saúl Ibarra Corretgé
384f7d7890 ios: update Podfile.lock 2019-04-02 16:18:09 +02:00
Bettenbuk Zoltan
4d9dcf5d43 [RN] Add InfoDialogButton 2019-04-02 16:18:09 +02:00
Saúl Ibarra Corretgé
e217e10af5 android: update custom version for native dependencies 2019-04-02 14:17:45 +02:00
Saúl Ibarra Corretgé
7feec7c11d deps: react-native-sound€0.10.12 2019-04-02 14:17:45 +02:00
Saúl Ibarra Corretgé
36eb27e233 rn: add build information to SettingsView 2019-04-02 12:40:35 +02:00
Bettenbuk Zoltan
b791fc32fd [RN] Make BaseIndicator render simpler 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
b1a70240fc Clear raise hand status on confidence leave 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
50d7c1521f Remove legacy web raise hand code 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
5d9762b429 Extract notification timeout to a constant 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
4e78502c9e Generalize indicators 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
6ff733dae0 Platform generic notification for raised hand 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
2dc59b9ea0 [RN] Add button to toggle raised hand 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
e65918564b [RN] Add UI for raised hand feature 2019-04-01 21:03:36 +02:00
Bettenbuk Zoltan
ce9744b9c3 Move participant event handler to a platform generic location 2019-04-01 21:03:36 +02:00
damencho
b413457a4f Commit from translate.jitsi.org by user damencho.: 262 of 588 strings translated (0 fuzzy). 2019-04-01 12:41:41 +00:00
damencho
75daedf9ab Commit from translate.jitsi.org by user damencho.: 406 of 583 strings translated (30 fuzzy). 2019-04-01 12:40:08 +00:00
damencho
45eeea447a Commit from translate.jitsi.org by user damencho.: 583 of 583 strings translated (0 fuzzy). 2019-04-01 12:40:00 +00:00
damencho
16fcc55ad1 Commit from translate.jitsi.org by user damencho.: 583 of 583 strings translated (0 fuzzy). 2019-04-01 12:39:52 +00:00
damencho
a70009e486 Commit from translate.jitsi.org by user damencho.: 583 of 583 strings translated (0 fuzzy). 2019-04-01 12:39:41 +00:00
damencho
06502e5aac Commit from translate.jitsi.org by user damencho.: 423 of 583 strings translated (24 fuzzy). 2019-04-01 12:39:33 +00:00
damencho
6316447d4b Commit from translate.jitsi.org by user damencho.: 504 of 583 strings translated (0 fuzzy). 2019-04-01 12:39:06 +00:00
jitsi-pootle
df5fa71b92 New files added from translate.jitsi.org based on templates 2019-04-01 12:39:06 +00:00
Bettenbuk Zoltan
10e951c17c Reorg notifications feature files 2019-03-29 18:52:44 +01:00
Hristo Terezov
f12317dc59 docs(api.md): Comply with our coding style. 2019-03-29 16:39:21 +00:00
Hristo Terezov
829e5597d5 fix(iframe-api-devices): Misc small issues. 2019-03-29 15:42:02 +00:00
Hristo Terezov
f2e0704b93 fix(filmstrip-only): DeviceSelectionPopup 2019-03-29 15:42:02 +00:00
Hristo Terezov
a7aaf31c79 feat(iframe-api): Add deviceListChanged event. 2019-03-29 15:42:02 +00:00
Hristo Terezov
4967488e56 ref(iframe-api-devices): Use labels instead of IDs 2019-03-29 15:42:02 +00:00
Hristo Terezov
ed1d3d3df5 fix(api-devices): Initial device function calls 2019-03-29 15:42:02 +00:00
Hristo Terezov
427f49367b feat(iframe-api): Device handling. 2019-03-29 15:42:02 +00:00
Saúl Ibarra Corretgé
659e420005 ios: make sure Fastlane can update the provisioning profile
https://docs.fastlane.tools/codesigning/xcode-project/#xcode-9-and-up
2019-03-29 14:50:59 +01:00
Saúl Ibarra Corretgé
9a46606f0d misc: s/Atlassian/8x8/ 2019-03-29 13:11:36 +01:00
Leonard Kim
3b911b0362 chore(deps): bump lib-jitsi-meet for permissions api fixes 2019-03-28 08:47:42 -05:00
Philip-Choi
7ae8ae5791 doc: update README 2019-03-28 09:46:03 +01:00
paweldomas
a386740103 fix(ConnectionService): history and audio focus on Samsung devices
On some Samsung devices the call done with the ConnectionService end up
in the native call history which we don't want. That's fixable by
marking the Connection as "external" just before the call is
disconnected.

Another issue specific to Samsung devices about the audio focus not
always being release when that call ends. That's fixable by marking
the call as holding just before disconnecting it.
2019-03-27 13:39:52 -05:00
Saúl Ibarra Corretgé
451949f49d android: enable PiP support by default in JitsiMeetActivity 2019-03-27 17:39:09 +01:00
Saúl Ibarra Corretgé
61ed459971 android: add JitsiMeetActivity.launch helper methods
They greatly simplify starting a JitsiMeetActivity by encapsulating the creation
of the Intent adn extras placement.

In order to make this possible JitsiMeetConferenceOptions now implements
Parcelable so it can be serialized and passed around when creating an Intent.
2019-03-27 17:39:09 +01:00
Saúl Ibarra Corretgé
c30a4a0aa6 android: make Amplitude and Dropbox modules package private 2019-03-27 17:39:09 +01:00
paweldomas
e839684ae9 fix(base/conference): tracks not added to the conference
If tracks are created while the conference is in the 'joining' state
they will never be added.
2019-03-27 10:06:59 +01:00
Saúl Ibarra Corretgé
15c5a2339b android: fix getting permission request results
Now that we have both a Fragment and an Activity there are lifecycle methods
that overlap. If a Fragment requests permission by calling requestPermissions
then the result handler will be called on itself. React Native's permissions
module, however, calls ActivityCompat.requestPermissions on the Activity, thus
we need to handle the results at the Activity level and not at the Fragment
level.
2019-03-26 11:56:14 -05:00
virtuacoplenny
d7e112aaf0 fix(display-name): do not default name to placeholder name (#4027)
* ref(display-name): do not pass in display name

The component gets the state itself from redux.

* fix(display-name): do not default name to placeholder name

The web display name component supports inline editing of
the name. Problems can occur when the displayed name
differs from the actual saved name, because participants
without a display name, including the local user, have
a different, default display name displayed. So when
editing starts, the input field is populated with the
default name. To workaround such while supporting fetching
the display name using mapStateToProps, pass in both the
name which should be shown and the name value saved in
settings.

* ref(display-name): rename methods
2019-03-26 09:34:02 -07:00
Saúl Ibarra Corretgé
24339b2461 ios: update Podfile.lock 2019-03-26 13:47:57 +01:00
Bettenbuk Zoltan
5b02c575f7 eslint-config-jitsi#1.0.0 2019-03-26 13:35:02 +01:00
Mayur Shah
1f8904a95b deps: react-native@0.59.2 2019-03-26 10:53:50 +01:00
Saúl Ibarra Corretgé
50268a08a0 ios: ensure the git tree is clean when / after building 2019-03-25 19:08:12 +01:00
Saúl Ibarra Corretgé
985385f364 ios: update fastlane Fastfile 2019-03-25 19:08:12 +01:00
Saúl Ibarra Corretgé
f662edd135 ios: don't bundle a dummy GoogleService-Info.plist file
It complicates automated builds.
2019-03-25 19:08:12 +01:00
Saúl Ibarra Corretgé
7ebcf69937 android: add fastlane integration 2019-03-25 19:08:12 +01:00
Saúl Ibarra Corretgé
40364ae269 misc: update gitignore 2019-03-25 19:08:12 +01:00
Saúl Ibarra Corretgé
030af37668 android: generate versionCode automatically
It's a number whichb must be ever increasing with each build submitted to the
store.

Automate its value by using the number of seconds since 1st of January 2019.
That should be enough for ~680 years.
2019-03-25 19:08:12 +01:00
Saúl Ibarra Corretgé
e29bc4bbb6 deps: update react-native-callstats to version 3.58.2 2019-03-25 14:56:52 +01:00
Bettenbuk Zoltan
13212a5980 [RN] Replace chat modal with SlidingView 2019-03-25 14:52:43 +01:00
Bettenbuk Zoltan
2a5adfc601 Remove some Flow annotations 2019-03-25 13:53:08 +01:00
paweldomas
19e8e8710a fix(Android/ConnectionService): do not display the address
Turns out that on Samsung phones the calls placed with
the ConnectionService appear in the calls log as weird long numbers.
The system mangles the address we give it ("sip:meet.jit.si/something")
into this weird long number and the call to request.getAddress() returns
that. Turn off the presentation as neither this number nor our address
makes sense. This way the call appears as from "Unknown" caller in call
history which is still not perfect, but better than the random number.

Note that other phones will preserve the originally passed address value
(tested on One Plus 5).
2019-03-25 09:24:33 +01:00
paweldomas
3b24124d57 fix(Android/ConnectionService): mic not working
Turns out the microphone will not work on some devices when starting in
"audio only", because the audio mode is not set to the MODE_IN_COMMUNICATION,
but to the MODE_IN_CALL. Calling setAudioModeIsVoip(true) makes
the system adjust to MODE_IN_COMMUNICATION and the mic works fine.
2019-03-25 09:24:33 +01:00
damencho
6894de00cc Fixes a typo of getting default number. 2019-03-23 09:59:25 +00:00
paweldomas
6d0b6bee85 ref(AudioModeModule): check 1 method to enable ConnectionService 2019-03-22 09:17:14 +01:00
virtuacoplenny
ac02a17943 feat(notifications): provide a way to turn off sticky notifications (#4010) 2019-03-21 14:06:33 -07:00
paweldomas
043d4db314 fix(NotificationsContainer.native): flow error 2019-03-21 17:09:56 +01:00
Saúl Ibarra Corretgé
6a919916d3 ios: pin all pod dependencies 2019-03-21 16:57:58 +01:00
Saúl Ibarra Corretgé
1de4897a6b ios: xcode project change shenanigans
Signing wouldn't work, disabling it and enabling it again created these changes.
Oh well!
2019-03-21 16:29:18 +01:00
paweldomas
0175690a2b ref(mobile): display only the topmost notification
Only one notification will be displayed at a time on mobile.
2019-03-21 15:47:14 +01:00
paweldomas
c7979a3944 feat(mobile): add 1 liner notifications
Adds 1 liner notifications to mobile. Only the title is displayed. In
case the title is missing there's a fallback to the description.
2019-03-21 15:47:14 +01:00
paweldomas
15fd27543a ref(Conference): extract AbstractConference 2019-03-21 15:47:14 +01:00
paweldomas
64f8a8d700 fix(AbstractNotificationsContainer): broken timeouts chain
If user dismisses the not topmost notification the timeout will be
cleared and a new one will not be set, because the top notification
remained the same (see the if at line 90).
2019-03-21 15:47:14 +01:00
paweldomas
95f684da2f fix(AbstractNotificationsContainer): dismiss timeout not always set
The docs of 'componentDidUpdate' say that it's not called for the
initial render. If the component is added to the DOM with 1 notification
already, then the update will not happen and timeout will never be set
which will effectively break the timeouts chain.
2019-03-21 15:47:14 +01:00
paweldomas
f3f8dc2072 ref: move participant joined notification to the middleware 2019-03-21 15:47:14 +01:00
Saúl Ibarra Corretgé
08efc46f21 android: fix crash in debug mode 2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
e32336b96f android: run the React packager when running from AS
When running the app from Android Studio the React packager is not automatically
started. In vanilla RN projects this is done by the "react-native run-android"
command, but often times it is desired to run from Android Studio.

This fixes that by starting the packager from Gradle.
2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
c91880859b android: fix gradle warning 2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
cff78d7a83 android: disable delta updates
It's enabled by default, but marked as experimental (uh?!). It creates trouble
as sometimes the packager goes bananas. Disable them until further notice, our
bundle is not that large anyway.
2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
49a0c03ff0 ios: fix deprecation warning
NSURLConnection sendSynchronousRequest is deprecated since iOS 9. Replace the
method by whjat's currently on RN master, which implements a modern alternative.
2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
2c592f61c3 android: enable 64bit builds 2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
c025c7e132 flow: tame the beast
🔥🔥🔥
2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
278d3a163b flow: update type definitions 2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
0e92e73789 chore: use strings as action types
Using anything non-serializable for action types is discouraged:
https://redux.js.org/faq/actions#actions

In fact, this is the Flow definition for dispatching actions:

declare export type DispatchAPI<A> = (action: A) => A;
declare export type Dispatch<A: { type: $Subtype<string> }> = DispatchAPI<A>;

Note how the `type` field is defined as a subtype of string, which Symbol isn’t.
2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
75527e01dd deps: update lib-jitsi-meet 2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
b53a034aaf deps: update React Native to version 0.59
This new version comes with an updated JSC runtime, so we no longer need to
depend on the updated version ourselves.
2019-03-21 14:47:55 +01:00
paweldomas
4d1c0cf219 fix eslint error 2019-03-19 21:59:45 +01:00
virtuacoplenny
a667c9bff2 ref: js-utils for random and room name generator (#3975) 2019-03-19 10:35:36 -07:00
Damien Fetis
e652117571 Remove the boolean conversion of authLogin string to display the string value instead of 'true'. (#3995) 2019-03-19 08:55:14 -07:00
Hristo Terezov
a6719896a2 fix(recording): Respect the selected recording service. 2019-03-15 20:12:25 +00:00
damencho
f5a7e0bccb Adds provider name to fix welcomepage text.
* Removes unused ADD_PEOPLE_APP_NAME
* Moves deep-link header background and logo size as variables.
* Fixes more numbers page space in the header.
* Fixes left padding on deep-linking mobile page.
2019-03-15 11:24:18 +00:00
damencho
f94db0da2c Adjust some paths to respect base. 2019-03-14 11:22:37 +00:00
paweldomas
460593a93e chrome: bump LJM to 74f48e168eec4c05fd8600812cc00e6e34e9ab90
Required for the Spot's TURN changes to work
2019-03-13 14:25:19 -05:00
paweldomas
19a27e75bd feat(spot): pass JitsiConnection to ProxyConnectionService to get TURN 2019-03-13 14:25:19 -05:00
Hristo Terezov
cb8e9eed5e feat(subject): UI 2019-03-12 23:03:58 +00:00
Saúl Ibarra Corretgé
2715e81f1d rn: add more SDK documentation 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
f941f15def ios: remove Jitsi Meet specific defaults
The app should always provide them.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
7712c6913c android: make ReactInstanceManagerHolder.emitEvent return void 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
45b6a8b5d5 android: throw if a unsupported type makes it to the props Bundle 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
26ca0e6630 android: throw if the overlsay permission is not granted in Debug mode 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
7978f9f5f4 misc: update .gitignore 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
d39290f9fa rn: refactor conference events
Consolidate all failure cases into a single one: CONFERENCE_TERMINATED. If the
conference ended gracefully no error indicator will be present, otherwise there
will be.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
f696a6dbe2 ios: update SDK documentation 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
bf3bcd65d6 android: add JitsiMeetActivity
It renders a single JitsiMeetFragment which holds the JitsiMeetView view.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
a7018970ca android: update SDK documentation 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
20edb7c279 android: make onExternalAPIEvent protected 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
59b00d022b android: don't proxy enterPictureInPicture in JitsiMeetFragment 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
53722fd2e6 android: remove ReactContextUtils
In practice, we are never going to be in a position where we don't have a
ReactContext but we do have some React Native code running. So let's not expect
the impossible.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
54bab793e5 android: remove JitsiMeetViewAdapter
It was never used and typicallt the Activity / Fragment holding the
JitsiMeetView object will be the listener.

In addition, once we refactor the events they will be reduced into far fewer.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
975ff9c83d rn: support passing serverURL and room to URL object
That's what the SDK passes now, if the room URL is not absolute.
2019-03-12 16:55:28 +01:00
paweldomas
5b3e8a9b5e android: introduce JitsiMeetConferenceOptions
Co-authored-by: Saúl Ibarra Corretgé <saghul@jitsi.org>
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
aedcfba263 ios: introduce JitsiMeetConferenceOptions 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
b97cb3509a rn: document externalAPIScope prop 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
7d8ea85ea0 rn: start removing defaultURL 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
e4c3e15791 rn: simplified code
There is no need for AbstractApp to require some getWindowLocation function.
It's only used in one place and we even polyfill it on mobile.

Thus replace it's usage with more specific functions.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
56135bd085 android: add initial implementation of join / leave 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
549b495d16 ios: add initial implementation of join / leave 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
f3abca6462 ios: add ability to control deep / universal linking
Since the SDK may be embedded with other apps, we need to recognize our custom
URL scheme and universal links in order to tell the user if we will process the
request or not.

Make them configurable with sane defaults.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
405905be82 rn: raise SDK version 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
468b02b812 ios: adjust to latest Swift syntax 2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
3fa5aed950 rn: drop deep / universal links handling from JS
It's now all handled in the SDK an we'll get the new URLs via props.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
90803c8ff6 android: SDK v2 pass one
Add JitsiMeetFragment and refactor the app to use it.
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
dbc88b972e ios: SDK v2 pass one
- cleanup
- API simplification (single loadURL method)
- JitsiMeet singleton for linking helpers and globals
- Linking moved to app
2019-03-12 16:55:28 +01:00
Saúl Ibarra Corretgé
1c47720a08 misc: ignore build artifacts 2019-03-12 16:55:28 +01:00
Hristo Terezov
59fc3642a6 feat(amplitude): add mobile implementation 2019-03-12 16:48:08 +01:00
Saúl Ibarra Corretgé
19b4b92150 deps: update lib-jitsi-meet 2019-03-12 16:48:08 +01:00
Bettenbuk Zoltan
8400d01d75 [RN] Add color scheme support to dialog buttons 2019-03-12 12:36:15 +01:00
Bettenbuk Zoltan
d04068344a [RN] Make header button same size as header label 2019-03-12 12:36:15 +01:00
Bettenbuk Zoltan
55a971c0fd [RN] Add color scheme support to header 2019-03-12 12:36:15 +01:00
Bettenbuk Zoltan
20c1b1cfae [RN] Wrap PagedList navigator with SafeAreaView 2019-03-12 12:36:15 +01:00
Bettenbuk Zoltan
ecb44b6ab4 [RN] Make the header more compact 2019-03-12 12:36:15 +01:00
Jose Angel Gonzalez
039805eba3 fix(android-sdk): Recover audio device if the OS changes it 2019-03-12 09:55:51 +01:00
virtuacoplenny
22277ad799 feat(api): add notification for when filmstrip gets toggled (#3974) 2019-03-11 11:17:28 -07:00
Hristo Terezov
2af1e8da95 fix(remote-video-menu): Icon position 2019-03-11 17:36:58 +00:00
Дамян Минков
12d0aef686 Updates recording dialog. (#3953)
* Updates recording dialog.

* Update config.js doc.

* Adds comment and make a check more intuitive.

* Changes of using enum for recording types.
2019-03-11 09:17:21 -07:00
Hristo Terezov
f439ad2999 feat(popover): Make the popover menus customizable. 2019-03-11 16:04:20 +00:00
Leonard Kim
81d4f694b7 fix(chat): prevent empty messages 2019-03-09 12:09:29 +01:00
Saúl Ibarra Corretgé
c737d46d90 android: update gradle plugin version 2019-03-08 17:24:49 +01:00
Saúl Ibarra Corretgé
3f2a559d64 rn: now working on version 19.1 2019-03-08 14:04:03 +01:00
Saúl Ibarra Corretgé
bdb3099073 android: fix running on Android < M
The android.telecom.CallAudioState class was only added in API level 23 (Android
M), so make sure we don't import it in lower versioned devices.
2019-03-08 11:37:25 +01:00
damencho
b3a05db286 Update dropbox redirect uri to always use the main domain static page. 2019-03-07 15:39:16 +00:00
virtuacoplenny
08f2edf350 feat(screenshare): emit source type when starting screenshare (#3959)
* feat(screenshare): emit source type when starting screenshare

* squash: update doc
2019-03-06 21:46:17 -08:00
Bettenbuk Zoltan
98c7430b6f [RN] Replace red screen with dialog 2019-03-07 01:09:03 +01:00
Bettenbuk Zoltan
ebdcbe122a Change dialog button property keys 2019-03-07 01:09:03 +01:00
virtuacoplenny
31c1034be7 deps(chore): bump lib-jitsi-meet to e398584 (#3958)
Bring over two fixes for spot. One is for
identifying the screenshare type when using
a camera for screenshare or when using a proxy
stream. Also bring in a fix to avoid a js error
in chrome ios.
2019-03-06 15:39:01 -08:00
Hristo Terezov
a9d82a79ea fix(toolbar): Move buttons to overflow menu when the space isn't enough 2019-03-06 17:51:31 +00:00
Bettenbuk Zoltan
27e1f5a1bc [RN] Avoid adding undefined in the invite 2019-03-06 16:52:22 +01:00
virtuacoplenny
dbedee5e22 chore(deps): update to lib 320919e (#3951) 2019-03-05 17:02:22 -08:00
Дамян Минков
636c63397b Adds integrations doc. (#3929)
* Adds integrations doc.

Google, Microsoft and Dropbox for now.

* Updates doc.
2019-02-28 09:09:09 +00:00
damencho
67e7994e36 Removes unused config. 2019-02-27 16:45:26 +00:00
damencho
40f03fedc2 Replaces emoji flags with flag from a png.
Seems like windows does not have emojis for flags.
2019-02-27 16:45:26 +00:00
Hristo Terezov
55149670da fix(dropbox-auth): In Electron. 2019-02-27 16:12:54 +00:00
Gabriel-Tiberiu Imre-Lucaci
5739e1deaa feat(external_api): notify when api is disposed 2019-02-27 14:39:04 +00:00
Bettenbuk Zoltan
b6e2701991 [RN] Add invite screen 2019-02-27 13:26:21 +01:00
Bettenbuk Zoltan
38b1be1291 [RN] Extract AvatarListItem 2019-02-27 13:26:21 +01:00
damencho
555f8b3a99 Fixes toll free position. 2019-02-26 17:08:56 +00:00
Дамян Минков
ea4d49f2a0 Adds new format of phoneList service and re-design dial in numbers page. (#3903)
* Adds new format of phoneList service and re-design dial in numbers page.

Adds flags and country names (with translations) for the numbers if using the new format.

* Fixes tests and fixes get default number.

* Updates swagger with new format.

* Moves html back yo table.

Fixes displaying on mobile and also the tel: URI generation. The tel: URI is tested on Android and iOS and seems to work (Android was not interpreting 'p', but both seems to like ',').

* Fixes a wrong return statement.

* Small fixes.
2019-02-26 13:32:46 +00:00
fossterer
d7eea8abbc Added links related to NAT config in a new FAQ doc 2019-02-26 09:53:48 +00:00
paweldomas
1b8ef9a05a chore: update LJM to 5a9fc76739bcf0bed50676c7be160f688f3a19b5 2019-02-25 14:16:05 -06:00
Emil Ivov
ac7311cb52 Merge pull request #3920 from jitsi/emcho-patch-3
Update api.md
2019-02-23 17:04:13 +00:00
Emil Ivov
f498c8d402 Update api.md 2019-02-23 16:39:27 +00:00
Leonard Kim
8c8b09878c fix(screensharing): do not sync camera device id on start
When a conference is started, the currently used
camera device id is saved. I believe this is happening
because lib-jitsi-meet does not use exact device id
mathcing when calling getUserMedia, so it's possibl
to request camera A but get camera B back because
camera A is not available. When config.startScreenSharing
is true, the syncing occurs and saves the desktop
source id. So when screensharing is stopped, jitsi-meet
requests that desktop source id instead of the preferred
camera.
2019-02-22 10:50:43 -06:00
Leonard Kim
03f8d8b51a fix(external_api): detect and skip params for hash routers 2019-02-22 10:34:49 -06:00
Hristo Terezov
32083fc44d fix(connection-quality): Bring back the icon. 2019-02-21 18:49:49 +00:00
Hristo Terezov
c4361ed7da feat(css): configurable Videolayot and overflow menu. 2019-02-21 18:49:49 +00:00
Hristo Terezov
a95d38a0f4 feat(thumbnail-indicators): Configurable icon sizes. 2019-02-21 18:49:49 +00:00
Hristo Terezov
981600a999 fix(toolbar): button distance and colors. 2019-02-21 18:49:49 +00:00
Hristo Terezov
0d674001d2 chore(icons): Cleanup 2019-02-21 16:18:01 +00:00
Hristo Terezov
f7b930409b feat(toolbox): Redesign. 2019-02-21 00:42:13 +00:00
paweldomas
4312512d2f feat(external API): add feedbackPromptDisplayed event
Adds a new event fired when Jitsi Meet shows the feedback prompt.
2019-02-20 11:59:46 -06:00
Saúl Ibarra Corretgé
b7b2745dae ios: update podfile for CocoaPods 1.6.0 2019-02-19 19:13:07 +01:00
damencho
fc129d9849 Adds setting subject and adding event on receiving such change. 2019-02-19 13:22:27 +00:00
paweldomas
54c36198d0 fix(mobile/call-integration): cleanup if leave takes too long
The conference disconnection process is asynchronous which means there's
no guarantee that there will be CONFERENCE_LEFT event for the old
conference, before the next conference is joined. Because of that we can
end up with two simultaneous calls on the native side which is not
always supported. End the call on CONFERENCE_WILL_LEAVE to fix this
corner case.
2019-02-16 17:10:04 -08:00
virtuacoplenny
16b440bbd0 chore(deps): upgrade webpack-dev-server 3.1.10 to 3.1.14 (#3900) 2019-02-15 09:03:05 -08:00
Bettenbuk Zoltan
d56d01cebb [Android] Change the type of the color scheme 2019-02-15 13:33:38 +01:00
Leonard Kim
d872728966 fix(recording): support passing styles in firefox
Using an array of styles in Firefox causes an error
that triggers jitsi-meet to redirect to a static page.
2019-02-15 10:11:26 +01:00
Saúl Ibarra Corretgé
877cea59e7 ios: don't configure CXProvider if CallKit is disabled 2019-02-14 13:16:31 -08:00
Saúl Ibarra Corretgé
a4b3f8ade6 android: don't build javadocs when publishing react-native plugins
They generate a bunch of harmless yet confusing error messages and they are not
really useful.
2019-02-14 13:16:04 -08:00
damencho
2ac5d136dc Detects nginx-extras package. Fixes #3891. 2019-02-14 14:05:27 +00:00
Saúl Ibarra Corretgé
7e320a5d38 ios: refactor AudioMode to use RTCAudioSession
RTCAudioSession is a thin wrapper around AVAudioSession provided by the WebRTC
framework. It makes some use-cases easier, and leads us closer to manual audio
unit management, which we will likely need in the near future.
2019-02-14 10:20:45 +01:00
Saúl Ibarra Corretgé
7289e59ca9 audio-mode: don't change the mode unless there is no active conference
If a new conference is joined and as a result the current one is terminated,
don't ever attempt to set the audio mode.
2019-02-14 10:20:45 +01:00
Saúl Ibarra Corretgé
e1b989e99b ios: make sure our CXProvider is invalidated when CallKit is disabled 2019-02-14 10:20:45 +01:00
Saúl Ibarra Corretgé
070a34e30d ios: enable proximity sensor on the main thread
Fixes this issue:

Main Thread Checker: UI API called on a background thread: -[UIApplication setExpectsFaceContact:inLandscape:]
PID: 25442, TID: 10886619, Thread name: (none), Queue name: com.facebook.react.ProximityQueue, QoS: 0
Backtrace:
4   JitsiMeet                           0x000000010a0eaadc -[Proximity setEnabled:] + 64
5   CoreFoundation                      0x00000001fea34630 <redacted> + 144
6   CoreFoundation                      0x00000001fe912450 <redacted> + 292
7   CoreFoundation                      0x00000001fe913034 <redacted> + 60
8   JitsiMeet                           0x000000010a4e08e8 -[RCTModuleMethod invokeWithBridge:module:arguments:] + 492
9   JitsiMeet                           0x000000010a4e7a10 _ZN8facebook5reactL11invokeInnerEP9RCTBridgeP13RCTModuleDatajRKN5folly7dynamicE + 248
10  JitsiMeet                           0x000000010a4e776c ___ZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEi_block_invoke + 88
11  libdispatch.dylib                   0x000000010b943824 _dispatch_call_block_and_release + 24
12  libdispatch.dylib                   0x000000010b944dc8 _dispatch_client_callout + 16
13  libdispatch.dylib                   0x000000010b94ce6c _dispatch_lane_serial_drain + 720
14  libdispatch.dylib                   0x000000010b94db60 _dispatch_lane_invoke + 460
15  libdispatch.dylib                   0x000000010b957bfc _dispatch_workloop_worker_thread + 1220
16  libsystem_pthread.dylib             0x00000001fe6490dc _pthread_wqthread + 312
17  libsystem_pthread.dylib             0x00000001fe64bcec start_wqthread + 4
2019-02-14 10:20:45 +01:00
Aaron van Meerten
e144c2fb3e Merge pull request #3886 from jitsi/invitation-post-application-json
invite post to use application/JSON
2019-02-13 16:42:47 -06:00
Aaron van Meerten
1a5e2763c1 use fetch syntax from virtuacoplenny 2019-02-13 16:23:26 -06:00
Saúl Ibarra Corretgé
a4121fef36 deps: update package-lock.json for npm 6.7.0 2019-02-13 21:59:38 +01:00
Aaron van Meerten
76638f524d invite post to use application/JSON
changed to .ajax from .post to allow content type to be set
2019-02-12 16:28:33 -06:00
Saúl Ibarra Corretgé
8ea693616d color-scheme: fix React warning
A reducer must always return a state or null to ignore it. When the color scheme
is undefined we should return the previous state.
2019-02-12 20:22:28 +01:00
Дамян Минков
2442ef80b0 Adds Afrikaans to languages. (#3884) 2019-02-12 13:18:56 +00:00
Saúl Ibarra Corretgé
87f171caa4 feat(ScreenSharing): use sane defaults
Both Chrome and Firefox can work without extensions now, so it no longer makes
sense to default to disabling it in Chrome. Moreover, rely on the fact that
undefined is falsey so no actual config needs to be provided.
2019-02-12 10:00:23 +00:00
Bettenbuk Zoltan
e094b6516a [RN] Add color scheme support - Components 2019-02-08 11:43:21 +01:00
Bettenbuk Zoltan
2941f5dde4 [RN] Add color scheme support - JS 2019-02-08 11:43:21 +01:00
Bettenbuk Zoltan
eec7a1b628 [RN] Add color scheme support - native 2019-02-08 11:43:21 +01:00
Saúl Ibarra Corretgé
5f7a515610 rn: drop {AddPeople,Invite}Controller
We are going to implement the invite dialog *inside* the SDK, so there is no
need to have all this machinery anymore.
2019-02-08 09:02:15 +01:00
virtuacoplenny
b7133f5717 fix(large-video): do not show avatar if no url (#3871)
* fix(large-video): do not show avatar if no url

By default the large video dominant speaker avatar
has an empty src, which will result in a broken
image displaying. There is also disconnect with
non-react code trying to set an undefined src.
To prevent such until local avatar generation
work is done in the future, just don't show the
avatar.

* fix(conference): set the room instance earlier

Set the room instance on APP.conference before triggering
a redux update of the conference being set,, because
middleware can then fire and call methods on APP.conference
that depend on the room being set.

* get local participant directly from store instead of from global
2019-02-06 19:19:02 -08:00
virtuacoplenny
f77e1dc591 fix(speaker-levels): convert calculation from string to float (#3870) 2019-02-06 10:49:20 -08:00
virtuacoplenny
4d817fc6c2 fix(home): fix plus button alignment for calendar events (#3869) 2019-02-06 09:33:44 -08:00
Paweł Domas
b8a7037959 Merge pull request #3866 from jitsi/ice_failed_notification
chore(deps): update LJM to get ICE failed notifications
2019-02-06 09:00:55 -06:00
Saúl Ibarra Corretgé
6f95c50d6e Revert "misc: make URL protocol matching regexes non-greedy"
This reverts commit 7c911eca96.

I'm dumb. We need global mode because otherwise lastIndex is not updated in the
regex object, which we rely upon, so this is intentional.
2019-02-06 15:49:44 +01:00
Bettenbuk Zoltan
9f3ef43daa [RN] Add conference navigation bar 2019-02-06 14:27:25 +01:00
Bettenbuk Zoltan
46713cab3b Move Labels to Conference 2019-02-06 14:27:25 +01:00
Bettenbuk Zoltan
8065cc0348 [RN] Remove unused code 2019-02-06 14:27:25 +01:00
Bettenbuk Zoltan
045a2d6aca Extract isToolboxVisible function 2019-02-06 14:27:25 +01:00
Bettenbuk Zoltan
d7d9bc4eeb Reorganize conference feature files 2019-02-06 14:27:25 +01:00
Saúl Ibarra Corretgé
33db155eb9 ios: don't override AVAudioSession category and mode in default state
When we are in the default state (ie, not in a meeting) we shouldn't override
the AVAudioSession category and mode. It's a singleton and we might be bothering
other components of the host app which use it.
2019-02-06 10:17:39 +01:00
paweldomas
1cfd6164f5 chore(deps): update LJM to get ICE failed notifications
Updates LJM to 2e1436e20d4d8fb6020497a87b2714dff38a6c86 which includes
the ICE failed notification logic.
2019-02-05 21:45:02 -06:00
bgrozev
d9cf33b4c4 fix: Shows the "turn" indication for non-p2p connections. (#3865) 2019-02-05 23:13:59 +00:00
virtuacoplenny
2b56822a41 fix(ie11): redirect to recommended browsers page (#3853) 2019-02-05 08:26:27 -08:00
damencho
c34fee4305 Commit from translate.jitsi.org by user damencho.: 500 of 583 strings translated (0 fuzzy). 2019-02-05 13:36:52 +00:00
jitsi-pootle
ddc8a670f9 New files added from translate.jitsi.org based on templates 2019-02-05 10:09:34 +00:00
Saúl Ibarra Corretgé
7c911eca96 misc: make URL protocol matching regexes non-greedy 2019-02-02 21:21:21 +01:00
Saúl Ibarra Corretgé
f3c83f6e6d rn: finally fix Android deep-linking
The URL cannot end in a /.
2019-02-02 21:21:21 +01:00
Aaron van Meerten
b9a14acd3c adds conference to lookup of dial in numbers (#3859) 2019-02-01 19:10:34 -08:00
Aaron van Meerten
c998dbb47e Merge pull request #3858 from jmacelroy/master
Normalizing subdomain when checking JWTs; similar to room.
2019-02-01 13:53:39 -06:00
jmacelroy
573cc64fcd Normalizing subdomain when checking JWTs; similar to room. 2019-02-01 13:19:33 -06:00
Saúl Ibarra Corretgé
53c232fd76 misc: fix off-by-one error
e729f0948c contained an off-by-one error:

URI_PROTOCOL_PATTERN includes the colon, so after applyting the regex we are
left with something like '//example.com/room' thus we only need to strip the
first 2 characters.

🤦
2019-02-01 15:22:17 +01:00
paweldomas
3b6e34e96b fix(JitsiMeetLogStorage): do not log whole message
The logMessage can be very long. Probably only it's length could be
important to why sendApplicationLog has failed. Stringify the error
though.
2019-02-01 10:34:03 +01:00
paweldomas
8fe5814831 ref(JitsiMeetLogStorage): move to base/logging 2019-02-01 10:34:03 +01:00
paweldomas
2305effa5c feat(RN): enable log collector on mobile
Stores the Logger.LogCollector instance in base/logging state instead of
global APP variable and enables it on mobile.
2019-02-01 10:34:03 +01:00
Saúl Ibarra Corretgé
e729f0948c android: fix deep-linking from web
Looks like custom-scheme links no longer work in all browsers. They do on
Firefox, but the don't in Chrome and other default browsers.

So, switch to intent links on Android:
https://developer.chrome.com/multidevice/android/intents

Example:
```
<a href="intent://meet.jit.si/test123#Intent;scheme=org.jitsi.meet;package=org.jitsi.meet;end">Open Jitsi Meet</a>
```
2019-02-01 09:30:09 +01:00
virtuacoplenny
6f57d58dd9 fix(participant): update local name only on explicit update (#3849)
Dominant speaker events can trigger local participant updates
without a display name. Do not update the name unless there
is an explicit update in the action.
2019-01-31 15:46:34 -08:00
paweldomas
d0858b95b8 update lib-jitsi-meet 2019-01-31 13:50:51 -06:00
Saúl Ibarra Corretgé
5afb057387 rn: polyfill callstats
Instead of bundling it in lib-jitsi-meet, which unnecessarily increases
lib-jitsi-meet's bundle size, polyfill it here so it's available in the global
scope, just like the web does.
2019-01-31 13:50:51 -06:00
Saúl Ibarra Corretgé
5d86e3b674 deps: update react-native-callstats to 3.57.1 2019-01-31 13:50:51 -06:00
Paweł Domas
f8294fb312 android: add ConnectionService
* feat(Android): implement ConnectionService

Adds basic integration with Android's ConnectionService by implementing
the outgoing call scenario.

* ref(callkit): rename _SET_CALLKIT_SUBSCRIPTIONS

* ref(callkit): move feature to call-integration directory

* feat(ConnectionService): synchronize video state

* ref(AudioMode): use ConnectionService on API >= 26

Not ready yet - few details left mentioned in the FIXMEs

* feat(ConnectionService): add debug logs

Adds logs to trace the calls.

* fix(ConnectionService): leaking ConnectionImpl instances

Turns out there is no callback fired back from the JavaScript side after
the disconnect or abort event is sent from the native. The connection
must be marked as disconnected and removed immediately.

* feat(ConnectionService): handle onCreateOutgoingConnectionFailed

* ref(ConnectionService): merge classes and move to the sdk package

* feat(CallIntegration): show Alert if outgoing call fails

* fix(ConnectionService): alternatively get call UUID from the account

Some Android flavours (or versions ?) do copy over extras to
the onCreateOutgoingConnectionFailed callback. But the call UUID is also
set as the PhoneAccount's label, so eventually it should be available
there.

* ref(ConnectionService): use call UUID as PhoneAccount ID.

The extra is not reliable on some custom Android flavours. It also makes
sense to use unique id for the account instead of the URL given that
it's created on the per call basis.

* fix(ConnectionService): abort the call when hold is requested

Turns out Android P can sometimes request HOLD even though there's no
HOLD capability added to the connection (what!?), so just abort the call
in that case.

* fix(ConnectionService): unregister account on call failure

Unregister the PhoneAccount onCreateOutgoingConnectionFailed. That's
before the ConnectionImpl instance is created which is normally
responsible for doing that.

* fix(AudioModeModule): make package private and run on the audio thread

* address other review comments
2019-01-31 17:20:53 +01:00
Aaron van Meerten
3ad99e24cf Merge pull request #3840 from jitsi/prosody-token-wildcard-subdomain
supports a '*' in the sub claim to allow access to any room
2019-01-29 13:48:33 -06:00
Saúl Ibarra Corretgé
14990a427a rn: set version to 19.0.0
This marks our switch to CalVer: http://calver.org/

Major: year
Minor: release number
Patch: build (in case we need to retry)
2019-01-29 17:25:00 +01:00
virtuacoplenny
a1383bf730 fix(local-recording): allow config override to enable (#3615)
* fix(local-recording): allow config override to enable

Config overrides are not set until some time after
APP_WILL_MOUNT has completed and not in the same execution
context as when APP_WILL_MOUNT is called. So instead
choose recording controller initialization at a later time.
The time chosen is after conference join because the
controller needs the conference instance to work.

* remove redundant conditional check
2019-01-29 08:22:50 -08:00
Saúl Ibarra Corretgé
9bfe54475b android: read Dropbox API from main package resources
This makes Dropbox work on apps using the SDK without needing to build it
themselves.
2019-01-29 15:39:20 +01:00
Saúl Ibarra Corretgé
d5a43426ed android: don't read Dropbox key from iOS files 2019-01-29 15:39:20 +01:00
Saúl Ibarra Corretgé
612028ce3c rn: fix showing Dropbox controls when recording
- remove unneeded dialog (it's taken care of by StartRecordingDialogContent)
- pass correct props so integrations (Dropbox) show up
2019-01-29 15:39:20 +01:00
Saúl Ibarra Corretgé
3cec4989fd ios: enable recording in dev mode
While Apple doesn't want to allow us to enable Dropbox, it's good to have it
available for testing.
2019-01-29 15:39:20 +01:00
Saúl Ibarra Corretgé
77f220753f ios: dynamically load Dropbox API key
Load it at build time from a "dropbox.key" file. The file should contain the API
key in a single line.
2019-01-29 15:39:20 +01:00
Aaron van Meerten
13165990fc supports a '*' in the sub claim to allow access to any room 2019-01-28 16:19:43 -06:00
Bettenbuk Zoltan
63ff0c27a9 [RN] Add display name to on-stage participant 2019-01-28 18:34:12 +01:00
Bettenbuk Zoltan
f2b2cfda44 Extract shouldRenderParticipantVideo from ParticipantView 2019-01-28 18:34:12 +01:00
Leonard Kim
1b59b21fa8 chore(deps): bump lib to get wireless screensharing service 2019-01-27 17:55:01 +01:00
virtuacoplenny
6241172af8 feat(screenshare): support remote wireless screensharing (#3809)
* feat(screenshare): support remote wireless screensharing

- Pass events to the ProxyConnectionService so it can
  handle establishing a peer connection so a remote
  participant, not in the conference, can send a
  video stream to the local participant to use as a
  local desktop stream.
- Modify the existing start screensharing flow to accept
  a desktop stream instead of always trying to create one.

* adjust ProxyConnectionService for lib review changes
2019-01-26 12:53:11 -08:00
Saúl Ibarra Corretgé
8e58ce7500 ios: re-enable live streaming on iOS 10
There was a missing delegate method call into RNGoogleSignIn, which fixed this.
2019-01-25 11:06:35 +01:00
Saúl Ibarra Corretgé
37d3625210 ios: fix Goggle Sign-In deep-lining 2019-01-25 11:06:35 +01:00
Saúl Ibarra Corretgé
111397d944 ios: style 2019-01-25 11:06:35 +01:00
Saúl Ibarra Corretgé
211b3b55b1 ios: simplify code 2019-01-25 11:06:35 +01:00
Saúl Ibarra Corretgé
8c0317cac0 ios: fix compilation warnings 2019-01-25 11:06:35 +01:00
Saúl Ibarra Corretgé
15c8f2b125 android: remove unused import 2019-01-25 11:06:35 +01:00
Saúl Ibarra Corretgé
349b1ff70e android: fix warning 2019-01-25 11:06:35 +01:00
Leonard Kim
244f206a87 chore(deps): bump lib for old conference listener cleanup 2019-01-25 09:19:10 +01:00
Bettenbuk Zoltan
82963b0aaf Add VSCode files to gitignore 2019-01-23 20:22:37 +01:00
paweldomas
92a412f814 chore(ios): update Podfile.lock 2019-01-23 17:04:41 +01:00
Guus der Kinderen
4b99caa1a9 Android SDK build instructions: add 'clean'
I'm ashamed to admit that I spent several _days_ chasing a bug that was already fixed. :( This obvious instruction would have been a time-saver.
2019-01-23 16:46:51 +01:00
Saúl Ibarra Corretgé
6190173ea7 misc: fixup MD format 2019-01-21 15:36:12 +01:00
Saúl Ibarra Corretgé
54df0f5d0f misc: add some more issue templates 2019-01-21 11:58:08 +01:00
damencho
4d440f5f64 Fixes showing video after waiting for owner. Fixes #3671. 2019-01-20 14:17:50 -08:00
virtuacoplenny
10624e87f5 ref(conference): change when the room reference is removed (#3808)
Delay removing the room reference. This is in case a
consumer of the API is attempting to submit feedback
after hangup but before redirecting to another page.
If the room reference is removed, feedback submission
will fail during this period.
2019-01-17 16:04:35 -08:00
Leonard Kim
7f29b47f3a chore(deps): update lib for camera-as-screenshare feature 2019-01-17 09:51:15 +01:00
Saúl Ibarra Corretgé
7c69308270 android: remove unused ProGuard rules file 2019-01-16 14:55:58 -06:00
Saúl Ibarra Corretgé
50b4212463 android: add missing ProGuard rules 2019-01-16 14:55:58 -06:00
Saúl Ibarra Corretgé
bb8fc8770a android: fix packager in debug mode in API 28
These values must match these ones in React Native:
5939d078a0/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java (L20-L22)
2019-01-16 14:55:12 -06:00
Bettenbuk Zoltan
79209535ea Centralise display name normalisation 2019-01-16 11:03:29 +01:00
Bettenbuk Zoltan
4bddae0bdb Remove default value from openDisplayNamePrompt action 2019-01-16 11:03:29 +01:00
Saúl Ibarra Corretgé
c203a452f7 ios: add initial Fastlane integration
Used for building and deploying builds to TestFlight and the App Store.
2019-01-16 11:01:42 +01:00
Saúl Ibarra Corretgé
515d2f11ce ios: set Google reverse client ID at build time
Read it from the GoogleService-Info.plist file and apply it into Info.plist.
2019-01-16 11:01:42 +01:00
Saúl Ibarra Corretgé
f7134722d0 ios: let the system reorder the file 2019-01-16 11:01:42 +01:00
Saúl Ibarra Corretgé
d8fa52fcaf ios: use a proper URL scheme placeholder
No caps are allowed, so this would trigger a rejection when uploading to
TestFlight.
2019-01-16 11:01:42 +01:00
Saúl Ibarra Corretgé
f7162c1500 rn: add some cleanup tasks when a conference ends / changes
- unpin participant (if the local one was pinned it would remain)
- close any dialog (except if authentication is pending)
2019-01-16 11:00:37 +01:00
virtuacoplenny
998db80db1 Merge pull request #3782 from virtuacoplenny/lenny/camera-as-ss
feat(screenshare): use camera as a screenshare source
2019-01-15 12:05:09 -08:00
Hristo Terezov
4575e7e119 fix(calendar): Remove logs with invalid calendar items. 2019-01-15 17:00:23 +01:00
Bettenbuk Zoltan
230b2b02fa Chat render improbement 2019-01-15 13:38:26 +01:00
Bettenbuk Zoltan
8a241ba2b7 [RN] Add chat functionality
Co-authored-by: DimaG <dgeorgiev06@gmail.com>
2019-01-15 11:33:12 +01:00
Bettenbuk Zoltan
82f714b608 Move display name handling into redux 2019-01-15 10:15:02 +01:00
Leonard Kim
8c9ba325ca fix(pinning): send a participant id on unpin
Analytics is erroring when unpinning because the logged
event sends null for the objectId. The objectId should
be the id of the person getting unpinned.
2019-01-15 09:58:45 +01:00
virtuacoplenny
693d4357a0 Merge pull request #3788 from virtuacoplenny/lenny/alpha-main
ref: alphabetize translation strings
2019-01-14 08:22:00 -08:00
Bettenbuk Zoltan
eef31d05cf [RN] Add an abstraction layer to Modal 2019-01-12 15:51:50 +01:00
Bettenbuk Zoltan
d7475a44e4 [RN] Extract header components for reuse 2019-01-12 15:51:50 +01:00
Leonard Kim
d09bfa7c0a ref: alphabetize translation strings 2019-01-11 15:33:01 -08:00
Leonard Kim
69dfa30142 feat(screenshare): use camera as a screenshare source
This feature is intended for spot. Spot can have an
HDMI -> usb adapter hooked up to it. In that case,
attempting to screenshare should use that adapter
as a screensharing source. Jitsi-Meet should pass
a configured screenshare source into lib-jitsi-meet
so it can be used as a source.
2019-01-11 09:52:53 -08:00
damencho
c13424f7c0 Fixes some lint warnings. 2019-01-11 15:11:17 +01:00
srmcgann
e7d0bf7b66 feat(DeepLinkingMobilePage): fix nested iframe button 2019-01-11 09:42:52 +01:00
damencho
653471e1c0 Adds specific class name to kick button.
The class name is similar to the one used for the mute button and is used by the tests to locate and click the button.
2019-01-10 12:02:55 -06:00
Bettenbuk Zoltan
e960002c45 [RN] Fix InviteButton translation 2019-01-10 16:31:03 +01:00
Bettenbuk Zoltan
c503187dc1 [RN] Fix input dialog value bug 2019-01-10 16:10:07 +01:00
virtuacoplenny
71563fec5b Merge pull request #3773 from zbettenbuk/fix-file-location
Move DeviceSelectionPopup to its right place
2019-01-09 22:17:49 -08:00
virtuacoplenny
5bf692a386 Merge pull request #3775 from jitsi/ljm_2080e81
Update LJM
2019-01-09 22:17:31 -08:00
paweldomas
f25556e63a chore: update lib-jitsi-meet to 2080e81 2019-01-09 18:48:59 -06:00
Saúl Ibarra Corretgé
a5696bb3e4 ref(eslint): remove React deprecated method rule suppression 2019-01-09 14:28:59 +01:00
Leonard Kim
29809ab024 ref(app): set url prop to state in componentDidUpdate
This is done to kill off the last deprecated lifecycle
usage. There is special logic within index.native to get a
default meeting url by asynchronously fetching it, if
a url is not passed initially. The url is then put onto
state and overridable on subsequent prop updates.
2019-01-09 14:28:59 +01:00
Bettenbuk Zoltan
5c0ae10ccb Remote video menu post-PR improvements 2019-01-09 12:13:30 +01:00
Bettenbuk Zoltan
82f6931ee8 [RN] Fix a react warning on remote video menu 2019-01-09 12:13:30 +01:00
Bettenbuk Zoltan
2ea5f3c1aa [RN] Add avatar to remote video menu 2019-01-09 12:13:30 +01:00
Saúl Ibarra Corretgé
889644f7bd [iOS] Add support for Siri shortcuts
This is mostly implemented in the app, with the needed support in the SDK. Since
the app needs to donate intents and deal with creating NSUserActivity objects it
doesn't feel right to do this in a library. Instead, we donate the intents from
the app, but the SDK is ready to extract conference URLs from any intent which
was registered as a conference activity.

This also opens the door for eventually adding Handoff support.
2019-01-09 12:05:58 +01:00
Saúl Ibarra Corretgé
4898f81596 [iOS] Simplify code
Share the code for extracting the URL for conference from a NSUserActivity.
2019-01-09 12:05:58 +01:00
Bettenbuk Zoltan
20d597e402 Move DeviceSelectionPopup to its right place 2019-01-09 12:02:42 +01:00
virtuacoplenny
fcd12a9cf6 Merge pull request #3770 from virtuacoplenny/lenny/bump-lib-json-override
chore(deps): bump lib to fix json message type overrriding
2019-01-08 13:27:42 -08:00
Leonard Kim
03094030a5 chore(deps): bump lib to fix json message type overriding 2019-01-08 11:32:06 -08:00
Buddhika Jayawardhana
16f47e5e0a doc: mention Java version 8 is required
Ref: #3543
2019-01-08 17:45:05 +01:00
Saúl Ibarra Corretgé
634f304815 android: simplify handling of the back button
Provide a default and builtin default implementation which finishes the
Activity, same as before.

What this PR removes is the ability to provide a custom default handler because
applications can already take this decision when calling `onBackPressed`. In
addition, make `onBackPressed` return `void` because it's virtually impossible
for it to return `false` (that would mean that there is no
`ReactInstanceManager`, which means there is no app to begin with).

In addition, remove the use of `BackAndroid` since `BackHandler` contains an iOS
shim now.
2019-01-08 17:43:36 +01:00
Saúl Ibarra Corretgé
148d4ebb90 rn: add Firebase integration
This is done at the app level, not the SDK.

Currently 2 Firebase services are used:

  - Crashlytics
  - Dynamic Links

They are enabled in tandem, if the appropriate Google services file
(GoogleService-Info.plist on iOS or google-services.json on Android) is found.

Each service needs to be individually enabled in the Firebase console.
2019-01-08 17:42:59 +01:00
Saúl Ibarra Corretgé
a1ebba0ef7 android: fix compilation warning
The annotation processor is required for our Glide module to be included.
2019-01-08 17:42:59 +01:00
Saúl Ibarra Corretgé
7e231c2826 ios: fix compilation warning 2019-01-08 17:42:59 +01:00
Saúl Ibarra Corretgé
5cbddb4874 ios: update SDK installation instructions
Mention the availability of CocoaPods.
2019-01-08 09:41:27 +01:00
Hristo Terezov
5a5dd6f5c5 chore(lib-jitsi-meet): Update. 2019-01-07 19:48:48 +00:00
Hristo Terezov
c2b2b4eba4 fix(initAnalytics): Add catch. 2019-01-07 19:48:48 +00:00
Hristo Terezov
155c7ba633 chore(lib-jitsi-meet): Update. 2019-01-07 14:32:31 +00:00
Hristo Terezov
5ad98dd058 ref(config): Create 'analytics' section. 2019-01-07 14:32:31 +00:00
Hristo Terezov
e5a8d95f1f feat(Amplitude): Integration. 2019-01-07 14:32:31 +00:00
virtuacoplenny
2d57d22a3f Merge pull request #3762 from saghul/no-prop-types
misc: drop dependency on prop-types and polyfill
2019-01-04 08:37:18 -08:00
virtuacoplenny
132dd98ecf Merge pull request #3763 from saghul/update-loaders
deps: update webpack loaders
2019-01-04 08:36:34 -08:00
virtuacoplenny
9b47dd1403 Merge pull request #3753 from virtuacoplenny/lenny/hangup-clean-ui
ref(hangup): clean up some UI state on hangup
2019-01-04 08:29:40 -08:00
virtuacoplenny
5b45542009 Merge pull request #3764 from virtuacoplenny/lenny/no-cwrp-abstract-app
ref(app): move url change handling to componentDidUpdate
2019-01-04 07:58:21 -08:00
Saúl Ibarra Corretgé
0b6496bf4d misc: drop dependency on prop-types and polyfill 2019-01-04 10:53:07 +01:00
Saúl Ibarra Corretgé
8ac701ab74 deps: drop @atlaskit/layer-manager dependency
We no longer need it since Rect 16 takes care of passing the context around.
It's also deprecated: https://atlaskit.atlassian.com/packages/core/layer-manager
2019-01-04 10:52:31 +01:00
Saúl Ibarra Corretgé
80bfeb6613 deps: update webpack loaders
- bump expose-loader to 0.7.5
- remove unused file-loader

NOTE: The first incarnation of this commmit also removed string-replace-loader,
but alas lib-jitsi-meet lists it as a devDependency so it's not installed and we
are currently running webpack on install. This is arguably wrong, but that's a
discussion for another day.
2019-01-04 10:27:40 +01:00
Leonard Kim
22a1917107 ref(app): move url change handling to componentDidUpdate
Instead of handling the side effect of navigating to another
url from within componentWillReceiveProps, try to match the
same logic instead in componentDidUpdate.
2019-01-03 19:34:46 -08:00
Sebastian Safari
ce01b31514 doc: add notes to enable 32bit only mode 2019-01-03 13:43:11 +01:00
Saúl Ibarra Corretgé
274b7148b0 ios: update development team
Also update the bundle ID since we don't release with that anyway.
2019-01-03 13:11:41 +01:00
Saúl Ibarra Corretgé
937c74f49e rn: disable touch feedback on Thumbnail
Touch feedback manifests in some ugly black border bleeding out of the thumbnail
itself. Since we already provide feedback (be that by adding the blue border in
case of pinning, or showing the menu in case of long press) the perception is
the same, without the graphical glitch.
2019-01-03 13:10:51 +01:00
Leonard Kim
be2bd9e2e6 chore(deps): bump @atlaskit/flag to 9.1.8 from 6.1.0
- Change the existing overrides to move the flags
  so the first flag does not cover the toolbar.
- Add a new override to disable the slide in
  animation, as it will play for each flag once
  it becomes the first flag--instead of playing
  only once when the flag queue has items.
2019-01-03 11:20:46 +00:00
Leonard Kim
50d3f46934 fix(thumbnail): re-override atlaskit theme for top toolbar
A CSS override prevents atlaskit theme from setting a
dark background on the top toolbar. With the upgrade
of the theme package the CSS class names changed.
2019-01-03 11:42:31 +02:00
Leonard Kim
14cc4ea54a ref(hangup): clean up some UI state on hangup
- Reset some state on the singletons conference
  and VideoLayout.
- Add a way for LocalVideo to clean itself up
  by sharing logic with the other SmallVideos.
- Add clearing of chat messages so they don't
  linger.
- Remove some UI event listeners.
2019-01-02 09:54:05 -08:00
Leonard Kim
9215b1e8b2 ref(app): move initialization into componentDidMount
componentWillMount is a deprecated lifecycle method;
componentDidMount should be used to kick off things
like ajax. In the case of the _App hierarchy, a promise
chain is used to perform initialization, and it is
first started in the constructor by initializing
storage. However, by the time storage is initialized,
resolving the first promise, _App has already mounted.
So, move it all to the componentDidMount lifecycle.
2019-01-02 10:02:04 +01:00
Leonard Kim
d996d51653 chore(deps): bump to @atlaskit/icon 15.0.5, @atlaskit/theme 7.0.2 2019-01-02 09:46:03 +01:00
Leonard Kim
ebcde745ef feat(tile-view): double click to pin 2019-01-02 09:43:20 +01:00
Saúl Ibarra Corretgé
fc75adc6ff feat(DialInInfo): fix webpack warning 2019-01-02 09:26:05 +01:00
Leonard Kim
3c4907ee0a fix(dial-in): update jsdoc 2019-01-02 09:22:58 +01:00
virtuacoplenny
914a64df7a Merge pull request #3747 from virtuacoplenny/lenny/remove-tab-hacks
ref(welcome-page): remove unused atlaskit overrides
2018-12-30 10:39:00 -08:00
Leonard Kim
eb34b0b11d ref(welcome-page): remove unused atlaskit overrides
WelcomePage used to use @atlaskit/tabs to switch between
recent meetings and calendar meetings. @atlaskit/tabs is
no longer used there so remove the css hacks which made
it look more presentable.
2018-12-29 16:42:55 -08:00
michael-dev
f6d3ca23a5 Fix LoginDialog hidden by gUM-Overlay (#766)
* Fix LoginDialog hidden by gUM-Overlay

Running FF46 on Linux and Android. The gUM Dialog (zIndex 1013) hides the LoginDialog (zIndex 999 by default) , but the gUM Dialog will only be resolved when connection is completed (aka hideUserMediaPermissionsGuidanceOverlay is called once the Promise.all in createInitialLocalTracksAndConnect is resolved and that Promise includes "connect").

Fix this by increasing the connection dialog zIndex.

Alternatively this could by fixed by handling gUM and connection one after the other.

* remove whitespace change
2018-12-28 09:37:29 -08:00
virtuacoplenny
fe33ad5026 Merge pull request #3724 from virtuacoplenny/lenny/bump-modal-dialog
chore(dep): bump @atlaskit/modal-dialog 6.0.12 to 7.1.2
2018-12-28 08:13:42 -08:00
damencho
380d9c75d1 Simplifies logic and renames a method. 2018-12-28 13:54:29 +00:00
damencho
7a09befd87 Updates time to be in ms and sends update of stats when user joins. 2018-12-28 13:54:29 +00:00
damencho
3b4037553a Adds server-side speaker stats handling.
Adds the component which receives the messages from client and a module which enabled on a virtual host will start advertising the component. When clients discover the component they will send message to the component with the name of the room where the dominant speaker event happen.
2018-12-28 13:54:29 +00:00
Saúl Ibarra Corretgé
f1ca2cac96 build: fix setting webpack mode 2018-12-21 17:04:08 +01:00
Saúl Ibarra Corretgé
8d1fd9841e misc: shorten text description 2018-12-21 15:12:13 +01:00
Leonard Kim
8b399e8caf chore(dep): bump @atlaskit/modal-dialog 6.0.12 to 7.1.2
The package now requires using a ModalTransition component
to handle animations. The existing DialogContainer component
has been split into native and web implementations to support
this change.
2018-12-20 20:05:49 -08:00
Bettenbuk Zoltan
6b68fba220 [RN] Add remote video menu 2018-12-20 17:23:07 +01:00
Saúl Ibarra Corretgé
d4c0840659 deps: update react-native-webrtc 2018-12-20 16:31:33 +01:00
Saúl Ibarra Corretgé
46a9891763 deps: update react-native-linear-gradient 2018-12-20 14:55:59 +01:00
Saúl Ibarra Corretgé
24bd62c22a ios: disable recording
Apple rejected our app on account of requiring Dropbox not being acceptable. Oh
well! Disable it until we find a way around it. Sigh.
2018-12-20 14:15:12 +01:00
Saúl Ibarra Corretgé
fef47684d9 deps: update react-native-background-timer 2018-12-20 13:59:17 +01:00
Saúl Ibarra Corretgé
58887577b4 ios: fix compilation warning 2018-12-20 13:56:46 +01:00
Saúl Ibarra Corretgé
c3a91c3194 deps: update react-native-sound
The avid reader may notice we have switched to using our own fork. That is
indeed the case. The upstream author hasn't maintained the library in months,
and changes to the Android build system are required at this point, hence the
fork.
2018-12-20 13:53:55 +01:00
Saúl Ibarra Corretgé
0469e5af5e deps: update react-native-calendar-events 2018-12-20 13:52:14 +01:00
Leonard Kim
eeb0697e52 chore(deps): update atlaskit deps with minor or patch bumps 2018-12-20 09:31:24 +01:00
Leonard Kim
e3415df6a3 chore(deps): update @atlaskit/button 9.0.8 to 10.1.1 2018-12-20 09:31:24 +01:00
Leonard Kim
b36fd96b07 chore(deps): update @atlaskit/checkbox from 4.0.6 to 5.0.10 2018-12-20 09:31:24 +01:00
Leonard Kim
07bcb38dd6 fix(live-streaming): show message if no broadcasts are found
It's possible for the YouTube api to return zero broadcasts
or broadcasts without any streams--streams are what are
associated with stream keys. In this case, instead of showing
an empty selector or no selector, show a message with a link
to where the stream key can be obtained.
2018-12-19 22:12:44 +01:00
virtuacoplenny
699b13066e Merge pull request #3696 from virtuacoplenny/lenny/stream-key-validation
Add some live stream key validation
2018-12-19 10:18:09 -08:00
Saúl Ibarra Corretgé
1e83891a70 deps: update react-native-immersive 2018-12-19 17:44:29 +01:00
Leonard Kim
001e8fe0a7 fix(tile-view): prevent local participant being selected on pin exit
On tile view enter/exit, local video is moved in the DOM (an effect
of not being reactified and moving being easier) and play is called
on its video element. The race condition setup is such: in tile
view with other participants and local video is on large (not
visible in the UI but visible in the app state and pip popout).
The race is such: pin a remote video, large video update is queued,
tile view is exited, local video is moved, play is called,,
onVideoPlaying callback executed, middleware fires mute update,
which checks if local is on large (it is), previous large video
update is cleared, and local is placed on large.

The fix is ensuring the redux representation of local video is
passed in, which holds the boolean videoStarted, which prevents
the onVideoPlaying callback from firing on subsequent plays.
2018-12-19 15:35:25 +01:00
Saúl Ibarra Corretgé
f97869ffde deps: update react-native-keep-awake 2018-12-19 15:20:10 +01:00
Saúl Ibarra Corretgé
0fc69416d4 android: update build and target SDK versions
Note that Android 9 Pie (API 28) disallows HTTP requests by default, so an
exception was needed in the app in order for the Metro bundler to work in debug
mode.
2018-12-19 15:18:10 +01:00
Saúl Ibarra Corretgé
f8f544c615 android: remove unneeded gradle task 2018-12-19 15:18:10 +01:00
Saúl Ibarra Corretgé
ac624b104f android: remove duplicated Maven repo
The Google repository is already added with google().
2018-12-19 15:18:10 +01:00
Saúl Ibarra Corretgé
d18f582922 android: fix warning 2018-12-19 15:18:10 +01:00
Saúl Ibarra Corretgé
85b141db89 android: update proguard rules 2018-12-19 15:18:10 +01:00
Saúl Ibarra Corretgé
e4b1e40cc6 deps: update react-native-google-signin 2018-12-19 15:15:21 +01:00
damencho
bc06d969b5 chore(deps): bump lib-jitsi-meet. 2018-12-19 14:08:28 +02:00
Saúl Ibarra Corretgé
1ff8d52b6b deps: update react-native to 0.57.8
Bumping React to 16.6.3 is a requirement for this update.
2018-12-19 10:28:28 +01:00
Leonard Kim
5598b8443a fix(live-streaming): show stream key validation in mobile 2018-12-18 14:29:13 -08:00
Leonard Kim
920c179f56 fix(live-streaming): show warning if stream key seems wrong
Provide a client-side notice if the YouTube live stream key
looks like it might be in the wrong format. Normally the
stream key looks like 4 groups of 4 numbers and letters,
each separated by a dash. The warning does not block submission
in case YouTube changes their stream key format.
2018-12-18 12:59:02 -08:00
Leonard Kim
b57eaed940 fix(live-streaming): trim the entered stream key 2018-12-18 12:59:02 -08:00
Bettenbuk Zoltan
4da8c626f7 Exclude static jitsi links from calendar fetch 2018-12-18 17:36:44 +01:00
Saúl Ibarra Corretgé
65519ec926 rn: drop support for beta.meet.jit.si over HTTP
It doesn't add any value, by default HTTP is not supported unless an exception
is added, plus it doesn't work in browsers at all.
2018-12-18 16:18:08 +01:00
Saúl Ibarra Corretgé
342718f673 rn: drop support for no longer supported deployments 2018-12-18 16:18:08 +01:00
virtuacoplenny
f35653b8fa chore(deps): bump lib-jitsi-meet (#3695)
* chore(deps): bump lib-jitsi-meet

Brings in a fix for getDisplayMedia being moved onto
navigator.mediaDevices and a hack fix for SDP
interop between Chrome and Firefox.

* Update package lock file sed/http/https.
2018-12-18 15:36:15 +02:00
Bettenbuk Zoltan
80e8afa9c1 [RN] Remove react-native-prompt 2018-12-18 13:21:48 +01:00
Saúl Ibarra Corretgé
3212bde6e6 [RN] Recolor AudioRoutePickerDialog 2018-12-18 13:21:48 +01:00
Bettenbuk Zoltan
506b15e3b5 [RN] Recolor BottomSheet 2018-12-18 13:21:48 +01:00
Bettenbuk Zoltan
62e7fd7e8e [RN] Make feature dialogs branded: recording 2018-12-18 13:21:48 +01:00
Bettenbuk Zoltan
4bc09dd8b9 [RN] Make feature dialogs branded: room-lock 2018-12-18 13:21:48 +01:00
Bettenbuk Zoltan
f6e6b09e78 [RN] Make feature dialogs branded: calendar-sync 2018-12-18 13:21:48 +01:00
Bettenbuk Zoltan
9645de33bc [RN] Make feature dialogs branded: authentication 2018-12-18 13:21:48 +01:00
Bettenbuk Zoltan
22a602768c [RN] Add branded dialog component 2018-12-18 13:21:48 +01:00
Leonard Kim
3ebad112a2 ref(conference): remove deprecated lifecycle methods 2018-12-18 12:38:25 +01:00
Saúl Ibarra Corretgé
545ad0e1a6 android: update documentation 2018-12-18 09:05:50 +01:00
Saúl Ibarra Corretgé
053437c86e android: circumvent trouble with apps using Glide
Glide (which is used by react-native-fast-image) can cause trouble if the host
app (the one using the SDK) is using Glide already.

To avoid this, don't use the builtin AppGlideModule (as the docs recommend) and
let apps define it.
2018-12-18 09:05:50 +01:00
Saúl Ibarra Corretgé
0a9333af02 rn: refactor Avatar to deal with FastImage changes
Updating react-native-fast-image brings a couple of interesting changes:

- onLoad is not called for cached images (reported and ignored upstream)
- load progress not working if component not displayed (on Android)

In order to fix this, a combination of 2 approaches was used:

- onLoadEnd / onError are used to detect if the image is loaded
- off-screen rendering is used on Android to get progress events

While implementing the above, yours truly noticed the complexity was increasing
way too much, so some extra refactoring was also performed:

- componentWillReceiveProps is dropped
- an auxiliary component (AvatarContent) is used for the actual content of the
  Avatar, with the former passing the key prop to the latter

Using the key prop ensures AvatarContent will be recreated if the URI changes,
which is not a bad idea anyway, since the new image needs to be downloaded.
2018-12-18 09:05:50 +01:00
Saúl Ibarra Corretgé
0031fd2678 android, ios: update react-native-fast-image dependency 2018-12-18 09:05:50 +01:00
damencho
32798b1a80 Recognises calendar events with conference data. 2018-12-17 09:51:13 +00:00
virtuacoplenny
2ea856acee Merge pull request #3688 from virtuacoplenny/lenny/fix-api-doc
fix(docs): change parentNode option name in api example
2018-12-15 11:45:55 -08:00
Leonard Kim
b8b2fb2d56 fix(docs): change parentNode option name in api example 2018-12-15 08:25:56 -08:00
virtuacoplenny
f89f3f144f Merge pull request #3597 from virtuacoplenny/lenny/handle-calendar-signed-out
fix(calendar): show error message if authorization fails on event fetch
2018-12-10 17:51:08 -08:00
Saúl Ibarra Corretgé
22199cb57a android: update documentation to match the new SDK API 2018-12-06 15:29:59 +01:00
Saúl Ibarra Corretgé
e5c9c69ec9 ios: drop iOS 9 support
WebRTC no longer actively fixes iOS 9 issues.
2018-12-06 10:47:44 +01:00
Saúl Ibarra Corretgé
d48bef6c11 ios: set version to 1.21 2018-12-06 10:47:44 +01:00
Saúl Ibarra Corretgé
0c3d037cb5 android: throw if Activity doesn't implement the required interface 2018-12-04 20:09:54 +01:00
Saúl Ibarra Corretgé
47830dfc3d ios: switch back to the "legacy" build system in Xcode
Xcode 10 introduced a new build system. Alas, it breaks a number of important
flows, such as creating an archive for the framework (ie SDK) target.

In order to "fix" this, switch back to the former (Xcode 9) build system for the
time being.
2018-12-04 12:12:01 +01:00
Saúl Ibarra Corretgé
45291e1054 deps: update to webpack 4 2018-12-04 11:28:52 +01:00
Saúl Ibarra Corretgé
66832ada68 deps: update lodash 2018-12-03 19:54:21 +01:00
Дамян Минков
f11b6cbb1e Replaces smileys and the logic of replacing links/emails. (#3560)
* Replaces smileys and the logic of replacing links/emails.

Now using react-emoji-render and react-linkify.

* Fixes heart emoji.

It is known that current implementation doesn't work with ascii emojis that contain < or >, like >:( >:-( </3 <\3 <3. Making those work may bring some xss issues.

* Adds '_blank' and 'noopener noreferrer' to the replaced links.

* Fixes package-lock links (http vs https).

* Fixes comments.
2018-12-03 18:01:40 +00:00
damencho
34f2ff9b85 Update comments. 2018-12-03 16:46:59 +01:00
damencho
21b0ed691b Auto accept android license on build machines.
Every time the android version that is used changes we need to update the license hash.
2018-12-03 16:46:59 +01:00
Saúl Ibarra Corretgé
8b359f48db android: remove no longer needed code
The dependency was dropped, so it's no longer needed.
2018-12-03 16:41:12 +01:00
Saúl Ibarra Corretgé
b66e2e4104 misc: add stale bot to close stalled issues and PRs
https://probot.github.io/apps/stale/
2018-12-03 12:55:33 +01:00
Saúl Ibarra Corretgé
ee8d2df355 android: update build instructions 2018-12-03 11:49:03 +01:00
Saúl Ibarra Corretgé
bc77a62626 android: fix maven repo relative location
Assume it's at the same level as the Jitsi Meet repo, by default.
2018-12-03 11:49:03 +01:00
Saúl Ibarra Corretgé
b15533d75f android: update app / sdk version
Set them to the next release versions. In additon, the buildNumber variable will
be used to match the requirements of versionCode:
https://developer.android.com/studio/publish/versioning

that is, a monotonically increasing number, independent of the app / sdk
version.
2018-12-03 11:49:03 +01:00
Saúl Ibarra Corretgé
cf9a65f475 android: update dependencies for publishing 2018-12-03 11:49:03 +01:00
Saúl Ibarra Corretgé
d7ba4a8a2a android: add helper scripts to publish RN and JSC to Maven 2018-12-03 11:49:03 +01:00
Saúl Ibarra Corretgé
26ba974757 [RN] Drop react-native-locale-detector dependency
The upstream package has been unmaintained for 2 years now, and making the litle
changes needed as React Native needs them is getting old. The actual
funcionality is a couple of one-liners plus tons of boliterplate, which gets
reduced by quite a bit if we just embed it. So here it goes.
2018-12-03 11:48:44 +01:00
Leonard Kim
7614ceda68 ref(video): remove deprecated lifecycle methods from gesture handler 2018-12-03 11:45:09 +01:00
Saúl Ibarra Corretgé
10163274d3 [RN] Share font selections between web and native 2018-12-03 11:27:12 +01:00
Saúl Ibarra Corretgé
2b91745af1 [RN] Fix dominant speaker and moderator indicators
They are part of the Jitsi font now, there is no need to load them from
FontAwesome.
2018-12-03 11:27:12 +01:00
Saúl Ibarra Corretgé
c9b910b1c1 feat(dev): don't proxy fonts
Use the local ones, this simplifies testing adding icons, for example.
2018-12-03 11:27:12 +01:00
Saúl Ibarra Corretgé
e452867e12 feat(cleanup): remove no longer used FontAwesome 2018-12-03 11:27:12 +01:00
Leonard Kim
f83d609f1a ref(video): calculate tint styles at render 2018-12-03 10:27:08 +01:00
Leonard Kim
822bc31d69 ref(video): use videoTrack from props
It doesn't seem like videoTrack needs to be set onto state
if it can be accessed directly from props. Removing the state
automatically removes the deprecated componentWillReceiveProps.
2018-12-03 10:10:24 +01:00
Roland
cea12c9a8b Fix typo which made this module unusable
showControls instead of showControns
2018-12-03 10:08:25 +01:00
virtuacoplenny
05b7e6facc Merge pull request #3636 from virtuacoplenny/lenny/tile-view-toggles-some-features
Tile view toggles some features and some features toggle tile view
2018-11-30 09:10:23 -08:00
Saúl Ibarra Corretgé
34e6ea2f26 deps: remove no longer used autosize 2018-11-30 16:38:17 +00:00
Saúl Ibarra Corretgé
9c4ca38222 deps: update lib-jitsi-meet
Introduces the sdpSemantics configuration option.
2018-11-30 16:22:07 +00:00
virtuacoplenny
5292d14412 Merge pull request #3637 from virtuacoplenny/lenny/floor-tile-sizes
fix(tile-view): thumbnail videos should cover entire thumbnail
2018-11-30 08:14:17 -08:00
virtuacoplenny
e207ad609a Merge pull request #3642 from virtuacoplenny/lenny/tile-view-popover-z
fix(tile-view): popovers should display over icons in other thumbnails
2018-11-30 08:08:21 -08:00
Leonard Kim
35da17f5a6 ref(local-video): merge styles at render
Remove caching of calculated styles, thereby removing
componentWillReceiveProps, by passing in base styles
and passed in styles when rendering.
2018-11-30 08:42:44 +00:00
Guus der Kinderen
fb6949f7ba [Android] Add jsc-android to SDK project / improve build docs
Due to a switch to a newer version of JSCore, the jsc-android dependency is now used by the
SDK. As this dependency is not (yet) available in the Jitsi Maven repository, an error like
this is reported when an application is ran that uses the SDK:

    com.facebook.react.common.JavascriptException: Can't find variable: Symbol

This commit primarily improves the instructions on how to create a local Maven repository
that contains all required dependencies, including the JSCore dependency that was missing.

This intends to address the issue described in https://github.com/jitsi/jitsi-meet/issues/3399
2018-11-29 22:21:27 +00:00
Leonard Kim
9013c0db39 fix(tile-view): popovers should display over icons in other thumbnails 2018-11-29 10:50:25 -08:00
Guus der Kinderen
99542e29e6 [RN] Upgrade React Native to 0.57.6 2018-11-29 10:35:31 +00:00
Leonard Kim
a1ef845663 fix(tile-view): thumbnail videos should cover entire thumbnail
Video elements may have problems scaling to cover pixel fractions,
so there could be a 1px black border line displaying in the
thumbnail. It's most visible in tile view. Flooring the sizing
calculations hides the border.
2018-11-28 13:36:12 -08:00
Leonard Kim
1396d59ce2 fix(tile-view): disable on etherpad display, disable etherpad on view enter 2018-11-28 11:48:15 -08:00
Leonard Kim
29bc18df01 fix(tile-view): disable tile view on pin, unpin all on view enter 2018-11-28 11:36:23 -08:00
Saúl Ibarra Corretgé
1ba66e4b65 ios: update CocoaPods dependencies 2018-11-28 16:59:37 +01:00
Saúl Ibarra Corretgé
80afe30e9e feat(chore): make sure all links in package-lock are HTTPS 2018-11-28 16:41:51 +01:00
virtuacoplenny
957606b3f8 Merge pull request #3630 from virtuacoplenny/lenny/youtube-1-on-1
fix(filmstrip): show thumbnails in 1-on-1 with a fake participant
2018-11-27 14:36:43 -08:00
Leonard Kim
769a2c7c94 fix(filmstrip): show thumbnails in 1-on-1 with a fake participant
Filmstrip remote thumbnails display under certain conditions, as
defined in filmstrip/functions.web.js. Previously the raw
participant count was used, which included fake participants.
Using the selector getParticipantCount excludes fake participants,
causing YouTube thumbnails to remain hidden in a 1-on-1 call.
2018-11-27 12:31:27 -08:00
virtuacoplenny
f349357d3c Merge pull request #3584 from virtuacoplenny/lenny/update-lifecycles-1
Remove some usages of deprecated lifecycle methods
2018-11-27 09:02:05 -08:00
virtuacoplenny
9c2f816c29 Merge pull request #3619 from mmoanis/dialog-with-tabs
Abstract the DialogWithTabs title so it can be reused with other comp…
2018-11-24 10:31:58 -08:00
mmoanis
b844a9f06b Abstract the DialogWithTabs title so it can be reused with other components 2018-11-24 12:50:09 +01:00
Leonard Kim
d4e18e78fa ref(recording-label): derive when the label state is no longer stale 2018-11-21 08:08:45 -08:00
Leonard Kim
f13cfe70f3 ref(sidebar): derive showOverlay state
- Derive the showOverlay state. When the sidebar should be hidden,
  the internal showOverlay state should remain true until the
  animation hides it. When the sidebar should show, the showOverlay
  state should become true immediately.
- Use PureComponent to prevent additional animation triggers
  instead of explicitly checking changes to the "show" prop.
2018-11-21 08:08:45 -08:00
Leonard Kim
5cb4bec633 ref(circular-label): animate after dom updates
Based on react-native docs, looks like animations should be
started after mount. Updating animation states I'm not certain
on so I moved it to componentDidUpdate and tested with the
live streaming label to ensure the component still animated fine.
2018-11-21 08:08:45 -08:00
Leonard Kim
4409bbabb7 ref(blank-page): destroy local track after mount
To kill componentWillMount, call destroyLocalTrack after mount.
Navigation to the blank page was synthetically forced and no
UI issues were noticed, possibly because destroyLocalTrack may
already be async so destruction may already have been occurring
after mount.
2018-11-21 08:08:45 -08:00
Leonard Kim
d6216f21d5 ref(live-streaming): remove picker state to remove componentWillReceiveProps 2018-11-21 08:08:45 -08:00
Leonard Kim
3a32f7f3f0 ref(audio-picker): fetch audio devices after mount
Per react migration docs, initially fetching external data is
recommended to be done in componentDidMount.
2018-11-21 08:08:45 -08:00
Leonard Kim
d5fb2c2717 ref(sdk): update comments to exclude mention of componentWillReceiveProps 2018-11-21 08:08:45 -08:00
Leonard Kim
c4f1588bb0 ref(dialog): set mounted flag after mount 2018-11-21 08:08:45 -08:00
Leonard Kim
609f3887f2 ref(welcome-page): native creates/destroys camera after mount 2018-11-21 08:08:45 -08:00
Leonard Kim
77f8f85b96 ref(device-selection): update preview tracks on component update 2018-11-21 08:08:45 -08:00
Leonard Kim
14adc0b887 ref(always-on-top): trigger toolbar hide timeout after update 2018-11-21 08:08:45 -08:00
Leonard Kim
c288d0e18c ref(deep-linking): set initial state in constructor 2018-11-21 08:08:45 -08:00
Leonard Kim
eaafc21133 ref(desktop-picker): derive desired types when props change 2018-11-21 08:08:45 -08:00
Leonard Kim
72c1fa38be ref(modal): simplify functional footer passing to remove componentWillUpdate 2018-11-21 08:08:45 -08:00
Leonard Kim
45068f68db ref(welcome-page): use getDerivedStateFromProps, set mounted after actual mount 2018-11-21 08:08:45 -08:00
Leonard Kim
e0cbb838be ref(info): derive when to clear the entered password state 2018-11-21 08:08:45 -08:00
Leonard Kim
c28c70fb2f ref(device-selection): change audio preview listener on component update 2018-11-21 08:08:45 -08:00
Leonard Kim
280178f5d1 ref(info-dialog): derive when to autoshow or autohide 2018-11-21 08:08:45 -08:00
Leonard Kim
e9b2518f8a ref(info): use getDerivedStateFromProps to update state 2018-11-21 08:08:45 -08:00
Leonard Kim
1e3e71c2ff ref(speaker-stats): begin polling for stats after mount 2018-11-21 08:08:45 -08:00
Leonard Kim
007d60eb6c ref(toolbox): getter for the recording/streaming disabled tooltip 2018-11-21 08:08:45 -08:00
Leonard Kim
85f487cca5 ref(large-video): use componentDidUpdate to change background image 2018-11-21 08:08:44 -08:00
Leonard Kim
b24e7ec5f0 ref(labels): use getDerivedStateFromProps to get display state 2018-11-21 08:08:44 -08:00
Leonard Kim
a045353e6e ref(tooltbox): use componentDidUpdate to trigger more changes 2018-11-21 08:08:44 -08:00
Aaron van Meerten
420c466f80 Merge pull request #3612 from jitsi/node_10_build_support
updated node-sass version for node 10
2018-11-20 17:31:12 -06:00
Leonard Kim
7a2c465c4a fix(calendar): show error message if authorization fails on event fetch 2018-11-06 11:56:25 -08:00
1858 changed files with 114626 additions and 56578 deletions

View File

@@ -2,22 +2,30 @@
; We fork some components by platform
.*/*[.]android.js
; Ignore "BUCK" generated dirs
<PROJECT_ROOT>/\.buckd/
; Ignore unexpected extra "@providesModule"
.*/node_modules/.*/node_modules/fbjs/.*
node_modules/react-native/Libraries/react-native/React.js
; Ignore duplicate module providers
; For RN Apps installed via npm, "Libraries" folder is inside
; "node_modules/react-native" but in the source repo it is in the root
.*/Libraries/react-native/React.js
node_modules/react-native/Libraries/react-native/React.js
; Flow doesn't support platforms
.*/Libraries/Utilities/LoadingView.js
; Ignore polyfills
.*/Libraries/polyfills/.*
node_modules/react-native/Libraries/polyfills/.*
; Ignore metro
.*/node_modules/metro/.*
; These should not be required directly
; require from fbjs/lib instead: require('fbjs/lib/warning')
node_modules/warning/.*
; Flow doesn't support platforms
.*/Libraries/Utilities/HMRLoadingView.js
[untyped]
.*/node_modules/@react-native-community/cli/.*/.*
; Ignore packages in node_modules which we (i.e. the jitsi-meet project) have
; seen to cause errors and we have chosen not to fix.
@@ -33,7 +41,6 @@
[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow/
node_modules/react-native/flow-github/
[options]
emoji=true
@@ -41,6 +48,18 @@ emoji=true
esproposal.optional_chaining=enable
esproposal.nullish_coalescing=enable
; We (i.e. the jitsi-meet project) are using the haste module system on Web as
; well, not only on React Native. Unfortunately, Flow does not support .web.js
; by default. Override Flow's defaults to include .web.js as well. Technically,
; we have .native.js as well so the choice of .web.js may lead to errors.
; Practically though, it is a potential future problem that we do not have at
; the time of this writing.
module.file_ext=.web.js
; Flow's defaults:
module.file_ext=.js
module.file_ext=.json
module.file_ext=.ios.js
module.system=haste
module.system.haste.use_name_reducers=true
# get basename
@@ -53,8 +72,11 @@ module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1'
module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1'
module.system.haste.paths.blacklist=.*/__tests__/.*
module.system.haste.paths.blacklist=.*/__mocks__/.*
module.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/Animated/src/polyfills/.*
module.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/Libraries/.*
module.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/RNTester/.*
module.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/IntegrationTests/.*
module.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/react-native/react-native-implementation.js
module.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/Animated/src/polyfills/.*
munge_underscores=true
@@ -65,22 +87,32 @@ suppress_type=$FlowFixMe
suppress_type=$FlowFixMeProps
suppress_type=$FlowFixMeState
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
; We (i.e. the jitsi-meet project) are using the haste module system on Web as
; well, not only on React Native. Unfortunately, Flow does not support .web.js
; by default. Override Flow's defaults to include .web.js as well. Technically,
; we have .native.js as well so the choice of .web.js may lead to errors.
; Practically though, it is a potential future problem that we do not have at
; the time of this writing.
module.file_ext=.web.js
; Flow's defaults:
module.file_ext=.js
module.file_ext=.jsx
module.file_ext=.json
[lints]
sketchy-null-number=warn
sketchy-null-mixed=warn
sketchy-number=warn
untyped-type-import=warn
nonstrict-import=warn
deprecated-type=warn
unsafe-getters-setters=warn
inexact-spread=warn
unnecessary-invariant=warn
signature-verification-failure=warn
deprecated-utility=error
[strict]
deprecated-type
nonstrict-import
sketchy-null
unclear-type
unsafe-getters-setters
untyped-import
untyped-type-import
[version]
^0.78.0
^0.104.0

48
.github/ISSUE_TEMPLATE/1-bug-report.md vendored Normal file
View File

@@ -0,0 +1,48 @@
---
name: Bug report
about: Create a report to help us improve
---
<!--
This issue tracker is only for reporting bugs and tracking issues related to the source code.
Before posting, please make sure to check if the same or similar bugs have already been discussed: https://github.com/jitsi/jitsi-meet/issues
General questions regarding usage, installation, etc. should be posted at https://community.jitsi.org. They will be closed if posted here.
-->
### Description:
<!-- Please describe the bug clearly and concisely. -->
### Steps to reproduce:
1. <!-- Open '...' -->
2. <!-- Click on '...' -->
3. <!-- and so on... -->
### Expected behavior:
<!-- Please describe what should happen. -->
### Actual behavior:
<!-- Please describe what actually happens. -->
<!-- Please attach screenshot if possible. -->
### Server information:
- Jitsi Meet version:
- Operating System:
### Client information:
- Browser / app version:
- Operating System:
### Additional information:
<!-- Please provide additional information about the bug, if any. -->

View File

@@ -0,0 +1,23 @@
---
name: "Feature request"
about: Suggest an idea for this project
---
<!--
Thank you for suggesting an idea to make Jitsi Meet better.
Please fill in as much of the template below as you're able.
Note that the ultimate decision for implementing features lies on the Jitsi team, not all feature requests shall be accepted.
-->
**Is your feature request related to a problem you are facing?**
Please describe the problem you are trying to solve.
**Describe the solution you'd like**
Please describe the desired behavior.
**Describe alternatives you've considered**
Please describe alternative solutions or features you have considered.

View File

@@ -1,27 +0,0 @@
---
name: Bug Report
about: Before posting, please make sure you check https://community.jitsi.org
---
*This Issue tracker is only for reporting bugs and tracking code related issues.*
Before posting, please make sure you check community.jitsi.org to see if the same or similar bugs have already been discussed. General questions, installation help, and feature requests can also be posted to community.jitsi.org.
## Description
---
## Current behavior
---
## Expected Behavior
---
## Possible Solution
---
## Steps to reproduce
---
# Environment details
---

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Need help with Jitsi Meet?
url: https://community.jitsi.org
about: Please ask it in our community.

16
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 90
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- confirmed
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

16
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
name: Simple CI
on: [pull_request]
jobs:
run-ci:
name: Build Frontend
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: '12.x'
- run: npm install
- run: npm run lint
- run: make

22
.gitignore vendored
View File

@@ -35,6 +35,7 @@ xcuserdata
DerivedData
*.hmap
*.ipa
*.dSYM.zip
*.xcuserstate
project.xcworkspace
@@ -60,19 +61,26 @@ buck-out/
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/
*/fastlane/report.xml
*/fastlane/Preview.html
*/fastlane/screenshots
# Bundle artifact
# Build artifacts
*.jsbundle
*.framework
android/app/debug
android/app/release
# precommit-hook
.jshintignore
.jshintrc
# VSCode files
android/.project
android/.settings/org.eclipse.buildship.core.prefs
# Secrets
android/app/dropbox.key
android/app/google-services.json
ios/app/dropbox.key
ios/app/GoogleService-Info.plist

1
.npmrc Normal file
View File

@@ -0,0 +1 @@
package-lock=true

View File

@@ -1,4 +1,6 @@
osx_image: xcode10
osx_image: xcode11.1
language: objective-c
script:
- "./ios/travis-ci/build-ipa.sh"
after_script:
- sleep 10

View File

@@ -13,7 +13,7 @@ Found a bug and know how to fix it? Great! Please read on.
## Contributor License Agreement
While the Jitsi projects are released under the
[Apache License 2.0](https://github.com/jitsi/jitsi-meet/blob/master/LICENSE), the copyright
holder and principal creator is [Atlassian](https://www.atlassian.com/). To
holder and principal creator is [8x8](https://www.8x8.com/). To
ensure that we can continue making these projects available under an Open Source license,
we need you to sign our Apache-based contributor
license agreement as either a [corporation](https://jitsi.org/ccla) or an
@@ -27,3 +27,99 @@ in the agreement, unfortunately, we cannot accept your contribution.
- Maintain a clean list of commits, squash them if necessary.
- Rebase your topic branch on top of the master branch before creating the pull
request.
## Coding style
### Comments
* Comments documenting the source code are required.
* Comments from which documentation is automatically generated are **not**
subject to case-by-case decisions. Such comments are used, for example, on
types and their members. Examples of tools which automatically generate
documentation from such comments include JSDoc, Javadoc, Doxygen.
* Comments which are not automatically processed are strongly encouraged. They
are subject to case-by-case decisions. Such comments are often observed in
function bodies.
* Comments should be formatted as proper English sentences. Such formatting pays
attention to, for example, capitalization and punctuation.
### Duplication
* Don't copy-paste source code. Reuse it.
### Formatting
* Line length is limited to 120 characters.
* Sort by alphabetical order in order to make the addition of new entities as
easy as looking a word up in a dictionary. Otherwise, one risks duplicate
entries (with conflicting values in the cases of key-value pairs). For
example:
* Within an `import` of multiple names from a module, sort the names in
alphabetical order. (Of course, the default name stays first as required by
the `import` syntax.)
````javascript
import {
DOMINANT_SPEAKER_CHANGED,
JITSI_CLIENT_CONNECTED,
JITSI_CLIENT_CREATED,
JITSI_CLIENT_DISCONNECTED,
JITSI_CLIENT_ERROR,
JITSI_CONFERENCE_JOINED,
MODERATOR_CHANGED,
PEER_JOINED,
PEER_LEFT,
RTC_ERROR
} from './actionTypes';
````
* Within a group of imports (e.g. groups of imports delimited by an empty line
may be: third-party modules, then project modules, and eventually the
private files of a module), sort the module names in alphabetical order.
````javascript
import React, { Component } from 'react';
import { connect } from 'react-redux';
````
### Indentation
* Align `switch` and `case`/`default`. Don't indent the `case`/`default` more
than its `switch`.
````javascript
switch (i) {
case 0:
...
break;
default:
...
}
````
### Naming
* An abstraction should have one name within the project and across multiple
projects. For example:
* The instance of lib-jitsi-meet's `JitsiConnection` type should be named
`connection` or `jitsiConnection` in jitsi-meet, not `client`.
* The class `ReducerRegistry` should be defined in ReducerRegistry.js and its
imports in other files should use the same name. Don't define the class
`Registry` in ReducerRegistry.js and then import it as `Reducers` in other
files.
* The names of global constants (including ES6 module-global constants) should
be written in uppercase with underscores to separate words. For example,
`BACKGROUND_COLOR`.
* The underscore character at the beginning of a name signals that the
respective variable, function, property is non-public i.e. private, protected,
or internal. In contrast, the lack of an underscore at the beginning of a name
signals public API.

View File

@@ -3,6 +3,7 @@ CLEANCSS = ./node_modules/.bin/cleancss
DEPLOY_DIR = libs
LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet/
LIBFLAC_DIR = node_modules/libflacjs/dist/min/
RNNOISE_WASM_DIR = node_modules/rnnoise-wasm/dist/
NODE_SASS = ./node_modules/.bin/node-sass
NPM = npm
OUTPUT_DIR = .
@@ -20,7 +21,8 @@ compile:
clean:
rm -fr $(BUILD_DIR)
deploy: deploy-init deploy-appbundle deploy-lib-jitsi-meet deploy-libflac deploy-css deploy-local
.NOTPARALLEL:
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-lib-jitsi-meet deploy-libflac deploy-css deploy-local
deploy-init:
rm -fr $(DEPLOY_DIR)
@@ -43,6 +45,12 @@ deploy-appbundle:
$(BUILD_DIR)/alwaysontop.min.js \
$(BUILD_DIR)/alwaysontop.min.map \
$(OUTPUT_DIR)/analytics-ga.js \
$(BUILD_DIR)/analytics-ga.min.js \
$(BUILD_DIR)/analytics-ga.min.map \
$(BUILD_DIR)/video-blur-effect.min.js \
$(BUILD_DIR)/video-blur-effect.min.map \
$(BUILD_DIR)/rnnoise-processor.min.js \
$(BUILD_DIR)/rnnoise-processor.min.map \
$(DEPLOY_DIR)
deploy-lib-jitsi-meet:
@@ -59,6 +67,11 @@ deploy-libflac:
$(LIBFLAC_DIR)/libflac4-1.3.2.min.js.mem \
$(DEPLOY_DIR)
deploy-rnnoise-binary:
cp \
$(RNNOISE_WASM_DIR)/rnnoise.wasm \
$(DEPLOY_DIR)
deploy-css:
$(NODE_SASS) $(STYLES_MAIN) $(STYLES_BUNDLE) && \
$(CLEANCSS) $(STYLES_BUNDLE) > $(STYLES_DESTINATION) ; \
@@ -67,12 +80,13 @@ deploy-css:
deploy-local:
([ ! -x deploy-local.sh ] || ./deploy-local.sh)
dev: deploy-init deploy-css deploy-lib-jitsi-meet deploy-libflac
.NOTPARALLEL:
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-lib-jitsi-meet deploy-libflac
$(WEBPACK_DEV_SERVER)
source-package:
mkdir -p source_package/jitsi-meet/css && \
cp -r *.js *.html connection_optimization favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
cp -r *.js *.html resources/*.txt connection_optimization favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
cp css/all.css source_package/jitsi-meet/css && \
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
rm -rf source_package

125
README.md
View File

@@ -1,18 +1,20 @@
# Jitsi Meet - Secure, Simple and Scalable Video Conferences
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](#security) and scalable video conferences. You can see Jitsi Meet in action [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](https://jitsi.org/security) and scalable video conferences. Jitsi Meet in action can be seen at [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
The Jitsi Meet client runs in your browser, without the need for installing anything on your computer. You can also try it out yourself at https://meet.jit.si .
The Jitsi Meet client runs in your browser, without installing anything else on your computer. You can try it out at https://meet.jit.si.
Jitsi Meet allows for very efficient collaboration. It allows users to stream their desktop or only some windows. It also supports shared document editing with Etherpad.
Jitsi Meet allows very efficient collaboration. Users can stream their desktop or only some windows. It also supports shared document editing with Etherpad.
## Installation
On the client side, no installation is necessary. You just point your browser to the URL of your deployment. This section is about installing the Jitsi Meet suite on your server and hosting your own conferencing service.
On the client side, no installation is necessary. You just point your browser to the URL of your deployment. This section is about installing a Jitsi Meet suite on your server and hosting your own conferencing service.
Installing Jitsi Meet is quite a simple experience. For Debian-based systems, we recommend following the [quick-install](https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md) document, which uses the package system. You can also see a demonstration of the process in [this tutorial video](https://jitsi.org/tutorial).
Installing Jitsi Meet is a simple experience. For Debian-based system, following the [quick install](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart) document, which uses the package system. You can also see a demonstration of the process in [this tutorial video](https://jitsi.org/tutorial).
For other systems, or if you wish to install all components manually, see the [detailed manual installation instructions](https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md).
For other systems, or if you wish to install all components manually, see the [detailed manual installation instructions](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-manual).
Installation with Docker is also available. Please see the [instruction](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker).
## Download
@@ -27,86 +29,32 @@ You can download Debian/Ubuntu binaries:
You can download source archives (produced by ```make source-package```):
* [source builds](https://download.jitsi.org/jitsi-meet/src/)
You can get our mobile versions from here:
### Mobile apps
* [Android](https://play.google.com/store/apps/details?id=org.jitsi.meet)
[<img src="resources/img/google-play-badge.png" height="50">](https://play.google.com/store/apps/details?id=org.jitsi.meet)
* [Android (F-Droid)](https://f-droid.org/en/packages/org.jitsi.meet/)
[<img src="resources/img/f-droid-badge.png" height="50">](https://f-droid.org/en/packages/org.jitsi.meet/)
* [iOS](https://itunes.apple.com/us/app/jitsi-meet/id1165103905)
## Building the sources
[<img src="resources/img/appstore-badge.png" height="50">](https://itunes.apple.com/us/app/jitsi-meet/id1165103905)
Node.js >= 8 and npm >= 6 are required.
You can also sign up for our open beta testing here:
On Debian/Ubuntu systems, the required packages can be installed with:
```
sudo apt-get install npm nodejs
cd jitsi-meet
npm install
```
* [Android](https://play.google.com/apps/testing/org.jitsi.meet)
* [iOS](https://testflight.apple.com/join/isy6ja7S)
To build the Jitsi Meet application, just type
```
make
```
## Release notes
### Working with the library sources (lib-jitsi-meet)
Release notes for Jitsi Meet are maintained on [this repository](https://github.com/jitsi/jitsi-meet-release-notes).
By default the library is build from its git repository sources. The default dependency path in package.json is :
```json
"lib-jitsi-meet": "jitsi/lib-jitsi-meet",
```
## Development
To work with local copy you must change the path to:
```json
"lib-jitsi-meet": "file:///Users/name/local-lib-jitsi-meet-copy",
```
To make the project you must force it to take the sources as 'npm update' will not do it.
```
npm install lib-jitsi-meet --force && make
```
Or if you are making only changes to the library:
```
npm install lib-jitsi-meet --force && make deploy-lib-jitsi-meet
```
Alternative way is to use [npm link](https://docs.npmjs.com/cli/link).
It allows to link `lib-jitsi-meet` dependency to local source in few steps:
```bash
cd lib-jitsi-meet
#### create global symlink for lib-jitsi-meet package
npm link
cd ../jitsi-meet
#### create symlink from the local node_modules folder to the global lib-jitsi-meet symlink
npm link lib-jitsi-meet
```
So now after changes in local `lib-jitsi-meet` repository you can rebuild it with `npm run install` and your `jitsi-meet` repository will use that modified library.
Note: when using node version 4.x, the make file of jitsi-meet do npm update which will delete the link, no longer the case with version 6.x.
If you do not want to use local repository anymore you should run
```bash
cd jitsi-meet
npm unlink lib-jitsi-meet
npm install
```
### Running with webpack-dev-server for development
Use it at the CLI, type
```
make dev
```
By default the backend deployment used is `beta.meet.jit.si`, you can point the Jitsi-Meet app at a different backend by using a proxy server. To do this set the WEBPACK_DEV_SERVER_PROXY_TARGET variable:
```
export WEBPACK_DEV_SERVER_PROXY_TARGET=https://your-example-server.com
make dev
```
The app should be running at https://localhost:8080/
For web development see [here](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-web), and for mobile see [here](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-mobile).
## Contributing
@@ -115,27 +63,18 @@ see our [guidelines for contributing](CONTRIBUTING.md).
## Embedding in external applications
Jitsi Meet provides a very flexible way of embedding it in external applications by using the [Jitsi Meet API](doc/api.md).
Jitsi Meet provides a very flexible way of embedding in external applications by using the [Jitsi Meet API](doc/api.md).
## Security
WebRTC today does not provide a way of conducting multiparty conversations with
end-to-end encryption. As a matter of fact, unless you consistently vocally
compare DTLS fingerprints with your peers, the same goes for one-to-one calls.
As a result when using a Jitsi Meet instance, your stream is encrypted on the
network but decrypted on the machine that hosts the bridge.
The Jitsi Meet architecture allows you to deploy your own version, including
all server components, and in that case your security guarantees will be roughly
equivalent to these of a direct one-to-one WebRTC call. This is what's unique to
Jitsi Meet in terms of security.
The security section here was starting to feel a bit too succinct for the complexity of the topic, so we created a post that covers the topic much more broadly here: https://jitsi.org/security
The [meet.jit.si](https://meet.jit.si) service is maintained by the Jitsi team
at [8x8](https://8x8.com).
The section on end-to-end encryption in that document is likely going to be one of the key points of interest: https://jitsi.org/security/#e2ee
## Mobile app
Jitsi Meet is also available as a React Native app for Android and iOS.
Instructions on how to build it can be found [here](doc/mobile.md).
## Security issues
For information on reporting security vulnerabilities in Jitsi Meet, see [SECURITY.md](./SECURITY.md).
## Acknowledgements
Jitsi Meet started out as a sample conferencing application using Jitsi Videobridge. It was originally developed by then ESTOS' developer Philipp Hancke who then contributed it to the community where development continues with joint forces!
Jitsi Meet started out as a sample conferencing application using Jitsi Videobridge. It was originally developed by ESTOS' developer Philipp Hancke who then contributed it to the community where development continues with joint forces!

9
SECURITY.md Normal file
View File

@@ -0,0 +1,9 @@
# Security
## Reporting security issuess
We take security very seriously and develop all Jitsi projects to be secure and safe.
If you find (or simply suspect) a security issue in any of the Jitsi projects, please send us an email to security@jitsi.org.
**We encourage responsible disclosure for the sake of our users, so please reach out before posting in a public space.**

View File

@@ -1,519 +1,3 @@
# Jitsi Meet SDK for Android
## Build your own, or use a pre-build SDK artifacts/binaries
Jitsi conveniently provides a pre-build SDK artifacts/binaries in its Maven repository. When you do not require any modification to the SDK itself, it's suggested to use the pre-build SDK. This avoids the complexity of building and installing your own SDK artifacts/binaries.
### Use pre-build SDK artifacts/binaries
In your project, add the Maven repository
`https://github.com/jitsi/jitsi-maven-repository/raw/master/releases` and the
dependency `org.jitsi.react:jitsi-meet-sdk` into your `build.gradle` files.
The repository typically goes into the `build.gradle` file in the root of your project:
```gradle
allprojects {
repositories {
google()
jcenter()
maven {
url "https://github.com/jitsi/jitsi-maven-repository/raw/master/releases"
}
}
}
```
Dependency definitions belong in the individual module `build.gradle` files:
```gradle
dependencies {
// (other dependencies)
implementation ('org.jitsi.react:jitsi-meet-sdk:+') { transitive = true }
}
```
### Build and use your own SDK artifacts/binaries
1. Install all required [dependencies](https://github.com/jitsi/jitsi-meet/blob/master/doc/mobile.md).
2. Create the SDK-release assembly, by invoking the following in the jitsi-meet
project source:
```bash
cd android/
./gradlew :sdk:assembleRelease
```
When this successfully executes, artifacts/binaries are ready to be published
into a Maven repository of your choice.
3. Configure the Maven repositories in which you are going to publish the
artifacts/binaries during step 4.
In the file `android/sdk/build.gradle` modify the line that contains
`"file:${rootProject.projectDir}/../../../jitsi/jitsi-maven-repository/releases"`
Change this value (which represents the Maven repository location used internally
by the Jitsi Developers) to the location of the repository that you'd like to use.
4. Publish the Maven artifact/binary of Jitsi Meet SDK for Android in the Maven
repository configured in step 3:
```bash
./gradlew :sdk:publish
cd ../
```
5. In _your_ project, add the Maven repository that you configured in step 3, as well
as the dependency `org.jitsi.react:jitsi-meet-sdk` into your `build.gradle`
file. Note that it's needed to pull in the transitive dependencies:
```gradle
implementation ('org.jitsi.react:jitsi-meet-sdk:+') { transitive = true }
```
Generally, if you are modifying the JavaScript code of Jitsi Meet SDK for Android only,
the above will suffice. If you would like to publish a third-party react-native module
which Jitsi Meet SDK for Android depends on (and is not publicly available in Maven
repositories) continue below.
6. Create the release assembly for _each_ third-party react-native module that you
need, replacing it's name in the example below.
```bash
./gradlew :react-native-webrtc:assembleRelease
```
7. Configure the Maven repositories in which you are going to publish the
artifacts/binaries during step 8.
In the file `android/build.gradle` (note that this is a different file than the file
that was modified in step 3) modify the line that contains
`"file:${rootProject.projectDir}/../../../jitsi/jitsi-maven-repository/releases"`
Change this value (which represents the Maven repository location used internally
by the Jitsi Developers) to the location of the repository that you'd like to use.
You can use the same repository as the one you configured in step 3 if you want.
8. Publish the Maven artifact/binary of _each_ third-party react-native module that
you need, replacing it's name in the example below. For example, to publish
react-native-webrtc:
```bash
./gradlew :react-native-webrtc:publish
```
Note that there should not be a need to explicitly add these dependencies in
_your_ project, as they will be pulled in as transitive dependencies of
`jitsi-meet-sdk`.
## Using the API
=======
Jitsi Meet SDK is an Android library which embodies the whole Jitsi Meet
experience and makes it reusable by third-party apps.
First, add Java 1.8 compatibility support to your project by adding the
following lines into your `build.gradle` file:
```
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
```
To get started, extends your `android.app.Activity` from
`org.jitsi.meet.sdk.JitsiMeetActivity`:
```java
package org.jitsi.example;
import org.jitsi.meet.sdk.JitsiMeetActivity;
public class MainActivity extends JitsiMeetActivity {
}
```
Alternatively, you can use the `org.jitsi.meet.sdk.JitsiMeetView` class which
extends `android.view.View`:
```java
package org.jitsi.example;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import org.jitsi.meet.sdk.JitsiMeetView;
public class MainActivity extends AppCompatActivity {
private JitsiMeetView view;
@Override
public void onBackPressed() {
if (!JitsiMeetView.onBackPressed()) {
// Invoke the default handler if it wasn't handled by React.
super.onBackPressed();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new JitsiMeetView(this);
view.loadURL(null);
setContentView(view);
}
@Override
protected void onDestroy() {
super.onDestroy();
view.dispose();
view = null;
JitsiMeetView.onHostDestroy(this);
}
@Override
public void onNewIntent(Intent intent) {
JitsiMeetView.onNewIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
JitsiMeetView.onHostResume(this);
}
@Override
protected void onStop() {
super.onStop();
JitsiMeetView.onHostPause(this);
}
}
```
### JitsiMeetActivity
This class encapsulates a high level API in the form of an Android `Activity`
which displays a single `JitsiMeetView`.
#### getDefaultURL()
See JitsiMeetView.getDefaultURL.
#### isPictureInPictureEnabled()
See JitsiMeetView.isPictureInPictureEnabled.
#### isWelcomePageEnabled()
See JitsiMeetView.isWelcomePageEnabled.
#### loadURL(URL)
See JitsiMeetView.loadURL.
#### setDefaultURL(URL)
See JitsiMeetView.setDefaultURL.
#### setPictureInPictureEnabled(boolean)
See JitsiMeetView.setPictureInPictureEnabled.
#### setWelcomePageEnabled(boolean)
See JitsiMeetView.setWelcomePageEnabled.
### JitsiMeetView
The `JitsiMeetView` class is the core of Jitsi Meet SDK. It's designed to
display a Jitsi Meet conference (or a welcome page).
#### dispose()
Releases all resources associated with this view. This method MUST be called
when the Activity holding this view is going to be destroyed, usually in the
`onDestroy()` method.
#### getDefaultURL()
Returns the default base URL used to join a conference when a partial URL (e.g.
a room name only) is specified to `loadURLString`/`loadURLObject`. If not set or
if set to `null`, the default built in JavaScript is used: https://meet.jit.si.
#### getListener()
Returns the `JitsiMeetViewListener` instance attached to the view.
#### isPictureInPictureEnabled()
Returns `true` if Picture-in-Picture is enabled; `false`, otherwise. If not
explicitly set (by a preceding `setPictureInPictureEnabled` call), defaults to
`true` if the platform supports Picture-in-Picture natively; `false`, otherwise.
#### isWelcomePageEnabled()
Returns true if the Welcome page is enabled; otherwise, false. If false, a black
empty view will be rendered when not in a conference. Defaults to false.
#### loadURL(URL)
Loads a specific URL which may identify a conference to join. If the specified
URL is null and the Welcome page is enabled, the Welcome page is displayed
instead.
#### loadURLString(String)
Loads a specific URL which may identify a conference to join. If the specified
URL is null and the Welcome page is enabled, the Welcome page is displayed
instead.
#### loadURLObject(Bundle)
Loads a specific URL which may identify a conference to join. The URL is
specified in the form of a Bundle of properties which (1) internally are
sufficient to construct a URL (string) while (2) abstracting the specifics of
constructing the URL away from API clients/consumers. If the specified URL is
null and the Welcome page is enabled, the Welcome page is displayed instead.
Example:
```java
Bundle config = new Bundle();
config.putBoolean("startWithAudioMuted", true);
config.putBoolean("startWithVideoMuted", false);
Bundle urlObject = new Bundle();
urlObject.putBundle("config", config);
urlObject.putString("url", "https://meet.jit.si/Test123");
view.loadURLObject(urlObject);
```
#### setDefaultURL(URL)
Sets the default URL. See `getDefaultURL` for more information.
NOTE: Must be called before (if at all) `loadURL`/`loadURLString` for it to take
effect.
#### setListener(listener)
Sets the given listener (class implementing the `JitsiMeetViewListener`
interface) on the view.
#### setPictureInPictureEnabled(boolean)
Sets whether Picture-in-Picture is enabled. If not set, Jitsi Meet SDK
automatically enables/disables Picture-in-Picture based on native platform
support.
NOTE: Must be called (if at all) before `loadURL`/`loadURLString` for it to take
effect.
#### setWelcomePageEnabled(boolean)
Sets whether the Welcome page is enabled. See `isWelcomePageEnabled` for more
information.
NOTE: Must be called (if at all) before `loadURL`/`loadURLString` for it to take
effect.
#### onBackPressed()
Helper method which should be called from the activity's `onBackPressed` method.
If this function returns `true`, it means the action was handled and thus no
extra processing is required; otherwise the app should call the parent's
`onBackPressed` method.
This is a static method.
#### onHostDestroy(activity)
Helper method which should be called from the activity's `onDestroy` method.
This is a static method.
#### onHostPause(activity)
Helper method which should be called from the activity's `onPause` method.
This is a static method.
#### onHostResume(activity)
Helper method which should be called from the activity's `onResume` or `onStop`
method.
This is a static method.
#### onNewIntent(intent)
Helper method for integrating the *deep linking* functionality. If your app's
activity is launched in "singleTask" mode this method should be called from the
activity's `onNewIntent` method.
This is a static method.
#### onUserLeaveHint()
Helper method for integrating automatic Picture-in-Picture. It should be called
from the activity's `onUserLeaveHint` method.
This is a static method.
#### JitsiMeetViewListener
`JitsiMeetViewListener` provides an interface apps can implement to listen to
the state of the Jitsi Meet conference displayed in a `JitsiMeetView`.
### JitsiMeetViewAdapter
A default implementation of the `JitsiMeetViewListener` interface. Apps may
extend the class instead of implementing the interface in order to minimize
boilerplate.
##### onConferenceFailed
Called when a joining a conference was unsuccessful or when there was an error
while in a conference.
The `data` `Map` contains an "error" key describing the error and a "url" key
with the conference URL.
#### onConferenceJoined
Called when a conference was joined.
The `data` `Map` contains a "url" key with the conference URL.
#### onConferenceLeft
Called when a conference was left.
The `data` `Map` contains a "url" key with the conference URL.
#### onConferenceWillJoin
Called before a conference is joined.
The `data` `Map` contains a "url" key with the conference URL.
#### onConferenceWillLeave
Called before a conference is left.
The `data` `Map` contains a "url" key with the conference URL.
#### onLoadConfigError
Called when loading the main configuration file from the Jitsi Meet deployment
fails.
The `data` `Map` contains an "error" key with the error and a "url" key with the
conference URL which necessitated the loading of the configuration file.
## ProGuard rules
When using the SDK on a project some proguard rules have to be added in order
to avoid necessary code being stripped. Add the following to your project's
rules file:
```
# React Native
# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.proguard.annotations.DoNotStrip class *
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.proguard.annotations.DoNotStrip *;
@com.facebook.common.internal.DoNotStrip *;
}
-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
void set*(***);
*** get*();
}
-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
-keep class * extends com.facebook.react.bridge.NativeModule { *; }
-keepclassmembers,includedescriptorclasses class * { native <methods>; }
-keepclassmembers class * { @com.facebook.react.uimanager.UIProp <fields>; }
-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }
-dontwarn com.facebook.react.**
# TextLayoutBuilder uses a non-public Android constructor within StaticLayout.
# See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details.
-dontwarn android.text.StaticLayout
# okhttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
# okio
-keep class sun.misc.Unsafe { *; }
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn okio.**
# WebRTC
-keep class org.webrtc.** { *; }
-dontwarn org.chromium.build.BuildHooksAndroid
# Jisti Meet SDK
-keep class org.jitsi.meet.sdk.** { *; }
```
## Picture-in-Picture
`JitsiMeetView` will automatically adjust its UI when presented in a
Picture-in-Picture style scenario, in a rectangle too small to accommodate its
"full" UI.
Jitsi Meet SDK automatically enables (unless explicitly disabled by a
`setPictureInPictureEnabled(false)` call) Android's native Picture-in-Picture
mode iff the platform is supported i.e. Android >= Oreo.
## Dropbox integration
To setup the Dropbox integration, follow these steps:
1. Add the following to the app's AndroidManifest.xml and change `<APP_KEY>` to
your Dropbox app key:
```
<activity
android:configChanges="keyboard|orientation"
android:launchMode="singleTask"
android:name="com.dropbox.core.android.AuthActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="db-<APP_KEY>" />
</intent-filter>
</activity>
```
2. Add the following to the app's strings.xml and change `<APP_KEY>` to your
Dropbox app key:
```
<string name="dropbox_app_key"><APP_KEY></string>
```
This document has been moved to [The Handbook](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-android-sdk).

6
android/app/.classpath Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

23
android/app/.project Normal file
View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>app</name>
<comment>Project app created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>

View File

@@ -0,0 +1,2 @@
connection.project.dir=..
eclipse.preferences.version=1

View File

@@ -1,40 +1,66 @@
apply plugin: 'com.android.application'
// Crashlytics integration is done as part of Firebase now, so it gets
// automagically activated with google-services.json
if (googleServicesEnabled) {
apply plugin: 'io.fabric'
}
// Use the number of seconds/10 since Jan 1 2019 as the versionCode.
// This lets us upload a new build at most every 10 seconds for the
// next ~680 years.
// https://stackoverflow.com/a/38643838
def vcode = (int) (((new Date().getTime() / 1000) - 1546297200) / 10)
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId 'org.jitsi.meet'
versionCode Integer.parseInt("${version}")
versionName "1.9.${version}"
versionCode vcode
versionName project.appVersion
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
ndk {
abiFilters 'armeabi-v7a', 'x86'
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
packagingOptions {
// The project react-native does not provide 64-bit binaries at the
// time of this writing. Unfortunately, packaging any 64-bit
// binaries into the .apk will crash the app at runtime on 64-bit
// platforms.
exclude '/lib/mips64/**'
exclude '/lib/arm64-v8a/**'
exclude '/lib/x86_64/**'
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro'
buildConfigField "boolean", "GOOGLE_SERVICES_ENABLED", "${googleServicesEnabled}"
buildConfigField "boolean", "LIBRE_BUILD", "${rootProject.ext.libreBuild}"
}
release {
// Uncomment the following line for singing a test release build.
//signingConfig signingConfigs.debug
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-release.pro'
buildConfigField "boolean", "GOOGLE_SERVICES_ENABLED", "${googleServicesEnabled}"
buildConfigField "boolean", "LIBRE_BUILD", "${rootProject.ext.libreBuild}"
}
}
sourceSets {
main {
java {
if (rootProject.ext.libreBuild) {
srcDir "src"
exclude "**/GoogleServicesHelper.java"
}
}
}
}
@@ -44,34 +70,39 @@ android {
}
}
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "com.android.support:support-v4:${rootProject.ext.supportLibVersion}"
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
implementation 'com.google.android.gms:play-services-auth:15.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-5'
if (!rootProject.ext.libreBuild) {
implementation 'com.google.android.gms:play-services-auth:16.0.1'
// Firebase
// - Crashlytics
// - Dynamic Links
implementation 'com.google.firebase:firebase-core:16.0.6'
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.8'
implementation 'com.google.firebase:firebase-dynamic-links:16.1.5'
}
implementation project(':sdk')
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
}
gradle.projectsEvaluated {
// Dropbox integration
//
def plistParser = new XmlSlurper(
/* validating */ false,
/* namespaceAware */ false,
/* allowDocTypeDeclaration */ true)
plistParser.setFeature(
'http://apache.org/xml/features/nonvalidating/load-external-dtd',
false)
def plist = plistParser.parse('../ios/app/src/Info.plist')
def dropboxScheme = plist.dict.array.dict.array.string.find { string ->
string.text().startsWith('db-')
def dropboxAppKey
if (project.file('dropbox.key').exists()) {
dropboxAppKey = project.file('dropbox.key').text.trim() - 'db-'
}
def dropboxAppKey = dropboxScheme?.text() - 'db-'
if (dropboxAppKey) {
android.defaultConfig.resValue('string', 'dropbox_app_key', "${dropboxAppKey}")
@@ -87,27 +118,59 @@ gradle.projectsEvaluated {
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="db-${dropboxAppKey}" />
</intent-filter>
</activity>""";
</activity>"""
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast {
def f = new File(manifestOutputDirectory, 'AndroidManifest.xml')
if (!f.isFile()) {
f = new File(new File(manifestOutputDirectory, output.dirName), 'AndroidManifest.xml')
}
if (f.exists()) {
def charset = 'UTF-8'
def s = f.getText(charset)
s = s.replace('</application>', "${dropboxActivity}</application>")
f.write(s, charset)
}
output.getProcessManifestProvider().get().doLast {
def outputDir = manifestOutputDirectory.get().asFile
def manifestPath = new File(outputDir, 'AndroidManifest.xml')
def charset = 'UTF-8'
def text
text = manifestPath.getText(charset)
text = text.replace('</application>', "${dropboxActivity}</application>")
manifestPath.write(text, charset)
}
}
}
}
// Run React packager
android.applicationVariants.all { variant ->
def targetName = variant.name.capitalize()
def currentRunPackagerTask = tasks.create(
name: "run${targetName}ReactPackager",
type: Exec) {
group = "react"
description = "Run the React packager."
doFirst {
println "Starting the React packager..."
def androidRoot = file("${projectDir}/../")
// Set up the call to the script
workingDir androidRoot
// Run the packager
commandLine("scripts/run-packager.sh")
}
// Set up dev mode
def devEnabled = !targetName.toLowerCase().contains("release")
// Only enable for dev builds
enabled devEnabled
}
def packageTask = variant.packageApplicationProvider.get()
packageTask.dependsOn(currentRunPackagerTask)
}
}
if (project.file('google-services.json').exists()) {
apply plugin: 'com.google.gms.google-services'
if (googleServicesEnabled) {
apply plugin: 'com.google.gms.google-services'
}

BIN
android/app/debug.keystore Normal file

Binary file not shown.

View File

@@ -1,5 +0,0 @@
-include proguard-rules.pro
# Disabling obfuscation is useful if you collect stack traces from production crashes
# (unless you are using a system that supports de-obfuscate the stack traces).
-dontobfuscate

View File

@@ -9,13 +9,6 @@
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# React Native
# Keep our interfaces so they can be used by other ProGuard rules.
@@ -45,10 +38,7 @@
-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }
-dontwarn com.facebook.react.**
# TextLayoutBuilder uses a non-public Android constructor within StaticLayout.
# See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details.
-dontwarn android.text.StaticLayout
-keep,includedescriptorclasses class com.facebook.react.bridge.** { *; }
# okhttp
@@ -63,11 +53,18 @@
-keep class sun.misc.Unsafe { *; }
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-keep class okio.** { *; }
-dontwarn okio.**
# FastImage
# WebRTC
-keep public class com.dylanvann.fastimage.** {*;}
-keep class org.webrtc.** { *; }
-dontwarn org.chromium.build.BuildHooksAndroid
# Jisti Meet SDK
-keep class org.jitsi.meet.** { *; }
-keep class org.jitsi.meet.sdk.** { *; }
# We added the following when we switched minifyEnabled on. Probably because we
# ran the app and hit problems...
@@ -79,7 +76,6 @@
-keep class com.facebook.react.bridge.ReadableType { *; }
-keep class com.facebook.react.bridge.queue.NativeRunnable { *; }
-keep class com.facebook.react.devsupport.** { *; }
-keep class org.webrtc.** { *; }
-dontwarn com.facebook.react.devsupport.**
-dontwarn com.google.appengine.**
@@ -87,3 +83,10 @@
-dontwarn javax.servlet.**
# ^^^ We added the above when we switched minifyEnabled on.
# Rule to avoid build errors related to SVGs.
-keep public class com.horcrux.svg.** {*;}
# Hermes
-keep class com.facebook.hermes.unicode.** { *; }

View File

@@ -5,7 +5,7 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".MainApplication"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme">
<activity
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
@@ -15,6 +15,7 @@
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:windowSoftInputMode="adjustResize">
<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@@ -23,11 +24,8 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:host="beta.hipchat.me" android:scheme="https" />
<data android:host="alpha.jitsi.net" android:scheme="https" />
<data android:host="beta.meet.jit.si" android:scheme="https" />
<data android:host="chaos.hipchat.me" android:scheme="https" />
<data android:host="enso.me" android:scheme="https" />
<data android:host="hipchat.me" android:scheme="https" />
<data android:host="meet.jit.si" android:scheme="https" />
</intent-filter>
<intent-filter>

View File

@@ -0,0 +1,43 @@
package org.jitsi.meet;
import android.net.Uri;
import android.util.Log;
import com.crashlytics.android.Crashlytics;
import com.google.firebase.dynamiclinks.FirebaseDynamicLinks;
import io.fabric.sdk.android.Fabric;
import org.jitsi.meet.sdk.JitsiMeet;
import org.jitsi.meet.sdk.JitsiMeetActivity;
/**
* Helper class to initialize Google related services and functionality.
* This functionality is compiled conditionally and called via reflection, that's why it was
* extracted here.
*
* "Libre builds" (builds with the LIBRE_BUILD flag set) will not include this file.
*/
final class GoogleServicesHelper {
public static void initialize(JitsiMeetActivity activity) {
if (BuildConfig.GOOGLE_SERVICES_ENABLED) {
Log.d(activity.getClass().getSimpleName(), "Initializing Google Services");
if (!JitsiMeet.isCrashReportingDisabled(activity)) {
Fabric.with(activity, new Crashlytics());
}
FirebaseDynamicLinks.getInstance().getDynamicLink(activity.getIntent())
.addOnSuccessListener(activity, pendingDynamicLinkData -> {
Uri dynamicLink = null;
if (pendingDynamicLinkData != null) {
dynamicLink = pendingDynamicLinkData.getLink();
}
if (dynamicLink != null) {
activity.join(dynamicLink.toString());
}
});
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
* Copyright @ 2017-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.
@@ -16,215 +16,135 @@
package org.jitsi.meet;
import android.os.Bundle;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent;
import androidx.annotation.Nullable;
import org.jitsi.meet.sdk.JitsiMeet;
import org.jitsi.meet.sdk.JitsiMeetActivity;
import org.jitsi.meet.sdk.JitsiMeetView;
import org.jitsi.meet.sdk.JitsiMeetViewListener;
import org.jitsi.meet.sdk.invite.AddPeopleController;
import org.jitsi.meet.sdk.invite.AddPeopleControllerListener;
import org.jitsi.meet.sdk.invite.InviteController;
import org.jitsi.meet.sdk.invite.InviteControllerListener;
import org.jitsi.meet.sdk.JitsiMeetConferenceOptions;
import com.facebook.react.bridge.UiThreadUtil;
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
/**
* The one and only {@link Activity} that the Jitsi Meet app needs. The
* The one and only Activity that the Jitsi Meet app needs. The
* {@code Activity} is launched in {@code singleTask} mode, so it will be
* created upon application initialization and there will be a single instance
* of it. Further attempts at launching the application once it was already
* launched will result in {@link Activity#onNewIntent(Intent)} being called.
*
* This {@code Activity} extends {@link JitsiMeetActivity} to keep the React
* Native CLI working, since the latter always tries to launch an
* {@code Activity} named {@code MainActivity} when doing
* {@code react-native run-android}.
* launched will result in {@link MainActivity#onNewIntent(Intent)} being called.
*/
public class MainActivity extends JitsiMeetActivity {
/**
* The query to perform through {@link AddPeopleController} when the
* {@code InviteButton} is tapped in order to exercise the public API of the
* feature invite. If {@code null}, the {@code InviteButton} will not be
* rendered.
* The request code identifying requests for the permission to draw on top
* of other apps. The value must be 16-bit and is arbitrarily chosen here.
*/
private static final String ADD_PEOPLE_CONTROLLER_QUERY = null;
private static final int OVERLAY_PERMISSION_REQUEST_CODE
= (int) (Math.random() * Short.MAX_VALUE);
// JitsiMeetActivity overrides
//
@Override
protected JitsiMeetView initializeView() {
JitsiMeetView view = super.initializeView();
protected boolean extraInitialize() {
Log.d(this.getClass().getSimpleName(), "LIBRE_BUILD="+BuildConfig.LIBRE_BUILD);
// XXX In order to increase (1) awareness of API breakages and (2) API
// coverage, utilize JitsiMeetViewListener in the Debug configuration of
// the app.
if (BuildConfig.DEBUG && view != null) {
view.setListener(new JitsiMeetViewListener() {
private void on(String name, Map<String, Object> data) {
UiThreadUtil.assertOnUiThread();
// Log with the tag "ReactNative" in order to have the log
// visible in react-native log-android as well.
Log.d(
"ReactNative",
JitsiMeetViewListener.class.getSimpleName() + " "
+ name + " "
+ data);
}
@Override
public void onConferenceFailed(Map<String, Object> data) {
on("CONFERENCE_FAILED", data);
}
@Override
public void onConferenceJoined(Map<String, Object> data) {
on("CONFERENCE_JOINED", data);
}
@Override
public void onConferenceLeft(Map<String, Object> data) {
on("CONFERENCE_LEFT", data);
}
@Override
public void onConferenceWillJoin(Map<String, Object> data) {
on("CONFERENCE_WILL_JOIN", data);
}
@Override
public void onConferenceWillLeave(Map<String, Object> data) {
on("CONFERENCE_WILL_LEAVE", data);
}
@Override
public void onLoadConfigError(Map<String, Object> data) {
on("LOAD_CONFIG_ERROR", data);
}
});
// inviteController
final InviteController inviteController
= view.getInviteController();
inviteController.setListener(new InviteControllerListener() {
public void beginAddPeople(
AddPeopleController addPeopleController) {
onInviteControllerBeginAddPeople(
inviteController,
addPeopleController);
}
});
inviteController.setAddPeopleEnabled(
ADD_PEOPLE_CONTROLLER_QUERY != null);
inviteController.setDialOutEnabled(
inviteController.isAddPeopleEnabled());
// Setup Crashlytics and Firebase Dynamic Links
// Here we are using reflection since it may have been disabled at compile time.
try {
Class<?> cls = Class.forName("org.jitsi.meet.GoogleServicesHelper");
Method m = cls.getMethod("initialize", JitsiMeetActivity.class);
m.invoke(null, this);
} catch (Exception e) {
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
}
return view;
// In Debug builds React needs permission to write over other apps in
// order to display the warning and error overlays.
if (BuildConfig.DEBUG) {
if (canRequestOverlayPermission() && !Settings.canDrawOverlays(this)) {
Intent intent
= new Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_REQUEST_CODE);
return true;
}
}
return false;
}
private void onAddPeopleControllerInviteSettled(
AddPeopleController addPeopleController,
List<Map<String, Object>> failedInvitees) {
UiThreadUtil.assertOnUiThread();
@Override
protected void initialize() {
// Set default options
JitsiMeetConferenceOptions defaultOptions
= new JitsiMeetConferenceOptions.Builder()
.setWelcomePageEnabled(true)
.setServerURL(buildURL("https://meet.jit.si"))
.setFeatureFlag("call-integration.enabled", false)
.build();
JitsiMeet.setDefaultConferenceOptions(defaultOptions);
// XXX Explicitly invoke endAddPeople on addPeopleController; otherwise,
// it is going to be memory-leaked in the associated InviteController
// and no subsequent InviteButton clicks/taps will be delivered.
// Technically, endAddPeople will automatically be invoked if there are
// no failedInviteees i.e. the invite succeeeded for all specified
// invitees.
addPeopleController.endAddPeople();
super.initialize();
}
private void onAddPeopleControllerReceivedResults(
AddPeopleController addPeopleController,
List<Map<String, Object>> results,
String query) {
UiThreadUtil.assertOnUiThread();
@Override
public void onConferenceTerminated(Map<String, Object> data) {
Log.d(TAG, "Conference terminated: " + data);
}
int size = results.size();
// Activity lifecycle method overrides
//
if (size > 0) {
// Exercise AddPeopleController's inviteById implementation.
List<String> ids = new ArrayList<>(size);
for (Map<String, Object> result : results) {
Object id = result.get("id");
if (id != null) {
ids.add(id.toString());
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE
&& canRequestOverlayPermission()) {
if (Settings.canDrawOverlays(this)) {
initialize();
return;
}
addPeopleController.inviteById(ids);
return;
throw new RuntimeException("Overlay permission is required when running in Debug mode.");
}
// XXX Explicitly invoke endAddPeople on addPeopleController; otherwise,
// it is going to be memory-leaked in the associated InviteController
// and no subsequent InviteButton clicks/taps will be delivered.
addPeopleController.endAddPeople();
super.onActivityResult(requestCode, resultCode, data);
}
// ReactAndroid/src/main/java/com/facebook/react/ReactActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
// As this is the Jitsi Meet app (i.e. not the Jitsi Meet SDK), we do
// want to enable some options.
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (BuildConfig.DEBUG && keyCode == KeyEvent.KEYCODE_MENU) {
JitsiMeet.showDevOptions();
return true;
}
// The welcome page defaults to disabled in the SDK at the time of this
// writing but it is clearer to be explicit about what we want anyway.
setWelcomePageEnabled(true);
super.onCreate(savedInstanceState);
return super.onKeyUp(keyCode, event);
}
private void onInviteControllerBeginAddPeople(
InviteController inviteController,
AddPeopleController addPeopleController) {
UiThreadUtil.assertOnUiThread();
// Helper methods
//
// Log with the tag "ReactNative" in order to have the log visible in
// react-native log-android as well.
Log.d(
"ReactNative",
InviteControllerListener.class.getSimpleName() + ".beginAddPeople");
String query = ADD_PEOPLE_CONTROLLER_QUERY;
if (query != null
&& (inviteController.isAddPeopleEnabled()
|| inviteController.isDialOutEnabled())) {
addPeopleController.setListener(new AddPeopleControllerListener() {
public void onInviteSettled(
AddPeopleController addPeopleController,
List<Map<String, Object>> failedInvitees) {
onAddPeopleControllerInviteSettled(
addPeopleController,
failedInvitees);
}
public void onReceivedResults(
AddPeopleController addPeopleController,
List<Map<String, Object>> results,
String query) {
onAddPeopleControllerReceivedResults(
addPeopleController,
results, query);
}
});
addPeopleController.performQuery(query);
} else {
// XXX Explicitly invoke endAddPeople on addPeopleController;
// otherwise, it is going to be memory-leaked in the associated
// InviteController and no subsequent InviteButton clicks/taps will
// be delivered.
addPeopleController.endAddPeople();
private @Nullable URL buildURL(String urlStr) {
try {
return new URL(urlStr);
} catch (MalformedURLException e) {
return null;
}
}
private boolean canRequestOverlayPermission() {
return
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 960 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#66A8DD</color>
</resources>

View File

@@ -2,5 +2,6 @@
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:navigationBarColor">#1081B2</item>
</style>
</resources>

View File

@@ -0,0 +1,6 @@
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">localhost</domain>
<domain includeSubdomains="false">10.0.2.2</domain>
</domain-config>
</network-security-config>

View File

@@ -1,3 +1,5 @@
import groovy.json.JsonSlurper
// Top-level build file where you can add configuration options common to all
// sub-projects/modules.
@@ -5,10 +7,14 @@ buildscript {
repositories {
google()
jcenter()
repositories {
maven { url 'https://maven.fabric.io/public' }
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
classpath 'com.google.gms:google-services:3.2.1'
classpath 'com.android.tools.build:gradle:3.3.2'
classpath 'com.google.gms:google-services:4.3.3'
classpath 'io.fabric.tools:gradle:1.28.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files.
@@ -17,12 +23,9 @@ buildscript {
allprojects {
repositories {
maven { url "https://maven.google.com" }
google()
jcenter()
maven { url "$rootDir/../node_modules/jsc-android/dist" }
// React Native (JS, Obj-C sources, Android binaries) is installed from
// npm.
// React Native (JS, Obj-C sources, Android binaries) is installed from npm.
maven { url "$rootDir/../node_modules/react-native/android" }
}
@@ -34,15 +37,9 @@ allprojects {
if (details.requested.group == 'com.facebook.react'
&& details.requested.name == 'react-native') {
def file = new File("$rootDir/../node_modules/react-native/package.json")
def version = new groovy.json.JsonSlurper().parseText(file.text).version
def version = new JsonSlurper().parseText(file.text).version
details.useVersion version
}
if (details.requested.group == 'org.webkit'
&& details.requested.name == 'android-jsc') {
def file = new File("$rootDir/../node_modules/jsc-android/package.json")
def version = new groovy.json.JsonSlurper().parseText(file.text).version
details.useVersion "r${version.tokenize('.')[0]}"
}
}
}
}
@@ -57,48 +54,41 @@ allprojects {
publishing {
publications {}
repositories {
maven { url "file:${rootProject.projectDir}/../../../jitsi/jitsi-maven-repository/releases" }
maven {
url rootProject.ext.mavenRepo
if (!rootProject.ext.mavenRepo.startsWith("file")) {
credentials {
username rootProject.ext.mavenUser
password rootProject.ext.mavenPassword
}
}
}
}
}
}
// Use the number of seconds/10 since Jan 1 2019 as the version qualifier number.
// This will last for the next ~680 years.
// https://stackoverflow.com/a/38643838
def versionQualifierNumber = (int)(((new Date().getTime()/1000) - 1546297200) / 10)
afterEvaluate { project ->
if (project.name.startsWith('react-native-')) {
def npmManifest = project.file('../package.json')
def json = new groovy.json.JsonSlurper().parseText(npmManifest.text)
// React Native modules have an npm peer dependency on react-native,
// they do not have an npm dependency on it. Further below though we
// choose a react-native version (range) when we represent them as
// Maven artifacts. Effectively, we are forking the projects by not
// complying with the full range of their npm peer dependency and,
// consequently, we should qualify their version.
def versionQualifier = '-jitsi-1'
if ('react-native-webrtc'.equals(project.name))
versionQualifier = '-jitsi-1'
project.version = "${json.version}${versionQualifier}"
if (project.plugins.hasPlugin('android') || project.plugins.hasPlugin('android-library')) {
project.android {
compileSdkVersion rootProject.ext.compileSdkVersion
if (rootProject.ext.has('buildToolsVersion')) {
buildToolsVersion rootProject.ext.buildToolsVersion
}
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
}
buildToolsVersion rootProject.ext.buildToolsVersion
}
}
if (project.name.startsWith('react-native-')) {
def npmManifest = project.file('../package.json')
def json = new JsonSlurper().parseText(npmManifest.text)
// Release every dependency the SDK has with a -jitsi-XXX qualified version. This allows
// us to pin the dependencies and make sure they are always updated, no matter what.
project.version = "${json.version}-jitsi-${versionQualifierNumber}"
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.source
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
failOnError false
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.source
@@ -114,7 +104,6 @@ allprojects {
extension "aar"
}
artifact(androidSourcesJar)
artifact(androidJavadocsJar)
pom.withXml {
def pomXml = asNode()
pomXml.appendNode('name', project.name)
@@ -135,7 +124,7 @@ allprojects {
// (third-party) React Native modules we utilize can
// depend not on a specific react-native release but
// a wider range.
if (artifactId.equals('react-native')) {
if (artifactId == 'react-native') {
def versionNumber = VersionNumber.parse(version)
version = "${versionNumber.major}.${versionNumber.minor}"
}
@@ -153,17 +142,27 @@ allprojects {
}
ext {
buildToolsVersion = "27.0.3"
compileSdkVersion = 27
buildToolsVersion = "28.0.3"
compileSdkVersion = 28
minSdkVersion = 21
targetSdkVersion = 26
supportLibVersion = "27.1.1"
targetSdkVersion = 28
supportLibVersion = "28.0.0"
// The Maven artifact groupdId of the third-party react-native modules which
// Jitsi Meet SDK for Android depends on and which are not available in
// third-party Maven repositories so we have to deploy to a Maven repository
// of ours.
moduleGroupId = 'com.facebook.react'
// Maven repo where artifacts will be published
mavenRepo = System.env.MVN_REPO ?: ""
mavenUser = System.env.MVN_USER ?: ""
mavenPassword = System.env.MVN_PASSWORD ?: ""
// Libre build
libreBuild = (System.env.LIBRE_BUILD ?: "false").toBoolean()
googleServicesEnabled = project.file('app/google-services.json').exists() && !libreBuild
}
// Force the version of the Android build tools we have chosen on all
@@ -180,8 +179,3 @@ subprojects { subproject ->
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '4.4'
distributionUrl = distributionUrl.replace("bin", "all")
}

2
android/fastlane/Appfile Normal file
View File

@@ -0,0 +1,2 @@
json_key_file("")
package_name("org.jitsi.meet")

34
android/fastlane/Fastfile Normal file
View File

@@ -0,0 +1,34 @@
ENV["FASTLANE_SKIP_UPDATE_CHECK"] = "1"
opt_out_usage
default_platform(:android)
platform :android do
desc "Deploy a new version to Goolge Play (Closed Beta)"
lane :deploy do
# Cleanup
gradle(task: "clean")
# Build and sign the app
gradle(
task: "assemble",
build_type: "Release",
print_command: false,
properties: {
"android.injected.signing.store.file" => ENV["JITSI_KEYSTORE"],
"android.injected.signing.store.password" => ENV["JITSI_KEYSTORE_PASSWORD"],
"android.injected.signing.key.alias" => ENV["JITSI_KEY_ALIAS"],
"android.injected.signing.key.password" => ENV["JITSI_KEY_PASSWORD"],
}
)
# Upload built artifact to the Closed Beta track
upload_to_play_store(
track: "beta",
json_key: ENV["JITSI_JSON_KEY_FILE"],
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true
)
end
end

View File

@@ -0,0 +1,29 @@
fastlane documentation
================
# Installation
Make sure you have the latest version of the Xcode command line tools installed:
```
xcode-select --install
```
Install _fastlane_ using
```
[sudo] gem install fastlane -NV
```
or alternatively using `brew cask install fastlane`
# Available Actions
## Android
### android deploy
```
fastlane android deploy
```
Deploy a new version to Goolge Play (Closed Beta)
----
This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run.
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 950 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1000 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -17,4 +17,8 @@
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
version=1
android.useAndroidX=true
android.enableJetifier=true
appVersion=20.3.0
sdkVersion=2.8.2

View File

@@ -1,6 +1,6 @@
#Fri Sep 08 10:42:14 CEST 2017
#Fri Mar 08 13:36:51 CET 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

111
android/scripts/release-sdk.sh Executable file
View File

@@ -0,0 +1,111 @@
#!/bin/bash
set -e -u
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
DEFAULT_MVN_REPO="${THIS_DIR}/../../../jitsi-maven-repository/releases"
THE_MVN_REPO=${MVN_REPO:-${1:-$DEFAULT_MVN_REPO}}
MVN_HTTP=0
DEFAULT_SDK_VERSION=$(grep sdkVersion ${THIS_DIR}/../gradle.properties | cut -d"=" -f2)
SDK_VERSION=${OVERRIDE_SDK_VERSION:-${DEFAULT_SDK_VERSION}}
RN_VERSION=$(jq -r '.version' ${THIS_DIR}/../../node_modules/react-native/package.json)
HERMES_VERSION=$(jq -r '.dependencies."hermes-engine"' ${THIS_DIR}/../../node_modules/react-native/package.json | cut -c 2-)
DO_GIT_TAG=${GIT_TAG:-0}
if [[ $THE_MVN_REPO == http* ]]; then
MVN_HTTP=1
else
MVN_REPO_PATH=$(realpath $THE_MVN_REPO)
THE_MVN_REPO="file:${MVN_REPO_PATH}"
fi
export MVN_REPO=$THE_MVN_REPO
echo "Releasing Jitsi Meet SDK ${SDK_VERSION}"
echo "Using ${MVN_REPO} as the Maven repo"
if [[ $MVN_HTTP == 1 ]]; then
# Push React Native
echo "Pushing React Native ${RN_VERSION} to the Maven repo"
pushd ${THIS_DIR}/../../node_modules/react-native/android/com/facebook/react/react-native/${RN_VERSION}
mvn \
deploy:deploy-file \
-Durl=${MVN_REPO} \
-DrepositoryId=${MVN_REPO_ID} \
-Dfile=react-native-${RN_VERSION}.aar \
-Dpackaging=aar \
-DgeneratePom=false \
-DpomFile=react-native-${RN_VERSION}.pom || true
popd
# Push Hermes
echo "Pushing Hermes ${HERMES_VERSION} to the Maven repo"
pushd ${THIS_DIR}/../../node_modules/hermes-engine/android/
mvn \
deploy:deploy-file \
-Durl=${MVN_REPO} \
-DrepositoryId=${MVN_REPO_ID} \
-Dfile=hermes-release.aar \
-Dpackaging=aar \
-DgroupId=com.facebook \
-DartifactId=hermes \
-Dversion=${HERMES_VERSION} \
-DgeneratePom=true || true
popd
else
# Push React Native, if necessary
if [[ ! -d ${MVN_REPO}/com/facebook/react/react-native/${RN_VERSION} ]]; then
echo "Pushing React Native ${RN_VERSION} to the Maven repo"
pushd ${THIS_DIR}/../../node_modules/react-native/android/com/facebook/react/react-native/${RN_VERSION}
mvn \
deploy:deploy-file \
-Durl=${MVN_REPO} \
-Dfile=react-native-${RN_VERSION}.aar \
-Dpackaging=aar \
-DgeneratePom=false \
-DpomFile=react-native-${RN_VERSION}.pom
popd
fi
# Push Hermes, if necessary
if [[ ! -d ${MVN_REPO}/com/facebook/hermes/${HERMES_VERSION} ]]; then
echo "Pushing Hermes ${HERMES_VERSION} to the Maven repo"
pushd ${THIS_DIR}/../../node_modules/hermes-engine/android/
mvn \
deploy:deploy-file \
-Durl=${MVN_REPO} \
-Dfile=hermes-release.aar \
-Dpackaging=aar \
-DgroupId=com.facebook \
-DartifactId=hermes \
-Dversion=${HERMES_VERSION} \
-DgeneratePom=true
popd
fi
# Check if an SDK with that same version has already been released
if [[ -d ${MVN_REPO}/org/jitsi/react/jitsi-meet-sdk/${SDK_VERSION} ]]; then
echo "There is already a release with that version in the Maven repo!"
exit 1
fi
fi
# Now build and publish the Jitsi Meet SDK and its dependencies
echo "Building and publishing the Jitsi Meet SDK"
pushd ${THIS_DIR}/../
./gradlew clean assembleRelease publish
popd
if [[ $DO_GIT_TAG == 1 ]]; then
# The artifacts are now on the Maven repo, commit them
pushd ${MVN_REPO_PATH}
git add -A .
git commit -m "Jitsi Meet SDK + dependencies: ${SDK_VERSION}"
popd
# Tag the release
git tag android-sdk-${SDK_VERSION}
fi
# Done!
echo "Finished! Don't forget to push the tag and the Maven repo artifacts."

26
android/scripts/run-packager.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/bin/bash
# This script is executed bt Gradle to start the React packager for Debug
# targets.
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}"
echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > "${THIS_DIR}/../../node_modules/react-native/scripts/.packager.env"
adb reverse tcp:8081 tcp:8081
if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then
if ! curl -s "http://localhost:${RCT_METRO_PORT}/status" | grep -q "packager-status:running" ; then
echo "Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly"
exit 2
fi
else
CMD="${THIS_DIR}/../../node_modules/react-native/scripts/launchPackager.command"
if [[ `uname` == "Darwin" ]]; then
open -g "${CMD}" || echo "Can't start packager automatically"
else
xdg-open "${CMD}" || echo "Can't start packager automatically"
fi
fi

6
android/sdk/.classpath Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

23
android/sdk/.project Normal file
View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>sdk</name>
<comment>Project sdk created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>

View File

@@ -0,0 +1,2 @@
connection.project.dir=..
eclipse.preferences.version=1

View File

@@ -1,3 +1,5 @@
import groovy.json.JsonSlurper
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
@@ -10,39 +12,74 @@ android {
}
buildTypes {
debug {}
debug {
buildConfigField "boolean", "LIBRE_BUILD", "${rootProject.ext.libreBuild}"
buildConfigField "boolean", "GOOGLE_SERVICES_ENABLED", "${rootProject.ext.googleServicesEnabled}"
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "boolean", "LIBRE_BUILD", "${rootProject.ext.libreBuild}"
buildConfigField "boolean", "GOOGLE_SERVICES_ENABLED", "${rootProject.ext.googleServicesEnabled}"
}
}
sourceSets {
main {
java {
if (rootProject.ext.libreBuild) {
srcDir "src"
exclude "**/AmplitudeModule.java"
}
exclude "test/"
}
}
}
packagingOptions {
pickFirst '**/libc++_shared.so'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "com.android.support:support-v4:${rootProject.ext.supportLibVersion}"
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.fragment:fragment:1.2.0'
//noinspection GradleDynamicVersion
api 'com.facebook.react:react-native:+'
// Hermes JS engine
def hermesPath = "../../node_modules/hermes-engine/android/"
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
implementation 'com.dropbox.core:dropbox-core-sdk:3.0.8'
api 'com.facebook.react:react-native:+'
implementation 'com.jakewharton.timber:timber:4.7.1'
implementation 'com.squareup.duktape:duktape-android:1.3.0'
if (!rootProject.ext.libreBuild) {
implementation 'com.amplitude:android-sdk:2.14.1'
implementation(project(":react-native-google-signin")) {
exclude group: 'com.google.android.gms'
exclude group: 'androidx'
}
}
implementation project(':react-native-background-timer')
implementation project(':react-native-calendar-events')
implementation(project(':react-native-fast-image')) {
exclude group: 'com.android.support'
}
implementation(project(":react-native-google-signin")) {
exclude group: 'com.google.android.gms'
exclude group: 'com.android.support'
}
implementation project(':react-native-community-async-storage')
implementation project(':react-native-community_netinfo')
implementation project(':react-native-default-preference')
implementation project(':react-native-immersive')
implementation project(':react-native-keep-awake')
implementation project(':react-native-linear-gradient')
implementation project(':react-native-locale-detector')
implementation project(':react-native-sound')
implementation project(':react-native-vector-icons')
implementation project(':react-native-svg')
implementation project(':react-native-webrtc')
implementation project(':react-native-webview')
testImplementation 'junit:junit:4.12'
}
@@ -107,25 +144,25 @@ android.libraryVariants.all { def variant ->
currentBundleTask.ext.generatedResFolders = files(resourcesDir).builtBy(currentBundleTask)
currentBundleTask.ext.generatedAssetsFolders = files(jsBundleDir).builtBy(currentBundleTask)
variant.registerGeneratedResFolders(currentBundleTask.generatedResFolders)
variant.mergeResources.dependsOn(currentBundleTask)
def assetsDir = variant.mergeAssets.outputDir
def mergeAssetsTask = variant.mergeAssetsProvider.get()
def mergeResourcesTask = variant.mergeResourcesProvider.get()
variant.mergeAssets.doLast {
// Bundle fonts
//
copy {
from("${projectDir}/../../fonts/jitsi.ttf")
into("${assetsDir}/fonts")
}
mergeAssetsTask.dependsOn(currentBundleTask)
mergeResourcesTask.dependsOn(currentBundleTask)
mergeAssetsTask.doLast {
def assetsDir = mergeAssetsTask.outputDir
// Bundle sounds
//
copy {
from("${projectDir}/../../sounds/incomingMessage.wav")
from("${projectDir}/../../sounds/joined.wav")
from("${projectDir}/../../sounds/left.wav")
from("${projectDir}/../../sounds/liveStreamingOn.mp3")
from("${projectDir}/../../sounds/liveStreamingOff.mp3")
from("${projectDir}/../../sounds/outgoingRinging.wav")
from("${projectDir}/../../sounds/outgoingStart.wav")
from("${projectDir}/../../sounds/recordingOn.mp3")
@@ -138,19 +175,19 @@ android.libraryVariants.all { def variant ->
//
if (currentBundleTask.enabled) {
copy {
from(jsBundleDir)
from(jsBundleFile)
into(assetsDir)
}
}
}
variant.mergeResources.doLast {
mergeResourcesTask.doLast {
// Copy React resources
//
if (currentBundleTask.enabled) {
copy {
from(resourcesDir)
into(variant.mergeResources.outputDir)
into(mergeResourcesTask.outputDir)
}
}
}
@@ -162,7 +199,7 @@ publishing {
aarArchive(MavenPublication) {
groupId 'org.jitsi.react'
artifactId 'jitsi-meet-sdk'
version '1.9.0'
version System.env.OVERRIDE_SDK_VERSION ?: project.sdkVersion
artifact("${project.buildDir}/outputs/aar/${project.name}-release.aar") {
extension "aar"
@@ -181,8 +218,7 @@ publishing {
def groupId = it.moduleGroup
def artifactId = it.moduleName
if (artifactId.startsWith('react-native-')
&& groupId.equals('jitsi-meet')) {
if (artifactId.startsWith('react-native-') && groupId.equals('jitsi-meet')) {
groupId = rootProject.ext.moduleGroupId
}
@@ -191,11 +227,27 @@ publishing {
dependency.appendNode('artifactId', artifactId)
dependency.appendNode('version', it.moduleVersion)
}
// Add Hermes dependency.
def hermesPkg = new File("$rootDir/../node_modules/hermes-engine/package.json")
def hermesVersion = new JsonSlurper().parseText(hermesPkg.text).version
def hermesDependency = dependencies.appendNode('dependency')
hermesDependency.appendNode('groupId', "com.facebook")
hermesDependency.appendNode('artifactId', "hermes")
hermesDependency.appendNode('version', hermesVersion)
}
}
}
repositories {
maven { url "file:${rootProject.projectDir}/../../../jitsi/jitsi-maven-repository/releases" }
maven {
url rootProject.ext.mavenRepo
if (!rootProject.ext.mavenRepo.startsWith("file")) {
credentials {
username rootProject.ext.mavenUser
password rootProject.ext.mavenPassword
}
}
}
}
}

View File

@@ -1,25 +0,0 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/scorretge/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -1,30 +1,52 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jitsi.meet.sdk">
<!-- XXX ACCESS_NETWORK_STATE is required by WebRTC. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- XXX ACCESS_NETWORK_STATE is required by WebRTC. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<activity
android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<activity
android:name=".JitsiMeetActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:windowSoftInputMode="adjustResize">
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<service
android:name=".ConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>
<service android:name="org.jitsi.meet.sdk.JitsiMeetOngoingConferenceService" />
</application>
</manifest>

View File

@@ -0,0 +1,122 @@
/*
* Copyright @ 2019-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings;
import android.text.TextUtils;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.amplitude.api.Amplitude;
import com.facebook.react.module.annotations.ReactModule;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Implements the react-native module for the Amplitude integration.
*/
@ReactModule(name = AmplitudeModule.NAME)
class AmplitudeModule
extends ReactContextBaseJavaModule {
public static final String NAME = "Amplitude";
public static final String JITSI_PREFERENCES = "jitsi-preferences";
public static final String AMPLITUDE_DEVICE_ID_KEY = "amplitudeDeviceId";
public AmplitudeModule(ReactApplicationContext reactContext) {
super(reactContext);
}
/**
* Initializes the Amplitude SDK.
*
* @param instanceName The name of the Amplitude instance. Should
* be used only for multi-project logging.
* @param apiKey The API_KEY of the Amplitude project.
*/
@ReactMethod
@SuppressLint("HardwareIds")
public void init(String instanceName, String apiKey) {
Amplitude.getInstance(instanceName).initialize(getCurrentActivity(), apiKey);
// Set the device ID to something consistent.
SharedPreferences sharedPreferences = getReactApplicationContext().getSharedPreferences(JITSI_PREFERENCES, Context.MODE_PRIVATE);
String android_id = sharedPreferences.getString(AMPLITUDE_DEVICE_ID_KEY, "");
if (!TextUtils.isEmpty(android_id)) {
Amplitude.getInstance(instanceName).setDeviceId(android_id);
} else {
String amplitudeId = Amplitude.getInstance(instanceName).getDeviceId();
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(JITSI_PREFERENCES, amplitudeId).apply();
}
}
/**
* Sets the user ID for an Amplitude instance.
*
* @param instanceName The name of the Amplitude instance.
* @param userId The new value for the user ID.
*/
@ReactMethod
public void setUserId(String instanceName, String userId) {
Amplitude.getInstance(instanceName).setUserId(userId);
}
/**
* Sets the user properties for an Amplitude instance.
*
* @param instanceName The name of the Amplitude instance.
* @param userProps JSON string with user properties to be set.
*/
@ReactMethod
public void setUserProperties(String instanceName, ReadableMap userProps) {
if (userProps != null) {
Amplitude.getInstance(instanceName).setUserProperties(
new JSONObject(userProps.toHashMap()));
}
}
/**
* Log an analytics event.
*
* @param instanceName The name of the Amplitude instance.
* @param eventType The event type.
* @param eventPropsString JSON string with the event properties.
*/
@ReactMethod
public void logEvent(String instanceName, String eventType, String eventPropsString) {
try {
JSONObject eventProps = new JSONObject(eventPropsString);
Amplitude.getInstance(instanceName).logEvent(eventType, eventProps);
} catch (JSONException e) {
JitsiMeetLogger.e(e, "Error logging event");
}
}
@Override
public String getName() {
return NAME;
}
}

View File

@@ -15,17 +15,21 @@ import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
@ReactModule(name = AndroidSettingsModule.NAME)
class AndroidSettingsModule
extends ReactContextBaseJavaModule {
public static final String NAME = "AndroidSettings";
public AndroidSettingsModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "AndroidSettings";
return NAME;
}
@ReactMethod

View File

@@ -23,13 +23,17 @@ import android.content.pm.PackageManager;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.module.annotations.ReactModule;
import java.util.HashMap;
import java.util.Map;
@ReactModule(name = AppInfoModule.NAME)
class AppInfoModule
extends ReactContextBaseJavaModule {
public static final String NAME = "AppInfo";
public AppInfoModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@@ -60,6 +64,9 @@ class AppInfoModule
Map<String, Object> constants = new HashMap<>();
constants.put(
"buildNumber",
packageInfo == null ? "" : String.valueOf(packageInfo.versionCode));
constants.put(
"name",
applicationInfo == null
@@ -68,12 +75,14 @@ class AppInfoModule
constants.put(
"version",
packageInfo == null ? "" : packageInfo.versionName);
constants.put("LIBRE_BUILD", BuildConfig.LIBRE_BUILD);
constants.put("GOOGLE_SERVICES_ENABLED", BuildConfig.GOOGLE_SERVICES_ENABLED);
return constants;
}
@Override
public String getName() {
return "AppInfo";
return NAME;
}
}

View File

@@ -0,0 +1,183 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import android.content.Context;
import android.media.AudioManager;
import android.os.Build;
import android.telecom.CallAudioState;
import androidx.annotation.RequiresApi;
import java.util.HashSet;
import java.util.Set;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* {@link AudioModeModule.AudioDeviceHandlerInterface} module implementing device handling for
* Android versions >= O when ConnectionService is enabled.
*/
@RequiresApi(Build.VERSION_CODES.O)
class AudioDeviceHandlerConnectionService implements
AudioModeModule.AudioDeviceHandlerInterface,
RNConnectionService.CallAudioStateListener {
private final static String TAG = AudioDeviceHandlerConnectionService.class.getSimpleName();
/**
* {@link AudioManager} instance used to interact with the Android audio subsystem.
*/
private AudioManager audioManager;
/**
* Reference to the main {@code AudioModeModule}.
*/
private AudioModeModule module;
/**
* Converts any of the "DEVICE_" constants into the corresponding
* {@link android.telecom.CallAudioState} "ROUTE_" number.
*
* @param audioDevice one of the "DEVICE_" constants.
* @return a route number {@link android.telecom.CallAudioState#ROUTE_EARPIECE} if
* no match is found.
*/
private static int audioDeviceToRouteInt(String audioDevice) {
if (audioDevice == null) {
return CallAudioState.ROUTE_SPEAKER;
}
switch (audioDevice) {
case AudioModeModule.DEVICE_BLUETOOTH:
return CallAudioState.ROUTE_BLUETOOTH;
case AudioModeModule.DEVICE_EARPIECE:
return CallAudioState.ROUTE_EARPIECE;
case AudioModeModule.DEVICE_HEADPHONES:
return CallAudioState.ROUTE_WIRED_HEADSET;
case AudioModeModule.DEVICE_SPEAKER:
return CallAudioState.ROUTE_SPEAKER;
default:
JitsiMeetLogger.e(TAG + " Unsupported device name: " + audioDevice);
return CallAudioState.ROUTE_SPEAKER;
}
}
/**
* Populates given route mask into the "DEVICE_" list.
*
* @param supportedRouteMask an integer coming from
* {@link android.telecom.CallAudioState#getSupportedRouteMask()}.
* @return a list of device names.
*/
private static Set<String> routesToDeviceNames(int supportedRouteMask) {
Set<String> devices = new HashSet<>();
if ((supportedRouteMask & CallAudioState.ROUTE_EARPIECE) == CallAudioState.ROUTE_EARPIECE) {
devices.add(AudioModeModule.DEVICE_EARPIECE);
}
if ((supportedRouteMask & CallAudioState.ROUTE_BLUETOOTH) == CallAudioState.ROUTE_BLUETOOTH) {
devices.add(AudioModeModule.DEVICE_BLUETOOTH);
}
if ((supportedRouteMask & CallAudioState.ROUTE_SPEAKER) == CallAudioState.ROUTE_SPEAKER) {
devices.add(AudioModeModule.DEVICE_SPEAKER);
}
if ((supportedRouteMask & CallAudioState.ROUTE_WIRED_HEADSET) == CallAudioState.ROUTE_WIRED_HEADSET) {
devices.add(AudioModeModule.DEVICE_HEADPHONES);
}
return devices;
}
/**
* Used to store the most recently reported audio devices.
* Makes it easier to compare for a change, because the devices are stored
* as a mask in the {@link android.telecom.CallAudioState}. The mask is populated into
* the {@code availableDevices} on each update.
*/
private int supportedRouteMask = -1;
public AudioDeviceHandlerConnectionService(AudioManager audioManager) {
this.audioManager = audioManager;
}
@Override
public void onCallAudioStateChange(final CallAudioState state) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
boolean audioRouteChanged
= audioDeviceToRouteInt(module.getSelectedDevice()) != state.getRoute();
int newSupportedRoutes = state.getSupportedRouteMask();
boolean audioDevicesChanged = supportedRouteMask != newSupportedRoutes;
if (audioDevicesChanged) {
supportedRouteMask = newSupportedRoutes;
Set<String> devices = routesToDeviceNames(supportedRouteMask);
module.replaceDevices(devices);
JitsiMeetLogger.i(TAG + " Available audio devices: " + devices.toString());
}
if (audioRouteChanged || audioDevicesChanged) {
module.resetSelectedDevice();
module.updateAudioRoute();
}
}
});
}
@Override
public void start(AudioModeModule audioModeModule) {
JitsiMeetLogger.i("Using " + TAG + " as the audio device handler");
module = audioModeModule;
RNConnectionService rcs = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
if (rcs != null) {
rcs.setCallAudioStateListener(this);
} else {
JitsiMeetLogger.w(TAG + " Couldn't set call audio state listener, module is null");
}
}
@Override
public void stop() {
RNConnectionService rcs = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
if (rcs != null) {
rcs.setCallAudioStateListener(null);
} else {
JitsiMeetLogger.w(TAG + " Couldn't set call audio state listener, module is null");
}
}
public void setAudioRoute(String audioDevice) {
int newAudioRoute = audioDeviceToRouteInt(audioDevice);
RNConnectionService.setAudioRoute(newAudioRoute);
}
@Override
public boolean setMode(int mode) {
if (mode != AudioModeModule.DEFAULT) {
// This shouldn't be needed when using ConnectionService, but some devices have been
// observed not doing it.
try {
audioManager.setMicrophoneMute(false);
} catch (Throwable tr) {
JitsiMeetLogger.w(tr, TAG + " Failed to unmute the microphone");
}
}
return true;
}
}

View File

@@ -0,0 +1,231 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import android.content.Context;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.os.Build;
import androidx.annotation.RequiresApi;
import java.util.HashSet;
import java.util.Set;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* {@link AudioModeModule.AudioDeviceHandlerInterface} module implementing device handling for
* all post-M Android versions. This handler can be used on any Android versions >= M, but by
* default it's only used on versions < O, since versions >= O use ConnectionService, but it
* can be disabled.
*/
@RequiresApi(Build.VERSION_CODES.M)
class AudioDeviceHandlerGeneric implements
AudioModeModule.AudioDeviceHandlerInterface,
AudioManager.OnAudioFocusChangeListener {
private final static String TAG = AudioDeviceHandlerGeneric.class.getSimpleName();
/**
* Reference to the main {@code AudioModeModule}.
*/
private AudioModeModule module;
/**
* Constant defining a USB headset. Only available on API level >= 26.
* The value of: AudioDeviceInfo.TYPE_USB_HEADSET
*/
private static final int TYPE_USB_HEADSET = 22;
/**
* Indicator that we have lost audio focus.
*/
private boolean audioFocusLost = false;
/**
* {@link AudioManager} instance used to interact with the Android audio
* subsystem.
*/
private AudioManager audioManager;
/**
* {@link Runnable} for running audio device detection the main thread.
* This is only used on Android >= M.
*/
private final Runnable onAudioDeviceChangeRunner = new Runnable() {
@Override
public void run() {
Set<String> devices = new HashSet<>();
AudioDeviceInfo[] deviceInfos = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
for (AudioDeviceInfo info: deviceInfos) {
switch (info.getType()) {
case AudioDeviceInfo.TYPE_BLUETOOTH_SCO:
devices.add(AudioModeModule.DEVICE_BLUETOOTH);
break;
case AudioDeviceInfo.TYPE_BUILTIN_EARPIECE:
devices.add(AudioModeModule.DEVICE_EARPIECE);
break;
case AudioDeviceInfo.TYPE_BUILTIN_SPEAKER:
devices.add(AudioModeModule.DEVICE_SPEAKER);
break;
case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
case AudioDeviceInfo.TYPE_WIRED_HEADSET:
case TYPE_USB_HEADSET:
devices.add(AudioModeModule.DEVICE_HEADPHONES);
break;
}
}
module.replaceDevices(devices);
JitsiMeetLogger.i(TAG + " Available audio devices: " + devices.toString());
module.updateAudioRoute();
}
};
private final android.media.AudioDeviceCallback audioDeviceCallback =
new android.media.AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(
AudioDeviceInfo[] addedDevices) {
JitsiMeetLogger.d(TAG + " Audio devices added");
onAudioDeviceChange();
}
@Override
public void onAudioDevicesRemoved(
AudioDeviceInfo[] removedDevices) {
JitsiMeetLogger.d(TAG + " Audio devices removed");
onAudioDeviceChange();
}
};
public AudioDeviceHandlerGeneric(AudioManager audioManager) {
this.audioManager = audioManager;
}
/**
* Helper method to trigger an audio route update when devices change. It
* makes sure the operation is performed on the audio thread.
*/
private void onAudioDeviceChange() {
module.runInAudioThread(onAudioDeviceChangeRunner);
}
/**
* {@link AudioManager.OnAudioFocusChangeListener} interface method. Called
* when the audio focus of the system is updated.
*
* @param focusChange - The type of focus change.
*/
@Override
public void onAudioFocusChange(final int focusChange) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN: {
JitsiMeetLogger.d(TAG + " Audio focus gained");
// Some other application potentially stole our audio focus
// temporarily. Restore our mode.
if (audioFocusLost) {
module.updateAudioRoute();
}
audioFocusLost = false;
break;
}
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: {
JitsiMeetLogger.d(TAG + " Audio focus lost");
audioFocusLost = true;
break;
}
}
}
});
}
/**
* Helper method to set the output route to a Bluetooth device.
*
* @param enabled true if Bluetooth should use used, false otherwise.
*/
private void setBluetoothAudioRoute(boolean enabled) {
if (enabled) {
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
} else {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();
}
}
@Override
public void start(AudioModeModule audioModeModule) {
JitsiMeetLogger.i("Using " + TAG + " as the audio device handler");
module = audioModeModule;
// Setup runtime device change detection.
audioManager.registerAudioDeviceCallback(audioDeviceCallback, null);
// Do an initial detection.
onAudioDeviceChange();
}
@Override
public void stop() {
audioManager.unregisterAudioDeviceCallback(audioDeviceCallback);
}
@Override
public void setAudioRoute(String device) {
// Turn speaker on / off
audioManager.setSpeakerphoneOn(device.equals(AudioModeModule.DEVICE_SPEAKER));
// Turn bluetooth on / off
setBluetoothAudioRoute(device.equals(AudioModeModule.DEVICE_BLUETOOTH));
}
@Override
public boolean setMode(int mode) {
if (mode == AudioModeModule.DEFAULT) {
audioFocusLost = false;
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(this);
audioManager.setSpeakerphoneOn(false);
setBluetoothAudioRoute(false);
return true;
}
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
if (audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
JitsiMeetLogger.w(TAG + " Audio focus request failed");
return false;
}
return true;
}
}

View File

@@ -0,0 +1,230 @@
/*
* Copyright @ 2017-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* {@link AudioModeModule.AudioDeviceHandlerInterface} module implementing device handling for
* legacy (pre-M) Android versions.
*/
class AudioDeviceHandlerLegacy implements
AudioModeModule.AudioDeviceHandlerInterface,
AudioManager.OnAudioFocusChangeListener,
BluetoothHeadsetMonitor.Listener {
private final static String TAG = AudioDeviceHandlerLegacy.class.getSimpleName();
/**
* Reference to the main {@code AudioModeModule}.
*/
private AudioModeModule module;
/**
* Indicator that we have lost audio focus.
*/
private boolean audioFocusLost = false;
/**
* {@link AudioManager} instance used to interact with the Android audio
* subsystem.
*/
private AudioManager audioManager;
/**
* {@link BluetoothHeadsetMonitor} for detecting Bluetooth device changes in
* old (< M) Android versions.
*/
private BluetoothHeadsetMonitor bluetoothHeadsetMonitor;
public AudioDeviceHandlerLegacy(AudioManager audioManager) {
this.audioManager = audioManager;
}
/**
* Helper method to trigger an audio route update when Bluetooth devices are
* connected / disconnected.
*/
@Override
public void onBluetoothDeviceChange(final boolean deviceAvailable) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
if (deviceAvailable) {
module.addDevice(AudioModeModule.DEVICE_BLUETOOTH);
} else {
module.removeDevice(AudioModeModule.DEVICE_BLUETOOTH);
}
module.updateAudioRoute();
}
});
}
/**
* Helper method to trigger an audio route update when a headset is plugged
* or unplugged.
*/
private void onHeadsetDeviceChange() {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
// XXX: isWiredHeadsetOn is not deprecated when used just for
// knowing if there is a wired headset connected, regardless of
// audio being routed to it.
//noinspection deprecation
if (audioManager.isWiredHeadsetOn()) {
module.addDevice(AudioModeModule.DEVICE_HEADPHONES);
} else {
module.removeDevice(AudioModeModule.DEVICE_HEADPHONES);
}
module.updateAudioRoute();
}
});
}
/**
* {@link AudioManager.OnAudioFocusChangeListener} interface method. Called
* when the audio focus of the system is updated.
*
* @param focusChange - The type of focus change.
*/
@Override
public void onAudioFocusChange(final int focusChange) {
module.runInAudioThread(new Runnable() {
@Override
public void run() {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN: {
JitsiMeetLogger.d(TAG + " Audio focus gained");
// Some other application potentially stole our audio focus
// temporarily. Restore our mode.
if (audioFocusLost) {
module.updateAudioRoute();
}
audioFocusLost = false;
break;
}
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: {
JitsiMeetLogger.d(TAG + " Audio focus lost");
audioFocusLost = true;
break;
}
}
}
});
}
/**
* Helper method to set the output route to a Bluetooth device.
*
* @param enabled true if Bluetooth should use used, false otherwise.
*/
private void setBluetoothAudioRoute(boolean enabled) {
if (enabled) {
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
} else {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();
}
}
@Override
public void start(AudioModeModule audioModeModule) {
JitsiMeetLogger.i("Using " + TAG + " as the audio device handler");
module = audioModeModule;
Context context = module.getContext();
// Setup runtime device change detection.
//
// Detect changes in wired headset connections.
IntentFilter wiredHeadSetFilter = new IntentFilter(AudioManager.ACTION_HEADSET_PLUG);
BroadcastReceiver wiredHeadsetReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
JitsiMeetLogger.d(TAG + " Wired headset added / removed");
onHeadsetDeviceChange();
}
};
context.registerReceiver(wiredHeadsetReceiver, wiredHeadSetFilter);
// Detect Bluetooth device changes.
bluetoothHeadsetMonitor = new BluetoothHeadsetMonitor(context, this);
// On Android < M, detect if we have an earpiece.
PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
module.addDevice(AudioModeModule.DEVICE_EARPIECE);
}
// Always assume there is a speaker.
module.addDevice(AudioModeModule.DEVICE_SPEAKER);
}
@Override
public void stop() {
bluetoothHeadsetMonitor.stop();
bluetoothHeadsetMonitor = null;
}
@Override
public void setAudioRoute(String device) {
// Turn speaker on / off
audioManager.setSpeakerphoneOn(device.equals(AudioModeModule.DEVICE_SPEAKER));
// Turn bluetooth on / off
setBluetoothAudioRoute(device.equals(AudioModeModule.DEVICE_BLUETOOTH));
}
@Override
public boolean setMode(int mode) {
if (mode == AudioModeModule.DEFAULT) {
audioFocusLost = false;
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(this);
audioManager.setSpeakerphoneOn(false);
setBluetoothAudioRoute(false);
return true;
}
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
if (audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
JitsiMeetLogger.w(TAG + " Audio focus request failed");
return false;
}
return true;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
* Copyright @ 2017-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.
@@ -16,16 +16,9 @@
package org.jitsi.meet.sdk;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.os.Build;
import android.util.Log;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
@@ -34,6 +27,9 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
import java.util.HashSet;
@@ -57,9 +53,9 @@ import java.util.concurrent.Executors;
* Before a call has started and after it has ended the
* {@code AudioModeModule.DEFAULT} mode should be used.
*/
class AudioModeModule
extends ReactContextBaseJavaModule
implements AudioManager.OnAudioFocusChangeListener {
@ReactModule(name = AudioModeModule.NAME)
class AudioModeModule extends ReactContextBaseJavaModule {
public static final String NAME = "AudioMode";
/**
* Constants representing the audio mode.
@@ -70,116 +66,39 @@ class AudioModeModule
* - VIDEO_CALL: Used for video calls. It will use the speaker by default,
* unless a wired or Bluetooth headset is connected.
*/
private static final int DEFAULT = 0;
private static final int AUDIO_CALL = 1;
private static final int VIDEO_CALL = 2;
/**
* Constant defining the action for plugging in a headset. This is used on
* our device detection system for API < 23.
*/
private static final String ACTION_HEADSET_PLUG
= (Build.VERSION.SDK_INT >= 21)
? AudioManager.ACTION_HEADSET_PLUG
: Intent.ACTION_HEADSET_PLUG;
/**
* Constant defining a USB headset. Only available on API level >= 26.
* The value of: AudioDeviceInfo.TYPE_USB_HEADSET
*/
private static final int TYPE_USB_HEADSET = 22;
/**
* The name of {@code AudioModeModule} to be used in the React Native
* bridge.
*/
private static final String MODULE_NAME = "AudioMode";
static final int DEFAULT = 0;
static final int AUDIO_CALL = 1;
static final int VIDEO_CALL = 2;
/**
* The {@code Log} tag {@code AudioModeModule} is to log messages with.
*/
static final String TAG = MODULE_NAME;
static final String TAG = NAME;
/**
* Indicator that we have lost audio focus.
* Whether or not the ConnectionService is used for selecting audio devices.
*/
private boolean audioFocusLost = false;
private static final boolean supportsConnectionService = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
private static boolean useConnectionService_ = supportsConnectionService;
static boolean useConnectionService() {
return supportsConnectionService && useConnectionService_;
}
/**
* {@link AudioManager} instance used to interact with the Android audio
* subsystem.
*/
private final AudioManager audioManager;
private AudioManager audioManager;
/**
* {@link BluetoothHeadsetMonitor} for detecting Bluetooth device changes in
* old (< M) Android versions.
*/
private BluetoothHeadsetMonitor bluetoothHeadsetMonitor;
private AudioDeviceHandlerInterface audioDeviceHandler;
/**
* {@link ExecutorService} for running all audio operations on a dedicated
* thread.
*/
private static final ExecutorService executor
= Executors.newSingleThreadExecutor();
/**
* {@link Runnable} for running audio device detection the main thread.
* This is only used on Android >= M.
*/
private final Runnable onAudioDeviceChangeRunner = new Runnable() {
@TargetApi(Build.VERSION_CODES.M)
@Override
public void run() {
Set<String> devices = new HashSet<>();
AudioDeviceInfo[] deviceInfos
= audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
for (AudioDeviceInfo info: deviceInfos) {
switch (info.getType()) {
case AudioDeviceInfo.TYPE_BLUETOOTH_SCO:
devices.add(DEVICE_BLUETOOTH);
break;
case AudioDeviceInfo.TYPE_BUILTIN_EARPIECE:
devices.add(DEVICE_EARPIECE);
break;
case AudioDeviceInfo.TYPE_BUILTIN_SPEAKER:
devices.add(DEVICE_SPEAKER);
break;
case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
case AudioDeviceInfo.TYPE_WIRED_HEADSET:
case TYPE_USB_HEADSET:
devices.add(DEVICE_HEADPHONES);
break;
}
}
availableDevices = devices;
Log.d(TAG, "Available audio devices: " +
availableDevices.toString());
// Reset user selection
userSelectedDevice = null;
if (mode != -1) {
updateAudioRoute(mode);
}
}
};
/**
* {@link Runnable} for running update operation on the main thread.
*/
private final Runnable updateAudioRouteRunner
= new Runnable() {
@Override
public void run() {
if (mode != -1) {
updateAudioRoute(mode);
}
}
};
private static final ExecutorService executor = Executors.newSingleThreadExecutor();
/**
* Audio mode currently in use.
@@ -189,10 +108,15 @@ class AudioModeModule
/**
* Audio device types.
*/
private static final String DEVICE_BLUETOOTH = "BLUETOOTH";
private static final String DEVICE_EARPIECE = "EARPIECE";
private static final String DEVICE_HEADPHONES = "HEADPHONES";
private static final String DEVICE_SPEAKER = "SPEAKER";
static final String DEVICE_BLUETOOTH = "BLUETOOTH";
static final String DEVICE_EARPIECE = "EARPIECE";
static final String DEVICE_HEADPHONES = "HEADPHONES";
static final String DEVICE_SPEAKER = "SPEAKER";
/**
* Device change event.
*/
private static final String DEVICE_CHANGE_EVENT = "org.jitsi.meet:features/audio-mode#devices-update";
/**
* List of currently available audio devices.
@@ -220,26 +144,7 @@ class AudioModeModule
public AudioModeModule(ReactApplicationContext reactContext) {
super(reactContext);
audioManager
= (AudioManager)
reactContext.getSystemService(Context.AUDIO_SERVICE);
// Setup runtime device change detection.
setupAudioRouteChangeDetection();
// Do an initial detection on Android >= M.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
runInAudioThread(onAudioDeviceChangeRunner);
} else {
// On Android < M, detect if we have an earpiece.
PackageManager pm = reactContext.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
availableDevices.add(DEVICE_EARPIECE);
}
// Always assume there is a speaker.
availableDevices.add(DEVICE_SPEAKER);
}
audioManager = (AudioManager)reactContext.getSystemService(Context.AUDIO_SERVICE);
}
/**
@@ -252,6 +157,7 @@ class AudioModeModule
public Map<String, Object> getConstants() {
Map<String, Object> constants = new HashMap<>();
constants.put("DEVICE_CHANGE_EVENT", DEVICE_CHANGE_EVENT);
constants.put("AUDIO_CALL", AUDIO_CALL);
constants.put("DEFAULT", DEFAULT);
constants.put("VIDEO_CALL", VIDEO_CALL);
@@ -260,31 +166,26 @@ class AudioModeModule
}
/**
* Gets the list of available audio device categories, i.e. 'bluetooth',
* 'earpiece ', 'speaker', 'headphones'.
*
* @param promise a {@link Promise} which will be resolved with an object
* containing a 'devices' key with a list of devices, plus a
* 'selected' key with the selected one.
* Notifies JS land that the devices list has changed.
*/
@ReactMethod
public void getAudioDevices(final Promise promise) {
private void notifyDevicesChanged() {
runInAudioThread(new Runnable() {
@Override
public void run() {
WritableMap map = Arguments.createMap();
map.putString("selected", selectedDevice);
WritableArray devices = Arguments.createArray();
WritableArray data = Arguments.createArray();
final boolean hasHeadphones = availableDevices.contains(DEVICE_HEADPHONES);
for (String device : availableDevices) {
if (mode == VIDEO_CALL && device.equals(DEVICE_EARPIECE)) {
// Skip earpiece when in video call mode.
if (hasHeadphones && device.equals(DEVICE_EARPIECE)) {
// Skip earpiece when headphones are plugged in.
continue;
}
devices.pushString(device);
WritableMap deviceInfo = Arguments.createMap();
deviceInfo.putString("type", device);
deviceInfo.putBoolean("selected", device.equals(selectedDevice));
data.pushMap(deviceInfo);
}
map.putArray("devices", devices);
promise.resolve(map);
ReactInstanceManagerHolder.emitEvent(DEVICE_CHANGE_EVENT, data);
JitsiMeetLogger.i(TAG + " Updating audio device list");
}
});
}
@@ -296,99 +197,45 @@ class AudioModeModule
*/
@Override
public String getName() {
return MODULE_NAME;
return NAME;
}
/**
* Helper method to trigger an audio route update when devices change. It
* makes sure the operation is performed on the main thread.
*
* Only used on Android >= M.
* Initializes the audio device handler module. This function is called *after* all Catalyst
* modules have been created, and that's why we use it, because {@link AudioDeviceHandlerConnectionService}
* needs access to another Catalyst module, so doing this in the constructor would be too early.
*/
void onAudioDeviceChange() {
runInAudioThread(onAudioDeviceChangeRunner);
}
/**
* Helper method to trigger an audio route update when Bluetooth devices are
* connected / disconnected.
*
* Only used on Android < M. Runs on the main thread.
*/
void onBluetoothDeviceChange() {
if (bluetoothHeadsetMonitor != null && bluetoothHeadsetMonitor.isHeadsetAvailable()) {
availableDevices.add(DEVICE_BLUETOOTH);
} else {
availableDevices.remove(DEVICE_BLUETOOTH);
}
if (mode != -1) {
updateAudioRoute(mode);
}
}
/**
* Helper method to trigger an audio route update when a headset is plugged
* or unplugged.
*
* Only used on Android < M.
*/
void onHeadsetDeviceChange() {
@Override
public void initialize() {
runInAudioThread(new Runnable() {
@Override
public void run() {
// XXX: isWiredHeadsetOn is not deprecated when used just for
// knowing if there is a wired headset connected, regardless of
// audio being routed to it.
//noinspection deprecation
if (audioManager.isWiredHeadsetOn()) {
availableDevices.add(DEVICE_HEADPHONES);
} else {
availableDevices.remove(DEVICE_HEADPHONES);
}
if (mode != -1) {
updateAudioRoute(mode);
}
setAudioDeviceHandler();
}
});
}
/**
* {@link AudioManager.OnAudioFocusChangeListener} interface method. Called
* when the audio focus of the system is updated.
*
* @param focusChange - The type of focus change.
*/
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN: {
Log.d(TAG, "Audio focus gained");
// Some other application potentially stole our audio focus
// temporarily. Restore our mode.
if (audioFocusLost) {
updateAudioRoute(mode);
}
audioFocusLost = false;
break;
}
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: {
Log.d(TAG, "Audio focus lost");
audioFocusLost = true;
break;
private void setAudioDeviceHandler() {
if (audioDeviceHandler != null) {
audioDeviceHandler.stop();
}
if (useConnectionService()) {
audioDeviceHandler = new AudioDeviceHandlerConnectionService(audioManager);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
audioDeviceHandler = new AudioDeviceHandlerGeneric(audioManager);
} else {
audioDeviceHandler = new AudioDeviceHandlerLegacy(audioManager);
}
audioDeviceHandler.start(this);
}
/**
* Helper function to run operations on a dedicated thread.
* @param runnable
*/
public void runInAudioThread(Runnable runnable) {
void runInAudioThread(Runnable runnable) {
executor.execute(runnable);
}
@@ -403,13 +250,13 @@ class AudioModeModule
@Override
public void run() {
if (!availableDevices.contains(device)) {
Log.d(TAG, "Audio device not available: " + device);
JitsiMeetLogger.w(TAG + " Audio device not available: " + device);
userSelectedDevice = null;
return;
}
if (mode != -1) {
Log.d(TAG, "User selected device set to: " + device);
JitsiMeetLogger.i(TAG + " User selected device set to: " + device);
userSelectedDevice = device;
updateAudioRoute(mode);
}
@@ -417,21 +264,6 @@ class AudioModeModule
});
}
/**
* Helper method to set the output route to a Bluetooth device.
*
* @param enabled true if Bluetooth should use used, false otherwise.
*/
private void setBluetoothAudioRoute(boolean enabled) {
if (enabled) {
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
} else {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();
}
}
/**
* Public method to set the current audio mode.
*
@@ -446,7 +278,7 @@ class AudioModeModule
return;
}
Runnable r = new Runnable() {
runInAudioThread(new Runnable() {
@Override
public void run() {
boolean success;
@@ -455,80 +287,33 @@ class AudioModeModule
success = updateAudioRoute(mode);
} catch (Throwable e) {
success = false;
Log.e(
TAG,
"Failed to update audio route for mode: " + mode,
e);
JitsiMeetLogger.e(e, TAG + " Failed to update audio route for mode: " + mode);
}
if (success) {
AudioModeModule.this.mode = mode;
promise.resolve(null);
} else {
promise.reject(
"setMode",
"Failed to set audio mode to " + mode);
promise.reject("setMode", "Failed to set audio mode to " + mode);
}
}
};
runInAudioThread(r);
});
}
/**
* Setup the audio route change detection mechanism. We use the
* {@link android.media.AudioDeviceCallback} API on Android >= 23 only.
* Sets whether ConnectionService should be used (if available) for setting the audio mode
* or not.
*
* @param use Boolean indicator of where it should be used or not.
*/
private void setupAudioRouteChangeDetection() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setupAudioRouteChangeDetectionM();
} else {
setupAudioRouteChangeDetectionPreM();
}
}
/**
* Audio route change detection mechanism for Android API >= 23.
*/
@TargetApi(Build.VERSION_CODES.M)
private void setupAudioRouteChangeDetectionM() {
android.media.AudioDeviceCallback audioDeviceCallback =
new android.media.AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(
AudioDeviceInfo[] addedDevices) {
Log.d(TAG, "Audio devices added");
onAudioDeviceChange();
}
@Override
public void onAudioDevicesRemoved(
AudioDeviceInfo[] removedDevices) {
Log.d(TAG, "Audio devices removed");
onAudioDeviceChange();
}
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback, null);
}
/**
* Audio route change detection mechanism for Android API < 23.
*/
private void setupAudioRouteChangeDetectionPreM() {
Context context = getReactApplicationContext();
// Detect changes in wired headset connections.
IntentFilter wiredHeadSetFilter = new IntentFilter(ACTION_HEADSET_PLUG);
BroadcastReceiver wiredHeadsetReceiver = new BroadcastReceiver() {
@ReactMethod
public void setUseConnectionService(final boolean use) {
runInAudioThread(new Runnable() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Wired headset added / removed");
onHeadsetDeviceChange();
public void run() {
useConnectionService_ = use;
setAudioDeviceHandler();
}
};
context.registerReceiver(wiredHeadsetReceiver, wiredHeadSetFilter);
// Detect Bluetooth device changes.
bluetoothHeadsetMonitor = new BluetoothHeadsetMonitor(this, context);
});
}
/**
@@ -539,34 +324,21 @@ class AudioModeModule
* {@code false}, otherwise.
*/
private boolean updateAudioRoute(int mode) {
Log.d(TAG, "Update audio route for mode: " + mode);
JitsiMeetLogger.i(TAG + " Update audio route for mode: " + mode);
if (mode == DEFAULT) {
audioFocusLost = false;
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(this);
audioManager.setSpeakerphoneOn(false);
setBluetoothAudioRoute(false);
selectedDevice = null;
userSelectedDevice = null;
return true;
}
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
if (audioManager.requestAudioFocus(
this,
AudioManager.STREAM_VOICE_CALL,
AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
Log.d(TAG, "Audio focus request failed");
if (!audioDeviceHandler.setMode(mode)) {
return false;
}
if (mode == DEFAULT) {
selectedDevice = null;
userSelectedDevice = null;
notifyDevicesChanged();
return true;
}
boolean bluetoothAvailable = availableDevices.contains(DEVICE_BLUETOOTH);
boolean earpieceAvailable = availableDevices.contains(DEVICE_EARPIECE);
boolean headsetAvailable = availableDevices.contains(DEVICE_HEADPHONES);
// Pick the desired device based on what's available and the mode.
@@ -575,15 +347,12 @@ class AudioModeModule
audioDevice = DEVICE_BLUETOOTH;
} else if (headsetAvailable) {
audioDevice = DEVICE_HEADPHONES;
} else if (mode == AUDIO_CALL && earpieceAvailable) {
audioDevice = DEVICE_EARPIECE;
} else {
audioDevice = DEVICE_SPEAKER;
}
// Consider the user's selection
if (userSelectedDevice != null
&& availableDevices.contains(userSelectedDevice)) {
if (userSelectedDevice != null && availableDevices.contains(userSelectedDevice)) {
audioDevice = userSelectedDevice;
}
@@ -594,14 +363,107 @@ class AudioModeModule
}
selectedDevice = audioDevice;
Log.d(TAG, "Selected audio device: " + audioDevice);
JitsiMeetLogger.i(TAG + " Selected audio device: " + audioDevice);
// Turn bluetooth on / off
setBluetoothAudioRoute(audioDevice.equals(DEVICE_BLUETOOTH));
// Turn speaker on / off
audioManager.setSpeakerphoneOn(audioDevice.equals(DEVICE_SPEAKER));
audioDeviceHandler.setAudioRoute(audioDevice);
notifyDevicesChanged();
return true;
}
/**
* Gets the currently selected audio device.
*
* @return The selected audio device.
*/
String getSelectedDevice() {
return selectedDevice;
}
/**
* Resets the current device selection.
*/
void resetSelectedDevice() {
selectedDevice = null;
userSelectedDevice = null;
}
/**
* Adds a new device to the list of available devices.
*
* @param device The new device.
*/
void addDevice(String device) {
availableDevices.add(device);
resetSelectedDevice();
}
/**
* Removes a device from the list of available devices.
*
* @param device The old device to the removed.
*/
void removeDevice(String device) {
availableDevices.remove(device);
resetSelectedDevice();
}
/**
* Replaces the current list of available devices with a new one.
*
* @param devices The new devices list.
*/
void replaceDevices(Set<String> devices) {
availableDevices = devices;
resetSelectedDevice();
}
/**
* Re-sets the current audio route. Needed when devices changes have happened.
*/
void updateAudioRoute() {
if (mode != -1) {
updateAudioRoute(mode);
}
}
/**
* Needed on the legacy handler...
*
* @return Context for the application.
*/
Context getContext() {
return getReactApplicationContext();
}
/**
* Interface for the modules implementing the actual audio device management.
*/
interface AudioDeviceHandlerInterface {
/**
* Start detecting audio device changes.
* @param audioModeModule Reference to the main {@link AudioModeModule}.
*/
void start(AudioModeModule audioModeModule);
/**
* Stop audio device detection.
*/
void stop();
/**
* Set the appropriate route for the given audio device.
*
* @param device Audio device for which the route must be set.
*/
void setAudioRoute(String device);
/**
* Set the given audio mode.
*
* @param mode The new audio mode to be used.
* @return Whether the operation was successful or not.
*/
boolean setMode(int mode);
}
}

View File

@@ -1,5 +1,6 @@
/*
* Copyright @ 2018-present Atlassian Pty Ltd
* Copyright @ 2018-present 8x8, Inc.
* Copyright @ 2018 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.
@@ -19,16 +20,16 @@ package org.jitsi.meet.sdk;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.react.ReactRootView;
import com.facebook.react.bridge.ReadableMap;
import com.rnimmersive.RNImmersiveModule;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
@@ -77,6 +78,15 @@ public abstract class BaseReactView<ListenerT>
return null;
}
/**
* Gets all registered React views.
*
* @return An {@link ArrayList} containing all views currently held by React.
*/
static ArrayList<BaseReactView> getViews() {
return new ArrayList<>(views);
}
/**
* The unique identifier of this {@code BaseReactView} within the process
* for the purposes of {@link ExternalAPIModule}. The name scope was
@@ -101,8 +111,7 @@ public abstract class BaseReactView<ListenerT>
setBackgroundColor(BACKGROUND_COLOR);
ReactInstanceManagerHolder.initReactInstanceManager(
((Activity) context).getApplication());
ReactInstanceManagerHolder.initReactInstanceManager((Activity)context);
// Hook this BaseReactView into ExternalAPI.
externalAPIScope = UUID.randomUUID().toString();
@@ -170,7 +179,7 @@ public abstract class BaseReactView<ListenerT>
* @param data - The details of the event associated with/specific to the
* specified {@code name}.
*/
public abstract void onExternalAPIEvent(String name, ReadableMap data);
protected abstract void onExternalAPIEvent(String name, ReadableMap data);
protected void onExternalAPIEvent(
Map<String, Method> listenerMethods,
@@ -194,29 +203,10 @@ public abstract class BaseReactView<ListenerT>
super.onWindowFocusChanged(hasFocus);
// https://github.com/mockingbot/react-native-immersive#restore-immersive-state
// FIXME The singleton pattern employed by RNImmersiveModule is not
// advisable because a react-native mobule is consumable only after its
// BaseJavaModule#initialize() has completed and here we have no
// knowledge of whether the precondition is really met.
RNImmersiveModule immersive = RNImmersiveModule.getInstance();
if (hasFocus && immersive != null) {
try {
immersive.emitImmersiveStateChangeEvent();
} catch (RuntimeException re) {
// FIXME I don't know how to check myself whether
// BaseJavaModule#initialize() has been invoked and thus
// RNImmersiveModule is consumable. A safe workaround is to
// swallow the failure because the whole full-screen/immersive
// functionality is brittle anyway, akin to the icing on the
// cake, and has been working without onWindowFocusChanged for a
// very long time.
Log.e(
"RNImmersiveModule",
"emitImmersiveStateChangeEvent() failed!",
re);
}
immersive.emitImmersiveStateChangeEvent();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
* Copyright @ 2017-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.
@@ -24,7 +24,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.util.Log;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* Helper class to detect and handle Bluetooth device changes. It monitors
@@ -32,68 +33,43 @@ import android.util.Log;
* about device changes when this occurs.
*/
class BluetoothHeadsetMonitor {
/**
* {@link AudioModeModule} where this monitor reports.
*/
private final AudioModeModule audioModeModule;
private final static String TAG = BluetoothHeadsetMonitor.class.getSimpleName();
/**
* The {@link Context} in which {@link #audioModeModule} executes.
* The {@link Context} in which this module executes.
*/
private final Context context;
/**
* Reference to the {@link BluetoothAdapter} object, used to access Bluetooth functionality.
*/
private BluetoothAdapter adapter;
/**
* Reference to a proxy object which allows us to query connected devices.
*/
private BluetoothHeadset headset;
/**
* Flag indicating if there are any Bluetooth headset devices currently
* available.
* receiver registered for receiving Bluetooth connection state changes.
*/
private boolean headsetAvailable = false;
private BroadcastReceiver receiver;
/**
* Helper for running Bluetooth operations on the main thread.
* Listener for receiving Bluetooth device change events.
*/
private final Runnable updateDevicesRunnable
= new Runnable() {
@Override
public void run() {
headsetAvailable
= (headset != null)
&& !headset.getConnectedDevices().isEmpty();
audioModeModule.onBluetoothDeviceChange();
}
};
private Listener listener;
public BluetoothHeadsetMonitor(
AudioModeModule audioModeModule,
Context context) {
this.audioModeModule = audioModeModule;
public BluetoothHeadsetMonitor(Context context, Listener listener) {
this.context = context;
AudioManager audioManager
= (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (!audioManager.isBluetoothScoAvailableOffCall()) {
Log.w(AudioModeModule.TAG, "Bluetooth SCO is not available");
return;
}
if (getBluetoothHeadsetProfileProxy()) {
registerBluetoothReceiver();
// Initial detection.
updateDevices();
}
this.listener = listener;
}
private boolean getBluetoothHeadsetProfileProxy() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null) {
Log.w(AudioModeModule.TAG, "Device doesn't support Bluetooth");
JitsiMeetLogger.w(TAG + " Device doesn't support Bluetooth");
return false;
}
@@ -103,9 +79,7 @@ class BluetoothHeadsetMonitor {
BluetoothProfile.ServiceListener listener
= new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(
int profile,
BluetoothProfile proxy) {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
headset = (BluetoothHeadset) proxy;
updateDevices();
@@ -119,21 +93,7 @@ class BluetoothHeadsetMonitor {
}
};
return
adapter.getProfileProxy(
context,
listener,
BluetoothProfile.HEADSET);
}
/**
* Returns the current headset availability.
*
* @return {@code true} if there is a Bluetooth headset connected;
* {@code false}, otherwise.
*/
public boolean isHeadsetAvailable() {
return headsetAvailable;
return adapter.getProfileProxy(context, listener, BluetoothProfile.HEADSET);
}
private void onBluetoothReceiverReceive(Context context, Intent intent) {
@@ -148,9 +108,7 @@ class BluetoothHeadsetMonitor {
switch (state) {
case BluetoothHeadset.STATE_CONNECTED:
case BluetoothHeadset.STATE_DISCONNECTED:
Log.d(
AudioModeModule.TAG,
"BT headset connection state changed: " + state);
JitsiMeetLogger.d(TAG + " BT headset connection state changed: " + state);
updateDevices();
break;
}
@@ -158,15 +116,12 @@ class BluetoothHeadsetMonitor {
// XXX: This action will be fired when the connection established
// with a Bluetooth headset (called a SCO connection) changes state.
// When the SCO connection is active we route audio to it.
int state
= intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -99);
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -99);
switch (state) {
case AudioManager.SCO_AUDIO_STATE_CONNECTED:
case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
Log.d(
AudioModeModule.TAG,
"BT SCO connection state changed: " + state);
JitsiMeetLogger.d(TAG + " BT SCO connection state changed: " + state);
updateDevices();
break;
}
@@ -174,24 +129,63 @@ class BluetoothHeadsetMonitor {
}
private void registerBluetoothReceiver() {
BroadcastReceiver receiver = new BroadcastReceiver() {
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
onBluetoothReceiverReceive(context, intent);
}
};
IntentFilter filter = new IntentFilter();
IntentFilter filter = new IntentFilter();
filter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
context.registerReceiver(receiver, filter);
}
/**
* Detects if there are new devices connected / disconnected and fires the
* {@link AudioModeModule#onAudioDeviceChange()} callback.
* {@link Listener} registered event.
*/
private void updateDevices() {
audioModeModule.runInAudioThread(updateDevicesRunnable);
boolean headsetAvailable = (headset != null) && !headset.getConnectedDevices().isEmpty();
listener.onBluetoothDeviceChange(headsetAvailable);
}
public void start() {
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (!audioManager.isBluetoothScoAvailableOffCall()) {
JitsiMeetLogger.w(TAG + " Bluetooth SCO is not available");
return;
}
if (!getBluetoothHeadsetProfileProxy()) {
JitsiMeetLogger.w(TAG + " Couldn't get BT profile proxy");
return;
}
registerBluetoothReceiver();
// Initial detection.
updateDevices();
}
public void stop() {
if (receiver != null) {
context.unregisterReceiver(receiver);
}
if (adapter != null && headset != null) {
adapter.closeProfileProxy(BluetoothProfile.HEADSET, headset);
}
receiver = null;
headset = null;
adapter = null;
}
interface Listener {
void onBluetoothDeviceChange(boolean deviceAvailable);
}
}

View File

@@ -0,0 +1,452 @@
package org.jitsi.meet.sdk;
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.telecom.CallAudioState;
import android.telecom.Connection;
import android.telecom.ConnectionRequest;
import android.telecom.DisconnectCause;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telecom.VideoProfile;
import androidx.annotation.RequiresApi;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableNativeMap;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* Jitsi Meet implementation of {@link ConnectionService}. At the time of this
* writing it implements only the outgoing call scenario.
*
* NOTE the class needs to be public, but is not part of the SDK API and should
* never be used directly.
*
* @author Pawel Domas
*/
@RequiresApi(api = Build.VERSION_CODES.O)
public class ConnectionService extends android.telecom.ConnectionService {
/**
* Tag used for logging.
*/
static final String TAG = "JitsiConnectionService";
/**
* The extra added to the {@link ConnectionImpl} and
* {@link ConnectionRequest} which stores the {@link PhoneAccountHandle}
* created for the call.
*/
static final String EXTRA_PHONE_ACCOUNT_HANDLE
= "org.jitsi.meet.sdk.connection_service.PHONE_ACCOUNT_HANDLE";
/**
* Connections mapped by call UUID.
*/
static private final Map<String, ConnectionImpl> connections
= new HashMap<>();
/**
* The start call Promises mapped by call UUID.
*/
static private final HashMap<String, Promise> startCallPromises
= new HashMap<>();
/**
* Aborts all ongoing connections. This is a last resort mechanism which forces all resources to
* be freed on the system in case of fatal error.
*/
static void abortConnections() {
for (ConnectionImpl connection: getConnections()) {
connection.onAbort();
}
}
/**
* Adds {@link ConnectionImpl} to the list.
*
* @param connection - {@link ConnectionImpl}
*/
static void addConnection(ConnectionImpl connection) {
connections.put(connection.getCallUUID(), connection);
}
/**
* Returns all {@link ConnectionImpl} instances held in this list.
*
* @return a list of {@link ConnectionImpl}.
*/
static List<ConnectionImpl> getConnections() {
return new ArrayList<>(connections.values());
}
/**
* @return {@code true} if running a Samsung device.
*/
static boolean isSamsungDevice() {
return android.os.Build.MANUFACTURER.toLowerCase().contains("samsung");
}
/**
* Registers a start call promise.
*
* @param uuid - the call UUID to which the start call promise belongs to.
* @param promise - the Promise instance to be stored for later use.
*/
static void registerStartCallPromise(String uuid, Promise promise) {
startCallPromises.put(uuid, promise);
}
/**
* Removes {@link ConnectionImpl} from the list.
*
* @param connection - {@link ConnectionImpl}
*/
static void removeConnection(ConnectionImpl connection) {
connections.remove(connection.getCallUUID());
}
/**
* Used to adjusts the connection's state to
* {@link android.telecom.Connection#STATE_ACTIVE}.
*
* @param callUUID the call UUID which identifies the connection.
* @return Whether the connection was set as active or not.
*/
static boolean setConnectionActive(String callUUID) {
ConnectionImpl connection = connections.get(callUUID);
if (connection != null) {
connection.setActive();
return true;
} else {
JitsiMeetLogger.w("%s setConnectionActive - no connection for UUID: %s", TAG, callUUID);
return false;
}
}
/**
* Used to adjusts the connection's state to
* {@link android.telecom.Connection#STATE_DISCONNECTED}.
*
* @param callUUID the call UUID which identifies the connection.
* @param cause disconnection reason.
*/
static void setConnectionDisconnected(String callUUID, DisconnectCause cause) {
ConnectionImpl connection = connections.get(callUUID);
if (connection != null) {
if (isSamsungDevice()) {
// Required to release the audio focus correctly.
connection.setOnHold();
// Prevents from including in the native phone calls history
connection.setConnectionProperties(
Connection.PROPERTY_SELF_MANAGED
| Connection.PROPERTY_IS_EXTERNAL_CALL);
}
// Note that the connection is not removed from the list here, but
// in ConnectionImpl's state changed callback. It's a safer
// approach, because in case the app would crash on the JavaScript
// side the calls would be cleaned up by the system they would still
// be removed from the ConnectionList.
connection.setDisconnected(cause);
connection.destroy();
} else {
JitsiMeetLogger.e(TAG + " endCall no connection for UUID: " + callUUID);
}
}
/**
* Unregisters a start call promise. Must be called after the Promise is
* rejected or resolved.
*
* @param uuid the call UUID which identifies the call to which the promise
* belongs to.
* @return the unregistered Promise instance or <tt>null</tt> if there
* wasn't any for the given call UUID.
*/
static Promise unregisterStartCallPromise(String uuid) {
return startCallPromises.remove(uuid);
}
/**
* Used to adjusts the call's state.
*
* @param callUUID the call UUID which identifies the connection.
* @param callState a map which carries the properties to be modified. See
* "KEY_*" constants in {@link ConnectionImpl} for the list of keys.
*/
static void updateCall(String callUUID, ReadableMap callState) {
ConnectionImpl connection = connections.get(callUUID);
if (connection != null) {
if (callState.hasKey(ConnectionImpl.KEY_HAS_VIDEO)) {
boolean hasVideo
= callState.getBoolean(ConnectionImpl.KEY_HAS_VIDEO);
JitsiMeetLogger.i(" %s updateCall: %s hasVideo: %s", TAG, callUUID, hasVideo);
connection.setVideoState(
hasVideo
? VideoProfile.STATE_BIDIRECTIONAL
: VideoProfile.STATE_AUDIO_ONLY);
}
} else {
JitsiMeetLogger.e(TAG + " updateCall no connection for UUID: " + callUUID);
}
}
@Override
public Connection onCreateOutgoingConnection(
PhoneAccountHandle accountHandle, ConnectionRequest request) {
ConnectionImpl connection = new ConnectionImpl();
connection.setConnectionProperties(Connection.PROPERTY_SELF_MANAGED);
connection.setAddress(
request.getAddress(),
TelecomManager.PRESENTATION_UNKNOWN);
connection.setExtras(request.getExtras());
connection.setAudioModeIsVoip(true);
// NOTE there's a time gap between the placeCall and this callback when
// things could get out of sync, but they are put back in sync once
// the startCall Promise is resolved below. That's because on
// the JavaScript side there's a logic to sync up in .then() callback.
connection.setVideoState(request.getVideoState());
Bundle moreExtras = new Bundle();
moreExtras.putParcelable(
EXTRA_PHONE_ACCOUNT_HANDLE,
Objects.requireNonNull(request.getAccountHandle(), "accountHandle"));
connection.putExtras(moreExtras);
addConnection(connection);
Promise startCallPromise
= unregisterStartCallPromise(connection.getCallUUID());
if (startCallPromise != null) {
JitsiMeetLogger.d(TAG + " onCreateOutgoingConnection " + connection.getCallUUID());
startCallPromise.resolve(null);
} else {
JitsiMeetLogger.e(
TAG + " onCreateOutgoingConnection: no start call Promise for " + connection.getCallUUID());
}
return connection;
}
@Override
public Connection onCreateIncomingConnection(
PhoneAccountHandle accountHandle, ConnectionRequest request) {
throw new RuntimeException("Not implemented");
}
@Override
public void onCreateIncomingConnectionFailed(
PhoneAccountHandle accountHandle, ConnectionRequest request) {
throw new RuntimeException("Not implemented");
}
@Override
public void onCreateOutgoingConnectionFailed(
PhoneAccountHandle accountHandle, ConnectionRequest request) {
PhoneAccountHandle theAccountHandle = request.getAccountHandle();
String callUUID = theAccountHandle.getId();
JitsiMeetLogger.e(TAG + " onCreateOutgoingConnectionFailed " + callUUID);
if (callUUID != null) {
Promise startCallPromise = unregisterStartCallPromise(callUUID);
if (startCallPromise != null) {
startCallPromise.reject(
"CREATE_OUTGOING_CALL_FAILED",
"The request has been denied by the system");
} else {
JitsiMeetLogger.e(TAG + " startCallFailed - no start call Promise for UUID: " + callUUID);
}
} else {
JitsiMeetLogger.e(TAG + " onCreateOutgoingConnectionFailed - no call UUID");
}
unregisterPhoneAccount(theAccountHandle);
}
private void unregisterPhoneAccount(PhoneAccountHandle phoneAccountHandle) {
TelecomManager telecom = getSystemService(TelecomManager.class);
if (telecom != null) {
if (phoneAccountHandle != null) {
telecom.unregisterPhoneAccount(phoneAccountHandle);
} else {
JitsiMeetLogger.e(TAG + " unregisterPhoneAccount - account handle is null");
}
} else {
JitsiMeetLogger.e(TAG + " unregisterPhoneAccount - telecom is null");
}
}
/**
* Registers new {@link PhoneAccountHandle}.
*
* @param context the current Android context.
* @param address the phone account's address. At the time of this writing
* it's the call handle passed from the Java Script side.
* @param callUUID the call's UUID for which the account is to be created.
* It will be used as the account's id.
* @return {@link PhoneAccountHandle} described by the given arguments.
*/
static PhoneAccountHandle registerPhoneAccount(
Context context, Uri address, String callUUID) {
PhoneAccountHandle phoneAccountHandle
= new PhoneAccountHandle(
new ComponentName(context, ConnectionService.class),
callUUID);
PhoneAccount.Builder builder
= PhoneAccount.builder(phoneAccountHandle, address.toString())
.setAddress(address)
.setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED |
PhoneAccount.CAPABILITY_VIDEO_CALLING |
PhoneAccount.CAPABILITY_SUPPORTS_VIDEO_CALLING)
.addSupportedUriScheme(PhoneAccount.SCHEME_SIP);
PhoneAccount account = builder.build();
TelecomManager telecomManager
= context.getSystemService(TelecomManager.class);
telecomManager.registerPhoneAccount(account);
return phoneAccountHandle;
}
/**
* Connection implementation for Jitsi Meet's {@link ConnectionService}.
*
* @author Pawel Domas
*/
class ConnectionImpl extends Connection {
/**
* The constant which defines the key for the "has video" property.
* The key is used in the map which carries the call's state passed as
* the argument of the {@link RNConnectionService#updateCall} method.
*/
static final String KEY_HAS_VIDEO = "hasVideo";
/**
* Called when system wants to disconnect the call.
*
* {@inheritDoc}
*/
@Override
public void onDisconnect() {
JitsiMeetLogger.i(TAG + " onDisconnect " + getCallUUID());
WritableNativeMap data = new WritableNativeMap();
data.putString("callUUID", getCallUUID());
ReactInstanceManagerHolder.emitEvent(
"org.jitsi.meet:features/connection_service#disconnect",
data);
// The JavaScript side will not go back to the native with
// 'endCall', so the Connection must be removed immediately.
setConnectionDisconnected(
getCallUUID(),
new DisconnectCause(DisconnectCause.LOCAL));
}
/**
* Called when system wants to abort the call.
*
* {@inheritDoc}
*/
@Override
public void onAbort() {
JitsiMeetLogger.i(TAG + " onAbort " + getCallUUID());
WritableNativeMap data = new WritableNativeMap();
data.putString("callUUID", getCallUUID());
ReactInstanceManagerHolder.emitEvent(
"org.jitsi.meet:features/connection_service#abort",
data);
// The JavaScript side will not go back to the native with
// 'endCall', so the Connection must be removed immediately.
setConnectionDisconnected(
getCallUUID(),
new DisconnectCause(DisconnectCause.CANCELED));
}
@Override
public void onHold() {
// What ?! Android will still call this method even if we do not add
// the HOLD capability, so do the same thing as on abort.
// TODO implement HOLD
JitsiMeetLogger.w(TAG + " onHold %s - HOLD is not supported, aborting the call...", getCallUUID());
this.onAbort();
}
/**
* Called when there's change to the call audio state. Either by
* the system after the connection is initialized or in response to
* {@link #setAudioRoute(int)}.
*
* @param state the new {@link CallAudioState}
*/
@Override
public void onCallAudioStateChanged(CallAudioState state) {
JitsiMeetLogger.d(TAG + " onCallAudioStateChanged: " + state);
RNConnectionService module = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
if (module != null) {
module.onCallAudioStateChange(state);
}
}
/**
* Unregisters the account when the call is disconnected.
*
* @param state - the new connection's state.
*/
@Override
public void onStateChanged(int state) {
JitsiMeetLogger.d(
"%s onStateChanged: %s %s", TAG, Connection.stateToString(state), getCallUUID());
if (state == STATE_DISCONNECTED) {
removeConnection(this);
unregisterPhoneAccount(getPhoneAccountHandle());
}
}
/**
* Retrieves the UUID of the call associated with this connection.
*
* @return call UUID
*/
String getCallUUID() {
return getPhoneAccountHandle().getId();
}
private PhoneAccountHandle getPhoneAccountHandle() {
return getExtras().getParcelable(
ConnectionService.EXTRA_PHONE_ACCOUNT_HANDLE);
}
@Override
public String toString() {
return String.format(
"ConnectionImpl[address=%s, uuid=%s]@%d",
getAddress(), getCallUUID(), hashCode());
}
}
}

View File

@@ -1,5 +1,6 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
* Copyright @ 2019-present 8x8, Inc.
* Copyright @ 2017-2018 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.
@@ -21,15 +22,14 @@ import android.app.Activity;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
/**
* Defines the default behavior of {@code JitsiMeetActivity} and
* Defines the default behavior of {@code JitsiMeetFragment} and
* {@code JitsiMeetView} upon invoking the back button if no
* {@code JitsiMeetView} handles the invocation. For example, a
* {@code JitsiMeetView} may (1) handle the invocation of the back button
* during a conference by leaving the conference and (2) not handle the
* invocation when not in a conference.
*/
public class DefaultHardwareBackBtnHandlerImpl
implements DefaultHardwareBackBtnHandler {
class DefaultHardwareBackBtnHandlerImpl implements DefaultHardwareBackBtnHandler {
/**
* The {@code Activity} to which the default handling of the back button

View File

@@ -1,4 +1,4 @@
package org.jitsi.meet.sdk.dropbox;
package org.jitsi.meet.sdk;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -20,6 +20,7 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.dropbox.core.android.Auth;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import java.util.HashMap;
import java.util.Map;
@@ -27,9 +28,13 @@ import java.util.Map;
/**
* Implements the react-native module for the dropbox integration.
*/
public class Dropbox
@ReactModule(name = DropboxModule.NAME)
class DropboxModule
extends ReactContextBaseJavaModule
implements LifecycleEventListener {
public static final String NAME = "Dropbox";
private String appKey;
private String clientId;
@@ -38,12 +43,14 @@ public class Dropbox
private Promise promise;
public Dropbox(ReactApplicationContext reactContext) {
public DropboxModule(ReactApplicationContext reactContext) {
super(reactContext);
String pkg = reactContext.getApplicationContext().getPackageName();
int resId = reactContext.getResources()
.getIdentifier("dropbox_app_key", "string", pkg);
appKey
= reactContext.getString(
org.jitsi.meet.sdk.R.string.dropbox_app_key);
= reactContext.getString(resId);
isEnabled = !TextUtils.isEmpty(appKey);
clientId = generateClientId();
@@ -129,7 +136,7 @@ public class Dropbox
@Override
public String getName() {
return "Dropbox";
return NAME;
}
/**

View File

@@ -16,20 +16,24 @@
package org.jitsi.meet.sdk;
import android.util.Log;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.module.annotations.ReactModule;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
/**
* Module implementing an API for sending events from JavaScript to native code.
*/
@ReactModule(name = ExternalAPIModule.NAME)
class ExternalAPIModule
extends ReactContextBaseJavaModule {
private static final String TAG = ExternalAPIModule.class.getSimpleName();
public static final String NAME = "ExternalAPI";
private static final String TAG = NAME;
/**
* Initializes a new module instance. There shall be a single instance of
@@ -49,7 +53,7 @@ class ExternalAPIModule
*/
@Override
public String getName() {
return "ExternalAPI";
return NAME;
}
/**
@@ -63,16 +67,20 @@ class ExternalAPIModule
*/
@ReactMethod
public void sendEvent(String name, ReadableMap data, String scope) {
// Keep track of the current ongoing conference.
OngoingConferenceTracker.getInstance().onExternalAPIEvent(name, data);
// The JavaScript App needs to provide uniquely identifying information
// to the native ExternalAPI module so that the latter may match the
// former to the native BaseReactView which hosts it.
BaseReactView view = BaseReactView.findViewByExternalAPIScope(scope);
if (view != null) {
JitsiMeetLogger.d(TAG + " Sending event: " + name + " with data: " + data);
try {
view.onExternalAPIEvent(name, data);
} catch(Exception e) {
Log.e(TAG, "onExternalAPIEvent: error sending event", e);
JitsiMeetLogger.e(e, TAG + " onExternalAPIEvent: error sending event");
}
}
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright @ 2019-present 8x8, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
import com.squareup.duktape.Duktape;
@ReactModule(name = JavaScriptSandboxModule.NAME)
class JavaScriptSandboxModule extends ReactContextBaseJavaModule {
public static final String NAME = "JavaScriptSandbox";
public JavaScriptSandboxModule(ReactApplicationContext reactContext) {
super(reactContext);
}
/**
* Evaluates the given code in a Duktape VM.
* @param code - The code that needs to evaluated.
* @param promise - Resolved with the output in case of success or rejected with an exception
* in case of failure.
*/
@ReactMethod
public void evaluate(String code, Promise promise) {
Duktape vm = Duktape.create();
try {
Object res = vm.evaluate(code);
promise.resolve(res.toString());
} catch (Throwable tr) {
promise.reject(tr);
} finally {
vm.close();
}
}
@Override
public String getName() {
return NAME;
}
}

View File

@@ -0,0 +1,84 @@
/*
* Copyright @ 2018-present 8x8, Inc.
* Copyright @ 2017-2018 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.meet.sdk;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import com.facebook.react.ReactInstanceManager;
public class JitsiMeet {
/**
* Default {@link JitsiMeetConferenceOptions} which will be used for all conferences. When
* joining a conference these options will be merged with the ones passed to
* {@link JitsiMeetView} join().
*/
private static JitsiMeetConferenceOptions defaultConferenceOptions;
public static JitsiMeetConferenceOptions getDefaultConferenceOptions() {
return defaultConferenceOptions;
}
public static void setDefaultConferenceOptions(JitsiMeetConferenceOptions options) {
if (options != null && options.getRoom() != null) {
throw new RuntimeException("'room' must be null in the default conference options");
}
defaultConferenceOptions = options;
}
/**
* Returns the current conference URL as a string.
*
* @return the current conference URL.
*/
public static String getCurrentConference() {
return OngoingConferenceTracker.getInstance().getCurrentConference();
}
/**
* Helper to get the default conference options as a {@link Bundle}.
*
* @return a {@link Bundle} with the default conference options.
*/
static Bundle getDefaultProps() {
if (defaultConferenceOptions != null) {
return defaultConferenceOptions.asProps();
}
return new Bundle();
}
/**
* Used in development mode. It displays the React Native development menu.
*/
public static void showDevOptions() {
ReactInstanceManager reactInstanceManager
= ReactInstanceManagerHolder.getReactInstanceManager();
if (reactInstanceManager != null) {
reactInstanceManager.showDevOptionsDialog();
}
}
public static boolean isCrashReportingDisabled(Context context) {
SharedPreferences preferences = context.getSharedPreferences("jitsi-default-preferences", Context.MODE_PRIVATE);
String value = preferences.getString("isCrashReportingDisabled", "");
return Boolean.parseBoolean(value);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
* Copyright @ 2019-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.
@@ -16,330 +16,215 @@
package org.jitsi.meet.sdk;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import com.facebook.react.modules.core.PermissionListener;
import java.net.URL;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.Map;
/**
* Base Activity for applications integrating Jitsi Meet at a higher level. It
* contains all the required wiring between the {@code JitsiMeetView} and
* the Activity lifecycle methods already implemented.
*
* In this activity we use a single {@code JitsiMeetView} instance. This
* instance gives us access to a view which displays the welcome page and the
* conference itself. All lifetime methods associated with this Activity are
* hooked to the React Native subsystem via proxy calls through the
* {@code JitsiMeetView} static methods.
* A base activity for SDK users to embed. It uses {@link JitsiMeetFragment} to do the heavy
* lifting and wires the remaining Activity lifecycle methods so it works out of the box.
*/
public class JitsiMeetActivity
extends AppCompatActivity implements JitsiMeetActivityInterface {
public class JitsiMeetActivity extends FragmentActivity
implements JitsiMeetActivityInterface, JitsiMeetViewListener {
/**
* The request code identifying requests for the permission to draw on top
* of other apps. The value must be 16-bit and is arbitrarily chosen here.
*/
private static final int OVERLAY_PERMISSION_REQUEST_CODE
= (int) (Math.random() * Short.MAX_VALUE);
protected static final String TAG = JitsiMeetActivity.class.getSimpleName();
/**
* The default behavior of this {@code JitsiMeetActivity} upon invoking the
* back button if {@link #view} does not handle the invocation.
*/
private DefaultHardwareBackBtnHandler defaultBackButtonImpl;
private static final String ACTION_JITSI_MEET_CONFERENCE = "org.jitsi.meet.CONFERENCE";
private static final String JITSI_MEET_CONFERENCE_OPTIONS = "JitsiMeetConferenceOptions";
/**
* The default base {@code URL} used to join a conference when a partial URL
* (e.g. a room name only) is specified. The value is used only while
* {@link #view} equals {@code null}.
*/
private URL defaultURL;
// Helpers for starting the activity
//
/**
* Instance of the {@link JitsiMeetView} which this activity will display.
*/
private JitsiMeetView view;
/**
* Whether Picture-in-Picture is enabled. The value is used only while
* {@link #view} equals {@code null}.
*/
private Boolean pictureInPictureEnabled;
/**
* Whether the Welcome page is enabled. The value is used only while
* {@link #view} equals {@code null}.
*/
private boolean welcomePageEnabled;
private boolean canRequestOverlayPermission() {
return
BuildConfig.DEBUG
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& getApplicationInfo().targetSdkVersion
>= Build.VERSION_CODES.M;
public static void launch(Context context, JitsiMeetConferenceOptions options) {
Intent intent = new Intent(context, JitsiMeetActivity.class);
intent.setAction(ACTION_JITSI_MEET_CONFERENCE);
intent.putExtra(JITSI_MEET_CONFERENCE_OPTIONS, options);
context.startActivity(intent);
}
/**
*
* @see JitsiMeetView#getDefaultURL()
*/
public URL getDefaultURL() {
return view == null ? defaultURL : view.getDefaultURL();
public static void launch(Context context, String url) {
JitsiMeetConferenceOptions options
= new JitsiMeetConferenceOptions.Builder().setRoom(url).build();
launch(context, options);
}
/**
* Initializes the {@link #view} of this {@code JitsiMeetActivity} with a
* new {@link JitsiMeetView} instance.
*/
private void initializeContentView() {
JitsiMeetView view = initializeView();
if (view != null) {
// XXX Allow extenders who override initializeView() to configure
// the view before the first loadURL(). Probably works around a
// problem related to ReactRootView#setAppProperties().
view.loadURL(null);
this.view = view;
setContentView(this.view);
}
}
/**
* Initializes a new {@link JitsiMeetView} instance.
*
* @return a new {@code JitsiMeetView} instance.
*/
protected JitsiMeetView initializeView() {
JitsiMeetView view = new JitsiMeetView(this);
// XXX Before calling JitsiMeetView#loadURL, make sure to call whatever
// is documented to need such an order in order to take effect:
view.setDefaultURL(defaultURL);
if (pictureInPictureEnabled != null) {
view.setPictureInPictureEnabled(
pictureInPictureEnabled.booleanValue());
}
view.setWelcomePageEnabled(welcomePageEnabled);
return view;
}
/**
*
* @see JitsiMeetView#isPictureInPictureEnabled()
*/
public boolean isPictureInPictureEnabled() {
return
view == null
? pictureInPictureEnabled
: view.isPictureInPictureEnabled();
}
/**
*
* @see JitsiMeetView#isWelcomePageEnabled()
*/
public boolean isWelcomePageEnabled() {
return view == null ? welcomePageEnabled : view.isWelcomePageEnabled();
}
/**
* Loads the given URL and displays the conference. If the specified URL is
* null, the welcome page is displayed instead.
*
* @param url The conference URL.
*/
public void loadURL(@Nullable URL url) {
view.loadURL(url);
}
@Override
protected void onActivityResult(
int requestCode,
int resultCode,
Intent data) {
if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE
&& canRequestOverlayPermission()) {
if (Settings.canDrawOverlays(this)) {
initializeContentView();
}
return;
}
ReactActivityLifecycleCallbacks.onActivityResult(
this, requestCode, resultCode, data);
}
@Override
public void onBackPressed() {
if (!ReactActivityLifecycleCallbacks.onBackPressed()) {
// JitsiMeetView didn't handle the invocation of the back button.
// Generally, an Activity extender would very likely want to invoke
// Activity#onBackPressed(). For the sake of consistency with
// JitsiMeetView and within the Jitsi Meet SDK for Android though,
// JitsiMeetActivity does what JitsiMeetView would've done if it
// were able to handle the invocation.
if (defaultBackButtonImpl == null) {
super.onBackPressed();
} else {
defaultBackButtonImpl.invokeDefaultOnBackPressed();
}
}
}
// Overrides
//
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// In Debug builds React needs permission to write over other apps in
// order to display the warning and error overlays.
if (canRequestOverlayPermission() && !Settings.canDrawOverlays(this)) {
Intent intent
= new Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
setContentView(R.layout.activity_jitsi_meet);
startActivityForResult(intent, OVERLAY_PERMISSION_REQUEST_CODE);
return;
// Listen for conference events.
getJitsiView().setListener(this);
if (!extraInitialize()) {
initialize();
}
initializeContentView();
}
@Override
protected void onDestroy() {
public void onDestroy() {
// Here we are trying to handle the following corner case: an application using the SDK
// is using this Activity for displaying meetings, but there is another "main" Activity
// with other content. If this Activity is "swiped out" from the recent list we will get
// Activity#onDestroy() called without warning. At this point we can try to leave the
// current meeting, but when our view is detached from React the JS <-> Native bridge won't
// be operational so the external API won't be able to notify the native side that the
// conference terminated. Thus, try our best to clean up.
leave();
if (AudioModeModule.useConnectionService()) {
ConnectionService.abortConnections();
}
JitsiMeetOngoingConferenceService.abort(this);
super.onDestroy();
if (view != null) {
view.dispose();
view = null;
}
ReactActivityLifecycleCallbacks.onHostDestroy(this);
}
// ReactAndroid/src/main/java/com/facebook/react/ReactActivity.java
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
ReactInstanceManager reactInstanceManager;
public void finish() {
leave();
if (!super.onKeyUp(keyCode, event)
&& BuildConfig.DEBUG
&& (reactInstanceManager
= ReactInstanceManagerHolder.getReactInstanceManager())
!= null
&& keyCode == KeyEvent.KEYCODE_MENU) {
reactInstanceManager.showDevOptionsDialog();
return true;
super.finish();
}
// Helper methods
//
protected JitsiMeetView getJitsiView() {
JitsiMeetFragment fragment
= (JitsiMeetFragment) getSupportFragmentManager().findFragmentById(R.id.jitsiFragment);
return fragment.getJitsiView();
}
public void join(@Nullable String url) {
JitsiMeetConferenceOptions options
= new JitsiMeetConferenceOptions.Builder()
.setRoom(url)
.build();
join(options);
}
public void join(JitsiMeetConferenceOptions options) {
getJitsiView().join(options);
}
public void leave() {
getJitsiView().leave();
}
private @Nullable JitsiMeetConferenceOptions getConferenceOptions(Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
Uri uri = intent.getData();
if (uri != null) {
return new JitsiMeetConferenceOptions.Builder().setRoom(uri.toString()).build();
}
} else if (ACTION_JITSI_MEET_CONFERENCE.equals(action)) {
return intent.getParcelableExtra(JITSI_MEET_CONFERENCE_OPTIONS);
}
return null;
}
/**
* Helper function called during activity initialization. If {@code true} is returned, the
* initialization is delayed and the {@link JitsiMeetActivity#initialize()} method is not
* called. In this case, it's up to the subclass to call the initialize method when ready.
*
* This is mainly required so we do some extra initialization in the Jitsi Meet app.
*
* @return {@code true} if the initialization will be delayed, {@code false} otherwise.
*/
protected boolean extraInitialize() {
return false;
}
protected void initialize() {
// Join the room specified by the URL the app was launched with.
// Joining without the room option displays the welcome page.
join(getConferenceOptions(getIntent()));
}
// Activity lifecycle methods
//
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
JitsiMeetActivityDelegate.onActivityResult(this, requestCode, resultCode, data);
}
@Override
public void onBackPressed() {
JitsiMeetActivityDelegate.onBackPressed();
}
@Override
public void onNewIntent(Intent intent) {
// XXX At least twice we received bug reports about malfunctioning
// loadURL in the Jitsi Meet SDK while the Jitsi Meet app seemed to
// functioning as expected in our testing. But that was to be expected
// because the app does not exercise loadURL. In order to increase the
// test coverage of loadURL, channel deep linking through loadURL.
Uri uri;
super.onNewIntent(intent);
if (Intent.ACTION_VIEW.equals(intent.getAction())
&& (uri = intent.getData()) != null
&& JitsiMeetView.loadURLStringInViews(uri.toString())) {
JitsiMeetConferenceOptions options;
if ((options = getConferenceOptions(intent)) != null) {
join(options);
return;
}
ReactActivityLifecycleCallbacks.onNewIntent(intent);
}
// https://developer.android.com/reference/android/support/v4/app/ActivityCompat.OnRequestPermissionsResultCallback
@Override
public void onRequestPermissionsResult(
final int requestCode,
final String[] permissions,
final int[] grantResults) {
ReactActivityLifecycleCallbacks.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
protected void onResume() {
super.onResume();
defaultBackButtonImpl = new DefaultHardwareBackBtnHandlerImpl(this);
ReactActivityLifecycleCallbacks.onHostResume(this, defaultBackButtonImpl);
}
@Override
public void onStop() {
super.onStop();
ReactActivityLifecycleCallbacks.onHostPause(this);
defaultBackButtonImpl = null;
JitsiMeetActivityDelegate.onNewIntent(intent);
}
@Override
protected void onUserLeaveHint() {
if (view != null) {
view.enterPictureInPicture();
}
getJitsiView().enterPictureInPicture();
}
/**
* Implementation of the {@code PermissionAwareActivity} interface.
*/
// JitsiMeetActivityInterface
//
@Override
public void requestPermissions(String[] permissions, int requestCode, PermissionListener listener) {
ReactActivityLifecycleCallbacks.requestPermissions(this, permissions, requestCode, listener);
JitsiMeetActivityDelegate.requestPermissions(this, permissions, requestCode, listener);
}
/**
*
* @see JitsiMeetView#setDefaultURL(URL)
*/
public void setDefaultURL(URL defaultURL) {
if (view == null) {
this.defaultURL = defaultURL;
} else {
view.setDefaultURL(defaultURL);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
/**
*
* @see JitsiMeetView#setPictureInPictureEnabled(boolean)
*/
public void setPictureInPictureEnabled(boolean pictureInPictureEnabled) {
if (view == null) {
this.pictureInPictureEnabled
= Boolean.valueOf(pictureInPictureEnabled);
} else {
view.setPictureInPictureEnabled(pictureInPictureEnabled);
}
// JitsiMeetViewListener
//
@Override
public void onConferenceJoined(Map<String, Object> data) {
JitsiMeetLogger.i("Conference joined: " + data);
// Launch the service for the ongoing notification.
JitsiMeetOngoingConferenceService.launch(this);
}
/**
*
* @see JitsiMeetView#setWelcomePageEnabled(boolean)
*/
public void setWelcomePageEnabled(boolean welcomePageEnabled) {
if (view == null) {
this.welcomePageEnabled = welcomePageEnabled;
} else {
view.setWelcomePageEnabled(welcomePageEnabled);
}
@Override
public void onConferenceTerminated(Map<String, Object> data) {
JitsiMeetLogger.i("Conference terminated: " + data);
finish();
}
@Override
public void onConferenceWillJoin(Map<String, Object> data) {
JitsiMeetLogger.i("Conference will join: " + data);
}
}

View File

@@ -1,5 +1,6 @@
/*
* Copyright @ 2018-present Atlassian Pty Ltd
* Copyright @ 2019-present 8x8, Inc.
* Copyright @ 2018 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.
@@ -24,7 +25,7 @@ import android.os.Build;
import com.calendarevents.CalendarEventsPackage;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.Callback;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.core.PermissionListener;
/**
@@ -32,7 +33,22 @@ import com.facebook.react.modules.core.PermissionListener;
* {@link Activity} lifecycle methods in order for the React side to be aware of
* it.
*/
public class ReactActivityLifecycleCallbacks {
public class JitsiMeetActivityDelegate {
/**
* Needed for making sure this class working with the "PermissionsAndroid"
* React Native module.
*/
private static PermissionListener permissionListener;
private static Callback permissionsCallback;
/**
* Tells whether or not the permissions request is currently in progress.
*
* @return {@code true} if the permssions are being requested or {@code false} otherwise.
*/
static boolean arePermissionsBeingRequested() {
return permissionListener != null;
}
/**
* {@link Activity} lifecycle method which should be called from
@@ -57,13 +73,6 @@ public class ReactActivityLifecycleCallbacks {
}
}
/**
* Needed for making sure this class working with the "PermissionsAndroid"
* React Native module.
*/
private static PermissionListener permissionListener;
private static Callback permissionsCallback;
/**
* {@link Activity} lifecycle method which should be called from
* {@link Activity#onBackPressed} so we can do the required internal
@@ -73,15 +82,12 @@ public class ReactActivityLifecycleCallbacks {
* otherwise. If {@code false}, the application should call the
* {@code super}'s implementation.
*/
public static boolean onBackPressed() {
public static void onBackPressed() {
ReactInstanceManager reactInstanceManager
= ReactInstanceManagerHolder.getReactInstanceManager();
if (reactInstanceManager == null) {
return false;
} else {
if (reactInstanceManager != null) {
reactInstanceManager.onBackPressed();
return true;
}
}
@@ -112,7 +118,13 @@ public class ReactActivityLifecycleCallbacks {
= ReactInstanceManagerHolder.getReactInstanceManager();
if (reactInstanceManager != null) {
reactInstanceManager.onHostPause(activity);
// Try to avoid a crash because some devices trip on this assert:
// https://github.com/facebook/react-native/blob/df4e67fe75d781d1eb264128cadf079989542755/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java#L512
// Why this happens is a mystery wrapped in an enigma.
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if (reactContext != null && activity == reactContext.getCurrentActivity()) {
reactInstanceManager.onHostPause(activity);
}
}
}
@@ -123,25 +135,11 @@ public class ReactActivityLifecycleCallbacks {
* @param activity {@code Activity} being resumed.
*/
public static void onHostResume(Activity activity) {
onHostResume(activity, new DefaultHardwareBackBtnHandlerImpl(activity));
}
/**
* {@link Activity} lifecycle method which should be called from
* {@code Activity#onResume} so we can do the required internal processing.
*
* @param activity {@code Activity} being resumed.
* @param defaultBackButtonImpl a {@link DefaultHardwareBackBtnHandler} to
* handle invoking the back button if no {@link BaseReactView} handles it.
*/
public static void onHostResume(
Activity activity,
DefaultHardwareBackBtnHandler defaultBackButtonImpl) {
ReactInstanceManager reactInstanceManager
= ReactInstanceManagerHolder.getReactInstanceManager();
if (reactInstanceManager != null) {
reactInstanceManager.onHostResume(activity, defaultBackButtonImpl);
reactInstanceManager.onHostResume(activity, new DefaultHardwareBackBtnHandlerImpl(activity));
}
if (permissionsCallback != null) {

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