Compare commits
888 Commits
hmuresan/r
...
jitihouse/
Author | SHA1 | Date |
---|---|---|
xenia | 4bd73cc368 | |
Boris Grozev | e12999d44f | |
Robert Pintilii | 8982f17ce1 | |
Robert Pintilii | c8f1690057 | |
Robert Pintilii | aa57309057 | |
damencho | fb81619fc5 | |
Hristo Terezov | 5a5656020b | |
Hristo Terezov | 0ff44a2f22 | |
Hristo Terezov | 4d04ea325e | |
Hristo Terezov | 42ce6dcc58 | |
Hristo Terezov | b033d0268a | |
Hristo Terezov | 4aea40d34f | |
Hristo Terezov | e5a170fb28 | |
Hristo Terezov | d1cf5578fc | |
Hristo Terezov | 4b29af6b5f | |
bgrozev | f3481576ff | |
bgrozev | 455a91a5c6 | |
Gabriel Borlea | 297ab194a8 | |
Christoph Settgast | 077a88a803 | |
Gabriel Borlea | 02c232440e | |
Emmanuel Pelletier | f727b9295f | |
Robert Pintilii | 0d0bec3aad | |
Emmanuel Pelletier | cfb8589bef | |
japm48 | 65730e256e | |
Robert Pintilii | 7b8b911fee | |
Robert Pintilii | 036286a1d6 | |
Robert Pintilii | d550254f31 | |
Robert Pintilii | b1a71d55d7 | |
George Politis | 17ed45799c | |
Jaya Allamsetty | e5681382b0 | |
Robert Pintilii | c27cb25afe | |
Avram Tudor | baf5aa14e8 | |
Horatiu Muresan | 29b6ce7721 | |
Mihaela Dumitru | 4f95c45e50 | |
Emmanuel Pelletier | 72dd609247 | |
Horatiu Muresan | fed74afffe | |
Mihaela Dumitru | 204f34cccb | |
Emmanuel Pelletier | c81777a475 | |
Horatiu Muresan | 778bca3031 | |
Avram Tudor | 336fa304ce | |
damencho | f14b69166c | |
Calin-Teodor | e405595a11 | |
zobadaniel | cabe48d66a | |
Duduman Bogdan Vlad | 8d7f46024b | |
damencho | d7f6c2bbf0 | |
damencho | 3c69645169 | |
damencho | abe2fa4dd4 | |
damencho | 863fd12488 | |
damencho | 50c4748d40 | |
damencho | f83840a3bc | |
damencho | 1466d7d149 | |
Calinteodor | d0fe034db5 | |
Дамян Минков | 8225f5e363 | |
Saúl Ibarra Corretgé | c641835d0f | |
Horatiu Muresan | 35ee92869f | |
Stefan Plücken | 9b7a5ffdd1 | |
Calin-Teodor | 581c2e621c | |
Mihaela Dumitru | f3117f3037 | |
Saúl Ibarra Corretgé | 877ef58dfb | |
Calinteodor | 19e61747b8 | |
Calinteodor | b4bf363237 | |
Calinteodor | f8af9c4fae | |
Nitish Kumar | 9fa426d97f | |
Yash-Ambekar | e3c95e376a | |
Calinteodor | 00ed794c50 | |
Saúl Ibarra Corretgé | b52d5629e2 | |
Horatiu Muresan | 9d8e646d4e | |
Horatiu Muresan | 850c0b97e4 | |
Robert Pintilii | 87035d0812 | |
Robert Pintilii | ef0168c9ff | |
Robert Pintilii | df1a5a25d4 | |
Robert Pintilii | c424884201 | |
Дамян Минков | 0a464a5223 | |
Horatiu Muresan | 8cd62bc132 | |
Jaya Allamsetty | 123a74b38b | |
Christoph Settgast | dbeca806bb | |
Jaya Allamsetty | f790d3e3ed | |
Horatiu Muresan | a12f7fc4d2 | |
Gabriel Borlea | 456ce38a10 | |
Gabriel Borlea | 72ef1668f2 | |
Jaya Allamsetty | fce8f52574 | |
Titus Moldovan | 8fcfd7a308 | |
Saúl Ibarra Corretgé | 04a41395c8 | |
Robert Pintilii | 18e8201167 | |
Robert Pintilii | 27b8794d8c | |
Calinteodor | 3cb0df579c | |
Robert Pintilii | 22ded30b61 | |
Robert Pintilii | 533deea5fd | |
Saúl Ibarra Corretgé | 46c6d1057d | |
Titus Moldovan | 45aa53b1a6 | |
damencho | 7d65123495 | |
Maria Mironova | e1ac000cd1 | |
Saúl Ibarra Corretgé | f98036efa1 | |
Saúl Ibarra Corretgé | 23aeafcc93 | |
Saúl Ibarra Corretgé | 0ffe2c2c87 | |
Saúl Ibarra Corretgé | dec58afe46 | |
Mihaela Dumitru | 2aa770e532 | |
Gabriel Borlea | 1a113ba733 | |
dependabot[bot] | 3a5833829c | |
Priyanshu Sharma | e6d1f039d2 | |
Horatiu Muresan | fef78152e1 | |
Mihaela Dumitru | 84221c5c13 | |
Calinteodor | 3e59359563 | |
Calin-Teodor | e69db9b878 | |
Robert Pintilii | ae7e441e21 | |
Robert Pintilii | 6b8afbcceb | |
José Luís Andrade | d712a565f8 | |
Saúl Ibarra Corretgé | 36bfbeb81d | |
Saúl Ibarra Corretgé | e7b16b0daf | |
Saúl Ibarra Corretgé | 92a891e7d3 | |
Robert Pintilii | 09e4696c60 | |
Robert Pintilii | a594aac078 | |
Saúl Ibarra Corretgé | 9409e64066 | |
Robert Pintilii | 12318db4c7 | |
Shawn | 749c26b74c | |
Robert10B | babe62eb6d | |
Robert Pintilii | fbc0a502e7 | |
Shawn | ab262ec8b1 | |
Maciej Zakrzewski | cced41665d | |
Mihaela Dumitru | f95e167779 | |
damencho | bf1b7cc856 | |
damencho | 091e3f69dc | |
Horatiu Muresan | 42868c9ec2 | |
Robert Pintilii | 0d5dae7ab9 | |
Calin-Teodor | 992bf47850 | |
Robert Pintilii | 4f34a576d0 | |
Robert Pintilii | 921f3ee8cd | |
Horatiu Muresan | 42838e756c | |
Werner Fleischer | e6eba3536a | |
Gabriel Borlea | 74bdb7bc3f | |
Mihaela Dumitru | 192187db32 | |
Saúl Ibarra Corretgé | 5dce74e21d | |
Hristo Terezov | fd7b6f457e | |
Kirat | 2bf3089dbf | |
Calin-Teodor | d396727e39 | |
Horatiu Muresan | 3e58cd8af3 | |
Robert Pintilii | cf7e692186 | |
Jaya Allamsetty | 5e90e72562 | |
Jaya Allamsetty | cbae997eda | |
Jaya Allamsetty | 6bd9a6bd15 | |
Werner Fleischer | e8bd75b2d1 | |
emrah | 46f1cb7b4b | |
Christian Tietze | 60dd26c13b | |
robertpin | 8e1d96cc48 | |
Matthieu D | e3166e6faa | |
robertpin | 6de306e46e | |
W0olFy | 8e91851a2f | |
Calin-Teodor | 0251201e93 | |
Saúl Ibarra Corretgé | 9775ad25ca | |
Saúl Ibarra Corretgé | da5e19fa98 | |
Robert Pintilii | a5ddcab084 | |
Robert Pintilii | 2c59b44df5 | |
Horatiu Muresan | 507d883503 | |
Saúl Ibarra Corretgé | a7b25d6d7b | |
Saúl Ibarra Corretgé | 43b91b16da | |
Saúl Ibarra Corretgé | 726fd3f8a1 | |
Saúl Ibarra Corretgé | 817a05cf7b | |
Horatiu Muresan | 6048279eb2 | |
Jaya Allamsetty | 43b3db11e0 | |
Calinteodor | 77e75815dc | |
Saúl Ibarra Corretgé | e1485fc253 | |
damencho | d6d71ab412 | |
Jaya Allamsetty | 59c47a0575 | |
damencho | 8793d67f0b | |
Saúl Ibarra Corretgé | d6888fa2d8 | |
Saúl Ibarra Corretgé | 222021f3bc | |
Calin-Teodor | 14c24a8851 | |
Calinteodor | 246a2d6bbf | |
Calinteodor | 838b26f770 | |
bgrozev | bc88ebe443 | |
Saúl Ibarra Corretgé | 7f54fa4ed8 | |
Calinteodor | 361428d245 | |
Calinteodor | 7ad57e6baf | |
Calinteodor | a59ab3b0d9 | |
Calinteodor | c50111a57d | |
Horatiu Muresan | 9422f48536 | |
Jaya Allamsetty | 122e80dcf1 | |
Robert Pintilii | 2dbb3c10e2 | |
damencho | 265d8c4b29 | |
bgrozev | e8e05c21ab | |
bgrozev | b0591ed968 | |
Narendiran Arthanarieswaran | 84fe52491f | |
Calinteodor | 450da1a6df | |
Oana Emilia Ianc | 720d4555ab | |
Calinteodor | c764397994 | |
Jaya Allamsetty | 0ad7b3db55 | |
Jaya Allamsetty | 7e30053d51 | |
Horatiu Muresan | 0ad52a06ce | |
bgrozev | 82fd465819 | |
Jaya Allamsetty | 561d0c9a10 | |
Hristo Terezov | 3b8ad78a62 | |
Christoph Settgast | 77e02a0994 | |
Christoph Settgast | 965e7dc41d | |
Christoph Settgast | ad0ad31df9 | |
Horatiu Muresan | 2bb2a68e01 | |
Horatiu Muresan | c441e8abca | |
Hristo Terezov | 27754c8874 | |
dependabot[bot] | 580f56010a | |
Jaya Allamsetty | 4bad63e484 | |
Hristo Terezov | 9cc41469d2 | |
Hristo Terezov | 5077a33fcb | |
Jaya Allamsetty | e7078786e6 | |
Gabriel Borlea | 291370a263 | |
Horatiu Muresan | 32dbdf2e5c | |
Hristo Terezov | 17b5009e63 | |
Saúl Ibarra Corretgé | d91f49ec88 | |
PO-jfiniel | 7187530430 | |
Saúl Ibarra Corretgé | d3d442e4d2 | |
Saúl Ibarra Corretgé | 294d2c9f6e | |
Saúl Ibarra Corretgé | 12c002e015 | |
Saúl Ibarra Corretgé | 9720b4858c | |
tmoldovan8x8 | 9fae488070 | |
Mihaela Dumitru | 0e47f72b5f | |
Jaya Allamsetty | 298c4bd1e3 | |
Gabriel Borlea | 955367a157 | |
Saúl Ibarra Corretgé | c30d1e7479 | |
Avram Tudor | cbbe58a1ec | |
Robert Pintilii | aef5328aeb | |
Gabriel Borlea | f5ac1b6271 | |
Titus Moldovan | ca9f0a6788 | |
Saúl Ibarra Corretgé | e7c5ae5936 | |
Saúl Ibarra Corretgé | c43a319576 | |
Saúl Ibarra Corretgé | 585c9aa0d2 | |
Horatiu Muresan | 768f10d966 | |
Horatiu Muresan | 704740969b | |
damencho | d444a45f00 | |
Дамян Минков | 9fbbe05d6c | |
Gabriel Borlea | 3445c513ba | |
Mihaela Dumitru | 6a4276b4c8 | |
damencho | 338b02a6b6 | |
damencho | ef2631e95a | |
damencho | 226ef9f33d | |
tmoldovan8x8 | 91ec5307ab | |
Nils Ohlmeier | fe0b7d3acc | |
Saúl Ibarra Corretgé | 9533650594 | |
Avram Tudor | d7bedb2e07 | |
Mihaela Dumitru | 33e4da32e2 | |
bgrozev | 9a8a8ef7ad | |
Calin-Teodor | 703ed731c8 | |
William Liang | 83dfb67f23 | |
Robert Pintilii | 51bdf67cf2 | |
damencho | 3adbda791c | |
Jaya Allamsetty | 924bb0e7ff | |
tmoldovan8x8 | 4c9bfe3d4d | |
Jaya Allamsetty | 1139311809 | |
Calinteodor | 2ad2e6ff0e | |
damencho | 46cc2e37ae | |
Saúl Ibarra Corretgé | 0ebac2ac6d | |
Saúl Ibarra Corretgé | 90e33ee799 | |
Saúl Ibarra Corretgé | be982ae996 | |
Saúl Ibarra Corretgé | 56114fe863 | |
Saúl Ibarra Corretgé | a2e8a7f28f | |
Pawel Domas | af072c3070 | |
Jaya Allamsetty | f42772ec5b | |
Gabriel Borlea | 2556a7ab77 | |
Charles Zablit | 3cbf160f2b | |
Дамян Минков | 744960bb1a | |
Дамян Минков | 76471a0ea9 | |
Robert Pintilii | 0ba033e07d | |
Robert Pintilii | cb3fb3ada9 | |
Calinteodor | 48a6472b3b | |
Roberto Vieira | 691e92b7ec | |
Calin-Teodor | 6e36340a83 | |
Mihaela Dumitru | ae424c95de | |
Mihaela Dumitru | 95b2979eb3 | |
_norbert | a0c130568b | |
Robert Pintilii | 643cc2db81 | |
Calinteodor | 6bce0bc917 | |
Calinteodor | 93566e313e | |
Gabriel Borlea | a7c653bc30 | |
Gabriel Borlea | 4b969cf4ab | |
Saúl Ibarra Corretgé | 3081b41d0d | |
Saúl Ibarra Corretgé | 30e5d213cb | |
Saúl Ibarra Corretgé | 752da71387 | |
Saúl Ibarra Corretgé | 645609974a | |
Saúl Ibarra Corretgé | 4f2f6df2bb | |
Jaya Allamsetty | e93c480e7c | |
Calinteodor | a795e0797a | |
Andrei Gavrilescu | 94ec2c720d | |
Abdullah Kerem Öğe | b11e14ea34 | |
Robert Pintilii | f5f55c4f23 | |
Duduman Bogdan Vlad | 243a330318 | |
_norbert | 98bc87ea18 | |
Saúl Ibarra Corretgé | f7926c9cfb | |
Saúl Ibarra Corretgé | 533501deb6 | |
Saúl Ibarra Corretgé | f38c9f5450 | |
Jaya Allamsetty | 55b80c948f | |
Calinteodor | 971fe0481f | |
Calin-Teodor | 1259e54d46 | |
Calin-Teodor | 0cb95f1dd6 | |
Calin-Teodor | 5cde9a138b | |
robertpin | 867c488e10 | |
Calin-Teodor | 7d9c13a618 | |
Hristo Terezov | 48ed3b7dc6 | |
Hristo Terezov | 04abfe1a3b | |
Alex Bumbu | d45decc393 | |
Saúl Ibarra Corretgé | 88f8f48465 | |
Saúl Ibarra Corretgé | 8127ea2479 | |
Saúl Ibarra Corretgé | b22915c169 | |
Saúl Ibarra Corretgé | 14fcd153e5 | |
Robert Pintilii | 48efe36cdf | |
Saúl Ibarra Corretgé | 0c373e105b | |
Shawn | e57c7f92a8 | |
Jaya Allamsetty | 70fa44f85f | |
rinenweb | bcc5beb73d | |
Joseph Garrone | 4ef4e45ee4 | |
TTG | c9ff0bb75f | |
chipechop | 282817db28 | |
Shawn | 93ab7725e7 | |
Calin-Teodor | 53ccb97d34 | |
Calin-Teodor | 6346d99d0e | |
Saúl Ibarra Corretgé | 79c4cabbad | |
Robert Pintilii | 7a9f51b01b | |
Robert Pintilii | a884a6b232 | |
Jaya Allamsetty | b00a17c1c3 | |
bgrozev | 99955df5c8 | |
Calin-Teodor | c0f0803f01 | |
dependabot[bot] | b2c864cbba | |
Saúl Ibarra Corretgé | 31957d4085 | |
Saúl Ibarra Corretgé | 4f83fc2a6d | |
Robert Pintilii | 4bd27730ce | |
Robert Pintilii | 817d7f0c0d | |
Robert Pintilii | 19a9b17425 | |
Robert Pintilii | cc33930259 | |
Jaya Allamsetty | 6223e16ca5 | |
José Luís Andrade | 99385ae3d7 | |
Shawn | 17cace070e | |
Calin-Teodor | cdb2436b73 | |
Calin-Teodor | 10db5ecf1f | |
Robert Pintilii | cbb8b5f620 | |
Jaya Allamsetty | f3e4c57036 | |
Calinteodor | 1731d5188d | |
Calinteodor | 2c7dc5e40e | |
Calinteodor | 74cd486232 | |
Alexey Matveev | 30f3bac217 | |
Vadim A. Misbakh-Soloviov | 84fc4dd63f | |
Robert Pintilii | 936a1a6b0e | |
Gabriel Borlea | f4e8f860b1 | |
Nils Ohlmeier | ee544d25f8 | |
Alexey Matveev | c32866f6a2 | |
Alexey Matveev | 215c2825de | |
Christoph Settgast | edb614783b | |
Alexey Matveev | 0e19bc9cd6 | |
Johan Bernhardsson | caff0c64af | |
Petr Ferschmann | fcb1845e2a | |
Suleyman BİLGİN | 977295bd87 | |
apetrus20 | ed139f53ca | |
Alexey Matveev | 5692c3cb4d | |
TTG | ed62409ad5 | |
Robert Pintilii | b52b4c2a78 | |
Duduman Bogdan Vlad | 36bef94c3c | |
Hristo Terezov | a995b33753 | |
Nils Ohlmeier | bfb15a2523 | |
TTG | 1d59c8122d | |
Hristo Terezov | 31766c891b | |
Robert Pintilii | 7a3b8d6ac4 | |
Saúl Ibarra Corretgé | edf5e1c094 | |
Saúl Ibarra Corretgé | 7cd39b7983 | |
Hristo Terezov | 49bcf5c179 | |
Filip Rejmus | 2b3989e5e6 | |
Saúl Ibarra Corretgé | 9b1e662a93 | |
Saúl Ibarra Corretgé | 73160de3b7 | |
Saúl Ibarra Corretgé | f5fc524030 | |
Saúl Ibarra Corretgé | 6e3b3879cc | |
Filip Rejmus | c9f9708166 | |
Calinteodor | 7a8350356a | |
Saúl Ibarra Corretgé | 2596c463fe | |
Saúl Ibarra Corretgé | 2de0520835 | |
JohnProv | c276c204ac | |
Calinteodor | 67cf6e6d18 | |
Robert Pintilii | b321cf3639 | |
TTG | 8e54a69160 | |
Milo Ivir | 93e5e48648 | |
polfernandez | c945b9cc5e | |
Robert Pintilii | 7c3d2010e4 | |
José Luís Andrade | 894c5cd788 | |
chipechop | 1c7e457879 | |
chipechop | b6b536962d | |
nomadbyte | b625b7b0ec | |
Saúl Ibarra Corretgé | eb59949dfa | |
Robert Pintilii | 69f4b116a9 | |
Robert Pintilii | 75d7c4b160 | |
Robert Pintilii | b5065306e5 | |
Robert Pintilii | 9f5a56bbc7 | |
Mihaela Dumitru | b4809fe083 | |
Robert Pintilii | 6dedc7fb1a | |
Robert Pintilii | a780051720 | |
Armel Chesnais | 51ac3ef64a | |
Filip Rejmus | a915238b49 | |
Robert Pintilii | 687837310a | |
Robert Pintilii | 7f879d2154 | |
Robert Pintilii | faec46dd17 | |
Saúl Ibarra Corretgé | 33ec975e19 | |
Saúl Ibarra Corretgé | db6165209b | |
Robert Pintilii | 27775de48d | |
Saúl Ibarra Corretgé | 8818f4f4e6 | |
Jaya Allamsetty | aebe4885bb | |
Saúl Ibarra Corretgé | 146cc2f9c9 | |
Saúl Ibarra Corretgé | 3b5878d078 | |
Robert Pintilii | 6ab996568b | |
Robert Pintilii | 4755f5a031 | |
Robert Pintilii | 0b48e55a35 | |
Hristo Terezov | 9e1ac3bea6 | |
Shawn | 7249406960 | |
Saúl Ibarra Corretgé | a9f5829e58 | |
Saúl Ibarra Corretgé | 4bb1697115 | |
Robert Pintilii | 2938d1f2dc | |
Robert Pintilii | 10d202439b | |
Robert Pintilii | af0715dc17 | |
Дамян Минков | 601e21ffcd | |
Robert Pintilii | ff29196f3a | |
Robert Pintilii | 748b66b04a | |
Robert Pintilii | ca4db54e6e | |
Robert Pintilii | 3eecf8063f | |
Robert Pintilii | 440339dea8 | |
Jaya Allamsetty | dbb0a953c6 | |
Robert Pintilii | 442ae6c3cb | |
tamasdomokos | 30051d2b0e | |
Robert Pintilii | 9ae236a010 | |
Robert Pintilii | 6f209a8139 | |
Jaya Allamsetty | 69567fb371 | |
Jaya Allamsetty | 66cddddd3e | |
bogdandarie | 485c875ee5 | |
Horatiu Muresan | ceb1cd9673 | |
Calinteodor | 4d817af060 | |
Дамян Минков | a082a3fb0f | |
Robert Pintilii | 2a321d6b1f | |
Robert Pintilii | dd6478b3cf | |
Saúl Ibarra Corretgé | 6274299d49 | |
Alex Bumbu | d77d2f0c5b | |
Janitz | 33be0dc32e | |
Robert Pintilii | 44c8b31187 | |
bogdandarie | 1279c5b0da | |
bogdandarie | 495957104c | |
Calinteodor | b558d7936c | |
Calin-Teodor | 1fe2a9193f | |
Calin-Teodor | e8e6beabab | |
Saúl Ibarra Corretgé | 3e31e1816d | |
kerem | eb1c3d8c56 | |
Saúl Ibarra Corretgé | 4a54f4bedc | |
Calinteodor | 4d84123c71 | |
Saúl Ibarra Corretgé | 4018e8875f | |
Calinteodor | be93fbd512 | |
Robert Pintilii | 51bbc3f87f | |
Robert Pintilii | f5fb402784 | |
Robert Pintilii | 70503d2518 | |
Дамян Минков | 40e1f28fc2 | |
Calinteodor | 935f95a3d5 | |
Hristo Terezov | 53e4f584f9 | |
Saúl Ibarra Corretgé | e218c0d3af | |
Robert Pintilii | 6c3206e4d4 | |
Saúl Ibarra Corretgé | 6365b699c1 | |
Saúl Ibarra Corretgé | 768cca6162 | |
Calinteodor | abdc5123eb | |
Robert Pintilii | 6423ed8fb5 | |
Robert Pintilii | b858496adb | |
Jaya Allamsetty | 68f79e52e7 | |
Jaya Allamsetty | 3f78de2d34 | |
Shawn | 2029db5a59 | |
Jaya Allamsetty | 6ede5c478f | |
Duduman Bogdan Vlad | 2ba7b3acb7 | |
robertpin | ebcd1d85f2 | |
Saúl Ibarra Corretgé | 4857664f15 | |
Saúl Ibarra Corretgé | 0f84b0b9fe | |
Saúl Ibarra Corretgé | eda3e620d3 | |
Saúl Ibarra Corretgé | e8df8f75a8 | |
Calin-Teodor | f2b2b02029 | |
Avram Tudor | 66769136ed | |
Calin-Teodor | 179647c93c | |
Robert Pintilii | 25bd824621 | |
Robert Pintilii | be25ad855f | |
Jaya Allamsetty | b1931de7b0 | |
Horatiu Muresan | 02da4a1c42 | |
damencho | 5c2ec5df54 | |
Mihaela Dumitru | e30b0306f9 | |
Mihaela Dumitru | 11e13e1849 | |
Calinteodor | 0f7aa5a084 | |
Calinteodor | ad4707c660 | |
Mihaela Dumitru | d0c22806ec | |
tmoldovan8x8 | be7f2643df | |
Robert Pintilii | 6c9441fa7b | |
Saúl Ibarra Corretgé | a2d39ca5b1 | |
Saúl Ibarra Corretgé | d2a36ea3a8 | |
Дамян Минков | e52c9043a5 | |
Дамян Минков | ee5817539b | |
Jaya Allamsetty | da9b5a9156 | |
Дамян Минков | bb84c47e78 | |
Дамян Минков | 13f4da7855 | |
Saúl Ibarra Corretgé | f935b29629 | |
mbondarenko | f5f689c53d | |
Saúl Ibarra Corretgé | af4ba32803 | |
kerem | 9e11bc302b | |
Saúl Ibarra Corretgé | 438b3924d7 | |
Horatiu Muresan | a2d0492007 | |
Robert Pintilii | c35d1d8d4b | |
Robert Pintilii | 7d7bf987a1 | |
Robert Pintilii | 3e744c5ffe | |
Robert Pintilii | f4f8808d95 | |
Robert Pintilii | 21bcbdc12f | |
Saúl Ibarra Corretgé | 090433b6e8 | |
Saúl Ibarra Corretgé | 230cbfac1e | |
Horatiu Muresan | c56c5bd145 | |
Tamas Domokos | f5a4fd4bc2 | |
Calin-Teodor | cb881311e7 | |
Nakorn | ac2698f829 | |
Nakorn | 5fafb5d29e | |
Saúl Ibarra Corretgé | fbcdb250f4 | |
Saúl Ibarra Corretgé | ba8529d72b | |
Mihaela Dumitru | 1230cebde2 | |
Mihaela Dumitru | 93406bb12c | |
dependabot[bot] | d43eea91cf | |
Robert Pintilii | 7364c7f27b | |
Calinteodor | 2de2500080 | |
TTG | 349e4bfb57 | |
Christoph Settgast | 4f92811263 | |
abora8x8 | a4e35f81cf | |
Alexandru Petrus | 7aefc3b94a | |
Avram Tudor | 3c180d3932 | |
Saúl Ibarra Corretgé | c523c07cb7 | |
Robert Pintilii | 5c77f61037 | |
tamasdomokos | 8162ae4dbe | |
Calin-Teodor | 69e0a37529 | |
Robert Pintilii | bfa88f13dc | |
Robert Pintilii | 0d917df1fb | |
Jaya Allamsetty | 95a3a8de0b | |
Bogdan Duduman | f4985d8028 | |
William Liang | 5d6aec3f3c | |
Shawn Chin | 2e6f14f872 | |
TTG | 90b17046f6 | |
Saúl Ibarra Corretgé | 86ab2be65e | |
Saúl Ibarra Corretgé | 11f138d28f | |
damencho | e163d6438b | |
TTG | 24cb07b830 | |
Bogdan Duduman | 53df3a7b55 | |
Horatiu Muresan | ca54533153 | |
Saúl Ibarra Corretgé | 02f5987187 | |
Horatiu Muresan | ce96b71bfa | |
Saúl Ibarra Corretgé | a32d237d54 | |
Bogdan Duduman | 48db099134 | |
Robert Pintilii | 1106a86ba7 | |
Jaya Allamsetty | 54346c065d | |
Filip Rejmus | c3ebde18df | |
José Luís Andrade | c613082ce1 | |
Saúl Ibarra Corretgé | eee096e0c0 | |
Robert Pintilii | 9c6119606f | |
Robert Pintilii | 077afecdba | |
Дамян Минков | 1b4bbcba3d | |
Jaya Allamsetty | 32b8c62ec9 | |
Дамян Минков | a9bc83db03 | |
Horatiu Muresan | 90bcbebedb | |
Robert Pintilii | c06d456ae6 | |
Saúl Ibarra Corretgé | fe0c804cc0 | |
Robert Pintilii | 4ee77b1f65 | |
Shawn Chin | 7cbb377a66 | |
Robert Pintilii | 0bccda2c9e | |
Robert Pintilii | 3426960d5a | |
Horatiu Muresan | fb2cfaa204 | |
Дамян Минков | d61d47fae3 | |
Gabriel Borlea | 2cb9596536 | |
Robert Pintilii | 62a10e6587 | |
damencho | e38f9a293b | |
Дамян Минков | eba7cfcec5 | |
Jaya Allamsetty | ae70370a38 | |
Jaya Allamsetty | 45c67142e9 | |
Jaya Allamsetty | 6a03e49b9e | |
Jaya Allamsetty | 25e7b79237 | |
Robert Pintilii | 779ecd6da6 | |
Robert Pintilii | dd4d49a591 | |
Robert Pintilii | 63b6b5a72d | |
George Politis | df9185f92a | |
Saúl Ibarra Corretgé | 9bb0decb30 | |
Saúl Ibarra Corretgé | e18240cfc6 | |
Jaya Allamsetty | 1703ed8b23 | |
Saúl Ibarra Corretgé | 945eda680c | |
Saúl Ibarra Corretgé | a378ba7827 | |
Saúl Ibarra Corretgé | 73ab43ac0c | |
Saúl Ibarra Corretgé | 3f5fa1e663 | |
Robert Pintilii | e05ad18ee4 | |
Robert Pintilii | 6dd04136de | |
Jaya Allamsetty | ffe005ba0a | |
Jaya Allamsetty | 7393c20ed8 | |
tmoldovan8x8 | 7509b520f3 | |
Robert Pintilii | 4c9f3d287a | |
TTG | fef562d767 | |
Saúl Ibarra Corretgé | d9bbf35466 | |
Saúl Ibarra Corretgé | 1cd80a33c6 | |
Robert Pintilii | 2d6e181a13 | |
Robert Pintilii | f5e60a7ca4 | |
Hristo Terezov | f0a45a9976 | |
Hristo Terezov | 81f5e68382 | |
Alex Bumbu | e68ede65e1 | |
damencho | 8c0de928ab | |
Horatiu Muresan | 9d57c8e058 | |
Horatiu Muresan | 35442c6094 | |
Gabriel Borlea | d6f3c2a0f4 | |
tmoldovan8x8 | b83c55e9c4 | |
Robert Pintilii | a1d20dc188 | |
Robert Pintilii | 95084e1004 | |
Saúl Ibarra Corretgé | 5502601fb3 | |
Saúl Ibarra Corretgé | 3fa72c99bc | |
Дамян Минков | 079a2a505d | |
Robert Pintilii | 139884fbe7 | |
Misha | 3ef3233242 | |
JohnProv | 443f4e4feb | |
Alexandru Petrus | 21a1d52753 | |
Bogdan Duduman | 0f63e560b0 | |
Horatiu Muresan | 43bea201e6 | |
Horatiu Muresan | 6e1e6df952 | |
Saúl Ibarra Corretgé | 8ce1423373 | |
Saúl Ibarra Corretgé | ede97584f2 | |
Robert Pintilii | 247c54b6c6 | |
Robert Pintilii | 10bb186c13 | |
Artur Shepilko | e296008d95 | |
Jaya Allamsetty | 01001d6438 | |
damencho | fce15b491d | |
damencho | cf37ba8771 | |
damencho | 0350f18e68 | |
Robert Pintilii | c9bbc6c762 | |
Christoph Settgast | fa942e9f3b | |
Robert Pintilii | fd67fb652b | |
Ali Alhaidary | a87d4f4a1d | |
Robert Pintilii | efb69d5382 | |
Flying-Light | db988f6e62 | |
Robert Pintilii | f4b46128bc | |
Gabriel Borlea | 9323b86e3c | |
Saúl Ibarra Corretgé | 06842c724a | |
Duduman Bogdan Vlad | 5f62acc67c | |
Robert Pintilii | 17008237dc | |
Robert Pintilii | 271ea8315b | |
Alexey Matveev | f18f8c1061 | |
Saúl Ibarra Corretgé | b535b8c583 | |
Hristo Terezov | adcd9a501b | |
Saúl Ibarra Corretgé | cfb1fef162 | |
Saúl Ibarra Corretgé | 8b4f2495dc | |
Saúl Ibarra Corretgé | 7e7107d45a | |
Saúl Ibarra Corretgé | 45c0597aff | |
Calinteodor | c77e2c8301 | |
Robert Pintilii | 3403d7bec2 | |
Robert Pintilii | c4557c66aa | |
Robert Pintilii | cfda02ee10 | |
JohnProv | 575ab1f1cb | |
tamasdomokos | b4f98e7386 | |
Calin-Teodor | e8de9b4d66 | |
damencho | 6fe353cfa4 | |
Stefan Weil | 882d343e8b | |
Hristo Terezov | cc3a8b7b8d | |
Saúl Ibarra Corretgé | 104bfe7339 | |
Saúl Ibarra Corretgé | fb9d35a991 | |
Saúl Ibarra Corretgé | 8fabba1679 | |
Saúl Ibarra Corretgé | 5fbf741278 | |
Saúl Ibarra Corretgé | bebcc8234f | |
Avram Tudor | 1e9f599a35 | |
Horatiu Muresan | cc5a3e499f | |
Calin-Teodor | dbcbafe088 | |
José Luís Andrade | b034cf27cb | |
Calin-Teodor | 126dba8070 | |
Calin-Teodor | a7c1aa4900 | |
Saúl Ibarra Corretgé | 206215c7c1 | |
Jaya Allamsetty | f38c5f39d2 | |
wfleischer | 09efaecc41 | |
Saúl Ibarra Corretgé | 3bb581c8d9 | |
Nils Ohlmeier | 96099a06a8 | |
Saúl Ibarra Corretgé | 4ef5da6c82 | |
George Politis | 289ece42df | |
Saúl Ibarra Corretgé | 7dba5f8a7e | |
Robert Pintilii | 1010955393 | |
Robert Pintilii | 3bd3be4df0 | |
Duduman Bogdan Vlad | fc60ab8383 | |
Rokixy | 85d2123fac | |
Дамян Минков | 5790742d53 | |
bogdandarie | be1752c162 | |
Gabriel Borlea | b9aeb19379 | |
Jaya Allamsetty | 7951dc3ce7 | |
Robert Pintilii | dfb2a07cfa | |
Calinteodor | 94dc6309de | |
Rokixy | 3f2018a1de | |
Calin-Teodor | cd4ab8a5f1 | |
Hristo Terezov | 594f9dfcdd | |
Robert Pintilii | 8dd71a921b | |
Calinteodor | 6d39d13af7 | |
Robert Pintilii | 372c2cb0f9 | |
Calin-Teodor | 5b41d68d39 | |
JohnProv | 1b9870dade | |
Mariusz Krzaczkowski | 38eff2ba24 | |
apetrus20 | 11f6b442fe | |
Calinteodor | e458eed931 | |
Avram Tudor | f07bd4a0d6 | |
Robert Pintilii | 40637aa3dc | |
Jaya Allamsetty | 2f10d80184 | |
Artur Shepilko | 739c060018 | |
damencho | 41a6cbd3fc | |
Calin-Teodor | 61df6f6794 | |
Artur Shepilko | d44cbb6d1e | |
Nils Ohlmeier | 06ed0e43ad | |
Calin-Teodor | eb911ec9b5 | |
Calin-Teodor | e8cdf38fda | |
Saúl Ibarra Corretgé | e578f6c30f | |
Saúl Ibarra Corretgé | 77d687952d | |
Saúl Ibarra Corretgé | bf222c5094 | |
Saúl Ibarra Corretgé | 08f9dc5e83 | |
Nils Ohlmeier | 9c83831b2c | |
Jaya Allamsetty | 97bc41f644 | |
Nils Ohlmeier | f70ed9cb8a | |
Saúl Ibarra Corretgé | 123ab32e75 | |
Saúl Ibarra Corretgé | 3c370eb6ca | |
Saúl Ibarra Corretgé | 3e6c988c30 | |
Saúl Ibarra Corretgé | 649ace1f44 | |
Saúl Ibarra Corretgé | 57f27b4234 | |
Saúl Ibarra Corretgé | 2ae4ba3875 | |
Saúl Ibarra Corretgé | 0bfa1027a9 | |
emrah | f412ff7f11 | |
Jaya Allamsetty | 3975db7a68 | |
Werner Fleischer | 02e4d2b902 | |
Jaya Allamsetty | ca095240b9 | |
Jaya Allamsetty | 3d60773963 | |
Saúl Ibarra Corretgé | 895ce56e8d | |
Saúl Ibarra Corretgé | d12860082c | |
Saúl Ibarra Corretgé | 4e03f20a51 | |
Robert Pintilii | 0435c3cc64 | |
Alex Bumbu | ea4be6cb30 | |
damencho | fa39c10766 | |
tmoldovan8x8 | 82c047707f | |
Robert Pintilii | 00221b7482 | |
Hristo Terezov | 8266d55cb9 | |
Robert Pintilii | b2396ff809 | |
Robert Pintilii | fb20786b65 | |
Saúl Ibarra Corretgé | f5649efa49 | |
Saúl Ibarra Corretgé | 7b361b3e23 | |
Robert Pintilii | 05fdd5f31f | |
Дамян Минков | 5c52ee97ed | |
Дамян Минков | 3626e51c24 | |
Saúl Ibarra Corretgé | ef748c576d | |
Saúl Ibarra Corretgé | dd044ad252 | |
Robert Pintilii | 5f04c5ba64 | |
Robert Pintilii | 8f5eabe1f2 | |
Robert Pintilii | 43578474a0 | |
José Luís Andrade | 6dbf283f3d | |
Jaya Allamsetty | a1e0a46bad | |
Hristo Terezov | 627027b167 | |
Jaya Allamsetty | 4d41d36020 | |
Robert Pintilii | 0f57c37d6a | |
Robert Pintilii | 5b34068435 | |
apetrus20 | 52ce9a86ed | |
Andrei Gavrilescu | bdff92397b | |
Andrei Gavrilescu | 1abc6b1e4a | |
Дамян Минков | ca259287be | |
Robert Pintilii | 5601a62b60 | |
Robert Pintilii | d3c7b074d4 | |
Robert Pintilii | 0fa0e99ffa | |
Robert Pintilii | 002d0fed42 | |
Jaya Allamsetty | 873cdbb404 | |
Filip Rejmus | 91cbeb0b3f | |
Robert Pintilii | 3a87282e26 | |
Дамян Минков | fa5ee32720 | |
Дамян Минков | 03c91de5c1 | |
Robert Pintilii | 2ec82c371c | |
Robert Pintilii | abc9d36c4c | |
Robert Pintilii | efa0a132c4 | |
Jaya Allamsetty | 083b009eba | |
Calin-Teodor | f0ba37e605 | |
Saúl Ibarra Corretgé | a2c3bdf05f | |
Robert Pintilii | 22a52dafca | |
Robert Pintilii | 3960b59765 | |
Robert Pintilii | db54c45b13 | |
Saúl Ibarra Corretgé | 3e66e0009d | |
Ali Alhaidary | d091881851 | |
Calin-Teodor | de44c53482 | |
Calin-Teodor | 64fef80f31 | |
Steffen Kolmer | 87f6d27fb2 | |
Saúl Ibarra Corretgé | 3f0e50a9cd | |
Jaya Allamsetty | d63e0c5ab6 | |
Jaya Allamsetty | 9b9fbc0bc9 | |
Jaya Allamsetty | 5505f01cd9 | |
Saúl Ibarra Corretgé | 7e7d3c0cc7 | |
Hristo Terezov | 1f99ce3457 | |
Shawn Chin | 94074836ec | |
Calin-Teodor | ccba7e8f75 | |
José Luís Andrade | 727b6dab9e | |
Andrei Gavrilescu | 0f1bf09c69 | |
Robert Pintilii | a6f93db8e3 | |
Robert Pintilii | 8e0cb583af | |
Robert Pintilii | 30a0a624a2 | |
Robert Pintilii | 2cea6c7b98 | |
Robert Pintilii | 69365d7e1f | |
Robert Pintilii | 5783e8992a | |
Robert Pintilii | dbc29a08ee | |
Robert Pintilii | 6f4b858e35 | |
Robert Pintilii | ffef8f78ea | |
Saúl Ibarra Corretgé | 82b2e77747 | |
Robert Pintilii | abc752635d | |
Calinteodor | 5ec6581d2e | |
Robert Pintilii | e139c6d32d | |
Robert Pintilii | 4e1af131fb | |
Robert Pintilii | 867d998d15 | |
Robert Pintilii | b1a9d68cf5 | |
Jaya Allamsetty | 8b4c7ebc03 | |
Filip Rejmus | 63ea273b20 | |
Robert Pintilii | ca3bd9138c | |
Robert Pintilii | c5115f99f0 | |
Calin-Teodor | 0a385c561d | |
Robert Pintilii | 44e5fa35af | |
Bo Frederiksen | 432d07c2ad | |
Milo Ivir | 2f42af0b70 | |
Hristo Terezov | e9055df9e3 | |
Christoph Settgast | cc7d3247ab | |
Ali Alhaidary | fa8608eea0 | |
Christoph Settgast | 0d9c4318ba | |
Jaya Allamsetty | 2a5e169c2f | |
Saúl Ibarra Corretgé | 2def75db50 | |
Saúl Ibarra Corretgé | 53e05fdea9 | |
Jaya Allamsetty | c727b603af | |
Robert Pintilii | 5dbb17bc81 | |
Robert Pintilii | cb712eb4ab | |
Robert Pintilii | c1e9724bba | |
dependabot[bot] | 24b9f5d113 | |
Calin-Teodor | 4ef88aa90e | |
Andrei Gavrilescu | 06491e2406 | |
Milo Ivir | 9ce52b237e | |
Robert Pintilii | ac2af79807 | |
Robert Pintilii | 4a8c8899a9 | |
Robert Pintilii | b08ed3ade4 | |
Robert Pintilii | 718d32990d | |
Mihaela Dumitru | 009588a3d8 | |
Robert Pintilii | 449d52f26b | |
bgrozev | 5a4ffea9aa | |
Robert Pintilii | d8b435ad16 | |
Robert Pintilii | b259757c79 | |
Robert Pintilii | 7995c7ed00 | |
Robert Pintilii | 08173ac1df | |
BinaryWizard904 | e33b65da36 | |
Robert Pintilii | defd0d2aaf | |
luzpaz | c7f96de787 | |
José Luís Andrade | 29669d88dc | |
William Liang | 131eed0f62 | |
Saúl Ibarra Corretgé | 77da65b8ea | |
Saúl Ibarra Corretgé | 989b8d9c2b | |
Robert Pintilii | eb20e85166 | |
Дамян Минков | d981acb94a | |
Horatiu Muresan | 155a14b351 | |
Robert Pintilii | 139fa9b3f2 | |
Robert Pintilii | f31a7f31e6 | |
Robert Pintilii | df887d24a2 | |
Avram Tudor | 6286c76904 | |
Saúl Ibarra Corretgé | 780019a711 | |
Дамян Минков | 4d51aedde0 | |
Calin-Teodor | 058c82a704 | |
Calin-Teodor | 7e2f3f7d68 | |
Calin-Teodor | 30b0bb7bd6 | |
Greg 'Gosha' Galperin | f02a75bc9d | |
Дамян Минков | 6b5a821696 | |
Дамян Минков | ad46df0a1a | |
Saúl Ibarra Corretgé | b0deb9ec0c | |
zobadaniel | 61a6ce2a2e | |
dependabot[bot] | bacdbeff21 | |
Ali Alhaidary | 7fc9f6f515 | |
Christoph Settgast | d34aae4a4b | |
Calin-Teodor | ab86d336fb | |
Calin-Teodor | ffc412c18d | |
Calin-Teodor | 077901cd2b | |
Calin-Teodor | ba3cd53017 | |
Calinteodor | 0d50f1867d | |
Jaya Allamsetty | e9cfa78aaf | |
Jaya Allamsetty | 76f7f3943f | |
Jaya Allamsetty | b9b8090996 | |
Calinteodor | d42e18c7bb | |
Mihaela Dumitru | a685f096a0 | |
Calin-Teodor | 49357e3cd2 | |
Calin-Teodor | 049a3eb7fb | |
Calin-Teodor | a31cc62c25 | |
Calin-Teodor | 75ddf3e75f | |
Calin-Teodor | 40128277bc | |
Saúl Ibarra Corretgé | 7770d59c93 | |
Boris Grozev | 2dd3c72473 | |
Calinteodor | 4a4856f3de | |
Titus Moldovan | 47bdf800e7 | |
Robert Pintilii | f6d088149c | |
Saúl Ibarra Corretgé | cbe3d6d505 | |
Calin-Teodor | b41c71e80b | |
Calin-Teodor | a4b997362a | |
Saúl Ibarra Corretgé | a5da90ddaf | |
Saúl Ibarra Corretgé | dffa71666c | |
Calin-Teodor | 892751154c | |
Robert Pintilii | 935e4d3261 | |
Saúl Ibarra Corretgé | f115028961 | |
Robert Pintilii | d910b9db57 | |
Robert Pintilii | b2b576f6fb | |
Robert Pintilii | a39d9f283d | |
Saúl Ibarra Corretgé | 0913cf2c4f |
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "Jitsi Meet Dev Container",
|
||||||
|
"image": "mcr.microsoft.com/devcontainers/universal:2",
|
||||||
|
"features": {
|
||||||
|
"ghcr.io/devcontainers/features/node:1": {
|
||||||
|
"version": "16"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hostRequirements": {
|
||||||
|
"cpus": 4,
|
||||||
|
"memory": "8gb",
|
||||||
|
"storage": "32gb"
|
||||||
|
},
|
||||||
|
"postCreateCommand": "bash -i -c 'nvm use && npm install && cp tsconfig.web.json tsconfig.json'"
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
'extends': [
|
'extends': [
|
||||||
'@jitsi/eslint-config'
|
'@jitsi/eslint-config'
|
||||||
]
|
],
|
||||||
|
'ignorePatterns': [ '*.d.ts' ]
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
name: Lua CI
|
||||||
|
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
luacheck:
|
||||||
|
name: Luacheck
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install luarocks
|
||||||
|
run: sudo apt-get --install-recommends -y install luarocks
|
||||||
|
|
||||||
|
- name: Install luacheck
|
||||||
|
run: sudo luarocks install luacheck
|
||||||
|
|
||||||
|
- name: Check lua codes
|
||||||
|
run: |
|
||||||
|
set -o pipefail && luacheck . | awk -F: '
|
||||||
|
{
|
||||||
|
print $0
|
||||||
|
printf "::warning file=%s,line=%s,col=%s::%s\n", $1, $2, $3, $4
|
||||||
|
}
|
||||||
|
'
|
|
@ -3,14 +3,15 @@ name: Simple CI
|
||||||
on: [pull_request]
|
on: [pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
run-ci:
|
lint:
|
||||||
name: Build Frontend
|
name: Lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: '16.x'
|
node-version: 16
|
||||||
|
cache: 'npm'
|
||||||
- run: npm install
|
- run: npm install
|
||||||
- name: Check git status
|
- name: Check git status
|
||||||
run: git status
|
run: git status
|
||||||
|
@ -18,6 +19,26 @@ jobs:
|
||||||
run: npm run lang-sort
|
run: npm run lang-sort
|
||||||
- name: Check if the git repository is clean
|
- name: Check if the git repository is clean
|
||||||
run: $(exit $(git status --porcelain --untracked-files=no | head -255 | wc -l)) || (echo "Dirty git tree"; git diff; exit 1)
|
run: $(exit $(git status --porcelain --untracked-files=no | head -255 | wc -l)) || (echo "Dirty git tree"; git diff; exit 1)
|
||||||
- run: npm run lint
|
- run: npm run lint:ci
|
||||||
- run: for file in lang/*.json; do npx --yes jsonlint -q $file || exit 1; done
|
linux-build:
|
||||||
|
name: Build Frontend (Linux)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
cache: 'npm'
|
||||||
|
- run: npm install
|
||||||
|
- run: make
|
||||||
|
macos-ci:
|
||||||
|
name: Build Frontend (macOS)
|
||||||
|
runs-on: macOS-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
cache: 'npm'
|
||||||
|
- run: npm install
|
||||||
- run: make
|
- run: make
|
||||||
|
|
|
@ -92,3 +92,4 @@ twa/*.apk
|
||||||
twa/*.aab
|
twa/*.aab
|
||||||
twa/assetlinks.json
|
twa/assetlinks.json
|
||||||
|
|
||||||
|
tsconfig.json
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
global = false
|
||||||
|
unused = false
|
||||||
|
redefined = false
|
||||||
|
ignore = { "581" }
|
||||||
|
max_line_length = false
|
||||||
|
color = false
|
||||||
|
formatter = "plain"
|
||||||
|
quiet = 1
|
|
@ -141,7 +141,7 @@ react/features/sample/
|
||||||
```
|
```
|
||||||
|
|
||||||
The middleware must be imported in `react/features/app/` specifically
|
The middleware must be imported in `react/features/app/` specifically
|
||||||
in `middlewares.any`, `middlewares.native.js` or `middlewares.web.js` where appropriate.
|
in `middlewares.any.ts`, `middlewares.native.ts` or `middlewares.web.ts` where appropriate.
|
||||||
Likewise for the reducer.
|
Likewise for the reducer.
|
||||||
|
|
||||||
An `index.js` file must not be provided for exporting actions, action types and
|
An `index.js` file must not be provided for exporting actions, action types and
|
||||||
|
|
33
Makefile
|
@ -4,7 +4,9 @@ DEPLOY_DIR = libs
|
||||||
LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet
|
LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet
|
||||||
OLM_DIR = node_modules/@matrix-org/olm
|
OLM_DIR = node_modules/@matrix-org/olm
|
||||||
TF_WASM_DIR = node_modules/@tensorflow/tfjs-backend-wasm/dist/
|
TF_WASM_DIR = node_modules/@tensorflow/tfjs-backend-wasm/dist/
|
||||||
RNNOISE_WASM_DIR = node_modules/rnnoise-wasm/dist
|
RNNOISE_WASM_DIR = node_modules/@jitsi/rnnoise-wasm/dist
|
||||||
|
EXCALIDRAW_DIR = node_modules/@jitsi/excalidraw/dist/excalidraw-assets
|
||||||
|
EXCALIDRAW_DIR_DEV = node_modules/@jitsi/excalidraw/dist/excalidraw-assets-dev
|
||||||
TFLITE_WASM = react/features/stream-effects/virtual-background/vendor/tflite
|
TFLITE_WASM = react/features/stream-effects/virtual-background/vendor/tflite
|
||||||
MEET_MODELS_DIR = react/features/stream-effects/virtual-background/vendor/models
|
MEET_MODELS_DIR = react/features/stream-effects/virtual-background/vendor/models
|
||||||
FACE_MODELS_DIR = node_modules/@vladmandic/human-models/models
|
FACE_MODELS_DIR = node_modules/@vladmandic/human-models/models
|
||||||
|
@ -14,19 +16,25 @@ OUTPUT_DIR = .
|
||||||
STYLES_BUNDLE = css/all.bundle.css
|
STYLES_BUNDLE = css/all.bundle.css
|
||||||
STYLES_DESTINATION = css/all.css
|
STYLES_DESTINATION = css/all.css
|
||||||
STYLES_MAIN = css/main.scss
|
STYLES_MAIN = css/main.scss
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
WEBPACK = .\node_modules\.bin\webpack
|
||||||
|
WEBPACK_DEV_SERVER = .\node_modules\.bin\webpack serve --mode development
|
||||||
|
else
|
||||||
WEBPACK = ./node_modules/.bin/webpack
|
WEBPACK = ./node_modules/.bin/webpack
|
||||||
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development
|
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development
|
||||||
|
endif
|
||||||
|
|
||||||
all: compile deploy clean
|
all: compile deploy clean
|
||||||
|
|
||||||
compile:
|
compile:
|
||||||
|
NODE_OPTIONS=--max-old-space-size=8192 \
|
||||||
$(WEBPACK)
|
$(WEBPACK)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -fr $(BUILD_DIR)
|
rm -fr $(BUILD_DIR)
|
||||||
|
|
||||||
.NOTPARALLEL:
|
.NOTPARALLEL:
|
||||||
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-face-landmarks
|
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-excalidraw deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-face-landmarks
|
||||||
|
|
||||||
deploy-init:
|
deploy-init:
|
||||||
rm -fr $(DEPLOY_DIR)
|
rm -fr $(DEPLOY_DIR)
|
||||||
|
@ -36,12 +44,8 @@ deploy-appbundle:
|
||||||
cp \
|
cp \
|
||||||
$(BUILD_DIR)/app.bundle.min.js \
|
$(BUILD_DIR)/app.bundle.min.js \
|
||||||
$(BUILD_DIR)/app.bundle.min.js.map \
|
$(BUILD_DIR)/app.bundle.min.js.map \
|
||||||
$(BUILD_DIR)/do_external_connect.min.js \
|
|
||||||
$(BUILD_DIR)/do_external_connect.min.js.map \
|
|
||||||
$(BUILD_DIR)/external_api.min.js \
|
$(BUILD_DIR)/external_api.min.js \
|
||||||
$(BUILD_DIR)/external_api.min.js.map \
|
$(BUILD_DIR)/external_api.min.js.map \
|
||||||
$(BUILD_DIR)/dial_in_info_bundle.min.js \
|
|
||||||
$(BUILD_DIR)/dial_in_info_bundle.min.js.map \
|
|
||||||
$(BUILD_DIR)/alwaysontop.min.js \
|
$(BUILD_DIR)/alwaysontop.min.js \
|
||||||
$(BUILD_DIR)/alwaysontop.min.js.map \
|
$(BUILD_DIR)/alwaysontop.min.js.map \
|
||||||
$(OUTPUT_DIR)/analytics-ga.js \
|
$(OUTPUT_DIR)/analytics-ga.js \
|
||||||
|
@ -49,6 +53,8 @@ deploy-appbundle:
|
||||||
$(BUILD_DIR)/analytics-ga.min.js.map \
|
$(BUILD_DIR)/analytics-ga.min.js.map \
|
||||||
$(BUILD_DIR)/face-landmarks-worker.min.js \
|
$(BUILD_DIR)/face-landmarks-worker.min.js \
|
||||||
$(BUILD_DIR)/face-landmarks-worker.min.js.map \
|
$(BUILD_DIR)/face-landmarks-worker.min.js.map \
|
||||||
|
$(BUILD_DIR)/noise-suppressor-worklet.min.js \
|
||||||
|
$(BUILD_DIR)/noise-suppressor-worklet.min.js.map \
|
||||||
$(DEPLOY_DIR)
|
$(DEPLOY_DIR)
|
||||||
cp \
|
cp \
|
||||||
$(BUILD_DIR)/close3.min.js \
|
$(BUILD_DIR)/close3.min.js \
|
||||||
|
@ -60,7 +66,6 @@ deploy-lib-jitsi-meet:
|
||||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.js \
|
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.js \
|
||||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.map \
|
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.map \
|
||||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.e2ee-worker.js \
|
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.e2ee-worker.js \
|
||||||
$(LIBJITSIMEET_DIR)/connection_optimization/external_connect.js \
|
|
||||||
$(LIBJITSIMEET_DIR)/modules/browser/capabilities.json \
|
$(LIBJITSIMEET_DIR)/modules/browser/capabilities.json \
|
||||||
$(DEPLOY_DIR)
|
$(DEPLOY_DIR)
|
||||||
|
|
||||||
|
@ -84,6 +89,16 @@ deploy-tflite:
|
||||||
$(TFLITE_WASM)/*.wasm \
|
$(TFLITE_WASM)/*.wasm \
|
||||||
$(DEPLOY_DIR)
|
$(DEPLOY_DIR)
|
||||||
|
|
||||||
|
deploy-excalidraw:
|
||||||
|
cp -R \
|
||||||
|
$(EXCALIDRAW_DIR) \
|
||||||
|
$(DEPLOY_DIR)/
|
||||||
|
|
||||||
|
deploy-excalidraw-dev:
|
||||||
|
cp -R \
|
||||||
|
$(EXCALIDRAW_DIR_DEV) \
|
||||||
|
$(DEPLOY_DIR)/
|
||||||
|
|
||||||
deploy-meet-models:
|
deploy-meet-models:
|
||||||
cp \
|
cp \
|
||||||
$(MEET_MODELS_DIR)/*.tflite \
|
$(MEET_MODELS_DIR)/*.tflite \
|
||||||
|
@ -106,12 +121,12 @@ deploy-local:
|
||||||
([ ! -x deploy-local.sh ] || ./deploy-local.sh)
|
([ ! -x deploy-local.sh ] || ./deploy-local.sh)
|
||||||
|
|
||||||
.NOTPARALLEL:
|
.NOTPARALLEL:
|
||||||
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-face-landmarks
|
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-excalidraw-dev deploy-face-landmarks
|
||||||
$(WEBPACK_DEV_SERVER)
|
$(WEBPACK_DEV_SERVER)
|
||||||
|
|
||||||
source-package:
|
source-package:
|
||||||
mkdir -p source_package/jitsi-meet/css && \
|
mkdir -p source_package/jitsi-meet/css && \
|
||||||
cp -r *.js *.html resources/*.txt connection_optimization favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
|
cp -r *.js *.html resources/*.txt favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
|
||||||
cp css/all.css source_package/jitsi-meet/css && \
|
cp css/all.css source_package/jitsi-meet/css && \
|
||||||
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
|
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
|
||||||
rm -rf source_package
|
rm -rf source_package
|
||||||
|
|
|
@ -18,7 +18,6 @@ Amongst others here are the main features Jitsi Meet offers:
|
||||||
* Web and native SDKs for integration
|
* Web and native SDKs for integration
|
||||||
* HD audio and video
|
* HD audio and video
|
||||||
* Content sharing
|
* Content sharing
|
||||||
* End-to-End Encryption
|
|
||||||
* Raise hand and reactions
|
* Raise hand and reactions
|
||||||
* Chat with private conversations
|
* Chat with private conversations
|
||||||
* Polls
|
* Polls
|
||||||
|
|
|
@ -76,7 +76,7 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
implementation 'androidx.appcompat:appcompat:1.4.1'
|
implementation 'androidx.appcompat:appcompat:1.5.1'
|
||||||
|
|
||||||
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
|
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 659 B |
Before Width: | Height: | Size: 379 B |
Before Width: | Height: | Size: 960 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1,70 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="262.91376dp"
|
||||||
|
android:height="262.91376dp"
|
||||||
|
android:viewportWidth="262.91376"
|
||||||
|
android:viewportHeight="262.91376">
|
||||||
|
<group android:scaleX="0.75" android:scaleY="0.75" android:translateX="35" android:translateY="35">
|
||||||
|
<clip-path
|
||||||
|
android:pathData="m0,0 l262.914,-0L262.914,262.914 0,262.914 0,0Z"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m142.646,105.099c0.117,0.026 0.255,0.036 0.406,0.036 3.186,-0 10.297,-4.615 11.617,-6.721l0.1,-0.17 0.153,-0.135c0.451,-0.441 1.746,-2.773 2.374,-4.17 -6.751,-2.023 -7.49,-5.677 -8.153,-8.919 -0.069,-0.376 -0.138,-0.717 -0.204,-1.019 -0.074,-0.397 -0.153,-0.8 -0.226,-1.112C138.668,86.221 135.593,88.094 133.921,89.483 133.056,90.201 132.542,92.251 135.042,97.926 136.323,100.816 140.727,104.733 142.646,105.099"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m115.413,146.042c5.934,-0 18.464,-3.543 26.748,-5.887 1.21,-0.336 2.33,-0.66 3.351,-0.944 0.166,-0.046 0.321,-0.091 0.472,-0.124 -0.463,-0.461 -1.239,-1.159 -2.497,-2.216 -5.521,-3.741 -10.736,-5.484 -16.403,-5.484 -1.237,-0 -2.522,0.071 -3.923,0.231 -4.801,0.55 -8.8,1.69 -10.722,2.237 -0.967,0.284 -1.263,0.366 -1.567,0.366 -0.58,-0 -1.079,-0.341 -1.273,-0.878 -0.194,-0.534 -0.027,-1.121 0.425,-1.507l0.024,-0.011c3.316,-2.784 9.489,-7.951 21.198,-10.256 2.027,-0.401 4.202,-0.605 6.454,-0.605 5.242,-0 10.67,1.086 16.125,3.219 7.436,2.899 12.521,6.625 16.602,9.62 2.199,1.609 4.105,3.007 5.755,3.771 0.421,0.2 0.637,0.255 0.746,0.265 0.074,-0.095 0.23,-0.365 0.474,-1.069 0.066,-0.185 0.529,-2.161 -2.806,-13.374 -1.931,-6.51 -4.264,-13.156 -5.479,-16.104 -2.356,-5.711 -1.778,-9.76 -1.051,-12.125 -1.999,0.735 -4.033,1.87 -6.174,3.446L161.758,98.711C160.694,99.506 159.599,100.404 158.426,101.454 151.517,107.64 146.344,110.864 143.035,111.04l-0.093,0.004 -0.093,-0.009c-2.912,-0.245 -7.324,-4.489 -9.133,-6.634 -0.373,-0.251 -0.8,-0.366 -1.366,-0.366 -0.564,-0 -1.202,0.116 -1.82,0.235C130.086,104.354 129.623,104.441 129.167,104.489 127.708,104.632 125.668,105.106 123.694,105.561 122.746,105.777 121.762,106.005 120.864,106.189 120.851,106.19 120.463,106.272 119.774,106.454 114.903,107.891 111.228,109.55 109.432,111.111 109.414,111.127 109.352,111.174 109.266,111.242 108.048,112.105 105.124,114.567 104.248,118.762L104.237,118.795C102.398,126.516 105.187,136.087 108.892,141.554 110.636,144.125 112.513,145.727 114.048,145.959 114.437,146.015 114.891,146.042 115.413,146.042"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m90.093,173.175c-1.252,-1.472 -1.783,-3.324 -1.574,-5.521 0.884,-10.642 -0.329,-13.215 -0.891,-13.829 -0.131,-0.144 -0.207,-0.144 -0.265,-0.144 -0.022,-0 -0.041,0.003 -0.064,0.003 -1.044,0.248 -8.066,5.002 -9.615,19.171 -0.749,6.845 0.561,15.63 1.679,20.974 0.897,-3.155 2.314,-6.624 5.057,-10.204 2.556,-3.326 5.345,-5.955 8.801,-8.253C92.143,174.93 90.991,174.235 90.093,173.175"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m94.906,156.389c-0.03,2.229 -0.326,4.36 -0.61,6.445 -0.151,1.119 -0.314,2.286 -0.434,3.46 -0.161,2.341 0.346,3.166 0.571,3.406 0.127,0.136 0.326,0.287 0.76,0.287 0.339,-0 0.741,-0.091 1.161,-0.268 4.202,-1.756 8.195,-4.815 10.115,-6.515C103.522,161.892 98.995,159.058 94.906,156.389"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m154.002,81.595c-0.031,0.074 -0.065,0.148 -0.101,0.216 -0.821,2.403 0.306,5.664 2.419,6.898 0.561,0.327 1.106,0.526 1.624,0.596 0.072,0.006 0.148,0.009 0.219,0.009 1.645,-0 2.971,-1.199 3.961,-3.561C162.752,83.959 162.836,81.827 162.37,79.904 162.003,78.409 161.057,76.627 160.453,75.738 159.332,76.509 157.111,78.207 155.585,79.553 154.518,80.582 154.136,81.229 154.002,81.595"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M148.97,77.699C153.957,73.194 156.988,65.754 158.253,61.334 153.915,65.513 148.633,67.758 145.25,69.198 144.084,69.695 143.08,70.124 142.477,70.476 142.224,70.623 141.965,70.77 141.708,70.919 139.654,72.109 136.55,73.905 136.1,75.011l-0.012,0.036 -0.012,0.034c-1.406,2.956 -2.199,7.401 -2.457,9.95 3.266,-1.99 6.625,-3.322 9.416,-4.42C145.628,79.585 147.863,78.703 148.97,77.699"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m164.464,51.921c-0.84,5.539 -2.205,10.799 -4.751,16.347 2.781,-3.144 4.396,-6.568 4.941,-10.401C164.886,56.275 165.097,54.756 164.464,51.921"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M148.749,142.639C148.718,142.598 148.684,142.56 148.658,142.519 148.523,142.539 148.307,142.584 147.972,142.683l-0.14,0.04c-1.726,0.644 -4.899,1.708 -8.556,2.946 -4.396,1.479 -9.365,3.154 -13.526,4.649 -5.297,1.975 -7.021,2.755 -7.557,3.024 -0.098,0.266 -0.203,0.599 -0.327,0.965 -1.254,3.816 -4.125,12.541 -18.276,18.653 2.928,2.956 9.289,8.27 21.809,8.27 1.082,-0 2.21,-0.036 3.341,-0.12 9.451,-0.666 18.342,-4.855 25.026,-11.78 6.087,-6.291 9.538,-14.136 9.585,-21.7C157.876,147.509 155.367,147.135 153.043,146.033 153.014,146.02 150.361,144.745 148.749,142.639"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m189.478,117.853c-0.523,9.749 -2.122,18.424 -4.744,25.8 -2.128,5.988 -4.94,11.134 -8.356,15.316 -5.676,6.931 -11.555,9.256 -12.804,9.304 -0.866,-0 -1.313,-0.309 -3.046,-1.528 -0.17,-0.114 -0.37,-0.252 -0.581,-0.4 -3.313,5.953 -8.505,11.097 -15.065,14.959 -7.079,4.144 -15.297,6.423 -23.157,6.423 -9.078,-0 -17.13,-2.924 -23.341,-8.456 -7.467,4.799 -12.31,9.074 -16.267,27.005l-1.363,6.17 -2.971,-5.564c-0.424,-0.786 -1.929,-3.731 -3.332,-8.887 -1.934,-7.104 -2.86,-15.181 -2.758,-24.01 0.117,-10.049 3.154,-16.526 5.68,-20.186 2.98,-4.314 6.837,-6.994 10.076,-6.994 0.216,-0 0.428,0.006 0.616,0.035 5.159,0.575 8.435,2.75 14.396,6.686l1.899,1.252c2.059,1.344 4.481,2.7 5.259,2.989 0.54,-0.284 1.749,-2.3 2.155,-5.271l0.069,-0.451c0.005,-0.045 0.009,-0.091 0.014,-0.131 -0.036,-0.02 -0.065,-0.029 -0.094,-0.041 -4.008,-1.375 -9.539,-7.7 -12.364,-17.134 -2.684,-9.382 -2.129,-17.185 1.644,-23.193 6.12,-9.736 19.198,-11.974 23.466,-12.702 1.331,-0.266 2.716,-0.511 4.041,-0.717 0.255,-0.061 0.469,-0.121 0.642,-0.168 -0.031,-0.126 -0.071,-0.265 -0.114,-0.43 -0.108,-0.417 -0.23,-0.891 -0.354,-1.447 -1.345,-6.035 -0.664,-11.069 0.181,-15.193 0.928,-4.546 1.489,-7.287 3.747,-9.936 3.029,-4.165 8.319,-5.936 11.479,-6.991 0.746,-0.249 1.511,-0.509 1.894,-0.689 8.988,-4.31 11.82,-8.739 12.615,-11.694 0.656,-2.451 1.699,-8.884 1.251,-13.335 -0.085,-0.805 0.129,-1.521 0.621,-2.065 0.45,-0.505 1.101,-0.794 1.778,-0.794 1.515,-0 2.82,-0 7.511,14.598 2.481,7.698 0.645,14.903 -5.45,21.424l-0.226,0.231c0.024,0.044 0.049,0.09 0.08,0.144 2.57,4.236 3.963,9.54 3.553,13.51 -0.099,0.906 -0.265,1.775 -0.419,2.549 -0.003,0.01 -0.003,0.016 -0.004,0.029 0.516,-0.032 1.119,-0.055 1.775,-0.055 3.052,-0 7.435,0.474 10.989,2.735 2.135,1.352 4.845,3.439 6.835,7.615C189.223,102.942 190.076,109.575 189.478,117.853m4.77,-23.191c-2.916,-6.1 -6.989,-9.177 -9.793,-10.96 -2.355,-1.494 -5.064,-2.584 -8.077,-3.24l-0.676,-0.146 -0.111,-0.689c-0.339,-2.119 -0.918,-4.275 -1.715,-6.406l-0.185,-0.49 0.292,-0.434c5.095,-7.594 6.323,-16.17 3.54,-24.802 -2.191,-6.824 -3.895,-11.211 -5.341,-13.799 -2.954,-5.305 -7.006,-6.417 -9.891,-6.417 -2.964,-0 -5.8,1.261 -7.789,3.457 -2.043,2.254 -2.993,5.207 -2.678,8.31 0.316,3.134 -0.494,8.516 -1.014,10.439 -0.04,0.117 -0.975,2.929 -8.201,6.428 -0.162,0.056 -0.512,0.179 -1.053,0.359 -3.729,1.246 -10.666,3.571 -15.258,9.64 -3.465,4.205 -4.332,8.441 -5.338,13.346 -0.586,2.865 -1.236,6.744 -1.079,11.344l0.026,0.841 -0.824,0.188c-11.646,2.585 -20.025,7.835 -24.909,15.605 -5.054,8.04 -5.919,18.055 -2.543,29.853 0.063,0.204 0.126,0.407 0.189,0.615l0.527,1.608 -1.665,-0.286c-0.561,-0.101 -1.135,-0.18 -1.729,-0.241 -0.493,-0.06 -1.001,-0.082 -1.509,-0.082 -5.633,-0 -11.663,3.585 -16.128,9.592 -3.451,4.641 -7.588,12.849 -7.735,25.601 -0.114,9.573 0.906,18.401 3.038,26.228 1.581,5.795 3.326,9.329 4.004,10.577l13.306,24.94 6.096,-27.619c2.454,-11.09 4.864,-15.262 7.725,-18.111l0.561,-0.563 0.679,0.411c6.605,3.977 14.466,6.084 22.73,6.084 9.286,-0 18.965,-2.682 27.259,-7.551 5.38,-3.16 9.974,-7.036 13.649,-11.531l0.45,-0.369 0.85,-0.02c2.156,-0.068 5.16,-1.164 8.222,-3.004 2.6,-1.555 6.543,-4.428 10.501,-9.262 3.997,-4.884 7.274,-10.854 9.716,-17.734 2.876,-8.073 4.625,-17.489 5.204,-28.004 0.689,-9.668 -0.434,-17.641 -3.327,-23.704"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m180.026,98.414c-1.67,-2.596 -3.771,-4.206 -5.475,-4.206 -0.313,-0 -0.613,0.051 -0.895,0.161 -0.911,0.361 -2.356,4.532 -1.714,7.566 0.434,2.066 2.938,9.04 4.151,12.394 0.456,1.281 0.68,1.91 0.754,2.142 0.064,0.183 0.145,0.448 0.256,0.774 0.97,2.971 3.467,10.586 4.206,16.761 1.549,-6.579 2.424,-14.512 2.085,-23.997C183.235,105.662 182.04,101.538 180.026,98.414"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M168.088,142.604C169.896,142.111 171.33,141.705 172.398,141.395 170.213,139.874 167.689,137.979 164.247,135.304c-8.418,-6.546 -17.449,-9.87 -26.839,-9.87 -5.135,-0 -9.611,0.991 -13.156,2.186 0.882,-0.05 1.779,-0.079 2.7,-0.079 1.1,-0 2.247,0.04 3.411,0.119 3.652,0.246 13.061,1.901 21.565,12.047 1.714,2.039 3.559,3.73 8.794,3.73 1.873,-0 4.051,-0.207 6.662,-0.645C167.544,142.751 167.793,142.678 168.088,142.604"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m164.3,147.583c-0.122,1.563 -0.376,4.509 -0.782,6.76 -0.495,2.719 -1.31,5.02 -1.791,6.226 0.85,0.786 1.694,1.553 2.247,2.043 2.214,-1.447 9.47,-6.96 14.483,-19.474C176.847,144.229 174.59,145.178 171.671,146.018 168.701,146.861 165.82,147.357 164.3,147.583"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:fillType="nonZero"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="colorPrimary">#17A0DB</color>
|
<color name="colorPrimary">#17A0DB</color>
|
||||||
<color name="colorPrimaryDark">#1081B2</color>
|
<color name="navigationBarColor">#161618</color>
|
||||||
</resources>
|
</resources>
|
|
@ -2,7 +2,7 @@
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
|
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
|
||||||
<item name="android:forceDarkAllowed">false</item>
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
|
<item name="android:navigationBarColor">@color/navigationBarColor</item>
|
||||||
<item name="android:windowDisablePreview">true</item>
|
<item name="android:windowDisablePreview">true</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import groovy.json.JsonSlurper
|
import groovy.json.JsonSlurper
|
||||||
import org.apache.tools.ant.taskdefs.condition.Os
|
|
||||||
import org.gradle.util.VersionNumber
|
import org.gradle.util.VersionNumber
|
||||||
|
|
||||||
// Top-level build file where you can add configuration options common to all
|
// Top-level build file where you can add configuration options common to all
|
||||||
|
@ -12,25 +11,21 @@ buildscript {
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:7.0.4'
|
classpath 'com.android.tools.build:gradle:7.0.4'
|
||||||
classpath 'com.google.gms:google-services:4.3.10'
|
classpath 'com.google.gms:google-services:4.3.14'
|
||||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'
|
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
buildToolsVersion = "31.0.0"
|
buildToolsVersion = "31.0.0"
|
||||||
compileSdkVersion = 31
|
compileSdkVersion = 32
|
||||||
minSdkVersion = 23
|
minSdkVersion = 23
|
||||||
targetSdkVersion = 31
|
targetSdkVersion = 32
|
||||||
supportLibVersion = "28.0.0"
|
supportLibVersion = "28.0.0"
|
||||||
|
|
||||||
if (System.properties['os.arch'] == "aarch64") {
|
if (System.properties['os.arch'] == "aarch64") {
|
||||||
// For M1 Users we need to use the NDK 24 which added support for aarch64
|
// For M1 Users we need to use the NDK 24 which added support for aarch64
|
||||||
ndkVersion = "24.0.8215888"
|
ndkVersion = "24.0.8215888"
|
||||||
} else if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
|
||||||
// For Android Users, we need to use NDK 23, otherwise the build will
|
|
||||||
// fail due to paths longer than the OS limit
|
|
||||||
ndkVersion = "23.1.7779620"
|
|
||||||
} else {
|
} else {
|
||||||
// Otherwise we default to the side-by-side NDK version from AGP.
|
// Otherwise we default to the side-by-side NDK version from AGP.
|
||||||
ndkVersion = "21.4.7075529"
|
ndkVersion = "21.4.7075529"
|
||||||
|
|
|
@ -26,5 +26,5 @@ android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
android.bundle.enableUncompressedNativeLibs=false
|
android.bundle.enableUncompressedNativeLibs=false
|
||||||
|
|
||||||
appVersion=22.3.0
|
appVersion=99.0.0
|
||||||
sdkVersion=5.2.0
|
sdkVersion=99.0.0
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
PKG_NAME=${1:-org.jitsi.meet}
|
||||||
|
APP_PID=$(adb shell ps | grep $PKG_NAME | awk '{print $2}')
|
||||||
|
|
||||||
|
if [[ -z "$APP_PID" ]]; then
|
||||||
|
echo "App is not running"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec adb logcat --pid=$APP_PID
|
|
@ -51,15 +51,10 @@ dependencies {
|
||||||
implementation 'com.google.code.gson:gson:2.8.6'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
implementation "androidx.startup:startup-runtime:1.1.0"
|
implementation "androidx.startup:startup-runtime:1.1.0"
|
||||||
|
|
||||||
if (rootProject.ext.libreBuild) {
|
// Only add these packages if we are NOT doing a LIBRE_BUILD
|
||||||
implementation(project(':react-native-device-info')) {
|
if (!rootProject.ext.libreBuild) {
|
||||||
exclude group: 'com.google.firebase'
|
|
||||||
exclude group: 'com.google.android.gms'
|
|
||||||
exclude group: 'com.android.installreferrer'
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
implementation project(':react-native-amplitude')
|
implementation project(':react-native-amplitude')
|
||||||
implementation project(':react-native-device-info')
|
implementation project(':react-native-giphy')
|
||||||
implementation(project(":react-native-google-signin")) {
|
implementation(project(":react-native-google-signin")) {
|
||||||
exclude group: 'com.google.android.gms'
|
exclude group: 'com.google.android.gms'
|
||||||
exclude group: 'androidx'
|
exclude group: 'androidx'
|
||||||
|
@ -72,15 +67,18 @@ dependencies {
|
||||||
implementation project(':react-native-community_clipboard')
|
implementation project(':react-native-community_clipboard')
|
||||||
implementation project(':react-native-community_netinfo')
|
implementation project(':react-native-community_netinfo')
|
||||||
implementation project(':react-native-default-preference')
|
implementation project(':react-native-default-preference')
|
||||||
|
implementation(project(':react-native-device-info')) {
|
||||||
|
exclude group: 'com.google.firebase'
|
||||||
|
exclude group: 'com.google.android.gms'
|
||||||
|
exclude group: 'com.android.installreferrer'
|
||||||
|
}
|
||||||
implementation project(':react-native-gesture-handler')
|
implementation project(':react-native-gesture-handler')
|
||||||
implementation project(':react-native-get-random-values')
|
implementation project(':react-native-get-random-values')
|
||||||
implementation project(':react-native-giphy')
|
|
||||||
implementation project(':react-native-immersive')
|
implementation project(':react-native-immersive')
|
||||||
implementation project(':react-native-keep-awake')
|
implementation project(':react-native-keep-awake')
|
||||||
implementation project(':react-native-masked-view_masked-view')
|
implementation project(':react-native-orientation-locker')
|
||||||
implementation project(':react-native-pager-view')
|
implementation project(':react-native-pager-view')
|
||||||
implementation project(':react-native-performance')
|
implementation project(':react-native-performance')
|
||||||
implementation project(':react-native-reanimated')
|
|
||||||
implementation project(':react-native-safe-area-context')
|
implementation project(':react-native-safe-area-context')
|
||||||
implementation project(':react-native-screens')
|
implementation project(':react-native-screens')
|
||||||
implementation project(':react-native-slider')
|
implementation project(':react-native-slider')
|
||||||
|
|
|
@ -22,6 +22,8 @@ import android.os.Build;
|
||||||
import android.telecom.CallAudioState;
|
import android.telecom.CallAudioState;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
|
import com.facebook.react.bridge.ReactContext;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -49,6 +51,8 @@ class AudioDeviceHandlerConnectionService implements
|
||||||
*/
|
*/
|
||||||
private AudioModeModule module;
|
private AudioModeModule module;
|
||||||
|
|
||||||
|
private RNConnectionService rcs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts any of the "DEVICE_" constants into the corresponding
|
* Converts any of the "DEVICE_" constants into the corresponding
|
||||||
* {@link android.telecom.CallAudioState} "ROUTE_" number.
|
* {@link android.telecom.CallAudioState} "ROUTE_" number.
|
||||||
|
@ -141,8 +145,8 @@ class AudioDeviceHandlerConnectionService implements
|
||||||
JitsiMeetLogger.i("Using " + TAG + " as the audio device handler");
|
JitsiMeetLogger.i("Using " + TAG + " as the audio device handler");
|
||||||
|
|
||||||
module = audioModeModule;
|
module = audioModeModule;
|
||||||
|
rcs = module.getContext().getNativeModule(RNConnectionService.class);
|
||||||
|
|
||||||
RNConnectionService rcs = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
|
|
||||||
if (rcs != null) {
|
if (rcs != null) {
|
||||||
rcs.setCallAudioStateListener(this);
|
rcs.setCallAudioStateListener(this);
|
||||||
} else {
|
} else {
|
||||||
|
@ -152,9 +156,9 @@ class AudioDeviceHandlerConnectionService implements
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stop() {
|
public void stop() {
|
||||||
RNConnectionService rcs = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
|
|
||||||
if (rcs != null) {
|
if (rcs != null) {
|
||||||
rcs.setCallAudioStateListener(null);
|
rcs.setCallAudioStateListener(null);
|
||||||
|
rcs = null;
|
||||||
} else {
|
} else {
|
||||||
JitsiMeetLogger.w(TAG + " Couldn't set call audio state listener, module is null");
|
JitsiMeetLogger.w(TAG + " Couldn't set call audio state listener, module is null");
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,10 +26,13 @@ import com.facebook.react.bridge.Arguments;
|
||||||
import com.facebook.react.bridge.Promise;
|
import com.facebook.react.bridge.Promise;
|
||||||
import com.facebook.react.bridge.ReactApplicationContext;
|
import com.facebook.react.bridge.ReactApplicationContext;
|
||||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||||
|
import com.facebook.react.bridge.ReactContext;
|
||||||
import com.facebook.react.bridge.ReactMethod;
|
import com.facebook.react.bridge.ReactMethod;
|
||||||
import com.facebook.react.bridge.WritableArray;
|
import com.facebook.react.bridge.WritableArray;
|
||||||
import com.facebook.react.bridge.WritableMap;
|
import com.facebook.react.bridge.WritableMap;
|
||||||
import com.facebook.react.module.annotations.ReactModule;
|
import com.facebook.react.module.annotations.ReactModule;
|
||||||
|
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||||
|
|
||||||
|
|
||||||
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
||||||
|
|
||||||
|
@ -196,7 +199,7 @@ class AudioModeModule extends ReactContextBaseJavaModule {
|
||||||
deviceInfo.putBoolean("selected", device.equals(selectedDevice));
|
deviceInfo.putBoolean("selected", device.equals(selectedDevice));
|
||||||
data.pushMap(deviceInfo);
|
data.pushMap(deviceInfo);
|
||||||
}
|
}
|
||||||
ReactInstanceManagerHolder.emitEvent(DEVICE_CHANGE_EVENT, data);
|
getContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(DEVICE_CHANGE_EVENT, data);
|
||||||
JitsiMeetLogger.i(TAG + " Updating audio device list");
|
JitsiMeetLogger.i(TAG + " Updating audio device list");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -212,6 +215,10 @@ class AudioModeModule extends ReactContextBaseJavaModule {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ReactContext getContext(){
|
||||||
|
return this.getReactApplicationContext();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the audio device handler module. This function is called *after* all Catalyst
|
* 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}
|
* modules have been created, and that's why we use it, because {@link AudioDeviceHandlerConnectionService}
|
||||||
|
|
|
@ -1,240 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
* 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.app.Activity;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
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;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.WeakHashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for all views which are backed by a React Native view.
|
|
||||||
*/
|
|
||||||
public abstract class BaseReactView<ListenerT>
|
|
||||||
extends FrameLayout {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Background color used by {@code BaseReactView} and the React Native root
|
|
||||||
* view.
|
|
||||||
*/
|
|
||||||
protected static int BACKGROUND_COLOR = 0xFF111111;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The collection of all existing {@code BaseReactView}s. Used to find the
|
|
||||||
* {@code BaseReactView} when delivering events coming from
|
|
||||||
* {@link ExternalAPIModule}.
|
|
||||||
*/
|
|
||||||
static final Set<BaseReactView> views
|
|
||||||
= Collections.newSetFromMap(new WeakHashMap<BaseReactView, Boolean>());
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds a {@code BaseReactView} which matches a specific external API
|
|
||||||
* scope.
|
|
||||||
*
|
|
||||||
* @param externalAPIScope - The external API scope associated with the
|
|
||||||
* {@code BaseReactView} to find.
|
|
||||||
* @return The {@code BaseReactView}, if any, associated with the specified
|
|
||||||
* {@code externalAPIScope}; otherwise, {@code null}.
|
|
||||||
*/
|
|
||||||
public static BaseReactView findViewByExternalAPIScope(
|
|
||||||
String externalAPIScope) {
|
|
||||||
synchronized (views) {
|
|
||||||
for (BaseReactView view : views) {
|
|
||||||
if (view.externalAPIScope.equals(externalAPIScope)) {
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
* inspired by postis which we use on Web for the similar purposes of the
|
|
||||||
* iframe-based external API.
|
|
||||||
*/
|
|
||||||
protected String externalAPIScope;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The listener (e.g. {@link JitsiMeetViewListener}) instance for reporting
|
|
||||||
* events occurring in Jitsi Meet.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
private ListenerT listener;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* React Native root view.
|
|
||||||
*/
|
|
||||||
private ReactRootView reactRootView;
|
|
||||||
|
|
||||||
public BaseReactView(@NonNull Context context) {
|
|
||||||
super(context);
|
|
||||||
initialize((Activity)context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseReactView(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
initialize((Activity)context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseReactView(Context context, AttributeSet attrs, int defStyle) {
|
|
||||||
super(context, attrs, defStyle);
|
|
||||||
initialize((Activity)context);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the {@code ReactRootView} for the given app name with the given
|
|
||||||
* props. Once created it's set as the view of this {@code FrameLayout}.
|
|
||||||
*
|
|
||||||
* @param appName - The name of the "app" (in React Native terms) to load.
|
|
||||||
* @param props - The React Component props to pass to the app.
|
|
||||||
*/
|
|
||||||
public void createReactRootView(String appName, @Nullable Bundle props) {
|
|
||||||
if (props == null) {
|
|
||||||
props = new Bundle();
|
|
||||||
}
|
|
||||||
|
|
||||||
props.putString("externalAPIScope", externalAPIScope);
|
|
||||||
|
|
||||||
if (reactRootView == null) {
|
|
||||||
reactRootView = new ReactRootView(getContext());
|
|
||||||
reactRootView.startReactApplication(
|
|
||||||
ReactInstanceManagerHolder.getReactInstanceManager(),
|
|
||||||
appName,
|
|
||||||
props);
|
|
||||||
reactRootView.setBackgroundColor(BACKGROUND_COLOR);
|
|
||||||
addView(reactRootView);
|
|
||||||
} else {
|
|
||||||
reactRootView.setAppProperties(props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Releases the React resources (specifically the {@link ReactRootView})
|
|
||||||
* associated with this view.
|
|
||||||
*
|
|
||||||
* MUST be called when the {@link Activity} holding this view is destroyed,
|
|
||||||
* typically in the {@code onDestroy} method.
|
|
||||||
*/
|
|
||||||
public void dispose() {
|
|
||||||
if (reactRootView != null) {
|
|
||||||
removeView(reactRootView);
|
|
||||||
reactRootView.unmountReactApplication();
|
|
||||||
reactRootView = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the listener set on this {@code BaseReactView}.
|
|
||||||
*
|
|
||||||
* @return The listener set on this {@code BaseReactView}.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public ListenerT getListener() {
|
|
||||||
return listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract method called by {@link ExternalAPIModule} when an event is
|
|
||||||
* received for this view.
|
|
||||||
*
|
|
||||||
* @param name - The name of the event.
|
|
||||||
* @param data - The details of the event associated with/specific to the
|
|
||||||
* specified {@code name}.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
protected abstract void onExternalAPIEvent(String name, ReadableMap data);
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
protected void onExternalAPIEvent(
|
|
||||||
Map<String, Method> listenerMethods,
|
|
||||||
String name, ReadableMap data) {
|
|
||||||
ListenerT listener = getListener();
|
|
||||||
|
|
||||||
if (listener != null) {
|
|
||||||
ListenerUtils.runListenerMethod(
|
|
||||||
listener, listenerMethods, name, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the window containing this view gains or loses focus.
|
|
||||||
*
|
|
||||||
* @param hasFocus If the window of this view now has focus, {@code true};
|
|
||||||
* otherwise, {@code false}.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onWindowFocusChanged(boolean hasFocus) {
|
|
||||||
super.onWindowFocusChanged(hasFocus);
|
|
||||||
|
|
||||||
// https://github.com/mockingbot/react-native-immersive#restore-immersive-state
|
|
||||||
RNImmersiveModule immersive = RNImmersiveModule.getInstance();
|
|
||||||
|
|
||||||
if (hasFocus && immersive != null) {
|
|
||||||
immersive.emitImmersiveStateChangeEvent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a specific listener on this {@code BaseReactView}.
|
|
||||||
*
|
|
||||||
* @param listener The listener to set on this {@code BaseReactView}.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public void setListener(ListenerT listener) {
|
|
||||||
this.listener = listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initialize(Activity activity) {
|
|
||||||
setBackgroundColor(BACKGROUND_COLOR);
|
|
||||||
|
|
||||||
ReactInstanceManagerHolder.initReactInstanceManager(activity);
|
|
||||||
|
|
||||||
// Hook this BaseReactView into ExternalAPI.
|
|
||||||
externalAPIScope = UUID.randomUUID().toString();
|
|
||||||
synchronized (views) {
|
|
||||||
views.add(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -102,31 +102,18 @@ class ExternalAPIModule extends ReactContextBaseJavaModule {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispatches an event that occurred on the JavaScript side of the SDK to
|
* Dispatches an event that occurred on the JavaScript side of the SDK to
|
||||||
* the specified {@link BaseReactView}'s listener.
|
* the native side.
|
||||||
*
|
*
|
||||||
* @param name The name of the event.
|
* @param name The name of the event.
|
||||||
* @param data The details/specifics of the event to send determined
|
* @param data The details/specifics of the event to send determined
|
||||||
* by/associated with the specified {@code name}.
|
* by/associated with the specified {@code name}.
|
||||||
* @param scope
|
|
||||||
*/
|
*/
|
||||||
@ReactMethod
|
@ReactMethod
|
||||||
public void sendEvent(String name, ReadableMap data, String scope) {
|
public void sendEvent(String name, ReadableMap data) {
|
||||||
// Keep track of the current ongoing conference.
|
// Keep track of the current ongoing conference.
|
||||||
OngoingConferenceTracker.getInstance().onExternalAPIEvent(name, data);
|
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);
|
JitsiMeetLogger.d(TAG + " Sending event: " + name + " with data: " + data);
|
||||||
try {
|
|
||||||
view.onExternalAPIEvent(name, data);
|
|
||||||
broadcastEmitter.sendBroadcast(name, data);
|
broadcastEmitter.sendBroadcast(name, data);
|
||||||
} catch (Exception e) {
|
|
||||||
JitsiMeetLogger.e(e, TAG + " onExternalAPIEvent: error sending event");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
|
import org.webrtc.VideoCodecInfo;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/** Container for static helper functions related to dealing with H264 codecs. */
|
||||||
|
class H264Utils {
|
||||||
|
public static final String H264_FMTP_PROFILE_LEVEL_ID = "profile-level-id";
|
||||||
|
public static final String H264_FMTP_LEVEL_ASYMMETRY_ALLOWED = "level-asymmetry-allowed";
|
||||||
|
public static final String H264_FMTP_PACKETIZATION_MODE = "packetization-mode";
|
||||||
|
|
||||||
|
public static final String H264_PROFILE_CONSTRAINED_BASELINE = "42e0";
|
||||||
|
public static final String H264_PROFILE_CONSTRAINED_HIGH = "640c";
|
||||||
|
public static final String H264_LEVEL_3_1 = "1f"; // 31 in hex.
|
||||||
|
public static final String H264_CONSTRAINED_HIGH_3_1 =
|
||||||
|
H264_PROFILE_CONSTRAINED_HIGH + H264_LEVEL_3_1;
|
||||||
|
public static final String H264_CONSTRAINED_BASELINE_3_1 =
|
||||||
|
H264_PROFILE_CONSTRAINED_BASELINE + H264_LEVEL_3_1;
|
||||||
|
|
||||||
|
public static Map<String, String> getDefaultH264Params(boolean isHighProfile) {
|
||||||
|
final Map<String, String> params = new HashMap<>();
|
||||||
|
params.put(VideoCodecInfo.H264_FMTP_LEVEL_ASYMMETRY_ALLOWED, "1");
|
||||||
|
params.put(VideoCodecInfo.H264_FMTP_PACKETIZATION_MODE, "1");
|
||||||
|
params.put(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID,
|
||||||
|
isHighProfile ? VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1
|
||||||
|
: VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1);
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VideoCodecInfo DEFAULT_H264_BASELINE_PROFILE_CODEC =
|
||||||
|
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ false));
|
||||||
|
public static VideoCodecInfo DEFAULT_H264_HIGH_PROFILE_CODEC =
|
||||||
|
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ true));
|
||||||
|
}
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jitsi.meet.sdk;
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
@ -22,6 +23,7 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.startup.Initializer;
|
import androidx.startup.Initializer;
|
||||||
|
|
||||||
import com.facebook.soloader.SoLoader;
|
import com.facebook.soloader.SoLoader;
|
||||||
|
import org.wonday.orientation.OrientationActivityLifecycle;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -37,6 +39,10 @@ public class JitsiInitializer implements Initializer<Boolean> {
|
||||||
|
|
||||||
// Register our uncaught exception handler.
|
// Register our uncaught exception handler.
|
||||||
JitsiMeetUncaughtExceptionHandler.register();
|
JitsiMeetUncaughtExceptionHandler.register();
|
||||||
|
|
||||||
|
// Register activity lifecycle handler for the orientation locker module.
|
||||||
|
((Application) context).registerActivityLifecycleCallbacks(OrientationActivityLifecycle.getInstance());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
@ -86,6 +87,14 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||||
// Overrides
|
// Overrides
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConfigurationChanged(Configuration newConfig) {
|
||||||
|
super.onConfigurationChanged(newConfig);
|
||||||
|
Intent intent = new Intent("onConfigurationChanged");
|
||||||
|
intent.putExtra("newConfig", newConfig);
|
||||||
|
this.sendBroadcast(intent);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
@ -167,12 +176,9 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void leave() {
|
protected void leave() {
|
||||||
if (this.jitsiView != null) {
|
Intent hangupBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent();
|
||||||
this.jitsiView .leave();
|
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(hangupBroadcastIntent);
|
||||||
} else {
|
|
||||||
JitsiMeetLogger.w("Cannot leave, view is null");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private @Nullable
|
private @Nullable
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
* 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.os.Bundle;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base {@link Fragment} for applications integrating Jitsi Meet at a higher level. It
|
|
||||||
* contains all the required wiring between the {@code JitsiMeetView} and
|
|
||||||
* the Fragment lifecycle methods already implemented.
|
|
||||||
*
|
|
||||||
* In this fragment 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 lifecycle methods associated with this Fragment are
|
|
||||||
* hooked to the React Native subsystem via proxy calls through the
|
|
||||||
* {@code JitsiMeetActivityDelegate} static methods.
|
|
||||||
*
|
|
||||||
* @deprecated use {@link JitsiMeetActivity} or directly {@link JitsiMeetView}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public class JitsiMeetFragment extends Fragment {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instance of the {@link JitsiMeetView} which this activity will display.
|
|
||||||
*/
|
|
||||||
private JitsiMeetView view;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
|
||||||
@Nullable ViewGroup container,
|
|
||||||
@Nullable Bundle savedInstanceState) {
|
|
||||||
return this.view = new JitsiMeetView(getActivity());
|
|
||||||
}
|
|
||||||
|
|
||||||
public JitsiMeetView getJitsiView() {
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
|
|
||||||
JitsiMeetActivityDelegate.onHostDestroy(getActivity());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
|
|
||||||
JitsiMeetActivityDelegate.onHostResume(getActivity());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStop() {
|
|
||||||
super.onStop();
|
|
||||||
|
|
||||||
JitsiMeetActivityDelegate.onHostPause(getActivity());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -51,7 +51,7 @@ public class JitsiMeetOngoingConferenceService extends Service
|
||||||
|
|
||||||
private boolean isAudioMuted;
|
private boolean isAudioMuted;
|
||||||
|
|
||||||
static void launch(Context context, HashMap<String, Object> extraData) {
|
public static void launch(Context context, HashMap<String, Object> extraData) {
|
||||||
OngoingNotification.createOngoingConferenceNotificationChannel();
|
OngoingNotification.createOngoingConferenceNotificationChannel();
|
||||||
|
|
||||||
Intent intent = new Intent(context, JitsiMeetOngoingConferenceService.class);
|
Intent intent = new Intent(context, JitsiMeetOngoingConferenceService.class);
|
||||||
|
@ -80,7 +80,7 @@ public class JitsiMeetOngoingConferenceService extends Service
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void abort(Context context) {
|
public static void abort(Context context) {
|
||||||
Intent intent = new Intent(context, JitsiMeetOngoingConferenceService.class);
|
Intent intent = new Intent(context, JitsiMeetOngoingConferenceService.class);
|
||||||
context.stopService(intent);
|
context.stopService(intent);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,36 +16,33 @@
|
||||||
|
|
||||||
package org.jitsi.meet.sdk;
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.facebook.react.bridge.ReadableMap;
|
import com.facebook.react.ReactRootView;
|
||||||
|
import com.rnimmersive.RNImmersiveModule;
|
||||||
|
|
||||||
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
|
public class JitsiMeetView extends FrameLayout {
|
||||||
implements OngoingConferenceTracker.OngoingConferenceListener {
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@code Method}s of {@code JitsiMeetViewListener} by event name i.e.
|
* Background color used by {@code BaseReactView} and the React Native root
|
||||||
* redux action types.
|
* view.
|
||||||
*/
|
*/
|
||||||
private static final Map<String, Method> LISTENER_METHODS
|
private static final int BACKGROUND_COLOR = 0xFF111111;
|
||||||
= ListenerUtils.mapListenerMethods(JitsiMeetViewListener.class);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The URL of the current conference.
|
* React Native root view.
|
||||||
*/
|
*/
|
||||||
// XXX Currently, one thread writes and one thread reads, so it should be
|
private ReactRootView reactRootView;
|
||||||
// fine to have this field volatile without additional synchronization.
|
|
||||||
private volatile String url;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to recursively merge 2 {@link Bundle} objects representing React Native props.
|
* Helper method to recursively merge 2 {@link Bundle} objects representing React Native props.
|
||||||
|
@ -84,6 +81,8 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
|
||||||
result.putBoolean(key, (Boolean)bValue);
|
result.putBoolean(key, (Boolean)bValue);
|
||||||
} else if (valueType.contentEquals("String")) {
|
} else if (valueType.contentEquals("String")) {
|
||||||
result.putString(key, (String)bValue);
|
result.putString(key, (String)bValue);
|
||||||
|
} else if (valueType.contentEquals("Integer")) {
|
||||||
|
result.putInt(key, (int)bValue);
|
||||||
} else if (valueType.contentEquals("Bundle")) {
|
} else if (valueType.contentEquals("Bundle")) {
|
||||||
result.putBundle(key, mergeProps((Bundle)aValue, (Bundle)bValue));
|
result.putBundle(key, mergeProps((Bundle)aValue, (Bundle)bValue));
|
||||||
} else {
|
} else {
|
||||||
|
@ -109,10 +108,19 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
|
||||||
initialize(context);
|
initialize(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* Releases the React resources (specifically the {@link ReactRootView})
|
||||||
|
* associated with this view.
|
||||||
|
*
|
||||||
|
* MUST be called when the {@link Activity} holding this view is destroyed,
|
||||||
|
* typically in the {@code onDestroy} method.
|
||||||
|
*/
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
OngoingConferenceTracker.getInstance().removeListener(this);
|
if (reactRootView != null) {
|
||||||
super.dispose();
|
removeView(reactRootView);
|
||||||
|
reactRootView.unmountReactApplication();
|
||||||
|
reactRootView = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,8 +138,7 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
|
||||||
PictureInPictureModule.class);
|
PictureInPictureModule.class);
|
||||||
if (pipModule != null
|
if (pipModule != null
|
||||||
&& pipModule.isPictureInPictureSupported()
|
&& pipModule.isPictureInPictureSupported()
|
||||||
&& !JitsiMeetActivityDelegate.arePermissionsBeingRequested()
|
&& !JitsiMeetActivityDelegate.arePermissionsBeingRequested()) {
|
||||||
&& this.url != null) {
|
|
||||||
try {
|
try {
|
||||||
pipModule.enterPictureInPicture();
|
pipModule.enterPictureInPicture();
|
||||||
} catch (RuntimeException re) {
|
} catch (RuntimeException re) {
|
||||||
|
@ -151,10 +158,40 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Leaves the currently active conference.
|
* Creates the {@code ReactRootView} for the given app name with the given
|
||||||
|
* props. Once created it's set as the view of this {@code FrameLayout}.
|
||||||
|
*
|
||||||
|
* @param appName - The name of the "app" (in React Native terms) to load.
|
||||||
|
* @param props - The React Component props to pass to the app.
|
||||||
*/
|
*/
|
||||||
public void leave() {
|
private void createReactRootView(String appName, @Nullable Bundle props) {
|
||||||
setProps(new Bundle());
|
if (props == null) {
|
||||||
|
props = new Bundle();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reactRootView == null) {
|
||||||
|
reactRootView = new ReactRootView(getContext());
|
||||||
|
reactRootView.startReactApplication(
|
||||||
|
ReactInstanceManagerHolder.getReactInstanceManager(),
|
||||||
|
appName,
|
||||||
|
props);
|
||||||
|
reactRootView.setBackgroundColor(BACKGROUND_COLOR);
|
||||||
|
addView(reactRootView);
|
||||||
|
} else {
|
||||||
|
reactRootView.setAppProperties(props);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initialize(@NonNull Context context) {
|
||||||
|
// Check if the parent Activity implements JitsiMeetActivityInterface,
|
||||||
|
// otherwise things may go wrong.
|
||||||
|
if (!(context instanceof JitsiMeetActivityInterface)) {
|
||||||
|
throw new RuntimeException("Enclosing Activity must implement JitsiMeetActivityInterface");
|
||||||
|
}
|
||||||
|
|
||||||
|
setBackgroundColor(BACKGROUND_COLOR);
|
||||||
|
|
||||||
|
ReactInstanceManagerHolder.initReactInstanceManager((Activity) context);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -171,7 +208,7 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
|
||||||
// by leaving the conference. However, React and, respectively,
|
// by leaving the conference. However, React and, respectively,
|
||||||
// appProperties/initialProperties are declarative expressions i.e. one
|
// appProperties/initialProperties are declarative expressions i.e. one
|
||||||
// and the same URL will not trigger an automatic re-render in the
|
// and the same URL will not trigger an automatic re-render in the
|
||||||
// JavaScript source code. The workaround implemented bellow introduces
|
// JavaScript source code. The workaround implemented below introduces
|
||||||
// "imperativeness" in React Component props by defining a unique value
|
// "imperativeness" in React Component props by defining a unique value
|
||||||
// per setProps() invocation.
|
// per setProps() invocation.
|
||||||
props.putLong("timestamp", System.currentTimeMillis());
|
props.putLong("timestamp", System.currentTimeMillis());
|
||||||
|
@ -179,46 +216,27 @@ public class JitsiMeetView extends BaseReactView<JitsiMeetViewListener>
|
||||||
createReactRootView("App", props);
|
createReactRootView("App", props);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for {@link OngoingConferenceTracker} events.
|
|
||||||
* @param conferenceUrl
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onCurrentConferenceChanged(String conferenceUrl) {
|
|
||||||
// This property was introduced in order to address
|
|
||||||
// an exception in the Picture-in-Picture functionality which arose
|
|
||||||
// because of delays related to bridging between JavaScript and Java. To
|
|
||||||
// reduce these delays do not wait for the call to be transferred to the
|
|
||||||
// UI thread.
|
|
||||||
this.url = conferenceUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for {@link ExternalAPIModule} events.
|
|
||||||
*
|
|
||||||
* @param name The name of the event.
|
|
||||||
* @param data The details/specifics of the event to send determined
|
|
||||||
* by/associated with the specified {@code name}.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
protected void onExternalAPIEvent(String name, ReadableMap data) {
|
|
||||||
onExternalAPIEvent(LISTENER_METHODS, name, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDetachedFromWindow() {
|
protected void onDetachedFromWindow() {
|
||||||
dispose();
|
dispose();
|
||||||
super.onDetachedFromWindow();
|
super.onDetachedFromWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initialize(@NonNull Context context) {
|
/**
|
||||||
// Check if the parent Activity implements JitsiMeetActivityInterface,
|
* Called when the window containing this view gains or loses focus.
|
||||||
// otherwise things may go wrong.
|
*
|
||||||
if (!(context instanceof JitsiMeetActivityInterface)) {
|
* @param hasFocus If the window of this view now has focus, {@code true};
|
||||||
throw new RuntimeException("Enclosing Activity must implement JitsiMeetActivityInterface");
|
* otherwise, {@code false}.
|
||||||
}
|
*/
|
||||||
|
@Override
|
||||||
|
public void onWindowFocusChanged(boolean hasFocus) {
|
||||||
|
super.onWindowFocusChanged(hasFocus);
|
||||||
|
|
||||||
OngoingConferenceTracker.getInstance().addListener(this);
|
// https://github.com/mockingbot/react-native-immersive#restore-immersive-state
|
||||||
|
RNImmersiveModule immersive = RNImmersiveModule.getInstance();
|
||||||
|
|
||||||
|
if (hasFocus && immersive != null) {
|
||||||
|
immersive.emitImmersiveStateChangeEvent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright @ 2017-present Atlassian Pty Ltd
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jitsi.meet.sdk;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for listening to events coming from Jitsi Meet.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public interface JitsiMeetViewListener {
|
|
||||||
/**
|
|
||||||
* Called when a conference was joined.
|
|
||||||
*
|
|
||||||
* @param data Map with a "url" key with the conference URL.
|
|
||||||
*/
|
|
||||||
void onConferenceJoined(Map<String, Object> data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the active conference ends, be it because of user choice or
|
|
||||||
* because of a failure.
|
|
||||||
*
|
|
||||||
* @param data Map with an "error" key with the error and a "url" key with
|
|
||||||
* the conference URL. If the conference finished gracefully no `error`
|
|
||||||
* key will be present. The possible values for "error" are described here:
|
|
||||||
* https://github.com/jitsi/lib-jitsi-meet/blob/master/JitsiConnectionErrors.js
|
|
||||||
* https://github.com/jitsi/lib-jitsi-meet/blob/master/JitsiConferenceErrors.js
|
|
||||||
*/
|
|
||||||
void onConferenceTerminated(Map<String, Object> data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called before the conference is joined.
|
|
||||||
*
|
|
||||||
* @param data Map with a "url" key with the conference URL.
|
|
||||||
*/
|
|
||||||
void onConferenceWillJoin(Map<String, Object> data);
|
|
||||||
}
|
|
|
@ -1,167 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright @ 2018-present Atlassian Pty Ltd
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jitsi.meet.sdk;
|
|
||||||
|
|
||||||
import com.facebook.react.bridge.ReadableMap;
|
|
||||||
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
||||||
import com.facebook.react.bridge.UiThreadUtil;
|
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utility methods for helping with transforming {@link ExternalAPIModule}
|
|
||||||
* events into listener methods. Used with descendants of {@link BaseReactView}.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public final class ListenerUtils {
|
|
||||||
/**
|
|
||||||
* Extracts the methods defined in a listener and creates a mapping of this
|
|
||||||
* form: event name -> method.
|
|
||||||
*
|
|
||||||
* @param listener - The listener whose methods we want to slurp.
|
|
||||||
* @return A mapping with event names - methods.
|
|
||||||
*/
|
|
||||||
public static Map<String, Method> mapListenerMethods(Class listener) {
|
|
||||||
Map<String, Method> methods = new HashMap<>();
|
|
||||||
|
|
||||||
// Figure out the mapping between the listener methods
|
|
||||||
// and the events i.e. redux action types.
|
|
||||||
Pattern onPattern = Pattern.compile("^on[A-Z]+");
|
|
||||||
Pattern camelcasePattern = Pattern.compile("([a-z0-9]+)([A-Z0-9]+)");
|
|
||||||
|
|
||||||
for (Method method : listener.getDeclaredMethods()) {
|
|
||||||
// * The method must be public (because it is declared by an
|
|
||||||
// interface).
|
|
||||||
// * The method must be/return void.
|
|
||||||
if (!Modifier.isPublic(method.getModifiers())
|
|
||||||
|| !Void.TYPE.equals(method.getReturnType())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// * The method name must start with "on" followed by a
|
|
||||||
// capital/uppercase letter (in agreement with the camelcase
|
|
||||||
// coding style customary to Java in general and the projects of
|
|
||||||
// the Jitsi community in particular).
|
|
||||||
String name = method.getName();
|
|
||||||
|
|
||||||
if (!onPattern.matcher(name).find()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// * The method must accept/have exactly 1 parameter of a type
|
|
||||||
// assignable from HashMap.
|
|
||||||
Class<?>[] parameterTypes = method.getParameterTypes();
|
|
||||||
|
|
||||||
if (parameterTypes.length != 1
|
|
||||||
|| !parameterTypes[0].isAssignableFrom(HashMap.class)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert the method name to an event name.
|
|
||||||
name
|
|
||||||
= camelcasePattern.matcher(name.substring(2))
|
|
||||||
.replaceAll("$1_$2")
|
|
||||||
.toUpperCase(Locale.ROOT);
|
|
||||||
methods.put(name, method);
|
|
||||||
}
|
|
||||||
|
|
||||||
return methods;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes the right listener method for the given event.
|
|
||||||
* NOTE: This function will run asynchronously on the UI thread.
|
|
||||||
*
|
|
||||||
* @param listener - The listener on which the method will be called.
|
|
||||||
* @param listenerMethods - Mapping with event names and the matching
|
|
||||||
* methods.
|
|
||||||
* @param eventName - Name of the event.
|
|
||||||
* @param eventData - Data associated with the event.
|
|
||||||
*/
|
|
||||||
public static void runListenerMethod(
|
|
||||||
final Object listener,
|
|
||||||
final Map<String, Method> listenerMethods,
|
|
||||||
final String eventName,
|
|
||||||
final ReadableMap eventData) {
|
|
||||||
// Make sure listener methods are invoked on the UI thread. It
|
|
||||||
// was requested by SDK consumers.
|
|
||||||
if (UiThreadUtil.isOnUiThread()) {
|
|
||||||
runListenerMethodOnUiThread(
|
|
||||||
listener, listenerMethods, eventName, eventData);
|
|
||||||
} else {
|
|
||||||
UiThreadUtil.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
runListenerMethodOnUiThread(
|
|
||||||
listener, listenerMethods, eventName, eventData);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper companion for {@link ListenerUtils#runListenerMethod} which runs
|
|
||||||
* in the UI thread.
|
|
||||||
*/
|
|
||||||
private static void runListenerMethodOnUiThread(
|
|
||||||
Object listener,
|
|
||||||
Map<String, Method> listenerMethods,
|
|
||||||
String eventName,
|
|
||||||
ReadableMap eventData) {
|
|
||||||
UiThreadUtil.assertOnUiThread();
|
|
||||||
|
|
||||||
Method method = listenerMethods.get(eventName);
|
|
||||||
if (method != null) {
|
|
||||||
try {
|
|
||||||
method.invoke(listener, toHashMap(eventData));
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes a new {@code HashMap} instance with the key-value
|
|
||||||
* associations of a specific {@code ReadableMap}.
|
|
||||||
*
|
|
||||||
* @param readableMap the {@code ReadableMap} specifying the key-value
|
|
||||||
* associations with which the new {@code HashMap} instance is to be
|
|
||||||
* initialized.
|
|
||||||
* @return a new {@code HashMap} instance initialized with the key-value
|
|
||||||
* associations of the specified {@code readableMap}.
|
|
||||||
*/
|
|
||||||
private static HashMap<String, Object> toHashMap(ReadableMap readableMap) {
|
|
||||||
HashMap<String, Object> hashMap = new HashMap<>();
|
|
||||||
|
|
||||||
for (ReadableMapKeySetIterator i = readableMap.keySetIterator();
|
|
||||||
i.hasNextKey();) {
|
|
||||||
String key = i.nextKey();
|
|
||||||
|
|
||||||
hashMap.put(key, readableMap.getString(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
return hashMap;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -193,7 +193,7 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
||||||
* Called by the JS side to update the call's state.
|
* Called by the JS side to update the call's state.
|
||||||
*
|
*
|
||||||
* @param callUUID - the call's UUID.
|
* @param callUUID - the call's UUID.
|
||||||
* @param callState - the map which carries infor about the current call's
|
* @param callState - the map which carries info about the current call's
|
||||||
* state. See static fields in {@link ConnectionService.ConnectionImpl}
|
* state. See static fields in {@link ConnectionService.ConnectionImpl}
|
||||||
* prefixed with "KEY_" for the values supported by the Android
|
* prefixed with "KEY_" for the values supported by the Android
|
||||||
* implementation.
|
* implementation.
|
||||||
|
|
|
@ -31,12 +31,12 @@ import com.facebook.react.common.LifecycleState;
|
||||||
import com.facebook.react.jscexecutor.JSCExecutorFactory;
|
import com.facebook.react.jscexecutor.JSCExecutorFactory;
|
||||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||||
import com.facebook.react.uimanager.ViewManager;
|
import com.facebook.react.uimanager.ViewManager;
|
||||||
|
import com.oney.WebRTCModule.EglUtils;
|
||||||
import com.oney.WebRTCModule.RTCVideoViewManager;
|
import com.oney.WebRTCModule.RTCVideoViewManager;
|
||||||
import com.oney.WebRTCModule.WebRTCModule;
|
import com.oney.WebRTCModule.WebRTCModule;
|
||||||
|
|
||||||
import org.devio.rn.splashscreen.SplashScreenModule;
|
import org.devio.rn.splashscreen.SplashScreenModule;
|
||||||
import org.webrtc.SoftwareVideoDecoderFactory;
|
import org.webrtc.EglBase;
|
||||||
import org.webrtc.SoftwareVideoEncoderFactory;
|
|
||||||
import org.webrtc.audio.AudioDeviceModule;
|
import org.webrtc.audio.AudioDeviceModule;
|
||||||
import org.webrtc.audio.JavaAudioDeviceModule;
|
import org.webrtc.audio.JavaAudioDeviceModule;
|
||||||
|
|
||||||
|
@ -46,6 +46,8 @@ import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
class ReactInstanceManagerHolder {
|
class ReactInstanceManagerHolder {
|
||||||
|
private static final String TAG = ReactInstanceManagerHolder.class.getSimpleName();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FIXME (from linter): Do not place Android context classes in static
|
* FIXME (from linter): Do not place Android context classes in static
|
||||||
* fields (static reference to ReactInstanceManager which has field
|
* fields (static reference to ReactInstanceManager which has field
|
||||||
|
@ -71,7 +73,6 @@ class ReactInstanceManagerHolder {
|
||||||
new SplashScreenModule(reactContext),
|
new SplashScreenModule(reactContext),
|
||||||
new PictureInPictureModule(reactContext),
|
new PictureInPictureModule(reactContext),
|
||||||
new ProximityModule(reactContext),
|
new ProximityModule(reactContext),
|
||||||
new WiFiStatsModule(reactContext),
|
|
||||||
new org.jitsi.meet.sdk.net.NAT64AddrInfoModule(reactContext)));
|
new org.jitsi.meet.sdk.net.NAT64AddrInfoModule(reactContext)));
|
||||||
|
|
||||||
if (AudioModeModule.useConnectionService()) {
|
if (AudioModeModule.useConnectionService()) {
|
||||||
|
@ -83,11 +84,14 @@ class ReactInstanceManagerHolder {
|
||||||
WebRTCModule.Options options = new WebRTCModule.Options();
|
WebRTCModule.Options options = new WebRTCModule.Options();
|
||||||
|
|
||||||
AudioDeviceModule adm = JavaAudioDeviceModule.builder(reactContext)
|
AudioDeviceModule adm = JavaAudioDeviceModule.builder(reactContext)
|
||||||
|
.setEnableVolumeLogger(false)
|
||||||
.createAudioDeviceModule();
|
.createAudioDeviceModule();
|
||||||
options.setAudioDeviceModule(adm);
|
options.setAudioDeviceModule(adm);
|
||||||
|
|
||||||
options.setVideoDecoderFactory(new SoftwareVideoDecoderFactory());
|
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
||||||
options.setVideoEncoderFactory(new SoftwareVideoEncoderFactory());
|
|
||||||
|
options.setVideoDecoderFactory(new WebRTCVideoDecoderFactory(eglContext));
|
||||||
|
options.setVideoEncoderFactory(new WebRTCVideoEncoderFactory(eglContext));
|
||||||
|
|
||||||
nativeModules.add(new WebRTCModule(reactContext, options));
|
nativeModules.add(new WebRTCModule(reactContext, options));
|
||||||
|
|
||||||
|
@ -110,24 +114,22 @@ class ReactInstanceManagerHolder {
|
||||||
new com.corbt.keepawake.KCKeepAwakePackage(),
|
new com.corbt.keepawake.KCKeepAwakePackage(),
|
||||||
new com.facebook.react.shell.MainReactPackage(),
|
new com.facebook.react.shell.MainReactPackage(),
|
||||||
new com.reactnativecommunity.clipboard.ClipboardPackage(),
|
new com.reactnativecommunity.clipboard.ClipboardPackage(),
|
||||||
new com.giphyreactnativesdk.GiphyReactNativeSdkPackage(),
|
|
||||||
new com.reactnativecommunity.netinfo.NetInfoPackage(),
|
new com.reactnativecommunity.netinfo.NetInfoPackage(),
|
||||||
new com.reactnativepagerview.PagerViewPackage(),
|
new com.reactnativepagerview.PagerViewPackage(),
|
||||||
new com.oblador.performance.PerformancePackage(),
|
new com.oblador.performance.PerformancePackage(),
|
||||||
new com.reactnativecommunity.slider.ReactSliderPackage(),
|
new com.reactnativecommunity.slider.ReactSliderPackage(),
|
||||||
new com.brentvatne.react.ReactVideoPackage(),
|
new com.brentvatne.react.ReactVideoPackage(),
|
||||||
new com.swmansion.reanimated.ReanimatedPackage(),
|
|
||||||
new org.reactnative.maskedview.RNCMaskedViewPackage(),
|
|
||||||
new com.reactnativecommunity.webview.RNCWebViewPackage(),
|
new com.reactnativecommunity.webview.RNCWebViewPackage(),
|
||||||
new com.kevinresol.react_native_default_preference.RNDefaultPreferencePackage(),
|
new com.kevinresol.react_native_default_preference.RNDefaultPreferencePackage(),
|
||||||
new com.learnium.RNDeviceInfo.RNDeviceInfo(),
|
new com.learnium.RNDeviceInfo.RNDeviceInfo(),
|
||||||
new com.swmansion.gesturehandler.react.RNGestureHandlerPackage(),
|
new com.swmansion.gesturehandler.RNGestureHandlerPackage(),
|
||||||
new org.linusu.RNGetRandomValuesPackage(),
|
new org.linusu.RNGetRandomValuesPackage(),
|
||||||
new com.rnimmersive.RNImmersivePackage(),
|
new com.rnimmersive.RNImmersivePackage(),
|
||||||
new com.swmansion.rnscreens.RNScreensPackage(),
|
new com.swmansion.rnscreens.RNScreensPackage(),
|
||||||
new com.zmxv.RNSound.RNSoundPackage(),
|
new com.zmxv.RNSound.RNSoundPackage(),
|
||||||
new com.th3rdwave.safeareacontext.SafeAreaContextPackage(),
|
new com.th3rdwave.safeareacontext.SafeAreaContextPackage(),
|
||||||
new com.horcrux.svg.SvgPackage(),
|
new com.horcrux.svg.SvgPackage(),
|
||||||
|
new org.wonday.orientation.OrientationPackage(),
|
||||||
new ReactPackageAdapter() {
|
new ReactPackageAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
||||||
|
@ -146,6 +148,17 @@ class ReactInstanceManagerHolder {
|
||||||
packages.add((ReactPackage)constructor.newInstance());
|
packages.add((ReactPackage)constructor.newInstance());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
||||||
|
Log.d(TAG, "Not loading AmplitudeReactNativePackage");
|
||||||
|
}
|
||||||
|
|
||||||
|
// GiphyReactNativeSdkPackage
|
||||||
|
try {
|
||||||
|
Class<?> giphyPackageClass = Class.forName("com.giphyreactnativesdk.GiphyReactNativeSdkPackage");
|
||||||
|
Constructor constructor = giphyPackageClass.getConstructor();
|
||||||
|
packages.add((ReactPackage)constructor.newInstance());
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
||||||
|
Log.d(TAG, "Not loading GiphyReactNativeSdkPackage");
|
||||||
}
|
}
|
||||||
|
|
||||||
// RNGoogleSignInPackage
|
// RNGoogleSignInPackage
|
||||||
|
@ -155,6 +168,7 @@ class ReactInstanceManagerHolder {
|
||||||
packages.add((ReactPackage)constructor.newInstance());
|
packages.add((ReactPackage)constructor.newInstance());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
// Ignore any error, the module is not compiled when LIBRE_BUILD is enabled.
|
||||||
|
Log.d(TAG, "Not loading RNGoogleSignInPackage");
|
||||||
}
|
}
|
||||||
|
|
||||||
return packages;
|
return packages;
|
||||||
|
@ -240,7 +254,7 @@ class ReactInstanceManagerHolder {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.d(ReactInstanceManagerHolder.class.getCanonicalName(), "initializing RN with Application");
|
Log.d(TAG, "initializing RN with Application");
|
||||||
|
|
||||||
reactInstanceManager
|
reactInstanceManager
|
||||||
= ReactInstanceManager.builder()
|
= ReactInstanceManager.builder()
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
|
/** Enumeration of supported video codec types. */
|
||||||
|
public enum VideoCodecMimeType {
|
||||||
|
VP8("video/x-vnd.on2.vp8"),
|
||||||
|
VP9("video/x-vnd.on2.vp9"),
|
||||||
|
H264("video/avc"),
|
||||||
|
AV1("video/av01");
|
||||||
|
|
||||||
|
private final String mimeType;
|
||||||
|
|
||||||
|
private VideoCodecMimeType(String mimeType) {
|
||||||
|
this.mimeType = mimeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
String mimeType() {
|
||||||
|
return mimeType;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.webrtc.EglBase;
|
||||||
|
import org.webrtc.HardwareVideoDecoderFactory;
|
||||||
|
import org.webrtc.SoftwareVideoDecoderFactory;
|
||||||
|
import org.webrtc.VideoCodecInfo;
|
||||||
|
import org.webrtc.VideoDecoder;
|
||||||
|
import org.webrtc.VideoDecoderFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a custom video decoder factory for WebRTC which behaves similarly
|
||||||
|
* to the default one in iOS. It supports the following codecs:
|
||||||
|
*
|
||||||
|
* - In hardware: H.264 (baseline)
|
||||||
|
* - In software: VP8, VP9, AV1
|
||||||
|
*/
|
||||||
|
public class WebRTCVideoDecoderFactory implements VideoDecoderFactory {
|
||||||
|
private final VideoDecoderFactory hardwareVideoDecoderFactory;
|
||||||
|
private final VideoDecoderFactory softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
|
||||||
|
|
||||||
|
public WebRTCVideoDecoderFactory(@Nullable EglBase.Context eglContext) {
|
||||||
|
this.hardwareVideoDecoderFactory = new HardwareVideoDecoderFactory(eglContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public VideoDecoder createDecoder(VideoCodecInfo codecInfo) {
|
||||||
|
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
|
||||||
|
return this.hardwareVideoDecoderFactory.createDecoder(codecInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.softwareVideoDecoderFactory.createDecoder(codecInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VideoCodecInfo[] getSupportedCodecs() {
|
||||||
|
List<VideoCodecInfo> codecs = new ArrayList<>();
|
||||||
|
|
||||||
|
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
|
||||||
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
|
||||||
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
|
||||||
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
|
||||||
|
|
||||||
|
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.webrtc.EglBase;
|
||||||
|
import org.webrtc.HardwareVideoEncoderFactory;
|
||||||
|
import org.webrtc.SoftwareVideoEncoderFactory;
|
||||||
|
import org.webrtc.VideoCodecInfo;
|
||||||
|
import org.webrtc.VideoEncoder;
|
||||||
|
import org.webrtc.VideoEncoderFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a custom video encoder factory for WebRTC which behaves similarly
|
||||||
|
* to the default one in iOS. It supports the following codecs:
|
||||||
|
*
|
||||||
|
* - In hardware: H.264 (baseline)
|
||||||
|
* - In software: VP8, VP9, AV1
|
||||||
|
*/
|
||||||
|
public class WebRTCVideoEncoderFactory implements VideoEncoderFactory {
|
||||||
|
private final VideoEncoderFactory hardwareVideoEncoderFactory;
|
||||||
|
private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
|
||||||
|
|
||||||
|
public WebRTCVideoEncoderFactory(@Nullable EglBase.Context eglContext) {
|
||||||
|
this.hardwareVideoEncoderFactory =
|
||||||
|
new HardwareVideoEncoderFactory(eglContext, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public VideoEncoder createEncoder(VideoCodecInfo codecInfo) {
|
||||||
|
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
|
||||||
|
return this.hardwareVideoEncoderFactory.createEncoder(codecInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.softwareVideoEncoderFactory.createEncoder(codecInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VideoCodecInfo[] getSupportedCodecs() {
|
||||||
|
List<VideoCodecInfo> codecs = new ArrayList<>();
|
||||||
|
|
||||||
|
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
|
||||||
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
|
||||||
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
|
||||||
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
|
||||||
|
|
||||||
|
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,203 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright @ 2017-present Atlassian Pty Ltd
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jitsi.meet.sdk;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.wifi.WifiInfo;
|
|
||||||
import android.net.wifi.WifiManager;
|
|
||||||
|
|
||||||
import com.facebook.react.bridge.Promise;
|
|
||||||
import com.facebook.react.bridge.ReactApplicationContext;
|
|
||||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
||||||
import com.facebook.react.bridge.ReactMethod;
|
|
||||||
import com.facebook.react.module.annotations.ReactModule;
|
|
||||||
|
|
||||||
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.NetworkInterface;
|
|
||||||
import java.net.SocketException;
|
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exposing WiFi statistics.
|
|
||||||
*
|
|
||||||
* Gathers rssi, signal in percentage, timestamp and the addresses of the wifi
|
|
||||||
* device.
|
|
||||||
*/
|
|
||||||
@ReactModule(name = WiFiStatsModule.NAME)
|
|
||||||
class WiFiStatsModule
|
|
||||||
extends ReactContextBaseJavaModule {
|
|
||||||
|
|
||||||
public static final String NAME = "WiFiStats";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The {@code Log} tag {@code WiFiStatsModule} is to log messages with.
|
|
||||||
*/
|
|
||||||
static final String TAG = NAME;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The scale used for the signal value. A level of the signal, given in the
|
|
||||||
* range of 0 to SIGNAL_LEVEL_SCALE-1 (both inclusive).
|
|
||||||
*/
|
|
||||||
public final static int SIGNAL_LEVEL_SCALE = 101;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@link ExecutorService} for running all operations on a dedicated thread.
|
|
||||||
*/
|
|
||||||
private static final ExecutorService executor
|
|
||||||
= Executors.newSingleThreadExecutor();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes a new module instance. There shall be a single instance of
|
|
||||||
* this module throughout the lifetime of the application.
|
|
||||||
*
|
|
||||||
* @param reactContext the {@link ReactApplicationContext} where this module
|
|
||||||
* is created.
|
|
||||||
*/
|
|
||||||
public WiFiStatsModule(ReactApplicationContext reactContext) {
|
|
||||||
super(reactContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the name for this module to be used in the React Native bridge.
|
|
||||||
*
|
|
||||||
* @return a string with the module name.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@link InetAddress} represented by this int.
|
|
||||||
*
|
|
||||||
* @param value the int representation of the ip address.
|
|
||||||
* @return the {@link InetAddress}.
|
|
||||||
* @throws UnknownHostException - if IP address is of illegal length.
|
|
||||||
*/
|
|
||||||
public static InetAddress toInetAddress(int value)
|
|
||||||
throws UnknownHostException {
|
|
||||||
return InetAddress.getByAddress(
|
|
||||||
new byte[] {
|
|
||||||
(byte) value,
|
|
||||||
(byte) (value >> 8),
|
|
||||||
(byte) (value >> 16),
|
|
||||||
(byte) (value >> 24)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Public method to retrieve WiFi stats.
|
|
||||||
*
|
|
||||||
* @param promise a {@link Promise} which will be resolved if WiFi stats are
|
|
||||||
* retrieved successfully, and it will be rejected otherwise.
|
|
||||||
*/
|
|
||||||
@ReactMethod
|
|
||||||
public void getWiFiStats(final Promise promise) {
|
|
||||||
Runnable r = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
Context context
|
|
||||||
= getReactApplicationContext().getApplicationContext();
|
|
||||||
WifiManager wifiManager
|
|
||||||
= (WifiManager) context
|
|
||||||
.getSystemService(Context.WIFI_SERVICE);
|
|
||||||
|
|
||||||
if (!wifiManager.isWifiEnabled()) {
|
|
||||||
promise.reject(new Exception("Wifi not enabled"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
|
||||||
|
|
||||||
if (wifiInfo.getNetworkId() == -1) {
|
|
||||||
promise.reject(new Exception("Wifi not connected"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int rssi = wifiInfo.getRssi();
|
|
||||||
int signalLevel
|
|
||||||
= WifiManager.calculateSignalLevel(
|
|
||||||
rssi, SIGNAL_LEVEL_SCALE);
|
|
||||||
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("rssi", rssi)
|
|
||||||
.put("signal", signalLevel)
|
|
||||||
.put("timestamp", System.currentTimeMillis());
|
|
||||||
|
|
||||||
JSONArray addresses = new JSONArray();
|
|
||||||
|
|
||||||
InetAddress wifiAddress
|
|
||||||
= toInetAddress(wifiInfo.getIpAddress());
|
|
||||||
|
|
||||||
try {
|
|
||||||
Enumeration<NetworkInterface> e
|
|
||||||
= NetworkInterface.getNetworkInterfaces();
|
|
||||||
while (e.hasMoreElements()) {
|
|
||||||
NetworkInterface networkInterface = e.nextElement();
|
|
||||||
boolean found = false;
|
|
||||||
|
|
||||||
// first check whether this is the desired interface
|
|
||||||
Enumeration<InetAddress> as
|
|
||||||
= networkInterface.getInetAddresses();
|
|
||||||
while (as.hasMoreElements()) {
|
|
||||||
InetAddress a = as.nextElement();
|
|
||||||
if(a.equals(wifiAddress)) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found) {
|
|
||||||
// interface found let's put addresses
|
|
||||||
// to the result object
|
|
||||||
as = networkInterface.getInetAddresses();
|
|
||||||
while (as.hasMoreElements()) {
|
|
||||||
InetAddress a = as.nextElement();
|
|
||||||
if (a.isLinkLocalAddress())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
addresses.put(a.getHostAddress());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
} catch (SocketException e) {
|
|
||||||
JitsiMeetLogger.e(e, TAG + " Unable to NetworkInterface.getNetworkInterfaces()");
|
|
||||||
}
|
|
||||||
|
|
||||||
result.put("addresses", addresses);
|
|
||||||
promise.resolve(result.toString());
|
|
||||||
|
|
||||||
JitsiMeetLogger.d(TAG + " WiFi stats: " + result.toString());
|
|
||||||
} catch (Throwable e) {
|
|
||||||
JitsiMeetLogger.e(e, TAG + " Failed to obtain wifi stats");
|
|
||||||
promise.reject(
|
|
||||||
new Exception("Failed to obtain wifi stats"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
executor.execute(r);
|
|
||||||
}
|
|
||||||
}
|
|
After Width: | Height: | Size: 699 B |
After Width: | Height: | Size: 406 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 3.1 KiB |
|
@ -31,14 +31,12 @@ include ':react-native-immersive'
|
||||||
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
|
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
|
||||||
include ':react-native-keep-awake'
|
include ':react-native-keep-awake'
|
||||||
project(':react-native-keep-awake').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keep-awake/android')
|
project(':react-native-keep-awake').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keep-awake/android')
|
||||||
include ':react-native-masked-view_masked-view'
|
include ':react-native-orientation-locker'
|
||||||
project(':react-native-masked-view_masked-view').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-masked-view/masked-view/android')
|
project(':react-native-orientation-locker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-orientation-locker/android')
|
||||||
include ':react-native-pager-view'
|
include ':react-native-pager-view'
|
||||||
project(':react-native-pager-view').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-pager-view/android')
|
project(':react-native-pager-view').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-pager-view/android')
|
||||||
include ':react-native-performance'
|
include ':react-native-performance'
|
||||||
project(':react-native-performance').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-performance/android')
|
project(':react-native-performance').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-performance/android')
|
||||||
include ':react-native-reanimated'
|
|
||||||
project(':react-native-reanimated').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-reanimated/android')
|
|
||||||
include ':react-native-safe-area-context'
|
include ':react-native-safe-area-context'
|
||||||
project(':react-native-safe-area-context').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-safe-area-context/android')
|
project(':react-native-safe-area-context').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-safe-area-context/android')
|
||||||
include ':react-native-screens'
|
include ':react-native-screens'
|
||||||
|
|
17
app.js
|
@ -1,6 +1,10 @@
|
||||||
/* application specific logic */
|
/* application specific logic */
|
||||||
|
|
||||||
import 'jquery';
|
// Re-export jQuery
|
||||||
|
// FIXME: Remove this requirement from torture tests.
|
||||||
|
import $ from 'jquery';
|
||||||
|
|
||||||
|
window.$ = window.jQuery = $;
|
||||||
|
|
||||||
import '@matrix-org/olm';
|
import '@matrix-org/olm';
|
||||||
|
|
||||||
|
@ -29,17 +33,6 @@ window.APP = {
|
||||||
API,
|
API,
|
||||||
conference,
|
conference,
|
||||||
|
|
||||||
// Used by do_external_connect.js if we receive the attach data after
|
|
||||||
// connect was already executed. status property can be 'initialized',
|
|
||||||
// 'ready', or 'connecting'. We are interested in 'ready' status only which
|
|
||||||
// means that connect was executed but we have to wait for the attach data.
|
|
||||||
// In status 'ready' handler property will be set to a function that will
|
|
||||||
// finish the connect process when the attach data or error is received.
|
|
||||||
connect: {
|
|
||||||
handler: null,
|
|
||||||
status: 'initialized'
|
|
||||||
},
|
|
||||||
|
|
||||||
// Used for automated performance tests.
|
// Used for automated performance tests.
|
||||||
connectionTimes: {
|
connectionTimes: {
|
||||||
'index.loaded': window.indexLoadedTime
|
'index.loaded': window.indexLoadedTime
|
||||||
|
|
863
conference.js
476
config.js
|
@ -1,11 +1,29 @@
|
||||||
|
/* eslint-disable comma-dangle, no-unused-vars, no-var, prefer-template, vars-on-top */
|
||||||
/* eslint-disable no-unused-vars, no-var */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: If you add a new option please remember to document it here:
|
* NOTE: If you add a new option please remember to document it here:
|
||||||
* https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-configuration
|
* https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-configuration
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
var subdir = '<!--# echo var="subdir" default="" -->';
|
||||||
|
var subdomain = '<!--# echo var="subdomain" default="" -->';
|
||||||
|
|
||||||
|
if (subdomain) {
|
||||||
|
subdomain = subdomain.substr(0, subdomain.length - 1).split('.')
|
||||||
|
.join('_')
|
||||||
|
.toLowerCase() + '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// In case of no ssi provided by the webserver, use empty strings
|
||||||
|
if (subdir.startsWith('<!--')) {
|
||||||
|
subdir = '';
|
||||||
|
}
|
||||||
|
if (subdomain.startsWith('<!--')) {
|
||||||
|
subdomain = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
var enableJaaS = false;
|
||||||
|
|
||||||
var config = {
|
var config = {
|
||||||
// Connection
|
// Connection
|
||||||
//
|
//
|
||||||
|
@ -24,20 +42,33 @@ var config = {
|
||||||
// focus: 'focus.jitsi-meet.example.com',
|
// focus: 'focus.jitsi-meet.example.com',
|
||||||
|
|
||||||
// XMPP MUC domain. FIXME: use XEP-0030 to discover it.
|
// XMPP MUC domain. FIXME: use XEP-0030 to discover it.
|
||||||
muc: 'conference.jitsi-meet.example.com'
|
muc: 'conference.' + subdomain + 'jitsi-meet.example.com',
|
||||||
},
|
},
|
||||||
|
|
||||||
// BOSH URL. FIXME: use XEP-0156 to discover it.
|
// BOSH URL. FIXME: use XEP-0156 to discover it.
|
||||||
bosh: '//jitsi-meet.example.com/http-bind',
|
bosh: 'https://jitsi-meet.example.com/' + subdir + 'http-bind',
|
||||||
|
|
||||||
// Websocket URL
|
// Websocket URL (XMPP)
|
||||||
// websocket: 'wss://jitsi-meet.example.com/xmpp-websocket',
|
// websocket: 'wss://jitsi-meet.example.com/' + subdir + 'xmpp-websocket',
|
||||||
|
|
||||||
// The real JID of focus participant - can be overridden here
|
// The real JID of focus participant - can be overridden here
|
||||||
// Do not change username - FIXME: Make focus username configurable
|
// Do not change username - FIXME: Make focus username configurable
|
||||||
// https://github.com/jitsi/jitsi-meet/issues/7376
|
// https://github.com/jitsi/jitsi-meet/issues/7376
|
||||||
// focusUserJid: 'focus@auth.jitsi-meet.example.com',
|
// focusUserJid: 'focus@auth.jitsi-meet.example.com',
|
||||||
|
|
||||||
|
// Options related to the bridge (colibri) data channel
|
||||||
|
bridgeChannel: {
|
||||||
|
// If the backend advertises multiple colibri websockets, this options allows
|
||||||
|
// to filter some of them out based on the domain name. We use the first URL
|
||||||
|
// which does not match ignoreDomain, falling back to the first one that matches
|
||||||
|
// ignoreDomain. Has no effect if undefined.
|
||||||
|
// ignoreDomain: 'example.com',
|
||||||
|
|
||||||
|
// Prefer SCTP (WebRTC data channels over the media path) over a colibri websocket.
|
||||||
|
// If SCTP is available in the backend it will be used instead of a WS. Defaults to
|
||||||
|
// false (SCTP is used only if available and no WS are available).
|
||||||
|
// preferSctp: false
|
||||||
|
},
|
||||||
|
|
||||||
// Testing / experimental features.
|
// Testing / experimental features.
|
||||||
//
|
//
|
||||||
|
@ -47,52 +78,24 @@ var config = {
|
||||||
// issues related to insertable streams.
|
// issues related to insertable streams.
|
||||||
// disableE2EE: false,
|
// disableE2EE: false,
|
||||||
|
|
||||||
// Enables/disables thumbnail reordering in the filmstrip. It is enabled by default unless explicitly
|
|
||||||
// disabled by the below option.
|
|
||||||
// enableThumbnailReordering: true,
|
|
||||||
|
|
||||||
// Enables XMPP WebSocket (as opposed to BOSH) for the given amount of users.
|
// Enables XMPP WebSocket (as opposed to BOSH) for the given amount of users.
|
||||||
// mobileXmppWsThreshold: 10 // enable XMPP WebSockets on mobile for 10% of the users
|
// mobileXmppWsThreshold: 10, // enable XMPP WebSockets on mobile for 10% of the users
|
||||||
|
|
||||||
// P2P test mode disables automatic switching to P2P when there are 2
|
// P2P test mode disables automatic switching to P2P when there are 2
|
||||||
// participants in the conference.
|
// participants in the conference.
|
||||||
// p2pTestMode: false,
|
// p2pTestMode: false,
|
||||||
|
|
||||||
// Enables the test specific features consumed by jitsi-meet-torture
|
// Enables the test specific features consumed by jitsi-meet-torture
|
||||||
// testMode: false
|
// testMode: false,
|
||||||
|
|
||||||
// Disables the auto-play behavior of *all* newly created video element.
|
// Disables the auto-play behavior of *all* newly created video element.
|
||||||
// This is useful when the client runs on a host with limited resources.
|
// This is useful when the client runs on a host with limited resources.
|
||||||
// noAutoPlayVideo: false
|
// noAutoPlayVideo: false,
|
||||||
|
|
||||||
// Enable / disable 500 Kbps bitrate cap on desktop tracks. When enabled,
|
|
||||||
// simulcast is turned off for the desktop share. If presenter is turned
|
|
||||||
// on while screensharing is in progress, the max bitrate is automatically
|
|
||||||
// adjusted to 2.5 Mbps. This takes a value between 0 and 1 which determines
|
|
||||||
// the probability for this to be enabled. This setting has been deprecated.
|
|
||||||
// desktopSharingFrameRate.max now determines whether simulcast will be enabled
|
|
||||||
// or disabled for the screenshare.
|
|
||||||
// capScreenshareBitrate: 1 // 0 to disable - deprecated.
|
|
||||||
|
|
||||||
// Whether to use fake constraints (height: 99999, width: 99999) when calling getDisplayMedia on
|
|
||||||
// Chromium based browsers. This is intended as a workaround for
|
|
||||||
// https://bugs.chromium.org/p/chromium/issues/detail?id=1056311
|
|
||||||
// setScreenSharingResolutionConstraints: true
|
|
||||||
|
|
||||||
// Enable callstats only for a percentage of users.
|
// Enable callstats only for a percentage of users.
|
||||||
// This takes a value between 0 and 100 which determines the probability for
|
// This takes a value between 0 and 100 which determines the probability for
|
||||||
// the callstats to be enabled.
|
// the callstats to be enabled.
|
||||||
// callStatsThreshold: 5 // enable callstats for 5% of the users.
|
// callStatsThreshold: 5, // enable callstats for 5% of the users.
|
||||||
},
|
|
||||||
|
|
||||||
// Feature Flags.
|
|
||||||
flags: {
|
|
||||||
// Enables source names in the signaling.
|
|
||||||
// sourceNameSignaling: false,
|
|
||||||
|
|
||||||
// Enables sending multiple video streams, i.e., camera and desktop tracks can be shared in the conference
|
|
||||||
// separately as two different streams instead of one composite stream.
|
|
||||||
// sendMultipleVideoStreams: false
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Disables moderator indicators.
|
// Disables moderator indicators.
|
||||||
|
@ -121,7 +124,7 @@ var config = {
|
||||||
// Can be either 'recording' - screensharing screenshots are taken
|
// Can be either 'recording' - screensharing screenshots are taken
|
||||||
// only when the recording is also on,
|
// only when the recording is also on,
|
||||||
// or 'always' - screensharing screenshots are always taken.
|
// or 'always' - screensharing screenshots are always taken.
|
||||||
// mode: 'recording'
|
// mode: 'recording',
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// Disables ICE/UDP by filtering out local and remote UDP candidates in
|
// Disables ICE/UDP by filtering out local and remote UDP candidates in
|
||||||
|
@ -143,6 +146,7 @@ var config = {
|
||||||
|
|
||||||
// Disable measuring of audio levels.
|
// Disable measuring of audio levels.
|
||||||
// disableAudioLevels: false,
|
// disableAudioLevels: false,
|
||||||
|
|
||||||
// audioLevelsInterval: 200,
|
// audioLevelsInterval: 200,
|
||||||
|
|
||||||
// Enabling this will run the lib-jitsi-meet no audio detection module which
|
// Enabling this will run the lib-jitsi-meet no audio detection module which
|
||||||
|
@ -178,16 +182,19 @@ var config = {
|
||||||
|
|
||||||
// Enabling it (with #params) will disable local audio output of remote
|
// Enabling it (with #params) will disable local audio output of remote
|
||||||
// participants and to enable it back a reload is needed.
|
// participants and to enable it back a reload is needed.
|
||||||
// startSilent: false
|
// startSilent: false,
|
||||||
|
|
||||||
// Enables support for opus-red (redundancy for Opus).
|
// Enables support for opus-red (redundancy for Opus).
|
||||||
// enableOpusRed: false,
|
// enableOpusRed: false,
|
||||||
|
|
||||||
// Specify audio quality stereo and opusMaxAverageBitrate values in order to enable HD audio.
|
// Specify audio quality stereo and opusMaxAverageBitrate values in order to enable HD audio.
|
||||||
// Beware, by doing so, you are disabling echo cancellation, noise suppression and AGC.
|
// Beware, by doing so, you are disabling echo cancellation, noise suppression and AGC.
|
||||||
|
// Specify enableOpusDtx to enable support for opus-dtx where
|
||||||
|
// audio packets won’t be transmitted while participant is silent or muted.
|
||||||
// audioQuality: {
|
// audioQuality: {
|
||||||
// stereo: false,
|
// stereo: false,
|
||||||
// opusMaxAverageBitrate: null // Value to fit the 6000 to 510000 range.
|
// opusMaxAverageBitrate: null, // Value to fit the 6000 to 510000 range.
|
||||||
|
// enableOpusDtx: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Video
|
// Video
|
||||||
|
@ -198,15 +205,35 @@ var config = {
|
||||||
// Specifies whether the raised hand will hide when someone becomes a dominant speaker or not
|
// Specifies whether the raised hand will hide when someone becomes a dominant speaker or not
|
||||||
// disableRemoveRaisedHandOnFocus: false,
|
// disableRemoveRaisedHandOnFocus: false,
|
||||||
|
|
||||||
|
// speakerStats: {
|
||||||
|
// // Specifies whether the speaker stats is enable or not.
|
||||||
|
// disabled: false,
|
||||||
|
|
||||||
|
// // Specifies whether there will be a search field in speaker stats or not.
|
||||||
|
// disableSearch: false,
|
||||||
|
|
||||||
|
// // Specifies whether participants in speaker stats should be ordered or not, and with what priority.
|
||||||
|
// // 'role', <- Moderators on top.
|
||||||
|
// // 'name', <- Alphabetically by name.
|
||||||
|
// // 'hasLeft', <- The ones that have left in the bottom.
|
||||||
|
// order: [
|
||||||
|
// 'role',
|
||||||
|
// 'name',
|
||||||
|
// 'hasLeft',
|
||||||
|
// ],
|
||||||
|
// },
|
||||||
|
|
||||||
|
// DEPRECATED. Please use speakerStats.disableSearch instead.
|
||||||
// Specifies whether there will be a search field in speaker stats or not
|
// Specifies whether there will be a search field in speaker stats or not
|
||||||
// disableSpeakerStatsSearch: false,
|
// disableSpeakerStatsSearch: false,
|
||||||
|
|
||||||
|
// DEPRECATED. Please use speakerStats.order .
|
||||||
// Specifies whether participants in speaker stats should be ordered or not, and with what priority
|
// Specifies whether participants in speaker stats should be ordered or not, and with what priority
|
||||||
// speakerStatsOrder: [
|
// speakerStatsOrder: [
|
||||||
// 'role', <- Moderators on top
|
// 'role', <- Moderators on top
|
||||||
// 'name', <- Alphabetically by name
|
// 'name', <- Alphabetically by name
|
||||||
// 'hasLeft', <- The ones that have left in the bottom
|
// 'hasLeft', <- The ones that have left in the bottom
|
||||||
// ] <- the order of the array elements determines priority
|
// ], <- the order of the array elements determines priority
|
||||||
|
|
||||||
// How many participants while in the tile view mode, before the receiving video quality is reduced from HD to SD.
|
// How many participants while in the tile view mode, before the receiving video quality is reduced from HD to SD.
|
||||||
// Use -1 to disable.
|
// Use -1 to disable.
|
||||||
|
@ -222,9 +249,9 @@ var config = {
|
||||||
// height: {
|
// height: {
|
||||||
// ideal: 720,
|
// ideal: 720,
|
||||||
// max: 720,
|
// max: 720,
|
||||||
// min: 240
|
// min: 240,
|
||||||
// }
|
// },
|
||||||
// }
|
// },
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Enable / disable simulcast support.
|
// Enable / disable simulcast support.
|
||||||
|
@ -243,23 +270,12 @@ var config = {
|
||||||
// applied locally. FIXME: having these 2 options is confusing.
|
// applied locally. FIXME: having these 2 options is confusing.
|
||||||
// startWithVideoMuted: false,
|
// startWithVideoMuted: false,
|
||||||
|
|
||||||
// If set to true, prefer to use the H.264 video codec (if supported).
|
|
||||||
// Note that it's not recommended to do this because simulcast is not
|
|
||||||
// supported when using H.264. For 1-to-1 calls this setting is enabled by
|
|
||||||
// default and can be toggled in the p2p section.
|
|
||||||
// This option has been deprecated, use preferredCodec under videoQuality section instead.
|
|
||||||
// preferH264: true,
|
|
||||||
|
|
||||||
// If set to true, disable H.264 video codec by stripping it out of the
|
|
||||||
// SDP.
|
|
||||||
// disableH264: false,
|
|
||||||
|
|
||||||
// Desktop sharing
|
// Desktop sharing
|
||||||
|
|
||||||
// Optional desktop sharing frame rate options. Default value: min:5, max:5.
|
// Optional desktop sharing frame rate options. Default value: min:5, max:5.
|
||||||
// desktopSharingFrameRate: {
|
// desktopSharingFrameRate: {
|
||||||
// min: 5,
|
// min: 5,
|
||||||
// max: 5
|
// max: 5,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// This option has been deprecated since it is no longer supported as per the w3c spec.
|
// This option has been deprecated since it is no longer supported as per the w3c spec.
|
||||||
|
@ -276,12 +292,12 @@ var config = {
|
||||||
|
|
||||||
// Enable the dropbox integration.
|
// Enable the dropbox integration.
|
||||||
// dropbox: {
|
// dropbox: {
|
||||||
// appKey: '<APP_KEY>' // Specify your app key here.
|
// appKey: '<APP_KEY>', // Specify your app key here.
|
||||||
// // A URL to redirect the user to, after authenticating
|
// // A URL to redirect the user to, after authenticating
|
||||||
// // by default uses:
|
// // by default uses:
|
||||||
// // 'https://jitsi-meet.example.com/static/oauth.html'
|
// // 'https://jitsi-meet.example.com/static/oauth.html'
|
||||||
// redirectURI:
|
// redirectURI:
|
||||||
// 'https://jitsi-meet.example.com/subfolder/static/oauth.html'
|
// 'https://jitsi-meet.example.com/subfolder/static/oauth.html',
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// recordingService: {
|
// recordingService: {
|
||||||
|
@ -297,7 +313,7 @@ var config = {
|
||||||
// sharingEnabled: false,
|
// sharingEnabled: false,
|
||||||
|
|
||||||
// // Hide the warning that says we only store the recording for 24 hours.
|
// // Hide the warning that says we only store the recording for 24 hours.
|
||||||
// hideStorageWarning: false
|
// hideStorageWarning: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// DEPRECATED. Use recordingService.enabled instead.
|
// DEPRECATED. Use recordingService.enabled instead.
|
||||||
|
@ -306,17 +322,35 @@ var config = {
|
||||||
// DEPRECATED. Use recordingService.sharingEnabled instead.
|
// DEPRECATED. Use recordingService.sharingEnabled instead.
|
||||||
// fileRecordingsServiceSharingEnabled: false,
|
// fileRecordingsServiceSharingEnabled: false,
|
||||||
|
|
||||||
// Whether to enable live streaming or not.
|
|
||||||
// liveStreamingEnabled: false,
|
|
||||||
|
|
||||||
// Local recording configuration.
|
// Local recording configuration.
|
||||||
// localRecording: {
|
// localRecording: {
|
||||||
// // Whether to disable local recording or not.
|
// // Whether to disable local recording or not.
|
||||||
// disable: false,
|
// disable: false,
|
||||||
|
|
||||||
// // Whether to notify all participants when a participant is recording locally.
|
// // Whether to notify all participants when a participant is recording locally.
|
||||||
// notifyAllParticipants: false
|
// notifyAllParticipants: false,
|
||||||
|
|
||||||
|
// // Whether to disable the self recording feature (only local participant streams).
|
||||||
|
// disableSelfRecording: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
|
// Customize the Live Streaming dialog. Can be modified for a non-YouTube provider.
|
||||||
|
// liveStreaming: {
|
||||||
|
// // Whether to enable live streaming or not.
|
||||||
|
// enabled: false,
|
||||||
|
// // Terms link
|
||||||
|
// termsLink: 'https://www.youtube.com/t/terms',
|
||||||
|
// // Data privacy link
|
||||||
|
// dataPrivacyLink: 'https://policies.google.com/privacy',
|
||||||
|
// // RegExp string that validates the stream key input field
|
||||||
|
// validatorRegExpString: '^(?:[a-zA-Z0-9]{4}(?:-(?!$)|$)){4}',
|
||||||
|
// // Documentation reference for the live streaming feature.
|
||||||
|
// helpLink: 'https://jitsi.org/live'
|
||||||
|
// },
|
||||||
|
|
||||||
|
// DEPRECATED. Use liveStreaming.enabled instead.
|
||||||
|
// liveStreamingEnabled: false,
|
||||||
|
|
||||||
// DEPRECATED. Use transcription.enabled instead.
|
// DEPRECATED. Use transcription.enabled instead.
|
||||||
// transcribingEnabled: false,
|
// transcribingEnabled: false,
|
||||||
|
|
||||||
|
@ -334,6 +368,14 @@ var config = {
|
||||||
// // Whether the feature should be enabled or not.
|
// // Whether the feature should be enabled or not.
|
||||||
// enabled: false,
|
// enabled: false,
|
||||||
|
|
||||||
|
// // Translation languages.
|
||||||
|
// // Available languages can be found in
|
||||||
|
// // ./src/react/features/transcribing/translation-languages.json.
|
||||||
|
// translationLanguages: ['en', 'es', 'fr', 'ro'],
|
||||||
|
|
||||||
|
// // Important languages to show on the top of the language list.
|
||||||
|
// translationLanguagesHead: ['en'],
|
||||||
|
|
||||||
// // If true transcriber will use the application language.
|
// // If true transcriber will use the application language.
|
||||||
// // The application language is either explicitly set by participants in their settings or automatically
|
// // The application language is either explicitly set by participants in their settings or automatically
|
||||||
// // detected based on the environment, e.g. if the app is opened in a chrome instance which
|
// // detected based on the environment, e.g. if the app is opened in a chrome instance which
|
||||||
|
@ -351,7 +393,7 @@ var config = {
|
||||||
// disableStartForAll: false,
|
// disableStartForAll: false,
|
||||||
|
|
||||||
// // Enables automatic turning on captions when recording is started
|
// // Enables automatic turning on captions when recording is started
|
||||||
// autoCaptionOnRecord: false
|
// autoCaptionOnRecord: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
|
@ -386,15 +428,9 @@ var config = {
|
||||||
// 30: 15,
|
// 30: 15,
|
||||||
// 50: 10,
|
// 50: 10,
|
||||||
// 70: 5,
|
// 70: 5,
|
||||||
// 90: 2
|
// 90: 2,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Provides a way to translate the legacy bridge signaling messages, 'LastNChangedEvent',
|
|
||||||
// 'SelectedEndpointsChangedEvent' and 'ReceiverVideoConstraint' into the new 'ReceiverVideoConstraints' message
|
|
||||||
// that invokes the new bandwidth allocation algorithm in the bridge which is described here
|
|
||||||
// - https://github.com/jitsi/jitsi-videobridge/blob/master/doc/allocation.md.
|
|
||||||
// useNewBandwidthAllocationStrategy: false,
|
|
||||||
|
|
||||||
// Specify the settings for video quality optimizations on the client.
|
// Specify the settings for video quality optimizations on the client.
|
||||||
// videoQuality: {
|
// videoQuality: {
|
||||||
// // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified
|
// // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified
|
||||||
|
@ -415,7 +451,7 @@ var config = {
|
||||||
// // This will result in Safari not being able to decode video from endpoints sending VP9 video.
|
// // This will result in Safari not being able to decode video from endpoints sending VP9 video.
|
||||||
// // When set to false, the conference falls back to VP8 whenever there is an endpoint that doesn't support the
|
// // When set to false, the conference falls back to VP8 whenever there is an endpoint that doesn't support the
|
||||||
// // preferred codec and goes back to the preferred codec when that endpoint leaves.
|
// // preferred codec and goes back to the preferred codec when that endpoint leaves.
|
||||||
// // enforcePreferredCodec: false,
|
// enforcePreferredCodec: false,
|
||||||
//
|
//
|
||||||
// // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for
|
// // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for
|
||||||
// // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values
|
// // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values
|
||||||
|
@ -426,18 +462,18 @@ var config = {
|
||||||
// H264: {
|
// H264: {
|
||||||
// low: 200000,
|
// low: 200000,
|
||||||
// standard: 500000,
|
// standard: 500000,
|
||||||
// high: 1500000
|
// high: 1500000,
|
||||||
// },
|
// },
|
||||||
// VP8 : {
|
// VP8 : {
|
||||||
// low: 200000,
|
// low: 200000,
|
||||||
// standard: 500000,
|
// standard: 500000,
|
||||||
// high: 1500000
|
// high: 1500000,
|
||||||
// },
|
// },
|
||||||
// VP9: {
|
// VP9: {
|
||||||
// low: 100000,
|
// low: 100000,
|
||||||
// standard: 300000,
|
// standard: 300000,
|
||||||
// high: 1200000
|
// high: 1200000,
|
||||||
// }
|
// },
|
||||||
// },
|
// },
|
||||||
//
|
//
|
||||||
// // The options can be used to override default thresholds of video thumbnail heights corresponding to
|
// // The options can be used to override default thresholds of video thumbnail heights corresponding to
|
||||||
|
@ -452,19 +488,16 @@ var config = {
|
||||||
// // the high quality.
|
// // the high quality.
|
||||||
// minHeightForQualityLvl: {
|
// minHeightForQualityLvl: {
|
||||||
// 360: 'standard',
|
// 360: 'standard',
|
||||||
// 720: 'high'
|
// 720: 'high',
|
||||||
// },
|
// },
|
||||||
//
|
//
|
||||||
// // Provides a way to resize the desktop track to 720p (if it is greater than 720p) before creating a canvas
|
|
||||||
// // for the presenter mode (camera picture-in-picture mode with screenshare).
|
|
||||||
// resizeDesktopForPresenter: false
|
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Notification timeouts
|
// Notification timeouts
|
||||||
// notificationTimeouts: {
|
// notificationTimeouts: {
|
||||||
// short: 2500,
|
// short: 2500,
|
||||||
// medium: 5000,
|
// medium: 5000,
|
||||||
// long: 10000
|
// long: 10000,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// // Options for the recording limit notification.
|
// // Options for the recording limit notification.
|
||||||
|
@ -479,7 +512,7 @@ var config = {
|
||||||
// appName: 'Unlimited recordings APP',
|
// appName: 'Unlimited recordings APP',
|
||||||
//
|
//
|
||||||
// // The URL of the app with unlimited recordings.
|
// // The URL of the app with unlimited recordings.
|
||||||
// appURL: 'https://unlimited.recordings.app.com/'
|
// appURL: 'https://unlimited.recordings.app.com/',
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Disables or enables RTX (RFC 4588) (defaults to false).
|
// Disables or enables RTX (RFC 4588) (defaults to false).
|
||||||
|
@ -522,12 +555,15 @@ var config = {
|
||||||
// Disables responsive tiles.
|
// Disables responsive tiles.
|
||||||
// disableResponsiveTiles: false,
|
// disableResponsiveTiles: false,
|
||||||
|
|
||||||
// Hides lobby button
|
// DEPRECATED. Please use `securityUi?.hideLobbyButton` instead.
|
||||||
|
// Hides lobby button.
|
||||||
// hideLobbyButton: false,
|
// hideLobbyButton: false,
|
||||||
|
|
||||||
|
// DEPRECATED. Please use `lobby?.autoKnock` instead.
|
||||||
// If Lobby is enabled starts knocking automatically.
|
// If Lobby is enabled starts knocking automatically.
|
||||||
// autoKnockLobby: false,
|
// autoKnockLobby: false,
|
||||||
|
|
||||||
|
// DEPRECATED. Please use `lobby?.enableChat` instead.
|
||||||
// Enable lobby chat.
|
// Enable lobby chat.
|
||||||
// enableLobbyChat: true,
|
// enableLobbyChat: true,
|
||||||
|
|
||||||
|
@ -538,9 +574,35 @@ var config = {
|
||||||
// Require users to always specify a display name.
|
// Require users to always specify a display name.
|
||||||
// requireDisplayName: true,
|
// requireDisplayName: true,
|
||||||
|
|
||||||
|
// DEPRECATED! Use 'welcomePage.disabled' instead.
|
||||||
// Whether to use a welcome page or not. In case it's false a random room
|
// Whether to use a welcome page or not. In case it's false a random room
|
||||||
// will be joined when no room is specified.
|
// will be joined when no room is specified.
|
||||||
enableWelcomePage: true,
|
// enableWelcomePage: true,
|
||||||
|
|
||||||
|
// Configs for welcome page.
|
||||||
|
// welcomePage: {
|
||||||
|
// // Whether to disable welcome page. In case it's disabled a random room
|
||||||
|
// // will be joined when no room is specified.
|
||||||
|
// disabled: false,
|
||||||
|
// // If set,landing page will redirect to this URL.
|
||||||
|
// customUrl: ''
|
||||||
|
// },
|
||||||
|
|
||||||
|
// Configs for the lobby screen.
|
||||||
|
// lobby {
|
||||||
|
// // If Lobby is enabled, it starts knocking automatically. Replaces `autoKnockLobby`.
|
||||||
|
// autoKnock: false,
|
||||||
|
// // Enables the lobby chat. Replaces `enableLobbyChat`.
|
||||||
|
// enableChat: true,
|
||||||
|
// },
|
||||||
|
|
||||||
|
// Configs for the security related UI elements.
|
||||||
|
// securityUi: {
|
||||||
|
// // Hides the lobby button. Replaces `hideLobbyButton`.
|
||||||
|
// hideLobbyButton: false,
|
||||||
|
// // Hides the possibility to set and enter a lobby password.
|
||||||
|
// disableLobbyPassword: false,
|
||||||
|
// },
|
||||||
|
|
||||||
// Disable app shortcuts that are registered upon joining a conference
|
// Disable app shortcuts that are registered upon joining a conference
|
||||||
// disableShortcuts: false,
|
// disableShortcuts: false,
|
||||||
|
@ -579,12 +641,9 @@ var config = {
|
||||||
// Hides the email section under profile settings.
|
// Hides the email section under profile settings.
|
||||||
// hideEmailInSettings: false,
|
// hideEmailInSettings: false,
|
||||||
|
|
||||||
// Whether or not some features are checked based on token.
|
|
||||||
// enableFeaturesBasedOnToken: false,
|
|
||||||
|
|
||||||
// When enabled the password used for locking a room is restricted to up to the number of digits specified
|
// When enabled the password used for locking a room is restricted to up to the number of digits specified
|
||||||
// roomPasswordNumberOfDigits: 10,
|
|
||||||
// default: roomPasswordNumberOfDigits: false,
|
// default: roomPasswordNumberOfDigits: false,
|
||||||
|
// roomPasswordNumberOfDigits: 10,
|
||||||
|
|
||||||
// Message to show the users. Example: 'The service will be down for
|
// Message to show the users. Example: 'The service will be down for
|
||||||
// maintenance at 01:00 AM GMT,
|
// maintenance at 01:00 AM GMT,
|
||||||
|
@ -604,11 +663,11 @@ var config = {
|
||||||
// // either the jwt or the userInfo from the iframe api init object in order for this to have an effect.
|
// // either the jwt or the userInfo from the iframe api init object in order for this to have an effect.
|
||||||
// hideDisplayName: false,
|
// hideDisplayName: false,
|
||||||
// // List of buttons to hide from the extra join options dropdown.
|
// // List of buttons to hide from the extra join options dropdown.
|
||||||
// hideExtraJoinButtons: ['no-audio', 'by-phone']
|
// hideExtraJoinButtons: ['no-audio', 'by-phone'],
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// When 'true', the user cannot edit the display name.
|
// When 'true', the user cannot edit the display name.
|
||||||
// (Mainly useful when used in conjuction with the JWT so the JWT name becomes read only.)
|
// (Mainly useful when used in conjunction with the JWT so the JWT name becomes read only.)
|
||||||
// readOnlyName: false,
|
// readOnlyName: false,
|
||||||
|
|
||||||
// If etherpad integration is enabled, setting this to true will
|
// If etherpad integration is enabled, setting this to true will
|
||||||
|
@ -639,7 +698,7 @@ var config = {
|
||||||
// // Defaults to Gravatar.
|
// // Defaults to Gravatar.
|
||||||
// baseUrl: 'https://www.gravatar.com/avatar/',
|
// baseUrl: 'https://www.gravatar.com/avatar/',
|
||||||
// // True if Gravatar should be disabled.
|
// // True if Gravatar should be disabled.
|
||||||
// disabled: false
|
// disabled: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// App name to be displayed in the invitation email subject, as an alternative to
|
// App name to be displayed in the invitation email subject, as an alternative to
|
||||||
|
@ -662,7 +721,6 @@ var config = {
|
||||||
// 'chat',
|
// 'chat',
|
||||||
// 'closedcaptions',
|
// 'closedcaptions',
|
||||||
// 'desktop',
|
// 'desktop',
|
||||||
// 'dock-iframe'
|
|
||||||
// 'download',
|
// 'download',
|
||||||
// 'embedmeeting',
|
// 'embedmeeting',
|
||||||
// 'etherpad',
|
// 'etherpad',
|
||||||
|
@ -676,6 +734,7 @@ var config = {
|
||||||
// 'linktosalesforce',
|
// 'linktosalesforce',
|
||||||
// 'livestreaming',
|
// 'livestreaming',
|
||||||
// 'microphone',
|
// 'microphone',
|
||||||
|
// 'noisesuppression',
|
||||||
// 'participants-pane',
|
// 'participants-pane',
|
||||||
// 'profile',
|
// 'profile',
|
||||||
// 'raisehand',
|
// 'raisehand',
|
||||||
|
@ -689,24 +748,23 @@ var config = {
|
||||||
// 'stats',
|
// 'stats',
|
||||||
// 'tileview',
|
// 'tileview',
|
||||||
// 'toggle-camera',
|
// 'toggle-camera',
|
||||||
// 'undock-iframe',
|
|
||||||
// 'videoquality',
|
// 'videoquality',
|
||||||
// '__end'
|
// 'whiteboard',
|
||||||
// ],
|
// ],
|
||||||
|
|
||||||
// Holds values related to toolbar visibility control.
|
// Holds values related to toolbar visibility control.
|
||||||
// toolbarConfig: {
|
// toolbarConfig: {
|
||||||
// // Moved from interfaceConfig.INITIAL_TOOLBAR_TIMEOUT
|
// // Moved from interfaceConfig.INITIAL_TOOLBAR_TIMEOUT
|
||||||
// // The initial numer of miliseconds for the toolbar buttons to be visible on screen.
|
// // The initial number of milliseconds for the toolbar buttons to be visible on screen.
|
||||||
// initialTimeout: 20000,
|
// initialTimeout: 20000,
|
||||||
// // Moved from interfaceConfig.TOOLBAR_TIMEOUT
|
// // Moved from interfaceConfig.TOOLBAR_TIMEOUT
|
||||||
// // Number of miliseconds for the toolbar buttons to be visible on screen.
|
// // Number of milliseconds for the toolbar buttons to be visible on screen.
|
||||||
// timeout: 4000,
|
// timeout: 4000,
|
||||||
// // Moved from interfaceConfig.TOOLBAR_ALWAYS_VISIBLE
|
// // Moved from interfaceConfig.TOOLBAR_ALWAYS_VISIBLE
|
||||||
// // Whether toolbar should be always visible or should hide after x miliseconds.
|
// // Whether toolbar should be always visible or should hide after x milliseconds.
|
||||||
// alwaysVisible: false,
|
// alwaysVisible: false,
|
||||||
// // Indicates whether the toolbar should still autohide when chat is open
|
// // Indicates whether the toolbar should still autohide when chat is open
|
||||||
// autoHideWhileChatIsOpen: false
|
// autoHideWhileChatIsOpen: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Toolbar buttons which have their click/tap event exposed through the API on
|
// Toolbar buttons which have their click/tap event exposed through the API on
|
||||||
|
@ -727,11 +785,13 @@ var config = {
|
||||||
// 'desktop',
|
// 'desktop',
|
||||||
// 'download',
|
// 'download',
|
||||||
// 'embedmeeting',
|
// 'embedmeeting',
|
||||||
|
// 'end-meeting',
|
||||||
// 'etherpad',
|
// 'etherpad',
|
||||||
// 'feedback',
|
// 'feedback',
|
||||||
// 'filmstrip',
|
// 'filmstrip',
|
||||||
// 'fullscreen',
|
// 'fullscreen',
|
||||||
// 'hangup',
|
// 'hangup',
|
||||||
|
// 'hangup-menu',
|
||||||
// 'help',
|
// 'help',
|
||||||
// {
|
// {
|
||||||
// key: 'invite',
|
// key: 'invite',
|
||||||
|
@ -741,6 +801,7 @@ var config = {
|
||||||
// 'microphone',
|
// 'microphone',
|
||||||
// 'mute-everyone',
|
// 'mute-everyone',
|
||||||
// 'mute-video-everyone',
|
// 'mute-video-everyone',
|
||||||
|
// 'noisesuppression',
|
||||||
// 'participants-pane',
|
// 'participants-pane',
|
||||||
// 'profile',
|
// 'profile',
|
||||||
// {
|
// {
|
||||||
|
@ -762,14 +823,22 @@ var config = {
|
||||||
// {
|
// {
|
||||||
// key: 'add-passcode',
|
// key: 'add-passcode',
|
||||||
// preventExecution: false
|
// preventExecution: false
|
||||||
// }
|
// },
|
||||||
// '__end'
|
// 'whiteboard',
|
||||||
// ],
|
// ],
|
||||||
|
|
||||||
// List of pre meeting screens buttons to hide. The values must be one or more of the 5 allowed buttons:
|
// List of pre meeting screens buttons to hide. The values must be one or more of the 5 allowed buttons:
|
||||||
// 'microphone', 'camera', 'select-background', 'invite', 'settings'
|
// 'microphone', 'camera', 'select-background', 'invite', 'settings'
|
||||||
// hiddenPremeetingButtons: [],
|
// hiddenPremeetingButtons: [],
|
||||||
|
|
||||||
|
// An array with custom option buttons for the participant context menu
|
||||||
|
// type: Array<{ icon: string; id: string; text: string; }>
|
||||||
|
// customParticipantMenuButtons: [],
|
||||||
|
|
||||||
|
// An array with custom option buttons for the toolbar
|
||||||
|
// type: Array<{ icon: string; id: string; text: string; }>
|
||||||
|
// customToolbarButtons: [],
|
||||||
|
|
||||||
// Stats
|
// Stats
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -786,6 +855,7 @@ var config = {
|
||||||
// Application ID and Secret.
|
// Application ID and Secret.
|
||||||
// callStatsID: '',
|
// callStatsID: '',
|
||||||
// callStatsSecret: '',
|
// callStatsSecret: '',
|
||||||
|
// callStatsApplicationLogsDisabled: false,
|
||||||
|
|
||||||
// The callstats initialize config params as described in the API:
|
// The callstats initialize config params as described in the API:
|
||||||
// https://docs.callstats.io/docs/javascript#callstatsinitialize-with-app-secret
|
// https://docs.callstats.io/docs/javascript#callstatsinitialize-with-app-secret
|
||||||
|
@ -803,10 +873,10 @@ var config = {
|
||||||
// pbxID: "PBX Identifier. Example, walmart.",
|
// pbxID: "PBX Identifier. Example, walmart.",
|
||||||
// pbxExtensionID: "PBX Extension Identifier. Example, 5625.",
|
// pbxExtensionID: "PBX Extension Identifier. Example, 5625.",
|
||||||
// fqExtensionID: "Fully qualified Extension Identifier. Example, +71 (US) +5625.",
|
// fqExtensionID: "Fully qualified Extension Identifier. Example, +71 (US) +5625.",
|
||||||
// sessionID: "Session Identifier. Example, session-12-34"
|
// sessionID: "Session Identifier. Example, session-12-34",
|
||||||
// },
|
// },
|
||||||
// collectLegacyStats: true, //enables the collection of legacy stats in chrome browser
|
// collectLegacyStats: true, //enables the collection of legacy stats in chrome browser
|
||||||
// collectIP: true //enables the collection localIP address
|
// collectIP: true, //enables the collection localIP address
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Enables sending participants' display names to callstats
|
// Enables sending participants' display names to callstats
|
||||||
|
@ -832,7 +902,7 @@ var config = {
|
||||||
// faceCenteringThreshold: 10,
|
// faceCenteringThreshold: 10,
|
||||||
|
|
||||||
// // Milliseconds for processing a new image capture in order to detect face coordinates if they exist.
|
// // Milliseconds for processing a new image capture in order to detect face coordinates if they exist.
|
||||||
// captureInterval: 1000
|
// captureInterval: 1000,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Controls the percentage of automatic feedback shown to participants when callstats is enabled.
|
// Controls the percentage of automatic feedback shown to participants when callstats is enabled.
|
||||||
|
@ -871,18 +941,10 @@ var config = {
|
||||||
// If not set, the effective value is 'all'.
|
// If not set, the effective value is 'all'.
|
||||||
// iceTransportPolicy: 'all',
|
// iceTransportPolicy: 'all',
|
||||||
|
|
||||||
// If set to true, it will prefer to use H.264 for P2P calls (if H.264
|
|
||||||
// is supported). This setting is deprecated, use preferredCodec instead.
|
|
||||||
// preferH264: true,
|
|
||||||
|
|
||||||
// Provides a way to set the video codec preference on the p2p connection. Acceptable
|
// Provides a way to set the video codec preference on the p2p connection. Acceptable
|
||||||
// codec values are 'VP8', 'VP9' and 'H264'.
|
// codec values are 'VP8', 'VP9' and 'H264'.
|
||||||
// preferredCodec: 'H264',
|
// preferredCodec: 'H264',
|
||||||
|
|
||||||
// If set to true, disable H.264 video codec by stripping it out of the
|
|
||||||
// SDP. This setting is deprecated, use disabledCodec instead.
|
|
||||||
// disableH264: false,
|
|
||||||
|
|
||||||
// Provides a way to prevent a video codec from being negotiated on the p2p connection.
|
// Provides a way to prevent a video codec from being negotiated on the p2p connection.
|
||||||
// disabledCodec: '',
|
// disabledCodec: '',
|
||||||
|
|
||||||
|
@ -894,8 +956,8 @@ var config = {
|
||||||
stunServers: [
|
stunServers: [
|
||||||
|
|
||||||
// { urls: 'stun:jitsi-meet.example.com:3478' },
|
// { urls: 'stun:jitsi-meet.example.com:3478' },
|
||||||
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
|
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' },
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
analytics: {
|
analytics: {
|
||||||
|
@ -903,14 +965,14 @@ var config = {
|
||||||
// disabled: false,
|
// disabled: false,
|
||||||
|
|
||||||
// The Google Analytics Tracking ID:
|
// The Google Analytics Tracking ID:
|
||||||
// googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1'
|
// googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1',
|
||||||
|
|
||||||
// Matomo configuration:
|
// Matomo configuration:
|
||||||
// matomoEndpoint: 'https://your-matomo-endpoint/',
|
// matomoEndpoint: 'https://your-matomo-endpoint/',
|
||||||
// matomoSiteID: '42',
|
// matomoSiteID: '42',
|
||||||
|
|
||||||
// The Amplitude APP Key:
|
// The Amplitude APP Key:
|
||||||
// amplitudeAPPKey: '<APP_KEY>'
|
// amplitudeAPPKey: '<APP_KEY>',
|
||||||
|
|
||||||
// Obfuscates room name sent to analytics (amplitude, rtcstats)
|
// Obfuscates room name sent to analytics (amplitude, rtcstats)
|
||||||
// Default value is false.
|
// Default value is false.
|
||||||
|
@ -922,19 +984,24 @@ var config = {
|
||||||
// PeerConnection states along with getStats metrics polled at the specified
|
// PeerConnection states along with getStats metrics polled at the specified
|
||||||
// interval.
|
// interval.
|
||||||
// rtcstatsEnabled: false,
|
// rtcstatsEnabled: false,
|
||||||
|
// rtcstatsStoreLogs: false,
|
||||||
|
|
||||||
// In order to enable rtcstats one needs to provide a endpoint url.
|
// In order to enable rtcstats one needs to provide a endpoint url.
|
||||||
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,
|
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,
|
||||||
|
|
||||||
// The interval at which rtcstats will poll getStats, defaults to 1000ms.
|
// The interval at which rtcstats will poll getStats, defaults to 10000ms.
|
||||||
// If the value is set to 0 getStats won't be polled and the rtcstats client
|
// If the value is set to 0 getStats won't be polled and the rtcstats client
|
||||||
// will only send data related to RTCPeerConnection events.
|
// will only send data related to RTCPeerConnection events.
|
||||||
// rtcstatsPolIInterval: 1000,
|
// rtcstatsPollInterval: 10000,
|
||||||
|
|
||||||
|
// This determines if rtcstats sends the SDP to the rtcstats server or replaces
|
||||||
|
// all SDPs with an empty string instead.
|
||||||
|
// rtcstatsSendSdp: false,
|
||||||
|
|
||||||
// Array of script URLs to load as lib-jitsi-meet "analytics handlers".
|
// Array of script URLs to load as lib-jitsi-meet "analytics handlers".
|
||||||
// scriptURLs: [
|
// scriptURLs: [
|
||||||
// "libs/analytics-ga.min.js", // google-analytics
|
// "libs/analytics-ga.min.js", // google-analytics
|
||||||
// "https://example.com/my-custom-analytics.js"
|
// "https://example.com/my-custom-analytics.js",
|
||||||
// ],
|
// ],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -943,11 +1010,11 @@ var config = {
|
||||||
|
|
||||||
// Information about the jitsi-meet instance we are connecting to, including
|
// Information about the jitsi-meet instance we are connecting to, including
|
||||||
// the user region as seen by the server.
|
// the user region as seen by the server.
|
||||||
deploymentInfo: {
|
// deploymentInfo: {
|
||||||
// shard: "shard1",
|
// shard: "shard1",
|
||||||
// region: "europe",
|
// region: "europe",
|
||||||
// userRegion: "asia"
|
// userRegion: "asia",
|
||||||
},
|
// },
|
||||||
|
|
||||||
// Array<string> of disabled sounds.
|
// Array<string> of disabled sounds.
|
||||||
// Possible values:
|
// Possible values:
|
||||||
|
@ -996,19 +1063,19 @@ var config = {
|
||||||
// chromeExtensionsInfo: [
|
// chromeExtensionsInfo: [
|
||||||
// {
|
// {
|
||||||
// id: 'kglhbbefdnlheedjiejgomgmfplipfeb',
|
// id: 'kglhbbefdnlheedjiejgomgmfplipfeb',
|
||||||
// path: 'jitsi-logo-48x48.png'
|
// path: 'jitsi-logo-48x48.png',
|
||||||
// },
|
// },
|
||||||
// // Edge extension info
|
// // Edge extension info
|
||||||
// {
|
// {
|
||||||
// id: 'eeecajlpbgjppibfledfihobcabccihn',
|
// id: 'eeecajlpbgjppibfledfihobcabccihn',
|
||||||
// path: 'jitsi-logo-48x48.png'
|
// path: 'jitsi-logo-48x48.png',
|
||||||
// }
|
// },
|
||||||
// ]
|
// ]
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// e2ee: {
|
// e2ee: {
|
||||||
// labels,
|
// labels,
|
||||||
// externallyManagedKey: false
|
// externallyManagedKey: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Options related to end-to-end (participant to participant) ping.
|
// Options related to end-to-end (participant to participant) ping.
|
||||||
|
@ -1023,8 +1090,8 @@ var config = {
|
||||||
// maxConferenceSize: 200,
|
// maxConferenceSize: 200,
|
||||||
//
|
//
|
||||||
// // The maximum number of e2e ping messages per second for the whole conference to aim for.
|
// // The maximum number of e2e ping messages per second for the whole conference to aim for.
|
||||||
// // This is used to contol the pacing of messages in order to reduce the load on the backend.
|
// // This is used to control the pacing of messages in order to reduce the load on the backend.
|
||||||
// maxMessagesPerSecond: 250
|
// maxMessagesPerSecond: 250,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// If set, will attempt to use the provided video input device label when
|
// If set, will attempt to use the provided video input device label when
|
||||||
|
@ -1034,10 +1101,71 @@ var config = {
|
||||||
// use only.
|
// use only.
|
||||||
// _desktopSharingSourceDevice: 'sample-id-or-label',
|
// _desktopSharingSourceDevice: 'sample-id-or-label',
|
||||||
|
|
||||||
|
// DEPRECATED! Use deeplinking.disabled instead.
|
||||||
// If true, any checks to handoff to another application will be prevented
|
// If true, any checks to handoff to another application will be prevented
|
||||||
// and instead the app will continue to display in the current browser.
|
// and instead the app will continue to display in the current browser.
|
||||||
// disableDeepLinking: false,
|
// disableDeepLinking: false,
|
||||||
|
|
||||||
|
// The deeplinking config.
|
||||||
|
// For information about the properties of
|
||||||
|
// deeplinking.[ios/android].dynamicLink check:
|
||||||
|
// https://firebase.google.com/docs/dynamic-links/create-manually
|
||||||
|
// deeplinking: {
|
||||||
|
//
|
||||||
|
// // The desktop deeplinking config.
|
||||||
|
// desktop: {
|
||||||
|
// appName: 'Jitsi Meet'
|
||||||
|
// },
|
||||||
|
// // If true, any checks to handoff to another application will be prevented
|
||||||
|
// // and instead the app will continue to display in the current browser.
|
||||||
|
// disabled: false,
|
||||||
|
|
||||||
|
// // whether to hide the logo on the deep linking pages.
|
||||||
|
// hideLogo: false,
|
||||||
|
|
||||||
|
// // The ios deeplinking config.
|
||||||
|
// ios: {
|
||||||
|
// appName: 'Jitsi Meet',
|
||||||
|
// // Specify mobile app scheme for opening the app from the mobile browser.
|
||||||
|
// appScheme: 'org.jitsi.meet',
|
||||||
|
// // Custom URL for downloading ios mobile app.
|
||||||
|
// downloadLink: 'https://itunes.apple.com/us/app/jitsi-meet/id1165103905',
|
||||||
|
// dynamicLink: {
|
||||||
|
// apn: 'org.jitsi.meet',
|
||||||
|
// appCode: 'w2atb',
|
||||||
|
// customDomain: undefined,
|
||||||
|
// ibi: 'com.atlassian.JitsiMeet.ios',
|
||||||
|
// isi: '1165103905'
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
|
||||||
|
// // The android deeplinking config.
|
||||||
|
// android: {
|
||||||
|
// appName: 'Jitsi Meet',
|
||||||
|
// // Specify mobile app scheme for opening the app from the mobile browser.
|
||||||
|
// appScheme: 'org.jitsi.meet',
|
||||||
|
// // Custom URL for downloading android mobile app.
|
||||||
|
// downloadLink: 'https://play.google.com/store/apps/details?id=org.jitsi.meet',
|
||||||
|
// // Android app package name.
|
||||||
|
// appPackage: 'org.jitsi.meet',
|
||||||
|
// fDroidUrl: 'https://f-droid.org/en/packages/org.jitsi.meet/',
|
||||||
|
// dynamicLink: {
|
||||||
|
// apn: 'org.jitsi.meet',
|
||||||
|
// appCode: 'w2atb',
|
||||||
|
// customDomain: undefined,
|
||||||
|
// ibi: 'com.atlassian.JitsiMeet.ios',
|
||||||
|
// isi: '1165103905'
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
|
||||||
|
// // The terms, privacy and help centre URL's.
|
||||||
|
// legalUrls: {
|
||||||
|
// helpCentre: 'https://web-cdn.jitsi.net/faq/meet-faq.html',
|
||||||
|
// privacy: 'https://jitsi.org/meet/privacy',
|
||||||
|
// terms: 'https://jitsi.org/meet/terms'
|
||||||
|
// },
|
||||||
|
|
||||||
// A property to disable the right click context menu for localVideo
|
// A property to disable the right click context menu for localVideo
|
||||||
// the menu has option to flip the locally seen video for local presentations
|
// the menu has option to flip the locally seen video for local presentations
|
||||||
// disableLocalVideoFlip: false,
|
// disableLocalVideoFlip: false,
|
||||||
|
@ -1062,7 +1190,7 @@ var config = {
|
||||||
// userDocumentationURL: 'https://docs.example.com/video-meetings.html',
|
// userDocumentationURL: 'https://docs.example.com/video-meetings.html',
|
||||||
// // If specified a 'Download our apps' button will be displayed in the overflow menu with a link
|
// // If specified a 'Download our apps' button will be displayed in the overflow menu with a link
|
||||||
// // to the specified URL for an app download page.
|
// // to the specified URL for an app download page.
|
||||||
// downloadAppsUrl: 'https://docs.example.com/our-apps.html'
|
// downloadAppsUrl: 'https://docs.example.com/our-apps.html',
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Options related to the remote participant menu.
|
// Options related to the remote participant menu.
|
||||||
|
@ -1074,7 +1202,7 @@ var config = {
|
||||||
// // If set to true the 'Grant moderator' button will be disabled.
|
// // If set to true the 'Grant moderator' button will be disabled.
|
||||||
// disableGrantModerator: true,
|
// disableGrantModerator: true,
|
||||||
// // If set to true the 'Send private message' button will be disabled.
|
// // If set to true the 'Send private message' button will be disabled.
|
||||||
// disablePrivateChat: true
|
// disablePrivateChat: true,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Endpoint that enables support for salesforce integration with in-meeting resource linking
|
// Endpoint that enables support for salesforce integration with in-meeting resource linking
|
||||||
|
@ -1090,7 +1218,7 @@ var config = {
|
||||||
// disableRemoteMute: true,
|
// disableRemoteMute: true,
|
||||||
|
|
||||||
// Enables support for lip-sync for this client (if the browser supports it).
|
// Enables support for lip-sync for this client (if the browser supports it).
|
||||||
// enableLipSync: false
|
// enableLipSync: false,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
External API url used to receive branding specific information.
|
External API url used to receive branding specific information.
|
||||||
|
@ -1119,7 +1247,7 @@ var config = {
|
||||||
// For a list of all possible theme tokens and their current defaults, please check:
|
// For a list of all possible theme tokens and their current defaults, please check:
|
||||||
// https://github.com/jitsi/jitsi-meet/tree/master/resources/custom-theme/custom-theme.json
|
// https://github.com/jitsi/jitsi-meet/tree/master/resources/custom-theme/custom-theme.json
|
||||||
// For a short explanations on each of the tokens, please check:
|
// For a short explanations on each of the tokens, please check:
|
||||||
// https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.js
|
// https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.ts
|
||||||
// IMPORTANT!: This is work in progress so many of the various tokens are not yet applied in code
|
// IMPORTANT!: This is work in progress so many of the various tokens are not yet applied in code
|
||||||
// or they are partially applied.
|
// or they are partially applied.
|
||||||
customTheme: {
|
customTheme: {
|
||||||
|
@ -1133,15 +1261,15 @@ var config = {
|
||||||
field02Hover: 'red',
|
field02Hover: 'red',
|
||||||
action01: 'green',
|
action01: 'green',
|
||||||
action01Hover: 'lightgreen',
|
action01Hover: 'lightgreen',
|
||||||
action02Disabled: 'beige',
|
disabled01: 'beige',
|
||||||
success02: 'cadetblue',
|
success02: 'cadetblue',
|
||||||
action02Hover: 'aliceblue'
|
action02Hover: 'aliceblue',
|
||||||
},
|
},
|
||||||
typography: {
|
typography: {
|
||||||
labelRegular: {
|
labelRegular: {
|
||||||
fontSize: 25,
|
fontSize: 25,
|
||||||
lineHeight: 30,
|
lineHeight: 30,
|
||||||
fontWeight: 500
|
fontWeight: 500,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1156,7 +1284,7 @@ var config = {
|
||||||
// // Hides the more actions button.
|
// // Hides the more actions button.
|
||||||
// hideMoreActionsButton: false,
|
// hideMoreActionsButton: false,
|
||||||
// // Hides the mute all button.
|
// // Hides the mute all button.
|
||||||
// hideMuteAllButton: false
|
// hideMuteAllButton: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Options related to the breakout rooms feature.
|
// Options related to the breakout rooms feature.
|
||||||
|
@ -1166,7 +1294,7 @@ var config = {
|
||||||
// // Hides the auto assign participants button.
|
// // Hides the auto assign participants button.
|
||||||
// hideAutoAssignButton: false,
|
// hideAutoAssignButton: false,
|
||||||
// // Hides the join breakout room button.
|
// // Hides the join breakout room button.
|
||||||
// hideJoinRoomButton: false
|
// hideJoinRoomButton: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// When true the user cannot add more images to be used as virtual background.
|
// When true the user cannot add more images to be used as virtual background.
|
||||||
|
@ -1206,7 +1334,7 @@ var config = {
|
||||||
// 'video-quality',
|
// 'video-quality',
|
||||||
// 'insecure-room',
|
// 'insecure-room',
|
||||||
// 'highlight-moment',
|
// 'highlight-moment',
|
||||||
// 'top-panel-toggle'
|
// 'top-panel-toggle',
|
||||||
// ]
|
// ]
|
||||||
// },
|
// },
|
||||||
|
|
||||||
|
@ -1233,9 +1361,8 @@ var config = {
|
||||||
// is not persisting the local storage inside the iframe.
|
// is not persisting the local storage inside the iframe.
|
||||||
// useHostPageLocalStorage: true,
|
// useHostPageLocalStorage: true,
|
||||||
|
|
||||||
// etherpad ("shared document") integration.
|
// Etherpad ("shared document") integration.
|
||||||
//
|
//
|
||||||
|
|
||||||
// If set, add a "Open shared document" link to the bottom right menu that
|
// If set, add a "Open shared document" link to the bottom right menu that
|
||||||
// will open an etherpad document.
|
// will open an etherpad document.
|
||||||
// etherpad_base: 'https://your-etherpad-installati.on/p/',
|
// etherpad_base: 'https://your-etherpad-installati.on/p/',
|
||||||
|
@ -1246,11 +1373,6 @@ var config = {
|
||||||
// {"countryCode":"US","tollFree":false,"formattedNumber":"+1 123-456-7890"}
|
// {"countryCode":"US","tollFree":false,"formattedNumber":"+1 123-456-7890"}
|
||||||
// dialInConfCodeUrl is the conference mapper converting a meeting id to a PIN used for dial-in
|
// dialInConfCodeUrl is the conference mapper converting a meeting id to a PIN used for dial-in
|
||||||
// or the other way around (more info in resources/cloud-api.swagger)
|
// or the other way around (more info in resources/cloud-api.swagger)
|
||||||
//
|
|
||||||
// For JaaS customers the default values are:
|
|
||||||
// dialInNumbersUrl: 'https://conference-mapper.jitsi.net/v1/access/dids',
|
|
||||||
// dialInConfCodeUrl: 'https://conference-mapper.jitsi.net/v1/access',
|
|
||||||
//
|
|
||||||
|
|
||||||
// List of undocumented settings used in jitsi-meet
|
// List of undocumented settings used in jitsi-meet
|
||||||
/**
|
/**
|
||||||
|
@ -1260,9 +1382,9 @@ var config = {
|
||||||
deploymentInfo
|
deploymentInfo
|
||||||
dialOutAuthUrl
|
dialOutAuthUrl
|
||||||
dialOutCodesUrl
|
dialOutCodesUrl
|
||||||
|
dialOutRegionUrl
|
||||||
disableRemoteControl
|
disableRemoteControl
|
||||||
displayJids
|
displayJids
|
||||||
externalConnectUrl
|
|
||||||
e2eeLabels
|
e2eeLabels
|
||||||
firefox_fake_device
|
firefox_fake_device
|
||||||
googleApiApplicationClientID
|
googleApiApplicationClientID
|
||||||
|
@ -1351,6 +1473,7 @@ var config = {
|
||||||
// 'notify.leftTwoMembers', // show when two participants left simultaneously
|
// 'notify.leftTwoMembers', // show when two participants left simultaneously
|
||||||
// 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously
|
// 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously
|
||||||
// 'notify.grantedTo', // shown when moderator rights were granted to a participant
|
// 'notify.grantedTo', // shown when moderator rights were granted to a participant
|
||||||
|
// 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute
|
||||||
// 'notify.invitedOneMember', // shown when 1 participant has been invited
|
// 'notify.invitedOneMember', // shown when 1 participant has been invited
|
||||||
// 'notify.invitedThreePlusMembers', // shown when 3+ participants have been invited
|
// 'notify.invitedThreePlusMembers', // shown when 3+ participants have been invited
|
||||||
// 'notify.invitedTwoMembers', // shown when 2 participants have been invited
|
// 'notify.invitedTwoMembers', // shown when 2 participants have been invited
|
||||||
|
@ -1371,7 +1494,7 @@ var config = {
|
||||||
// 'notify.raisedHand', // shown when a partcipant used raise hand,
|
// 'notify.raisedHand', // shown when a partcipant used raise hand,
|
||||||
// 'notify.startSilentTitle', // shown when user joined with no audio
|
// 'notify.startSilentTitle', // shown when user joined with no audio
|
||||||
// 'notify.unmute', // shown to moderator when user raises hand during AV moderation
|
// 'notify.unmute', // shown to moderator when user raises hand during AV moderation
|
||||||
// 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute
|
// 'notify.videoMutedRemotelyTitle', // shown when user's video is muted by a remote party,
|
||||||
// 'prejoin.errorDialOut',
|
// 'prejoin.errorDialOut',
|
||||||
// 'prejoin.errorDialOutDisconnected',
|
// 'prejoin.errorDialOutDisconnected',
|
||||||
// 'prejoin.errorDialOutFailed',
|
// 'prejoin.errorDialOutFailed',
|
||||||
|
@ -1384,7 +1507,7 @@ var config = {
|
||||||
// 'toolbar.noAudioSignalTitle', // shown when a broken mic is detected
|
// 'toolbar.noAudioSignalTitle', // shown when a broken mic is detected
|
||||||
// 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone
|
// 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone
|
||||||
// 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted
|
// 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted
|
||||||
// 'transcribing.failedToStart' // shown when transcribing fails to start
|
// 'transcribing.failedToStart', // shown when transcribing fails to start
|
||||||
// ],
|
// ],
|
||||||
|
|
||||||
// List of notifications to be disabled. Works in tandem with the above setting.
|
// List of notifications to be disabled. Works in tandem with the above setting.
|
||||||
|
@ -1402,19 +1525,23 @@ var config = {
|
||||||
// // (displaying multiple participants on stage besides the vertical filmstrip)
|
// // (displaying multiple participants on stage besides the vertical filmstrip)
|
||||||
// disableStageFilmstrip: false,
|
// disableStageFilmstrip: false,
|
||||||
|
|
||||||
|
// // Default number of participants that can be displayed on stage.
|
||||||
|
// // The user can change this in settings. Number must be between 1 and 6.
|
||||||
|
// stageFilmstripParticipants: 1,
|
||||||
|
|
||||||
// // Disables the top panel (only shown when a user is sharing their screen).
|
// // Disables the top panel (only shown when a user is sharing their screen).
|
||||||
// disableTopPanel: false,
|
// disableTopPanel: false,
|
||||||
|
|
||||||
// // The minimum number of participants that must be in the call for
|
// // The minimum number of participants that must be in the call for
|
||||||
// // the top panel layout to be used.
|
// // the top panel layout to be used.
|
||||||
// minParticipantCountForTopPanel: 50
|
// minParticipantCountForTopPanel: 50,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Tile view related config options.
|
// Tile view related config options.
|
||||||
// tileView: {
|
// tileView: {
|
||||||
// // The optimal number of tiles that are going to be shown in tile view. Depending on the screen size it may
|
// // The optimal number of tiles that are going to be shown in tile view. Depending on the screen size it may
|
||||||
// // not be possible to show the exact number of participants specified here.
|
// // not be possible to show the exact number of participants specified here.
|
||||||
// numberOfVisibleTiles: 25
|
// numberOfVisibleTiles: 25,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Specifies whether the chat emoticons are disabled or not
|
// Specifies whether the chat emoticons are disabled or not
|
||||||
|
@ -1431,15 +1558,50 @@ var config = {
|
||||||
// // - chat: show the GIF as a message in chat
|
// // - chat: show the GIF as a message in chat
|
||||||
// // - all: all of the above. This is the default option
|
// // - all: all of the above. This is the default option
|
||||||
// displayMode: 'all',
|
// displayMode: 'all',
|
||||||
// // How long the GIF should be displayed on the tile (in miliseconds).
|
// // How long the GIF should be displayed on the tile (in milliseconds).
|
||||||
// tileTime: 5000
|
// tileTime: 5000,
|
||||||
|
// // Limit results by rating: g, pg, pg-13, r. Default value: g.
|
||||||
|
// rating: 'pg',
|
||||||
|
// // The proxy server url for giphy requests in the web app.
|
||||||
|
// proxyUrl: 'https://giphy-proxy.example.com',
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Allow all above example options to include a trailing comma and
|
// Logging
|
||||||
// prevent fear when commenting out the last value.
|
// logging: {
|
||||||
makeJsonParserHappy: 'even if last key had a trailing comma'
|
// // Default log level for the app and lib-jitsi-meet.
|
||||||
|
// defaultLogLevel: 'trace',
|
||||||
|
// // Option to disable LogCollector (which stores the logs on CallStats).
|
||||||
|
// //disableLogCollector: true,
|
||||||
|
// // Individual loggers are customizable.
|
||||||
|
// loggers: {
|
||||||
|
// // The following are too verbose in their logging with the default level.
|
||||||
|
// 'modules/RTC/TraceablePeerConnection.js': 'info',
|
||||||
|
// 'modules/statistics/CallStats.js': 'info',
|
||||||
|
// 'modules/xmpp/strophe.util.js': 'log',
|
||||||
|
// },
|
||||||
|
|
||||||
// no configuration value should follow this line.
|
// Application logo url
|
||||||
|
// defaultLogoUrl: 'images/watermark.svg',
|
||||||
|
|
||||||
|
// Settings for the Excalidraw whiteboard integration.
|
||||||
|
// whiteboard: {
|
||||||
|
// // Whether the feature is enabled or not.
|
||||||
|
// enabled: true,
|
||||||
|
// // The server used to support whiteboard collaboration.
|
||||||
|
// // https://github.com/jitsi/excalidraw-backend
|
||||||
|
// collabServerBaseUrl: 'https://excalidraw-backend.example.com',
|
||||||
|
// },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* eslint-enable no-unused-vars, no-var */
|
// Temporary backwards compatibility with old mobile clients.
|
||||||
|
config.flags = config.flags || {};
|
||||||
|
config.flags.sourceNameSignaling = true;
|
||||||
|
config.flags.sendMultipleVideoStreams = true;
|
||||||
|
config.flags.receiveMultipleVideoStreams = true;
|
||||||
|
|
||||||
|
// Set the default values for JaaS customers
|
||||||
|
if (enableJaaS) {
|
||||||
|
config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids';
|
||||||
|
config.dialInConfCodeUrl = 'https://conference-mapper.jitsi.net/v1/access';
|
||||||
|
config.roomPasswordNumberOfDigits = 10; // skip re-adding it (do not remove comment)
|
||||||
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {
|
||||||
connectionEstablished,
|
connectionEstablished,
|
||||||
connectionFailed,
|
connectionFailed,
|
||||||
constructOptions
|
constructOptions
|
||||||
} from './react/features/base/connection/actions';
|
} from './react/features/base/connection/actions.web';
|
||||||
import { openDialog } from './react/features/base/dialog/actions';
|
import { openDialog } from './react/features/base/dialog/actions';
|
||||||
import { setJWT } from './react/features/base/jwt';
|
import { setJWT } from './react/features/base/jwt';
|
||||||
import {
|
import {
|
||||||
|
@ -19,10 +19,9 @@ import {
|
||||||
} from './react/features/base/lib-jitsi-meet';
|
} from './react/features/base/lib-jitsi-meet';
|
||||||
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
|
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
|
||||||
import { getCustomerDetails } from './react/features/jaas/actions.any';
|
import { getCustomerDetails } from './react/features/jaas/actions.any';
|
||||||
import { isVpaasMeeting, getJaasJWT } from './react/features/jaas/functions';
|
import { getJaasJWT, isVpaasMeeting } from './react/features/jaas/functions';
|
||||||
import {
|
import {
|
||||||
setPrejoinDisplayNameRequired,
|
setPrejoinDisplayNameRequired
|
||||||
setPrejoinPageVisibility
|
|
||||||
} from './react/features/prejoin/actions';
|
} from './react/features/prejoin/actions';
|
||||||
const logger = Logger.getLogger(__filename);
|
const logger = Logger.getLogger(__filename);
|
||||||
|
|
||||||
|
@ -33,54 +32,6 @@ const logger = Logger.getLogger(__filename);
|
||||||
*/
|
*/
|
||||||
export const DISCO_JIBRI_FEATURE = 'http://jitsi.org/protocol/jibri';
|
export const DISCO_JIBRI_FEATURE = 'http://jitsi.org/protocol/jibri';
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if we have data to use attach instead of connect. If we have the data
|
|
||||||
* executes attach otherwise check if we have to wait for the data. If we have
|
|
||||||
* to wait for the attach data we are setting handler to APP.connect.handler
|
|
||||||
* which is going to be called when the attach data is received otherwise
|
|
||||||
* executes connect.
|
|
||||||
*
|
|
||||||
* @param {string} [id] user id
|
|
||||||
* @param {string} [password] password
|
|
||||||
* @param {string} [roomName] the name of the conference.
|
|
||||||
*/
|
|
||||||
function checkForAttachParametersAndConnect(id, password, connection) {
|
|
||||||
if (window.XMPPAttachInfo) {
|
|
||||||
APP.connect.status = 'connecting';
|
|
||||||
|
|
||||||
// When connection optimization is not deployed or enabled the default
|
|
||||||
// value will be window.XMPPAttachInfo.status = "error"
|
|
||||||
// If the connection optimization is deployed and enabled and there is
|
|
||||||
// a failure the value will be window.XMPPAttachInfo.status = "error"
|
|
||||||
if (window.XMPPAttachInfo.status === 'error') {
|
|
||||||
connection.connect({
|
|
||||||
id,
|
|
||||||
password
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const attachOptions = window.XMPPAttachInfo.data;
|
|
||||||
|
|
||||||
if (attachOptions) {
|
|
||||||
connection.attach(attachOptions);
|
|
||||||
delete window.XMPPAttachInfo.data;
|
|
||||||
} else {
|
|
||||||
connection.connect({
|
|
||||||
id,
|
|
||||||
password
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
APP.connect.status = 'ready';
|
|
||||||
APP.connect.handler
|
|
||||||
= checkForAttachParametersAndConnect.bind(
|
|
||||||
null,
|
|
||||||
id, password, connection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to open connection using provided credentials.
|
* Try to open connection using provided credentials.
|
||||||
* @param {string} [id]
|
* @param {string} [id]
|
||||||
|
@ -183,7 +134,10 @@ export async function connect(id, password) {
|
||||||
APP.store.dispatch(setPrejoinDisplayNameRequired());
|
APP.store.dispatch(setPrejoinDisplayNameRequired());
|
||||||
}
|
}
|
||||||
|
|
||||||
checkForAttachParametersAndConnect(id, password, connection);
|
connection.connect({
|
||||||
|
id,
|
||||||
|
password
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +201,6 @@ function requestAuth(roomName) {
|
||||||
resolve(connection);
|
resolve(connection);
|
||||||
};
|
};
|
||||||
|
|
||||||
APP.store.dispatch(setPrejoinPageVisibility(false));
|
|
||||||
APP.store.dispatch(
|
APP.store.dispatch(
|
||||||
openDialog(LoginDialog, { onSuccess,
|
openDialog(LoginDialog, { onSuccess,
|
||||||
roomName })
|
roomName })
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
'extends': '../react/.eslintrc.js'
|
|
||||||
};
|
|
|
@ -1,86 +0,0 @@
|
||||||
/* global config, createConnectionExternally */
|
|
||||||
|
|
||||||
import getRoomName from '../react/features/base/config/getRoomName';
|
|
||||||
import { parseURLParams } from '../react/features/base/util/parseURLParams';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements external connect using createConnectionExternally function defined
|
|
||||||
* in external_connect.js for Jitsi Meet. Parses the room name and JSON Web
|
|
||||||
* Token (JWT) from the URL and executes createConnectionExternally.
|
|
||||||
*
|
|
||||||
* NOTE: If you are using lib-jitsi-meet without Jitsi Meet, you should use this
|
|
||||||
* file as reference only because the implementation is Jitsi Meet-specific.
|
|
||||||
*
|
|
||||||
* NOTE: For optimal results this file should be included right after
|
|
||||||
* external_connect.js.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (typeof createConnectionExternally === 'function') {
|
|
||||||
// URL params have higher priority than config params.
|
|
||||||
// Do not use external connect if websocket is enabled.
|
|
||||||
let url
|
|
||||||
= parseURLParams(window.location, true, 'hash')[
|
|
||||||
'config.externalConnectUrl']
|
|
||||||
|| config.websocket ? undefined : config.externalConnectUrl;
|
|
||||||
const isRecorder
|
|
||||||
= parseURLParams(window.location, true, 'hash')['config.iAmRecorder'];
|
|
||||||
|
|
||||||
let roomName;
|
|
||||||
|
|
||||||
if (url && (roomName = getRoomName()) && !isRecorder) {
|
|
||||||
url += `?room=${roomName}`;
|
|
||||||
|
|
||||||
const token = parseURLParams(window.location, true, 'search').jwt;
|
|
||||||
|
|
||||||
if (token) {
|
|
||||||
url += `&token=${token}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
createConnectionExternally(
|
|
||||||
url,
|
|
||||||
connectionInfo => {
|
|
||||||
// Sets that global variable to be used later by connect method
|
|
||||||
// in connection.js.
|
|
||||||
window.XMPPAttachInfo = {
|
|
||||||
status: 'success',
|
|
||||||
data: connectionInfo
|
|
||||||
};
|
|
||||||
checkForConnectHandlerAndConnect();
|
|
||||||
},
|
|
||||||
errorCallback);
|
|
||||||
} else {
|
|
||||||
errorCallback();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
errorCallback();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if connect from connection.js was executed and executes the handler
|
|
||||||
* that is going to finish the connect work.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
function checkForConnectHandlerAndConnect() {
|
|
||||||
window.APP
|
|
||||||
&& window.APP.connect.status === 'ready'
|
|
||||||
&& window.APP.connect.handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements a callback to be invoked if anything goes wrong.
|
|
||||||
*
|
|
||||||
* @param {Error} error - The specifics of what went wrong.
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
function errorCallback(error) {
|
|
||||||
// The value of error is undefined if external connect is disabled.
|
|
||||||
error && console.warn(error);
|
|
||||||
|
|
||||||
// Sets that global variable to be used later by connect method in
|
|
||||||
// connection.js.
|
|
||||||
window.XMPPAttachInfo = {
|
|
||||||
status: 'error'
|
|
||||||
};
|
|
||||||
checkForConnectHandlerAndConnect();
|
|
||||||
}
|
|
|
@ -2,13 +2,13 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
&-content {
|
&-content {
|
||||||
background: $menuBG;
|
position: relative;
|
||||||
border-radius: 3px;
|
right: auto;
|
||||||
font-size: 14px;
|
margin-bottom: 4px;
|
||||||
line-height: 24px;
|
|
||||||
max-height: 456px;
|
max-height: 456px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
width: 300px;
|
width: 300px;
|
||||||
|
|
||||||
&-ul {
|
&-ul {
|
||||||
margin:0;
|
margin:0;
|
||||||
padding:0;
|
padding:0;
|
||||||
|
@ -16,90 +16,33 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&-header {
|
&-header:hover {
|
||||||
color: #fff;
|
background-color: initial;
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
margin-top: 8px;
|
|
||||||
padding: 8px 16px;
|
|
||||||
|
|
||||||
&-icon {
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
fill: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&--bordered {
|
|
||||||
border-bottom: 1px solid #4C4D50;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-text {
|
|
||||||
margin-left: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-entry {
|
|
||||||
align-items: center;
|
|
||||||
color: #fff;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
padding: 8px 0;
|
|
||||||
margin-left: 48px;
|
|
||||||
|
|
||||||
&--selected {
|
|
||||||
background: #131519;
|
|
||||||
cursor: initial;
|
cursor: initial;
|
||||||
margin-left: 0;
|
|
||||||
padding-left: 18px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&-text {
|
&-entry-text {
|
||||||
color: #fff;
|
|
||||||
display: inline-block;
|
|
||||||
line-height: 24px;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
max-width: 213px;
|
max-width: 213px;
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
&.left-margin {
|
||||||
|
margin-left: 36px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&-speaker {
|
&-speaker {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&-ul {
|
|
||||||
margin:0;
|
|
||||||
padding:0;
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover, &:focus-within, &:focus {
|
&:hover, &:focus-within, &:focus {
|
||||||
.audio-preview-entry {
|
|
||||||
background: #36383C;
|
|
||||||
margin-left: 0;
|
|
||||||
padding-left: 48px;
|
|
||||||
|
|
||||||
&--selected {
|
|
||||||
padding-left: 18px;
|
|
||||||
background: $newToolbarBackgroundColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.audio-preview-test-button {
|
.audio-preview-test-button {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.audio-preview-entry-text {
|
.audio-preview-entry-text {
|
||||||
max-width: 178px;
|
max-width: 178px;
|
||||||
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
padding-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.audio-preview-entry-text {
|
.audio-preview-entry-text {
|
||||||
max-width: 238px;
|
max-width: 238px;
|
||||||
}
|
}
|
||||||
|
@ -108,19 +51,6 @@
|
||||||
&-microphone {
|
&-microphone {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
.audio-preview-entry {
|
|
||||||
background: #36383C;
|
|
||||||
margin-left: 0;
|
|
||||||
padding-left: 48px;
|
|
||||||
|
|
||||||
&--selected {
|
|
||||||
background: $newToolbarBackgroundColor;
|
|
||||||
padding-left: 18px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&--nometer {
|
&--nometer {
|
||||||
.audio-preview-entry-text {
|
.audio-preview-entry-text {
|
||||||
max-width: 238px;
|
max-width: 238px;
|
||||||
|
@ -140,42 +70,21 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 14px;
|
width: 14px;
|
||||||
|
|
||||||
& svg {
|
|
||||||
fill: #1C2025;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--check {
|
|
||||||
background: #31B76A;
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--exclamation {
|
&--exclamation {
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
|
|
||||||
& svg {
|
& svg {
|
||||||
fill: #E54B4B;
|
fill: #E54B4B;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&-hr {
|
|
||||||
border-top: 1px solid #4C4D50;
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-test-button {
|
&-test-button {
|
||||||
display: none;
|
display: none;
|
||||||
background: #FFF;
|
padding: 4px 10px;
|
||||||
border: 1px solid #D1DBE8;
|
|
||||||
border-radius: 3px;
|
|
||||||
color: #1C2025;
|
|
||||||
cursor: pointer;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 0.8rem;
|
|
||||||
line-height: 24px;
|
|
||||||
padding: 2px 8px;
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 16px;
|
right: 16px;
|
||||||
top: 5px;
|
top: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&-meter-mic {
|
&-meter-mic {
|
||||||
|
@ -184,9 +93,7 @@
|
||||||
top: 14px;
|
top: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Override @atlaskit/InlineDialog container which is made with styled components
|
&-checkbox-container {
|
||||||
& > div:nth-child(2) {
|
padding: 10px 16px;
|
||||||
outline: none;
|
|
||||||
padding: 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,6 +126,12 @@ form {
|
||||||
background-size: contain;
|
background-size: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.leftwatermarknomargin {
|
||||||
|
background-position: center left;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: contain;
|
||||||
|
}
|
||||||
|
|
||||||
.rightwatermark {
|
.rightwatermark {
|
||||||
right: 32px;
|
right: 32px;
|
||||||
top: 32px;
|
top: 32px;
|
||||||
|
@ -182,3 +188,8 @@ form {
|
||||||
background: rgba(0, 0, 0, .5);
|
background: rgba(0, 0, 0, .5);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Necessary for the new icons to work properly. */
|
||||||
|
.jitsi-icon svg path {
|
||||||
|
fill: inherit !important;
|
||||||
|
}
|
||||||
|
|
240
css/_chat.scss
|
@ -22,7 +22,7 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
// extract header + tabs height
|
// extract header + tabs height
|
||||||
height: calc(100% - 102px);
|
height: calc(100% - 119px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-panel-no-tabs {
|
.chat-panel-no-tabs {
|
||||||
|
@ -30,12 +30,18 @@
|
||||||
height: calc(100% - 70px);
|
height: calc(100% - 70px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#chat-conversation-container {
|
||||||
|
// extract message input height
|
||||||
|
height: calc(100% - 64px);
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
#chatconversation {
|
#chatconversation {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
font-size: 10pt;
|
font-size: 10pt;
|
||||||
// extract message input height
|
height: 100%;
|
||||||
height: calc(100% - 68px);
|
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
@ -70,32 +76,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#chat-recipient {
|
|
||||||
align-items: center;
|
|
||||||
background-color: $chatPrivateMessageBackgroundColor;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
font-weight: 100;
|
|
||||||
padding: 10px;
|
|
||||||
|
|
||||||
span {
|
|
||||||
color: white;
|
|
||||||
display: flex;
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
div {
|
|
||||||
svg {
|
|
||||||
cursor: pointer;
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.lobby-chat-recipient {
|
|
||||||
background-color: $chatLobbyMessageBackgroundColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.chat-header {
|
.chat-header {
|
||||||
height: 70px;
|
height: 70px;
|
||||||
|
@ -118,64 +98,18 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-input-container {
|
.chat-input-container {
|
||||||
padding: 0 16px 16px;
|
padding: 0 16px 24px;
|
||||||
|
|
||||||
&.populated {
|
|
||||||
#chat-input {
|
|
||||||
.send-button {
|
|
||||||
background: #1B67EC;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-left: 0.3rem;
|
|
||||||
|
|
||||||
@media (hover: hover) and (pointer: fine) {
|
|
||||||
&:hover {
|
|
||||||
background: #3D82FB;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
background: #0852D4;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#chat-input {
|
#chat-input {
|
||||||
border: 1px solid $chatInputSeparatorColor;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 4px;
|
align-items: flex-end;
|
||||||
border-radius: 3px;
|
position: relative;
|
||||||
|
|
||||||
&:focus-within {
|
|
||||||
border: 1px solid #619CF4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
* {
|
.chat-input {
|
||||||
background-color: transparent;
|
flex: 1;
|
||||||
}
|
margin-right: 8px;
|
||||||
}
|
|
||||||
|
|
||||||
.send-button-container {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.send-button {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 40px;
|
|
||||||
width: 40px;
|
|
||||||
border-radius: 3px;
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: $chatInputSeparatorColor;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.smiley-button {
|
.smiley-button {
|
||||||
|
@ -302,15 +236,6 @@
|
||||||
-webkit-user-select: text;
|
-webkit-user-select: text;
|
||||||
user-select: text;
|
user-select: text;
|
||||||
}
|
}
|
||||||
|
|
||||||
.display-name {
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 600;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.sr-only {
|
.sr-only {
|
||||||
|
@ -327,24 +252,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.chatmessage {
|
.chatmessage {
|
||||||
background-color: $chatRemoteMessageBackgroundColor;
|
|
||||||
border-radius: 0px 6px 6px 6px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
color: white;
|
|
||||||
margin-top: 3px;
|
|
||||||
max-width: 100%;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&.localuser {
|
&.localuser {
|
||||||
background-color: $chatLocalMessageBackgroundColor;
|
background-color: $chatLocalMessageBackgroundColor;
|
||||||
border-radius: 6px 0px 6px 6px;
|
border-radius: 6px 0px 6px 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.usermessage {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.error {
|
&.error {
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
|
|
||||||
|
@ -359,22 +271,12 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.privatemessagenotice {
|
|
||||||
font-size: 11px;
|
|
||||||
font-weight: 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
.messagecontent {
|
.messagecontent {
|
||||||
margin: 8px;
|
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.timestamp {
|
|
||||||
color: #757575;
|
|
||||||
}
|
|
||||||
|
|
||||||
#smileys {
|
#smileys {
|
||||||
font-size: 20pt;
|
font-size: 20pt;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
|
@ -395,7 +297,9 @@
|
||||||
|
|
||||||
.smiley-input {
|
.smiley-input {
|
||||||
display: flex;
|
display: flex;
|
||||||
position: relative;
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.smileys-panel {
|
.smileys-panel {
|
||||||
|
@ -403,7 +307,7 @@
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background-color: rgba(0, 0, 0, .6) !important;
|
background-color: rgba(0, 0, 0, .6) !important;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: none;
|
display: flex;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: calc(#{$sidebarWidth} - 32px);
|
width: calc(#{$sidebarWidth} - 32px);
|
||||||
|
@ -418,11 +322,6 @@
|
||||||
*/
|
*/
|
||||||
transition: max-height 0.3s;
|
transition: max-height 0.3s;
|
||||||
|
|
||||||
&.show-smileys {
|
|
||||||
display: flex;
|
|
||||||
max-height: 500%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#smileysContainer {
|
#smileysContainer {
|
||||||
background-color: $chatBackgroundColor;
|
background-color: $chatBackgroundColor;
|
||||||
border-top: 1px solid $chatInputSeparatorColor;
|
border-top: 1px solid $chatInputSeparatorColor;
|
||||||
|
@ -451,24 +350,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-message-group {
|
.chat-message-group {
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
&.local {
|
&.local {
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
|
|
||||||
.chatmessage {
|
|
||||||
background-color: $chatLocalMessageBackgroundColor;
|
|
||||||
border-radius: 6px 0px 6px 6px;
|
|
||||||
|
|
||||||
&.privatemessage {
|
|
||||||
background-color: $chatPrivateMessageBackgroundColor;
|
|
||||||
}
|
|
||||||
&.lobbymessage {
|
|
||||||
background-color: $chatLobbyMessageBackgroundColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.display-name {
|
.display-name {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@ -479,58 +363,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&.error {
|
&.error {
|
||||||
.chatmessage {
|
|
||||||
background-color: $defaultWarningColor;
|
|
||||||
border-radius: 0px;
|
|
||||||
font-weight: 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
.display-name {
|
.display-name {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.chatmessage-wrapper {
|
|
||||||
max-width: 100%;
|
|
||||||
|
|
||||||
.replywrapper {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
.messageactions {
|
|
||||||
align-self: stretch;
|
|
||||||
border-left: 1px solid $chatActionsSeparatorColor;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 5px;
|
|
||||||
|
|
||||||
&.lobbychatmessageactions {
|
|
||||||
border-left-color: $chatLobbyActionsSeparatorColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolbox-icon {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chatmessage {
|
|
||||||
background-color: $chatRemoteMessageBackgroundColor;
|
|
||||||
border-radius: 0px 6px 6px 6px;
|
|
||||||
display: inline-block;
|
|
||||||
margin-top: 3px;
|
|
||||||
color: white;
|
|
||||||
|
|
||||||
&.privatemessage {
|
|
||||||
background-color: $chatPrivateMessageBackgroundColor;
|
|
||||||
}
|
|
||||||
&.lobbymessage {
|
|
||||||
background-color: $chatLobbyMessageBackgroundColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-dialog {
|
.chat-dialog {
|
||||||
|
@ -573,41 +409,3 @@
|
||||||
background: #36383C;
|
background: #36383C;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-tabs-container {
|
|
||||||
width: 100%;
|
|
||||||
border-bottom: thin solid #292929;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-around;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-tab {
|
|
||||||
font-size: 1.2em;
|
|
||||||
padding-bottom: 0.5em;
|
|
||||||
width: 50%;
|
|
||||||
text-align: center;
|
|
||||||
color: #8B8B8B;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-tab-focus {
|
|
||||||
border-bottom-style: solid;
|
|
||||||
color: #FFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-tab-title {
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-tab-badge {
|
|
||||||
background-color: #165ecc;
|
|
||||||
border-radius: 50%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-weight: 700;
|
|
||||||
overflow: hidden;
|
|
||||||
text-align: center;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
vertical-align: middle;
|
|
||||||
padding: 0 4px;
|
|
||||||
color: #FFF;
|
|
||||||
}
|
|
||||||
|
|
|
@ -24,8 +24,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.drawer-menu {
|
.drawer-menu {
|
||||||
background: #242528;
|
|
||||||
border-radius: 16px 16px 0 0;
|
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
margin-bottom: env(safe-area-inset-bottom, 0);
|
margin-bottom: env(safe-area-inset-bottom, 0);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
@keyframes rotateAroundY {
|
||||||
|
from { transform: rotateY(0deg); }
|
||||||
|
to { transform: rotateY(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rainbowRoad {
|
||||||
|
to {
|
||||||
|
background-position: 400% 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "Comic Sans MS", "Comic Sans", sans-serif !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important;
|
||||||
|
-webkit-background-clip: text !important;
|
||||||
|
-webkit-text-fill-color: transparent !important;
|
||||||
|
-moz-background-clip: text !important;
|
||||||
|
-moz-text-fill-color: transparent !important;
|
||||||
|
animation: rainbowRoad 8s linear infinite !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.dominant-speaker {
|
||||||
|
box-shadow: inset 0px 0px 0px 4px rgba(255,0,255,0.33) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.display-avatar-only {
|
||||||
|
background-image: url("");
|
||||||
|
}
|
||||||
|
|
||||||
|
.videocontainer:nth-child(odd) {
|
||||||
|
transform: rotate(1.5deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.videocontainer:nth-child(even) {
|
||||||
|
transform: rotate(-1.3deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#largeVideoContainer.videocontainer {
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sideToolbarContainer {
|
||||||
|
transform: rotate(-1.1deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.displayname:before {
|
||||||
|
content: "♡︎ ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.displayname:after {
|
||||||
|
content: " ♡︎";
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar, .userAvatar {
|
||||||
|
transform: rotateY(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar:hover, .userAvatar:hover {
|
||||||
|
animation: rotateAroundY 3.6s linear infinite;
|
||||||
|
}
|
|
@ -82,6 +82,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.left-column {
|
.left-column {
|
||||||
|
order: -1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
|
@ -92,6 +93,7 @@
|
||||||
.right-column {
|
.right-column {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
padding-top: 13px;
|
padding-top: 13px;
|
||||||
|
@ -102,7 +104,7 @@
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
padding-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtitle {
|
.subtitle {
|
||||||
|
@ -125,8 +127,7 @@
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.with-click-handler:hover,
|
&.with-click-handler:hover {
|
||||||
&.with-click-handler:focus {
|
|
||||||
background-color: #c7ddff;
|
background-color: #c7ddff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,28 +3,28 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
& > svg {
|
& > svg {
|
||||||
fill: #4E5E6C;
|
fill: #525252;
|
||||||
width: 38px;
|
width: 38px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.metr--disabled {
|
&.metr--disabled {
|
||||||
& > svg {
|
& > svg {
|
||||||
fill: #4E5E6C;
|
fill: #525252;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.metr-l-0 {
|
.metr-l-0 {
|
||||||
rect:first-child {
|
rect:first-child {
|
||||||
fill: #31B76A;
|
fill: #1EC26A;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@for $i from 1 through 7 {
|
@for $i from 1 through 7 {
|
||||||
.metr-l-#{$i} {
|
.metr-l-#{$i} {
|
||||||
rect:nth-child(-n+#{$i+1}) {
|
rect:nth-child(-n+#{$i+1}) {
|
||||||
fill: #31B76A;
|
fill: #1EC26A;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
445
css/_polls.scss
|
@ -1,444 +1,3 @@
|
||||||
.poll-dialog {
|
.polls-panel {
|
||||||
font-size: 14px;
|
height: calc(100% - 119px);
|
||||||
font-weight: 400;
|
|
||||||
line-height: 20px;
|
|
||||||
|
|
||||||
h1, span, li, strong {
|
|
||||||
color: #bce;
|
|
||||||
}
|
|
||||||
ol {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-question-field {
|
|
||||||
padding: 8px 16px;
|
|
||||||
padding-bottom: 24px;
|
|
||||||
border-bottom: 1px solid #525252;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-header {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-creator {
|
|
||||||
color: #C2C2C2;
|
|
||||||
font-weight: 600;
|
|
||||||
margin: 4px 0 16px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-container {
|
|
||||||
background: #3D3D3D;
|
|
||||||
border-radius: 3px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
&> span {
|
|
||||||
padding: 8px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
|
||||||
margin-top: 6px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-option {
|
|
||||||
font-weight: 400;
|
|
||||||
display: block;
|
|
||||||
margin: 4px;
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
font-size: 16px;
|
|
||||||
margin: 11px 8px
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-field-list, .poll-answer-list, .poll-result-list {
|
|
||||||
list-style-type: none;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-field-list {
|
|
||||||
padding: 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol.poll-result-list {
|
|
||||||
margin-bottom: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-result-list > li {
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-field {
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: stretch;
|
|
||||||
margin-bottom: 16;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-field:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-create-option-row {
|
|
||||||
display: 'flex';
|
|
||||||
margin-bottom: 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Needeed to override atlaskit default blue color
|
|
||||||
.poll-create-container .jsYMHu {
|
|
||||||
background: #292929;
|
|
||||||
border-color: #808090;
|
|
||||||
color: #fff // #808090
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-add-button {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 8px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-remove-option-button {
|
|
||||||
background: 0 0;
|
|
||||||
border: none;
|
|
||||||
color: #E04757;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-create-add-option {
|
|
||||||
border: none;
|
|
||||||
background-color: #292929;
|
|
||||||
padding: 3px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-icon-button, .poll-drag-handle {
|
|
||||||
.jitsi-icon svg {
|
|
||||||
fill: #929292;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-drag-handle {
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
cursor: grab;
|
|
||||||
padding-left: 8;
|
|
||||||
padding-top: 8px;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-dragged {
|
|
||||||
opacity: 0.5;
|
|
||||||
* {
|
|
||||||
cursor: grabbing !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-question {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
line-height: 26px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-voters {
|
|
||||||
font-weight: lighter;
|
|
||||||
list-style-type: none;
|
|
||||||
border: #616161 solid 1px;
|
|
||||||
border-radius: 3px;
|
|
||||||
padding: 2px 6px;
|
|
||||||
margin: 4px 0px 12px;
|
|
||||||
background-color: #616161;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-vote-name {
|
|
||||||
flex-shrink: 1;
|
|
||||||
overflow-wrap: anywhere
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-vote-count-container{
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-vote-count {
|
|
||||||
margin-left: 10px;
|
|
||||||
white-space: nowrap;
|
|
||||||
flex: 1;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-short-results{
|
|
||||||
display: flex;
|
|
||||||
min-width: 10em;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-bar-container, .poll-bar {
|
|
||||||
border-radius: 3px;
|
|
||||||
height: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-bar-container {
|
|
||||||
background-color: #616161;
|
|
||||||
max-width: 160px;
|
|
||||||
margin-top: 3px;
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-bar {
|
|
||||||
background-color: #246FE5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-message-footer {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 12px;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-notice {
|
|
||||||
font-weight: 100;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-show-details {
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-result-links {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
a.poll-detail-link, a.poll-change-vote-link {
|
|
||||||
color: #669AEC;
|
|
||||||
cursor: pointer;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: #669AEC;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:visited {
|
|
||||||
color: #669AEC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.polls-pane-content {
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pane-content{
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-pane-icon {
|
|
||||||
width: 50%;
|
|
||||||
padding: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-pane-icon svg {
|
|
||||||
fill: #3D3D3D;
|
|
||||||
width: 100%;
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-pane-message {
|
|
||||||
color: #fff;
|
|
||||||
padding: 0 16px;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-results, .poll-answer {
|
|
||||||
background: #292929;
|
|
||||||
border-radius: 8px;
|
|
||||||
border: 1px solid #666666;
|
|
||||||
margin: 16px;
|
|
||||||
padding: 16px;
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-results {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer {
|
|
||||||
|
|
||||||
h1, strong ,span {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-create-label {
|
|
||||||
color: #C2C2C2;
|
|
||||||
display: flex;
|
|
||||||
font-weight: 400;
|
|
||||||
margin-bottom: 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.expandable-input{
|
|
||||||
line-height: 18px;
|
|
||||||
resize: none;
|
|
||||||
width: 100%;
|
|
||||||
height: 40px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
overflow: hidden;
|
|
||||||
border: 1px solid #666666;
|
|
||||||
background-color: #141414;
|
|
||||||
color: #FFF;
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 10px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#polls-panel {
|
|
||||||
height: calc(100% - 102px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-container {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 600;
|
|
||||||
height: calc(100% - 88px);
|
|
||||||
line-height: 20px;
|
|
||||||
overflow-y: auto;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
& > * + *:not(.ignore-child) {
|
|
||||||
margin-top: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
height: calc(100% - 102px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-create-header {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 20px;
|
|
||||||
line-height: 28px;
|
|
||||||
margin: 20px 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-create-container {
|
|
||||||
padding: 8px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-create-footer {
|
|
||||||
background-color: #141414;
|
|
||||||
bottom: 0;
|
|
||||||
position: absolute;
|
|
||||||
width: calc(100% - 32px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-footer {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 0 16px 16px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-answer-footer {
|
|
||||||
padding: 8px 0 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-button {
|
|
||||||
align-items: center;
|
|
||||||
border: 0;
|
|
||||||
border-radius: 6px;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 600;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
min-height: 40px;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
&:disabled {
|
|
||||||
cursor: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
min-height: 48px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-button-primary {
|
|
||||||
background-color: #0056E0;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #246FE5;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
background-color: #0045B3;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
background-color: #0045B3;
|
|
||||||
border: 3px solid #99BBF3;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled {
|
|
||||||
background-color: #00225A;
|
|
||||||
color: #858585;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-button-secondary {
|
|
||||||
background-color: #3D3D3D;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #525252;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
background-color: #292929;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
background-color: #292929;
|
|
||||||
border: 3px solid #858585;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled {
|
|
||||||
background-color: #141414;
|
|
||||||
color: #858585;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-button-short {
|
|
||||||
max-width: 132px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-button-shortest {
|
|
||||||
max-width: 117px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.poll-button-short,
|
|
||||||
.poll-button-shortest {
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
min-width: 49%;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,3 +45,7 @@
|
||||||
margin: -16px -24px;
|
margin: -16px -24px;
|
||||||
z-index: $popoverZ;
|
z-index: $popoverZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.excalidraw .popover {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
|
@ -5,15 +5,15 @@
|
||||||
.popupmenu__contents {
|
.popupmenu__contents {
|
||||||
.popupmenu__volume-slider {
|
.popupmenu__volume-slider {
|
||||||
&::-webkit-slider-runnable-track {
|
&::-webkit-slider-runnable-track {
|
||||||
background-color: $popupSliderColor;
|
background-color: #246FE5;
|
||||||
}
|
}
|
||||||
|
|
||||||
&::-moz-range-track {
|
&::-moz-range-track {
|
||||||
background-color: $popupSliderColor;
|
background-color: #246FE5;
|
||||||
}
|
}
|
||||||
|
|
||||||
&::-ms-fill-lower {
|
&::-ms-fill-lower {
|
||||||
background-color: $popupSliderColor;
|
background-color: #246FE5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin-left: 16px;
|
margin-left: 16px;
|
||||||
|
max-width: 70%;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.space-top {
|
&.space-top {
|
||||||
|
@ -82,7 +83,7 @@
|
||||||
background-color: #FFFFFF;
|
background-color: #FFFFFF;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
width: 56px;
|
width: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jitsi-content-recording-icon-container-without-switch {
|
.jitsi-content-recording-icon-container-without-switch {
|
||||||
|
|
|
@ -31,10 +31,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-tabs {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-text-title {
|
.header-text-title {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
@ -56,13 +52,6 @@
|
||||||
.welcome-footer-row-block {
|
.welcome-footer-row-block {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
.welcome-badge {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.welcome-footer {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
|
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding: 4px;
|
padding: 1px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: -4px;
|
right: -4px;
|
||||||
top: -3px;
|
top: -3px;
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
|
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
|
||||||
|
|
||||||
& > svg {
|
& > svg {
|
||||||
fill: #000;
|
fill: #040404;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.settings-button-small-icon--disabled {
|
&.settings-button-small-icon--disabled {
|
||||||
|
|
|
@ -42,42 +42,6 @@
|
||||||
height: 28px;
|
height: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subject-text {
|
|
||||||
background: rgba(0, 0, 0, 0.6);
|
|
||||||
border-radius: 3px 0px 0px 3px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 28px;
|
|
||||||
padding: 0 16px;
|
|
||||||
height: 28px;
|
|
||||||
max-width: 324px;
|
|
||||||
|
|
||||||
@media (max-width: 300px) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--content {
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.subject-timer {
|
|
||||||
background: rgba(0, 0, 0, 0.8);
|
|
||||||
border-radius: 0px 3px 3px 0px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 28px;
|
|
||||||
min-width: 34px;
|
|
||||||
padding: 0 8px;
|
|
||||||
height: 28px;
|
|
||||||
|
|
||||||
@media (max-width: 300px) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-container {
|
.details-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -120,12 +120,34 @@
|
||||||
margin: 8px 0;
|
margin: 8px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hangup-button {
|
div.hangup-button {
|
||||||
background-color: $hangupColor;
|
background-color: #CB2233;
|
||||||
|
|
||||||
@media (hover: hover) and (pointer: fine) {
|
@media (hover: hover) and (pointer: fine) {
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $hangupHoverColor;
|
background-color: #E04757;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: #A21B29;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.hangup-menu-button {
|
||||||
|
background-color: #CB2233;
|
||||||
|
|
||||||
|
@media (hover: hover) and (pointer: fine) {
|
||||||
|
&:hover {
|
||||||
|
background-color: #E04757;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: #A21B29;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,6 @@
|
||||||
* Style variables
|
* Style variables
|
||||||
*/
|
*/
|
||||||
$baseFontFamily: -apple-system, BlinkMacSystemFont, 'open_sanslight', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
$baseFontFamily: -apple-system, BlinkMacSystemFont, 'open_sanslight', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
$hangupColor:#DD3849;
|
|
||||||
$hangupHoverColor: #F25363;
|
|
||||||
$hangupFontSize: 2em;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Size variables.
|
* Size variables.
|
||||||
|
@ -43,7 +40,6 @@ $newToolbarSizeMobile: 60px;
|
||||||
$newToolbarSizeWithPadding: calc(#{$newToolbarSize} + 24px);
|
$newToolbarSizeWithPadding: calc(#{$newToolbarSize} + 24px);
|
||||||
$toolbarTitleFontSize: 19px;
|
$toolbarTitleFontSize: 19px;
|
||||||
$overflowMenuItemColor: #fff;
|
$overflowMenuItemColor: #fff;
|
||||||
$overflowMenuItemBackground: #36383C;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -79,7 +75,6 @@ $modalTextColor: #333;
|
||||||
$chatActionsSeparatorColor: rgb(173, 105, 112);
|
$chatActionsSeparatorColor: rgb(173, 105, 112);
|
||||||
$chatBackgroundColor: #131519;
|
$chatBackgroundColor: #131519;
|
||||||
$chatInputSeparatorColor: #A4B8D1;
|
$chatInputSeparatorColor: #A4B8D1;
|
||||||
$chatLobbyMessageBackgroundColor: #6A50D3;
|
|
||||||
$chatLobbyActionsSeparatorColor: #6A50D3;
|
$chatLobbyActionsSeparatorColor: #6A50D3;
|
||||||
$chatLocalMessageBackgroundColor: #484A4F;
|
$chatLocalMessageBackgroundColor: #484A4F;
|
||||||
$chatPrivateMessageBackgroundColor: rgb(153, 69, 77);
|
$chatPrivateMessageBackgroundColor: rgb(153, 69, 77);
|
||||||
|
@ -101,8 +96,6 @@ $zindex0: 0;
|
||||||
$zindex1: 1;
|
$zindex1: 1;
|
||||||
$zindex2: 2;
|
$zindex2: 2;
|
||||||
$zindex3: 3;
|
$zindex3: 3;
|
||||||
$toolbarBackgroundZ: 4;
|
|
||||||
$labelsZ: 5;
|
|
||||||
$subtitlesZ: 7;
|
$subtitlesZ: 7;
|
||||||
$popoverZ: 8;
|
$popoverZ: 8;
|
||||||
$reloadZ: 20;
|
$reloadZ: 20;
|
||||||
|
@ -111,10 +104,7 @@ $ringingZ: 300;
|
||||||
$sideToolbarContainerZ: 300;
|
$sideToolbarContainerZ: 300;
|
||||||
$toolbarZ: 250;
|
$toolbarZ: 250;
|
||||||
$drawerZ: 351;
|
$drawerZ: 351;
|
||||||
$tooltipsZ: 401;
|
|
||||||
$dropdownMaskZ: 900;
|
|
||||||
$dropdownZ: 901;
|
$dropdownZ: 901;
|
||||||
$centeredVideoLabelZ: 1010;
|
|
||||||
$overlayZ: 1016;
|
$overlayZ: 1016;
|
||||||
// Place filmstrip videos over toolbar in order
|
// Place filmstrip videos over toolbar in order
|
||||||
// to make connection info visible.
|
// to make connection info visible.
|
||||||
|
@ -175,8 +165,9 @@ $welcomePageHeaderPaddingBottom: 0px;
|
||||||
$welcomePageHeaderTitleMaxWidth: initial;
|
$welcomePageHeaderTitleMaxWidth: initial;
|
||||||
$welcomePageHeaderTextAlign: center;
|
$welcomePageHeaderTextAlign: center;
|
||||||
|
|
||||||
|
$welcomePageHeaderContainerMarginTop: 104px;
|
||||||
$welcomePageHeaderContainerDisplay: flex;
|
$welcomePageHeaderContainerDisplay: flex;
|
||||||
$welcomePageHeaderContainerMargin: 104px 32px 0 32px;
|
$welcomePageHeaderContainerMargin: $welcomePageHeaderContainerMarginTop auto 0;
|
||||||
|
|
||||||
$welcomePageHeaderTextTitleMarginBottom: 0;
|
$welcomePageHeaderTextTitleMarginBottom: 0;
|
||||||
$welcomePageHeaderTextTitleFontSize: 42px;
|
$welcomePageHeaderTextTitleFontSize: 42px;
|
||||||
|
@ -210,11 +201,6 @@ $deepLinkingDialInConferenceIdPadding: inherit;
|
||||||
$deepLinkingDialInConferenceIdBackgroundColor: inherit;
|
$deepLinkingDialInConferenceIdBackgroundColor: inherit;
|
||||||
$deepLinkingDialInConferenceIdBorderRadius: inherit;
|
$deepLinkingDialInConferenceIdBorderRadius: inherit;
|
||||||
|
|
||||||
$deepLinkingDialInConferenceNameFontSize: inherit;
|
|
||||||
$deepLinkingDialInConferenceNameLineHeight: inherit;
|
|
||||||
$deepLinkingDialInConferenceNameMarginBottom: none;
|
|
||||||
$deepLinkingDialInConferenceNameFontWeight: inherit;
|
|
||||||
|
|
||||||
$deepLinkingDialInConferenceDescriptionFontSize: 0.8em;
|
$deepLinkingDialInConferenceDescriptionFontSize: 0.8em;
|
||||||
$deepLinkingDialInConferenceDescriptionLineHeight: inherit;
|
$deepLinkingDialInConferenceDescriptionLineHeight: inherit;
|
||||||
$deepLinkingDialInConferenceDescriptionMarginBottom: none;
|
$deepLinkingDialInConferenceDescriptionMarginBottom: none;
|
||||||
|
@ -248,7 +234,6 @@ $chromeExtensionBannerRightInMeeeting: 10px;
|
||||||
/**
|
/**
|
||||||
* media type thresholds
|
* media type thresholds
|
||||||
*/
|
*/
|
||||||
$smallScreen: 700px;
|
|
||||||
$verySmallScreen: 500px;
|
$verySmallScreen: 500px;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3,48 +3,38 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
&-container {
|
&-container {
|
||||||
max-height: 344px;
|
max-height: 456px;
|
||||||
background: $menuBG;
|
|
||||||
border-radius: 3px;
|
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
padding: 8px;
|
margin-bottom: 4px;
|
||||||
|
position: relative;
|
||||||
|
right: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
&-entry {
|
&-entry {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
height: 168px;
|
height: 138px;
|
||||||
margin-bottom: 8px;
|
width: 244px;
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 284px;
|
margin: 0 7px 4px;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
&--selected {
|
&--selected {
|
||||||
border: 3px solid #31B76A;
|
border: 2px solid #4687ED;
|
||||||
border-radius: 3px;
|
|
||||||
cursor: default;
|
|
||||||
height: 162px;
|
|
||||||
width: 278px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&-video {
|
&-video {
|
||||||
border-radius: 3px;
|
|
||||||
height: 100%;
|
height: 100%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
&-overlay {
|
|
||||||
background: rgba(42, 58, 75, 0.6);
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-error {
|
&-error {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -55,23 +45,22 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&-label {
|
&-label {
|
||||||
bottom: 8px;
|
|
||||||
color: #fff;
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
max-width: 100%;
|
||||||
|
padding: 8px;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
|
||||||
&-container {
|
|
||||||
margin: 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-text {
|
&-text {
|
||||||
background-color: #131519;
|
background-color: rgba(0, 0, 0, 0.7);
|
||||||
border-radius: 3px;
|
border-radius: 4px;
|
||||||
padding: 2px 8px;
|
padding: 4px 8px;
|
||||||
font-size: 13px;
|
color: #fff;
|
||||||
line-height: 20px;
|
font-size: 12px;
|
||||||
margin: 0 auto;
|
line-height: 16px;
|
||||||
|
font-weight: 600;
|
||||||
max-width: calc(100% - 16px);
|
max-width: calc(100% - 16px);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
@ -79,8 +68,8 @@
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Override @atlaskit/InlineDialog container which is made with styled components
|
|
||||||
& > div:nth-child(2) {
|
&-checkbox-container {
|
||||||
padding: 0;
|
padding: 10px 14px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,16 @@ body.welcome-page {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin: $welcomePageHeaderContainerMargin;
|
margin: $welcomePageHeaderContainerMargin;
|
||||||
z-index: $zindex2;
|
z-index: $zindex2;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
max-width: 688px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-watermark-container {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin-top: calc(20px - #{$welcomePageHeaderContainerMarginTop});
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-text-title {
|
.header-text-title {
|
||||||
|
@ -80,7 +90,7 @@ body.welcome-page {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
|
|
||||||
&:focus {
|
&.focus-visible {
|
||||||
outline: auto 2px #005fcc;
|
outline: auto 2px #005fcc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,11 +133,7 @@ body.welcome-page {
|
||||||
max-width: calc(100% - 40px);
|
max-width: calc(100% - 40px);
|
||||||
padding: 16px 0 39px 0;
|
padding: 16px 0 39px 0;
|
||||||
width: $welcomePageEnterRoomWidth;
|
width: $welcomePageEnterRoomWidth;
|
||||||
|
text-align: center;
|
||||||
p {
|
|
||||||
color: $welcomePageDescriptionColor;
|
|
||||||
float: left;
|
|
||||||
text-align: $welcomePageHeaderTextAlign;
|
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
@ -135,7 +141,6 @@ body.welcome-page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.tab-container {
|
.tab-container {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
@ -162,7 +167,7 @@ body.welcome-page {
|
||||||
margin: 4px;
|
margin: 4px;
|
||||||
display: $welcomePageTabButtonsDisplay;
|
display: $welcomePageTabButtonsDisplay;
|
||||||
|
|
||||||
.tab {
|
[role="tab"] {
|
||||||
background-color: #c7ddff;
|
background-color: #c7ddff;
|
||||||
border-radius: 7px;
|
border-radius: 7px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
@ -171,8 +176,10 @@ body.welcome-page {
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
padding: 7px 0;
|
padding: 7px 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
color: inherit;
|
||||||
|
border: 0;
|
||||||
|
|
||||||
&.selected {
|
&[aria-selected="true"] {
|
||||||
background-color: #FFF;
|
background-color: #FFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,8 +207,8 @@ body.welcome-page {
|
||||||
color: $welcomePageDescriptionColor;
|
color: $welcomePageDescriptionColor;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 32px;
|
top: calc(35px - #{$welcomePageHeaderContainerMarginTop});
|
||||||
right: 32px;
|
right: 0;
|
||||||
z-index: $zindex2;
|
z-index: $zindex2;
|
||||||
|
|
||||||
* {
|
* {
|
||||||
|
@ -224,6 +231,11 @@ body.welcome-page {
|
||||||
width: $welcomePageWatermarkWidth;
|
width: $welcomePageWatermarkWidth;
|
||||||
height: $welcomePageWatermarkHeight;
|
height: $welcomePageWatermarkHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.watermark.leftwatermarknomargin {
|
||||||
|
width: $welcomePageWatermarkWidth;
|
||||||
|
height: $welcomePageWatermarkHeight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.without-content {
|
&.without-content {
|
||||||
|
@ -242,10 +254,17 @@ body.welcome-page {
|
||||||
padding-top: 40px;
|
padding-top: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-card-row {
|
.welcome-card-column {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 0 32px;
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
max-width: 688px;
|
||||||
|
margin: auto;
|
||||||
|
|
||||||
|
> div {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-card-text {
|
.welcome-card-text {
|
||||||
|
@ -253,7 +272,7 @@ body.welcome-page {
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-card {
|
.welcome-card {
|
||||||
width: 49%;
|
width: 100%;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
|
|
||||||
&--dark {
|
&--dark {
|
||||||
|
@ -268,10 +287,6 @@ body.welcome-page {
|
||||||
&--grey {
|
&--grey {
|
||||||
background: #F2F3F4;
|
background: #F2F3F4;
|
||||||
}
|
}
|
||||||
|
|
||||||
&--shadow {
|
|
||||||
box-shadow: 0px 4px 30px rgba(0, 0, 0, 0.15);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-footer {
|
.welcome-footer {
|
||||||
|
|
|
@ -68,6 +68,12 @@
|
||||||
}
|
}
|
||||||
.buttons {
|
.buttons {
|
||||||
margin-top: 16px;
|
margin-top: 16px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&>button:first-child {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,13 @@
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.dial-in-conference-id {
|
||||||
|
text-align: center;
|
||||||
|
min-width: 200px;
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
.dial-in-conference-id {
|
.dial-in-conference-id {
|
||||||
margin: $deepLinkingDialInConferenceIdMargin;
|
margin: $deepLinkingDialInConferenceIdMargin;
|
||||||
padding: $deepLinkingDialInConferenceIdPadding;
|
padding: $deepLinkingDialInConferenceIdPadding;
|
||||||
|
@ -74,24 +81,12 @@
|
||||||
border-radius: $deepLinkingDialInConferenceIdBorderRadius;
|
border-radius: $deepLinkingDialInConferenceIdBorderRadius;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dial-in-conference-name {
|
|
||||||
font-size: $deepLinkingDialInConferenceNameFontSize;
|
|
||||||
line-height: $deepLinkingDialInConferenceNameLineHeight;
|
|
||||||
margin-bottom: $deepLinkingDialInConferenceNameMarginBottom;
|
|
||||||
font-weight: $deepLinkingDialInConferenceNameFontWeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dial-in-conference-description {
|
.dial-in-conference-description {
|
||||||
font-size: $deepLinkingDialInConferenceDescriptionFontSize;
|
font-size: $deepLinkingDialInConferenceDescriptionFontSize;
|
||||||
line-height: $deepLinkingDialInConferenceDescriptionLineHeight;
|
line-height: $deepLinkingDialInConferenceDescriptionLineHeight;
|
||||||
margin-bottom: $deepLinkingDialInConferenceDescriptionMarginBottom;
|
margin-bottom: $deepLinkingDialInConferenceDescriptionMarginBottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dial-in-conference-pin {
|
|
||||||
font-size: $deepLinkingDialInConferencePinFontSize;
|
|
||||||
line-height: $deepLinkingDialInConferencePinLineHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toll-free-list {
|
.toll-free-list {
|
||||||
min-width: 80px;
|
min-width: 80px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
* tiled thumbnail experience.
|
* tiled thumbnail experience.
|
||||||
*/
|
*/
|
||||||
.tile-view,
|
.tile-view,
|
||||||
|
.whiteboard-container,
|
||||||
.stage-filmstrip {
|
.stage-filmstrip {
|
||||||
/**
|
/**
|
||||||
* Let the avatar grow with the tile.
|
* Let the avatar grow with the tile.
|
||||||
|
|
|
@ -112,7 +112,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove unnecssary padding that is normally used to prevent horizontal
|
* Remove unnecessary padding that is normally used to prevent horizontal
|
||||||
* filmstrip from overlapping the left edge of the screen.
|
* filmstrip from overlapping the left edge of the screen.
|
||||||
*/
|
*/
|
||||||
#filmstripLocalVideo,
|
#filmstripLocalVideo,
|
||||||
|
|
|
@ -33,7 +33,6 @@ $flagsImagePath: "../images/";
|
||||||
@import 'reload_overlay/reload_overlay';
|
@import 'reload_overlay/reload_overlay';
|
||||||
@import 'mini_toolbox';
|
@import 'mini_toolbox';
|
||||||
@import 'modals/desktop-picker/desktop-picker';
|
@import 'modals/desktop-picker/desktop-picker';
|
||||||
@import 'modals/device-selection/device-selection';
|
|
||||||
@import 'modals/dialog';
|
@import 'modals/dialog';
|
||||||
@import 'modals/embed-meeting/embed-meeting';
|
@import 'modals/embed-meeting/embed-meeting';
|
||||||
@import 'modals/feedback/feedback';
|
@import 'modals/feedback/feedback';
|
||||||
|
@ -95,3 +94,9 @@ $flagsImagePath: "../images/";
|
||||||
@import 'notifications';
|
@import 'notifications';
|
||||||
|
|
||||||
/* Modules END */
|
/* Modules END */
|
||||||
|
|
||||||
|
/* Jeet crew BEGIN */
|
||||||
|
|
||||||
|
@import 'jiti';
|
||||||
|
|
||||||
|
/* Jeet crew END */
|
||||||
|
|
|
@ -38,3 +38,7 @@
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dialog-bottom-margin {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
|
@ -63,3 +63,8 @@
|
||||||
.desktop-source-preview-image-container {
|
.desktop-source-preview-image-container {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.desktop-picker-tabs-container {
|
||||||
|
width: 65%;
|
||||||
|
margin-top: 3px;
|
||||||
|
}
|
||||||
|
|
|
@ -1,148 +0,0 @@
|
||||||
.device-selection {
|
|
||||||
.device-selectors {
|
|
||||||
font-size: 14px;
|
|
||||||
|
|
||||||
> div {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-selector-icon {
|
|
||||||
align-self: center;
|
|
||||||
color: inherit;
|
|
||||||
font-size: 20px;
|
|
||||||
margin-left: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-selector-label {
|
|
||||||
margin-bottom: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* device-selector-trigger stylings attempt to mimic AtlasKit button */
|
|
||||||
.device-selector-trigger {
|
|
||||||
background-color: #0E1624;
|
|
||||||
border: 1px solid #455166;
|
|
||||||
border-radius: 5px;
|
|
||||||
display: flex;
|
|
||||||
height: 2.3em;
|
|
||||||
justify-content: space-between;
|
|
||||||
line-height: 2.3em;
|
|
||||||
overflow: hidden;
|
|
||||||
padding: 0 8px;
|
|
||||||
}
|
|
||||||
.device-selector-trigger-disabled {
|
|
||||||
.device-selector-trigger {
|
|
||||||
color: #a5adba;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-selector-trigger-text {
|
|
||||||
overflow: hidden;
|
|
||||||
text-align: center;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-selection-column {
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: top;
|
|
||||||
|
|
||||||
&.column-selectors {
|
|
||||||
margin-left: 15px;
|
|
||||||
width: 45%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.column-video {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-selection-video-container {
|
|
||||||
border-radius: 3px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
|
|
||||||
.video-input-preview {
|
|
||||||
margin-top: 2px;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
> video {
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.video-input-preview-error {
|
|
||||||
color: $participantNameColor;
|
|
||||||
display: none;
|
|
||||||
left: 0;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
text-align: center;
|
|
||||||
top: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.video-preview-has-error {
|
|
||||||
background: black;
|
|
||||||
|
|
||||||
.video-input-preview-error {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.video-input-preview-display {
|
|
||||||
height: auto;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.audio-output-preview {
|
|
||||||
font-size: 14px;
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #6FB1EA;
|
|
||||||
cursor: pointer;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #B3D4FF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.audio-input-preview {
|
|
||||||
background: #1B2638;
|
|
||||||
border-radius: 5px;
|
|
||||||
height: 8px;
|
|
||||||
|
|
||||||
.audio-input-preview-level {
|
|
||||||
background: #75B1FF;
|
|
||||||
border-radius: 5px;
|
|
||||||
height: 100%;
|
|
||||||
-webkit-transition: width .1s ease-in-out;
|
|
||||||
-moz-transition: width .1s ease-in-out;
|
|
||||||
-o-transition: width .1s ease-in-out;
|
|
||||||
transition: width .1s ease-in-out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-selection.video-hidden {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.column-selectors {
|
|
||||||
width: 100%;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-video {
|
|
||||||
order: 1;
|
|
||||||
width: 100%;
|
|
||||||
margin-top: 8px;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -9,7 +9,6 @@
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-top: 16px;
|
margin-top: 16px;
|
||||||
width: auto;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&-code {
|
&-code {
|
||||||
|
|
|
@ -44,59 +44,3 @@
|
||||||
-webkit-animation-timing-function: ease-in-out;
|
-webkit-animation-timing-function: ease-in-out;
|
||||||
animation-timing-function: ease-in-out
|
animation-timing-function: ease-in-out
|
||||||
}
|
}
|
||||||
|
|
||||||
.feedback-dialog {
|
|
||||||
.details {
|
|
||||||
textarea {
|
|
||||||
min-height: 100px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-control {
|
|
||||||
background-color: $feedbackInputBg;
|
|
||||||
color: $feedbackInputTextColor;
|
|
||||||
|
|
||||||
&::-webkit-input-placeholder {
|
|
||||||
color: $feedbackInputPlaceholderColor;
|
|
||||||
}
|
|
||||||
&::-moz-placeholder { /* Firefox 19+ */
|
|
||||||
color: $feedbackInputPlaceholderColor;
|
|
||||||
}
|
|
||||||
&:-ms-input-placeholder {
|
|
||||||
color: $feedbackInputPlaceholderColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.rating {
|
|
||||||
line-height: 1.2;
|
|
||||||
margin-top: 10px;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
.star-label {
|
|
||||||
font-size: 14px;
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.star-btn {
|
|
||||||
color: inherit;
|
|
||||||
cursor: pointer;
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 34px;
|
|
||||||
outline: none;
|
|
||||||
position: relative;
|
|
||||||
text-decoration: none;
|
|
||||||
@include transition(all .2s ease);
|
|
||||||
|
|
||||||
&.active,
|
|
||||||
&:hover,
|
|
||||||
&.starHover {
|
|
||||||
color: #36B37E;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
.star-btn:focus,
|
|
||||||
.star-btn:active {
|
|
||||||
outline: 1px solid #B8C7E0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -38,19 +38,6 @@
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-password-input {
|
|
||||||
width: 100%;
|
|
||||||
background-color: #0E1624;
|
|
||||||
border-radius: 3px;
|
|
||||||
border: 2px solid #202B3D;
|
|
||||||
color: inherit;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
.info-password-input:focus ,
|
|
||||||
.info-password-input:active {
|
|
||||||
border: 2px solid #B8C7E0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-password-local {
|
.info-password-local {
|
||||||
user-select: text;
|
user-select: text;
|
||||||
}
|
}
|
||||||
|
@ -63,6 +50,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.dial-in-numbers-list {
|
.dial-in-numbers-list {
|
||||||
|
max-width: 334px;
|
||||||
|
width: 100%;
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
|
@ -72,10 +61,6 @@
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr {
|
|
||||||
border-bottom: 1px solid #d1dbe8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flag-cell {
|
.flag-cell {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
width: 30px;
|
width: 30px;
|
||||||
|
@ -104,6 +89,7 @@
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
li.toll-free:empty:before {
|
li.toll-free:empty:before {
|
||||||
|
@ -132,11 +118,6 @@
|
||||||
margin-top: 40px;
|
margin-top: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dial-in-conference-name,
|
|
||||||
.dial-in-conference-pin {
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dial-in-conference-description {
|
.dial-in-conference-description {
|
||||||
margin: 12px;
|
margin: 12px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,56 +84,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.icon-container {
|
|
||||||
display: none;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
display: flex;
|
|
||||||
width: calc(100% - 26px);
|
|
||||||
padding: 8px 8px 8px 16px;
|
|
||||||
|
|
||||||
background: #2A3A4B;
|
|
||||||
border: 1px solid #5E6D7A;
|
|
||||||
border-top: none;
|
|
||||||
border-radius: 0 0 3px 3px;
|
|
||||||
|
|
||||||
.copy-invite-icon, .provider-icon {
|
|
||||||
align-items: center;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
height: 40px;
|
|
||||||
place-content: center;
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover > div:hover {
|
|
||||||
background-color: rgba(255, 255, 255, 0.2);
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > :not(:last-child) {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy-invite-icon > div > svg > path {
|
|
||||||
fill: #A4B8D1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.dial-in-display {
|
|
||||||
.info-label {
|
|
||||||
color: #A4B8D1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dial-in-copy {
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle;
|
|
||||||
cursor: pointer;
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.invite-buttons {
|
&.invite-buttons {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
|
.share-audio-dialog-container {
|
||||||
|
max-height: none;
|
||||||
|
}
|
||||||
|
|
||||||
.share-audio-dialog {
|
.share-audio-dialog {
|
||||||
.share-audio-animation {
|
.share-audio-animation {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 90%;
|
height: 90%;
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
}
|
margin-bottom: 10px;
|
||||||
input[type="checkbox"] + svg + span {
|
|
||||||
color: #9FB0CC;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.separator-line {
|
.separator-line {
|
||||||
|
|
|
@ -13,12 +13,14 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.password {
|
.password {
|
||||||
align-items: center;
|
align-items: flex-start;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: flex-start;
|
||||||
margin-top: 15px;
|
margin-top: 15px;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
&-actions {
|
&-actions {
|
||||||
|
margin-top: 10px;
|
||||||
a {
|
a {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
@ -26,7 +28,7 @@
|
||||||
color: #6FB1EA;
|
color: #6FB1EA;
|
||||||
}
|
}
|
||||||
|
|
||||||
& > :first-child:not(:last-child) {
|
& > :not(:last-child) {
|
||||||
margin-right: 24px;
|
margin-right: 24px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,3 +204,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lobby-button-margin {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ $sidePanelWidth: 300px;
|
||||||
|
|
||||||
.prejoin-third-party {
|
.prejoin-third-party {
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
|
z-index: auto;
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
height: auto;
|
height: auto;
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
* Override default InlineDialog behaviour, since it does not play nicely with relative widths
|
* Override default InlineDialog behaviour, since it does not play nicely with relative widths
|
||||||
*/
|
*/
|
||||||
& > div:nth-child(2) {
|
& > div:nth-child(2) {
|
||||||
background: #fff;
|
background: #E0E0E0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
position: absolute !important;
|
position: absolute !important;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -58,3 +58,11 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.prejoin-input {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
& input {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,14 +1,4 @@
|
||||||
.premeeting-screen {
|
.premeeting-screen {
|
||||||
background: #292929;
|
|
||||||
bottom: 0;
|
|
||||||
display: flex;
|
|
||||||
font-size: 1.3em;
|
|
||||||
left: 0;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: $toolbarZ + 2;
|
|
||||||
|
|
||||||
.action-btn {
|
.action-btn {
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
@ -75,58 +65,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
|
||||||
align-items: center;
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex-shrink: 0;
|
|
||||||
height: 100%;
|
|
||||||
margin: 0 30px;
|
|
||||||
padding: 24px 0 16px;
|
|
||||||
position: relative;
|
|
||||||
width: $prejoinDefaultContentWidth;
|
|
||||||
z-index: $toolbarZ + 2;
|
|
||||||
|
|
||||||
&-controls {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
margin: auto;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.title {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 28px;
|
|
||||||
font-weight: 600;
|
|
||||||
letter-spacing: -0.015;
|
|
||||||
line-height: 36px;
|
|
||||||
margin-bottom: 32px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
input.field {
|
|
||||||
background-color: white;
|
|
||||||
border: none;
|
|
||||||
outline: none;
|
|
||||||
border-radius: 6px;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 20px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
color: #1C2025;
|
|
||||||
padding: 10px 16px;
|
|
||||||
text-align: center;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
&.error {
|
|
||||||
border: 1px solid #E04757;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.focused {
|
|
||||||
box-shadow: 0px 0px 1px 1.5px black, 0px 0px 1.3px 4px white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#new-toolbox {
|
#new-toolbox {
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
@ -141,7 +79,7 @@
|
||||||
background: transparent;
|
background: transparent;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-evenly;
|
justify-content: space-between;
|
||||||
padding: 8px 0;
|
padding: 8px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,62 +90,19 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 720px) {
|
|
||||||
flex-direction: column-reverse;
|
|
||||||
|
|
||||||
.content {
|
|
||||||
height: auto;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// mobile phone landscape
|
|
||||||
@media (max-height: 420px) {
|
|
||||||
div.content {
|
|
||||||
padding: 16px 16px 0 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 400px) {
|
@media (max-width: 400px) {
|
||||||
.content {
|
|
||||||
padding: 16px;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
&-controls {
|
|
||||||
input.field {
|
|
||||||
font-size: 16px;
|
|
||||||
padding: 14px 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-status-error {
|
.device-status-error {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
margin: 0 -16px;
|
margin: 0 -16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input.field {
|
|
||||||
font-size: 16px;
|
|
||||||
padding: 14px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.action-btn {
|
.action-btn {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
padding: 11px 16px;
|
padding: 11px 16px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input::placeholder {
|
|
||||||
color: #040404;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#preview {
|
#preview {
|
||||||
|
|
|
@ -6,8 +6,6 @@ $baseLight: #FFFFFF;
|
||||||
/**
|
/**
|
||||||
* Controls
|
* Controls
|
||||||
*/
|
*/
|
||||||
$controlBackground: $baseLight;
|
|
||||||
$controlColor: #333333;
|
|
||||||
$sliderTrackBackground: #474747;
|
$sliderTrackBackground: #474747;
|
||||||
$sliderThumbBackground: #3572b0;
|
$sliderThumbBackground: #3572b0;
|
||||||
|
|
||||||
|
@ -60,42 +58,20 @@ $readOnlyInputColor: #a7a7a7;
|
||||||
$defaultDarkSelectionColor: #ccc;
|
$defaultDarkSelectionColor: #ccc;
|
||||||
$buttonFontWeight: 400;
|
$buttonFontWeight: 400;
|
||||||
$labelFontWeight: 400;
|
$labelFontWeight: 400;
|
||||||
$hintFontSize: em(13, 14);
|
|
||||||
$linkFontColor: #3572b0;
|
$linkFontColor: #3572b0;
|
||||||
$linkHoverFontColor: darken(#3572b0, 10%);
|
$linkHoverFontColor: darken(#3572b0, 10%);
|
||||||
$dropdownColor: #333;
|
|
||||||
$errorColor: #c61600;
|
$errorColor: #c61600;
|
||||||
|
|
||||||
// Feedback colors
|
|
||||||
$feedbackCancelFontColor: #333;
|
|
||||||
|
|
||||||
// Popover colors
|
// Popover colors
|
||||||
$popoverFontColor: #ffffff !important;
|
$popoverFontColor: #ffffff !important;
|
||||||
$popupSliderColor: #0376da;
|
|
||||||
|
|
||||||
// Toolbar
|
// Toolbar
|
||||||
$secondaryToolbarBg: rgba(0, 0, 0, 0.5);
|
|
||||||
// TOFIX: Once moved to react rename to match the side panel class name.
|
|
||||||
$sideToolbarContainerBg: rgba(0, 0, 0, 0.75);
|
|
||||||
$toolbarBackground: rgba(0, 0, 0, 0.5);
|
$toolbarBackground: rgba(0, 0, 0, 0.5);
|
||||||
$toolbarBadgeBackground: #165ECC;
|
$toolbarBadgeBackground: #165ECC;
|
||||||
$toolbarBadgeColor: #FFFFFF;
|
$toolbarBadgeColor: #FFFFFF;
|
||||||
$toolbarButtonColor: #FFFFFF;
|
|
||||||
$toolbarSelectBackground: rgba(0, 0, 0, .6);
|
|
||||||
$toolbarTitleColor: #FFFFFF;
|
|
||||||
$toolbarToggleBackground: #12499C;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Forms
|
* Forms
|
||||||
*/
|
*/
|
||||||
//dropdown
|
$selectBg: $baseLight;
|
||||||
$selectFontColor: $controlColor;
|
|
||||||
$selectBg: $controlBackground;
|
|
||||||
$selectActiveBg: darken($controlBackground, 5%);
|
|
||||||
$selectActiveItemBg: darken($controlBackground, 20%);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Replace by themed component.
|
|
||||||
*/
|
|
||||||
$videoQualityActive: #57A0ff;
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
declare module '*.svg' {
|
||||||
|
const content: any;
|
||||||
|
export default content;
|
||||||
|
}
|
|
@ -20,7 +20,7 @@ Description: WebRTC JavaScript video conferences
|
||||||
|
|
||||||
Package: jitsi-meet-web-config
|
Package: jitsi-meet-web-config
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends: openssl, nginx | nginx-full | nginx-extras | apache2
|
Depends: openssl, nginx | nginx-full | nginx-extras | openresty | apache2, curl
|
||||||
Description: Configuration for web serving of Jitsi Meet
|
Description: Configuration for web serving of Jitsi Meet
|
||||||
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
|
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
|
||||||
Videobridge to provide high quality, scalable video conferences.
|
Videobridge to provide high quality, scalable video conferences.
|
||||||
|
@ -33,7 +33,7 @@ Description: Configuration for web serving of Jitsi Meet
|
||||||
|
|
||||||
Package: jitsi-meet-prosody
|
Package: jitsi-meet-prosody
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec, lua-basexx, lua-luaossl, lua-cjson
|
Depends: openssl, prosody (>= 0.11.7) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec, lua-basexx, lua-luaossl, lua-cjson, lua-inspect
|
||||||
Replaces: jitsi-meet-tokens
|
Replaces: jitsi-meet-tokens
|
||||||
Description: Prosody configuration for Jitsi Meet
|
Description: Prosody configuration for Jitsi Meet
|
||||||
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
|
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
|
||||||
|
@ -47,7 +47,7 @@ Description: Prosody configuration for Jitsi Meet
|
||||||
|
|
||||||
Package: jitsi-meet-tokens
|
Package: jitsi-meet-tokens
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends: ${misc:Depends}, prosody-trunk | prosody-0.11 | prosody-0.12 | prosody (>= 0.11.2), jitsi-meet-prosody
|
Depends: ${misc:Depends}, prosody-trunk | prosody-0.11 | prosody-0.12 | prosody (>= 0.11.7), jitsi-meet-prosody
|
||||||
Description: Prosody token authentication plugin for Jitsi Meet
|
Description: Prosody token authentication plugin for Jitsi Meet
|
||||||
|
|
||||||
Package: jitsi-meet-turnserver
|
Package: jitsi-meet-turnserver
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
doc/debian/jitsi-meet-prosody/prosody.cfg.lua-jvb.example /usr/share/jitsi-meet-prosody/
|
doc/debian/jitsi-meet-prosody/prosody.cfg.lua-jvb.example /usr/share/jitsi-meet-prosody/
|
||||||
|
doc/debian/jitsi-meet-prosody/jaas.cfg.lua /usr/share/jitsi-meet-prosody/
|
||||||
resources/prosody-plugins/ /usr/share/jitsi-meet/
|
resources/prosody-plugins/ /usr/share/jitsi-meet/
|
||||||
|
|
|
@ -44,12 +44,7 @@ case "$1" in
|
||||||
fi
|
fi
|
||||||
JVB_SECRET="$RET"
|
JVB_SECRET="$RET"
|
||||||
|
|
||||||
db_get jicofo/jicofo-authuser
|
JICOFO_AUTH_USER="focus"
|
||||||
if [ -z "$RET" ] ; then
|
|
||||||
db_input critical jicofo/jicofo-authuser || true
|
|
||||||
db_go
|
|
||||||
fi
|
|
||||||
JICOFO_AUTH_USER="$RET"
|
|
||||||
|
|
||||||
db_get jicofo/jicofo-authpassword
|
db_get jicofo/jicofo-authpassword
|
||||||
if [ -z "$RET" ] ; then
|
if [ -z "$RET" ] ; then
|
||||||
|
@ -83,6 +78,31 @@ case "$1" in
|
||||||
TURN_SECRET="$RET"
|
TURN_SECRET="$RET"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
SELF_SIGNED_CHOICE="Generate a new self-signed certificate"
|
||||||
|
# In the case of updating from an older version the configure of -prosody package may happen before the -config
|
||||||
|
# one, so if JAAS_INPUT is empty (the question is not asked), let's ask it now.
|
||||||
|
# If db_get returns an error (workaround for strange Debian failure) continue without stopping the config
|
||||||
|
db_get jitsi-meet/cert-choice || CERT_CHOICE=$SELF_SIGNED_CHOICE
|
||||||
|
CERT_CHOICE="$RET"
|
||||||
|
if [ -z "$CERT_CHOICE" ] ; then
|
||||||
|
db_input critical jitsi-meet/cert-choice || true
|
||||||
|
db_go
|
||||||
|
db_get jitsi-meet/cert-choice
|
||||||
|
CERT_CHOICE="$RET"
|
||||||
|
fi
|
||||||
|
if [ "$CERT_CHOICE" != "$SELF_SIGNED_CHOICE" ]; then
|
||||||
|
db_get jitsi-meet/jaas-choice
|
||||||
|
JAAS_INPUT="$RET"
|
||||||
|
if [ -z "$JAAS_INPUT" ] ; then
|
||||||
|
db_subst jitsi-meet/jaas-choice domain "${JVB_HOSTNAME}"
|
||||||
|
db_set jitsi-meet/jaas-choice false
|
||||||
|
db_input critical jitsi-meet/jaas-choice || true
|
||||||
|
db_go
|
||||||
|
db_get jitsi-meet/jaas-choice
|
||||||
|
JAAS_INPUT="$RET"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# and we're done with debconf
|
# and we're done with debconf
|
||||||
db_stop
|
db_stop
|
||||||
|
|
||||||
|
@ -141,7 +161,7 @@ case "$1" in
|
||||||
# New:
|
# New:
|
||||||
# Component "focus.jitmeet.example.com" "client_proxy"
|
# Component "focus.jitmeet.example.com" "client_proxy"
|
||||||
# target_address = "focus@auth.jitmeet.example.com"
|
# target_address = "focus@auth.jitmeet.example.com"
|
||||||
if grep -q "Component \"focus.$JVB_HOSTNAME\"" $PROSODY_HOST_CONFIG && ! grep "Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"" $PROSODY_HOST_CONFIG ;then
|
if grep -q "Component \"focus.$JVB_HOSTNAME\"" $PROSODY_HOST_CONFIG && ! grep -q "Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"" $PROSODY_HOST_CONFIG ;then
|
||||||
sed -i "s/Component \"focus.$JVB_HOSTNAME\"/Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"\n target_address = \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\"/g" $PROSODY_HOST_CONFIG
|
sed -i "s/Component \"focus.$JVB_HOSTNAME\"/Component \"focus.$JVB_HOSTNAME\" \"client_proxy\"\n target_address = \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\"/g" $PROSODY_HOST_CONFIG
|
||||||
PROSODY_CONFIG_PRESENT="false"
|
PROSODY_CONFIG_PRESENT="false"
|
||||||
fi
|
fi
|
||||||
|
@ -166,6 +186,29 @@ case "$1" in
|
||||||
PROSODY_CONFIG_PRESENT="false"
|
PROSODY_CONFIG_PRESENT="false"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
JAAS_HOST_CONFIG="/etc/prosody/conf.avail/jaas.cfg.lua"
|
||||||
|
if [ "${JAAS_INPUT}" = "true" ] && [ ! -f $JAAS_HOST_CONFIG ]; then
|
||||||
|
sed -i "s/enabled = false -- Jitsi meet components/enabled = true -- Jitsi meet components/g" $PROSODY_HOST_CONFIG
|
||||||
|
PROSODY_CONFIG_PRESENT="false"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For those deployments that don't have the config in the jitsi-meet prosody config add the new jaas file
|
||||||
|
if [ ! -f $JAAS_HOST_CONFIG ] && ! grep -q "VirtualHost \"jigasi.meet.jitsi\"" $PROSODY_HOST_CONFIG; then
|
||||||
|
PROSODY_CONFIG_PRESENT="false"
|
||||||
|
cp /usr/share/jitsi-meet-prosody/jaas.cfg.lua $JAAS_HOST_CONFIG
|
||||||
|
sed -i "s/jitmeet.example.com/$JVB_HOSTNAME/g" $JAAS_HOST_CONFIG
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${JAAS_INPUT}" = "true" ]; then
|
||||||
|
JAAS_HOST_CONFIG_ENABLED="/etc/prosody/conf.d/jaas.cfg.lua "
|
||||||
|
if [ ! -f $JAAS_HOST_CONFIG_ENABLED ] && ! grep -q "VirtualHost \"jigasi.meet.jitsi\"" $PROSODY_HOST_CONFIG; then
|
||||||
|
if [ -f $JAAS_HOST_CONFIG ]; then
|
||||||
|
ln -s $JAAS_HOST_CONFIG $JAAS_HOST_CONFIG_ENABLED
|
||||||
|
PROSODY_CONFIG_PRESENT="false"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Make sure the focus@auth user's roster includes the proxy component (this is idempotent)
|
# Make sure the focus@auth user's roster includes the proxy component (this is idempotent)
|
||||||
prosodyctl mod_roster_command subscribe focus.$JVB_HOSTNAME $JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN
|
prosodyctl mod_roster_command subscribe focus.$JVB_HOSTNAME $JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN
|
||||||
|
|
||||||
|
@ -178,32 +221,6 @@ case "$1" in
|
||||||
ln -sf /var/lib/prosody/$JVB_HOSTNAME.crt /etc/prosody/certs/$JVB_HOSTNAME.crt
|
ln -sf /var/lib/prosody/$JVB_HOSTNAME.crt /etc/prosody/certs/$JVB_HOSTNAME.crt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PRTRUNK_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-trunk' 2>/dev/null | awk '{print $3}' || true)"
|
|
||||||
PR10_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.10' 2>/dev/null | awk '{print $3}' || true)"
|
|
||||||
PR_VER_INSTALLED=$(dpkg-query -f='${Version}\n' --show prosody 2>/dev/null || true)
|
|
||||||
if [ "$PRTRUNK_INSTALL_CHECK" = "installed" ] \
|
|
||||||
|| [ "$PRTRUNK_INSTALL_CHECK" = "unpacked" ] ; then
|
|
||||||
if [ -f $PROSODY_HOST_CONFIG ]; then
|
|
||||||
sed -i 's/storage = \"memory\"/storage = \"null\"/g' $PROSODY_HOST_CONFIG
|
|
||||||
|
|
||||||
# trigger a restart
|
|
||||||
PROSODY_CONFIG_PRESENT="false"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [ "$PR10_INSTALL_CHECK" = "installed" ] \
|
|
||||||
|| [ "$PR10_INSTALL_CHECK" = "unpacked" ] \
|
|
||||||
|| dpkg --compare-versions "$PR_VER_INSTALLED" gt "0.10" ; then
|
|
||||||
|
|
||||||
# if the version is 0.10.X (>0.10 and <0.11)
|
|
||||||
if [ -f $PROSODY_HOST_CONFIG ] \
|
|
||||||
&& dpkg --compare-versions "$PR_VER_INSTALLED" lt "0.11" ; then
|
|
||||||
sed -i 's/storage = \"memory\"/storage = \"none\"/g' $PROSODY_HOST_CONFIG
|
|
||||||
|
|
||||||
# trigger a restart
|
|
||||||
PROSODY_CONFIG_PRESENT="false"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
CERT_ADDED_TO_TRUST="false"
|
CERT_ADDED_TO_TRUST="false"
|
||||||
|
|
||||||
if [ ! -f /var/lib/prosody/$JICOFO_AUTH_DOMAIN.crt ]; then
|
if [ ! -f /var/lib/prosody/$JICOFO_AUTH_DOMAIN.crt ]; then
|
||||||
|
|
|
@ -35,6 +35,8 @@ case "$1" in
|
||||||
if [ -n "$RET" ]; then
|
if [ -n "$RET" ]; then
|
||||||
rm -f /etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua
|
rm -f /etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua
|
||||||
rm -f /etc/prosody/conf.d/$JVB_HOSTNAME.cfg.lua
|
rm -f /etc/prosody/conf.d/$JVB_HOSTNAME.cfg.lua
|
||||||
|
rm -f /etc/prosody/conf.avail/jaas.cfg.lua
|
||||||
|
rm -f /etc/prosody/conf.d/jaas.cfg.lua
|
||||||
|
|
||||||
JICOFO_AUTH_DOMAIN="auth.$JVB_HOSTNAME"
|
JICOFO_AUTH_DOMAIN="auth.$JVB_HOSTNAME"
|
||||||
# clean up generated certificates
|
# clean up generated certificates
|
||||||
|
|
|
@ -1,24 +1,18 @@
|
||||||
Template: jitsi-meet-prosody/jvb-hostname
|
Template: jitsi-meet-prosody/jvb-hostname
|
||||||
Type: string
|
Type: string
|
||||||
_Description: The hostname of the current installation:
|
_Description: The domain of the current installation (e.g. meet.jitsi.com):
|
||||||
The value for the hostname that is set in Jitsi Videobridge installation.
|
The value of the domain that is set in the Jitsi Videobridge installation.
|
||||||
|
|
||||||
Template: jitsi-videobridge/jvb-hostname
|
Template: jitsi-videobridge/jvb-hostname
|
||||||
Type: string
|
Type: string
|
||||||
_Description: The hostname of the current installation:
|
_Description: The domain of the current installation (e.g. meet.jitsi.com):
|
||||||
The value for the hostname that is set in Jitsi Videobridge installation.
|
The value of the domain that is set in the Jitsi Videobridge installation.
|
||||||
|
|
||||||
Template: jitsi-videobridge/jvbsecret
|
Template: jitsi-videobridge/jvbsecret
|
||||||
Type: password
|
Type: password
|
||||||
_Description: Jitsi Videobridge Component secret:
|
_Description: Jitsi Videobridge Component secret:
|
||||||
The secret used by Jitsi Videobridge to connect to xmpp server as component.
|
The secret used by Jitsi Videobridge to connect to xmpp server as component.
|
||||||
|
|
||||||
Template: jicofo/jicofo-authuser
|
|
||||||
Type: string
|
|
||||||
Default: focus
|
|
||||||
_Description: Jicofo username:
|
|
||||||
The jicofo needs an authenticated admin user to connect to xmpp server.
|
|
||||||
|
|
||||||
Template: jicofo/jicofo-authpassword
|
Template: jicofo/jicofo-authpassword
|
||||||
Type: password
|
Type: password
|
||||||
_Description: Jicofo user password:
|
_Description: Jicofo user password:
|
||||||
|
|
|
@ -50,27 +50,15 @@ case "$1" in
|
||||||
if [ -f "$PROSODY_HOST_CONFIG" ] ; then
|
if [ -f "$PROSODY_HOST_CONFIG" ] ; then
|
||||||
# search for the token auth, if this is not enabled this is the
|
# search for the token auth, if this is not enabled this is the
|
||||||
# first time we install tokens package and needs a config change
|
# first time we install tokens package and needs a config change
|
||||||
if ! egrep -q '^\s*authentication\s*=\s*"token"' "$PROSODY_HOST_CONFIG"; then
|
if ! egrep -q '^\s*authentication\s*=\s*"token" -- do not delete me' "$PROSODY_HOST_CONFIG"; then
|
||||||
# enable tokens in prosody host config
|
# enable tokens in prosody host config
|
||||||
sed -i 's/--plugin_paths/plugin_paths/g' $PROSODY_HOST_CONFIG
|
sed -i 's/--plugin_paths/plugin_paths/g' $PROSODY_HOST_CONFIG
|
||||||
sed -i 's/authentication = "anonymous"/authentication = "token"/g' $PROSODY_HOST_CONFIG
|
sed -i 's/authentication = "jitsi-anonymous" -- do not delete me/authentication = "token" -- do not delete me/g' $PROSODY_HOST_CONFIG
|
||||||
sed -i 's/ --allow_unencrypted_plain_auth/ allow_unencrypted_plain_auth/g' $PROSODY_HOST_CONFIG
|
|
||||||
sed -i "s/ --app_id=\"example_app_id\"/ app_id=\"$APP_ID\"/g" $PROSODY_HOST_CONFIG
|
sed -i "s/ --app_id=\"example_app_id\"/ app_id=\"$APP_ID\"/g" $PROSODY_HOST_CONFIG
|
||||||
sed -i "s/ --app_secret=\"example_app_secret\"/ app_secret=\"$APP_SECRET\"/g" $PROSODY_HOST_CONFIG
|
sed -i "s/ --app_secret=\"example_app_secret\"/ app_secret=\"$APP_SECRET\"/g" $PROSODY_HOST_CONFIG
|
||||||
sed -i 's/ --modules_enabled = { "token_verification" }/ modules_enabled = { "token_verification" }/g' $PROSODY_HOST_CONFIG
|
sed -i 's/ --modules_enabled = { "token_verification" }/ modules_enabled = { "token_verification" }/g' $PROSODY_HOST_CONFIG
|
||||||
sed -i '/^\s*--\s*"token_verification"/ s/--\s*//' $PROSODY_HOST_CONFIG
|
sed -i '/^\s*--\s*"token_verification"/ s/--\s*//' $PROSODY_HOST_CONFIG
|
||||||
|
|
||||||
PR10_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.10' 2>/dev/null | awk '{print $3}' || true)"
|
|
||||||
PRTRUNK_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-trunk' 2>/dev/null | awk '{print $3}' || true)"
|
|
||||||
PR_VER_INSTALLED=$(dpkg-query -f='${Version}\n' --show prosody 2>/dev/null || true)
|
|
||||||
if [ "$PR10_INSTALL_CHECK" = "installed" ] \
|
|
||||||
|| [ "$PR10_INSTALL_CHECK" = "unpacked" ] \
|
|
||||||
|| [ "$PRTRUNK_INSTALL_CHECK" = "installed" ] \
|
|
||||||
|| [ "$PRTRUNK_INSTALL_CHECK" = "unpacked" ] \
|
|
||||||
|| dpkg --compare-versions "$PR_VER_INSTALLED" lt "0.11" ; then
|
|
||||||
sed -i 's/module:hook_global(/module:hook(/g' /usr/share/jitsi-meet/prosody-plugins/mod_auth_token.lua
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -x "/etc/init.d/prosody" ]; then
|
if [ -x "/etc/init.d/prosody" ]; then
|
||||||
invoke-rc.d prosody restart || true
|
invoke-rc.d prosody restart || true
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -37,7 +37,7 @@ case "$1" in
|
||||||
APP_SECRET=$RET
|
APP_SECRET=$RET
|
||||||
|
|
||||||
# Revert prosody config
|
# Revert prosody config
|
||||||
sed -i 's/authentication = "token"/authentication = "anonymous"/g' $PROSODY_HOST_CONFIG
|
sed -i 's/authentication = "token" -- do not delete me/authentication = "jitsi-anonymous" -- do not delete me/g' $PROSODY_HOST_CONFIG
|
||||||
sed -i "s/ app_id=\"$APP_ID\"/ --app_id=\"example_app_id\"/g" $PROSODY_HOST_CONFIG
|
sed -i "s/ app_id=\"$APP_ID\"/ --app_id=\"example_app_id\"/g" $PROSODY_HOST_CONFIG
|
||||||
sed -i "s/ app_secret=\"$APP_SECRET\"/ --app_secret=\"example_app_secret\"/g" $PROSODY_HOST_CONFIG
|
sed -i "s/ app_secret=\"$APP_SECRET\"/ --app_secret=\"example_app_secret\"/g" $PROSODY_HOST_CONFIG
|
||||||
sed -i '/^\s*"token_verification"/ s/"token_verification"/-- "token_verification"/' $PROSODY_HOST_CONFIG
|
sed -i '/^\s*"token_verification"/ s/"token_verification"/-- "token_verification"/' $PROSODY_HOST_CONFIG
|
||||||
|
|
|
@ -1,3 +1,2 @@
|
||||||
doc/debian/jitsi-meet-turn/turnserver.conf /usr/share/jitsi-meet-turnserver/
|
doc/debian/jitsi-meet-turn/turnserver.conf /usr/share/jitsi-meet-turnserver/
|
||||||
doc/debian/jitsi-meet/jitsi-meet.conf /usr/share/jitsi-meet-turnserver/
|
doc/debian/jitsi-meet/jitsi-meet.conf /usr/share/jitsi-meet-turnserver/
|
||||||
doc/debian/jitsi-meet-turn/coturn-certbot-deploy.sh /usr/share/jitsi-meet-turnserver/
|
|
||||||
|
|