mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-05-08 16:33:01 +00:00
Compare commits
774 Commits
rm-dead-co
...
android-sd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3dd39f6e4 | ||
|
|
92c43c03ad | ||
|
|
8d8bd4d8d4 | ||
|
|
8dda34a502 | ||
|
|
3a85a915bf | ||
|
|
17b0a12224 | ||
|
|
b52394d328 | ||
|
|
cadb216cea | ||
|
|
2bf8e6cfce | ||
|
|
261a8a6740 | ||
|
|
35dbcd9b9d | ||
|
|
45bf00d096 | ||
|
|
78847148d8 | ||
|
|
c53e7ff9cd | ||
|
|
e6caeb86b0 | ||
|
|
5854e38a09 | ||
|
|
3e9ee9451f | ||
|
|
29d02f0a2b | ||
|
|
c780f9bbba | ||
|
|
d5a0bac0a3 | ||
|
|
f0187cc0f8 | ||
|
|
4708d894cc | ||
|
|
f38d120406 | ||
|
|
53960baf76 | ||
|
|
a0f061aa6f | ||
|
|
f2fb525d0a | ||
|
|
5a59bee597 | ||
|
|
07b903d887 | ||
|
|
1a39315001 | ||
|
|
97e5f00dae | ||
|
|
bae77f21f8 | ||
|
|
24d788f333 | ||
|
|
c4d553c605 | ||
|
|
fa64e2e67c | ||
|
|
94c29180e4 | ||
|
|
b864d91572 | ||
|
|
2006182a2a | ||
|
|
8fc3de416c | ||
|
|
4c5787511e | ||
|
|
8a2e4bc628 | ||
|
|
f78ebbb9a9 | ||
|
|
4cc4c25691 | ||
|
|
d02c7dc3a7 | ||
|
|
8741ee771e | ||
|
|
006e8463cd | ||
|
|
86e295e9bc | ||
|
|
07bade2557 | ||
|
|
0becc890d8 | ||
|
|
a1ce6f1ce5 | ||
|
|
43a7d00c63 | ||
|
|
9c04ba767c | ||
|
|
7e1d10fb4d | ||
|
|
4ce2280e31 | ||
|
|
2918a89d35 | ||
|
|
8f1c83edfd | ||
|
|
106452d857 | ||
|
|
a4d3fb6c70 | ||
|
|
a7af01b9e3 | ||
|
|
f7f434ab55 | ||
|
|
09c0854779 | ||
|
|
b4d12d74f7 | ||
|
|
50b064907a | ||
|
|
b9d6a0f269 | ||
|
|
2414e57260 | ||
|
|
6c41ddb622 | ||
|
|
55e75d56fd | ||
|
|
32ac299422 | ||
|
|
cb7146f954 | ||
|
|
144c1ce4f4 | ||
|
|
2102d6eda1 | ||
|
|
1f8e3fe26f | ||
|
|
8b0285a9d7 | ||
|
|
b546d01c2d | ||
|
|
7bf3e7df1d | ||
|
|
f9ac965e18 | ||
|
|
d70412166c | ||
|
|
a843406cb0 | ||
|
|
58115477a2 | ||
|
|
e1dc573c3c | ||
|
|
c025102511 | ||
|
|
54d052de73 | ||
|
|
7e633f0136 | ||
|
|
4b4bc1c823 | ||
|
|
767e23f34c | ||
|
|
b003d28cc5 | ||
|
|
91c8e9bd86 | ||
|
|
1f52c0b49f | ||
|
|
16fd4d4411 | ||
|
|
b8a669ad21 | ||
|
|
f0cb33a627 | ||
|
|
b5b7019325 | ||
|
|
7ccd68eb18 | ||
|
|
44b0ac57eb | ||
|
|
a411b7c969 | ||
|
|
fc8ce532f6 | ||
|
|
ef56b3c5b6 | ||
|
|
37e13804a5 | ||
|
|
8b209b3c6e | ||
|
|
cb26042d08 | ||
|
|
2952d1cde8 | ||
|
|
8a7f456560 | ||
|
|
f74b6cd82f | ||
|
|
d04515c35a | ||
|
|
2aca0ce110 | ||
|
|
d0e49b27a1 | ||
|
|
d97c365aed | ||
|
|
8304e77a04 | ||
|
|
b1db315582 | ||
|
|
4e785dd982 | ||
|
|
40f5afcf43 | ||
|
|
de2688bb33 | ||
|
|
76db09303b | ||
|
|
ea4e20f9a7 | ||
|
|
01a74856a3 | ||
|
|
36045100bf | ||
|
|
cc344cb548 | ||
|
|
a2624952a0 | ||
|
|
b8259e00dc | ||
|
|
463c823d3b | ||
|
|
5a6f3ead5a | ||
|
|
1b4d666af3 | ||
|
|
77d299338a | ||
|
|
33fc6e2f3f | ||
|
|
a95eaa6c2e | ||
|
|
5a3947bb23 | ||
|
|
f84a561d9e | ||
|
|
295878ffff | ||
|
|
609942654a | ||
|
|
60ad0196c3 | ||
|
|
caea6966ef | ||
|
|
d4c269f7cb | ||
|
|
54a1ee53b4 | ||
|
|
2c51e8ac06 | ||
|
|
3cbd69eef2 | ||
|
|
ee539644d8 | ||
|
|
465263bc97 | ||
|
|
1def65eb90 | ||
|
|
746be98bfc | ||
|
|
99b58dd318 | ||
|
|
df3ef0d895 | ||
|
|
83e4042668 | ||
|
|
c6e87568b6 | ||
|
|
0170c65c7b | ||
|
|
a7c1ccec71 | ||
|
|
1adbebf9dc | ||
|
|
9d68cb52b3 | ||
|
|
44272b650c | ||
|
|
5ce96d379a | ||
|
|
173c5fe430 | ||
|
|
e10595c3ed | ||
|
|
9138f56701 | ||
|
|
974e2a5106 | ||
|
|
509cf661f5 | ||
|
|
25fdea9984 | ||
|
|
9979e470fc | ||
|
|
2a492f5036 | ||
|
|
baf1f01e44 | ||
|
|
1f8dc944e3 | ||
|
|
dc07c6fede | ||
|
|
94a63f8aea | ||
|
|
a47cb595db | ||
|
|
86ccc176e8 | ||
|
|
b31041f0ce | ||
|
|
e434a78de9 | ||
|
|
6ddb77e03c | ||
|
|
f6665d79c0 | ||
|
|
75a7b99a42 | ||
|
|
3858a40c1c | ||
|
|
3d6aa8f2b5 | ||
|
|
54436f97c1 | ||
|
|
dca40dc6cb | ||
|
|
c19d91a373 | ||
|
|
840cfd8ab0 | ||
|
|
8cf6ba88e1 | ||
|
|
4ac81b030e | ||
|
|
e5cd1b29fe | ||
|
|
ebc932572f | ||
|
|
f0a6c6e67e | ||
|
|
e1454b5c4a | ||
|
|
f6e2abdf01 | ||
|
|
e2a02f4b21 | ||
|
|
934d7db24e | ||
|
|
2b520cbc4c | ||
|
|
e37dd73b9e | ||
|
|
c646319657 | ||
|
|
7a3a5a3f43 | ||
|
|
5345a77092 | ||
|
|
91de33550d | ||
|
|
85fb7513db | ||
|
|
c9d907e3fe | ||
|
|
5dfd02151e | ||
|
|
e446802ac9 | ||
|
|
bb71a4bb7d | ||
|
|
7ea2b9c8c0 | ||
|
|
056bc55e1f | ||
|
|
b1f89276cf | ||
|
|
f75ae6bd21 | ||
|
|
1066c65a6a | ||
|
|
03daaa4832 | ||
|
|
faea112f5e | ||
|
|
4461196ba3 | ||
|
|
ef3f20830d | ||
|
|
6d3ff5a956 | ||
|
|
9b6ef10555 | ||
|
|
1ac86cf979 | ||
|
|
1303040e17 | ||
|
|
5e2f745407 | ||
|
|
dc6861d5a4 | ||
|
|
7e5833bed2 | ||
|
|
55af587836 | ||
|
|
f59174d6ce | ||
|
|
c83c4488bf | ||
|
|
38280c358f | ||
|
|
f7c1500bc0 | ||
|
|
ae90e96a3e | ||
|
|
c05a49567d | ||
|
|
96fe34e6c7 | ||
|
|
c9f6de1371 | ||
|
|
60a995d654 | ||
|
|
1b053b0ff2 | ||
|
|
6293b586f1 | ||
|
|
f615b0133c | ||
|
|
06f509b475 | ||
|
|
47d261e45c | ||
|
|
961dbd81c7 | ||
|
|
190755126b | ||
|
|
f21ebf63ba | ||
|
|
beb30c5224 | ||
|
|
2253393ac8 | ||
|
|
965a6981db | ||
|
|
214c53220f | ||
|
|
c5af0ba621 | ||
|
|
22eff7fa21 | ||
|
|
0f57928585 | ||
|
|
7fee0297e8 | ||
|
|
df81e0fe53 | ||
|
|
c58de5c690 | ||
|
|
cf1fa52426 | ||
|
|
e58cad0464 | ||
|
|
2bf982452e | ||
|
|
891278d0b3 | ||
|
|
056226b8af | ||
|
|
f8dae86798 | ||
|
|
309f23ba94 | ||
|
|
3f93a81818 | ||
|
|
83196cda10 | ||
|
|
f3670ce86d | ||
|
|
5fd5804245 | ||
|
|
c58e557019 | ||
|
|
50515e0143 | ||
|
|
05f082ef06 | ||
|
|
20ef19ecf1 | ||
|
|
65450e36ef | ||
|
|
1b7a81afa5 | ||
|
|
470e987fad | ||
|
|
419db67267 | ||
|
|
ff70025429 | ||
|
|
7a305ef96e | ||
|
|
28efcea9d8 | ||
|
|
3927f3423f | ||
|
|
0c3b5139b1 | ||
|
|
ec9fcdf1cb | ||
|
|
d335438f12 | ||
|
|
69b536cfb9 | ||
|
|
edb4555699 | ||
|
|
8b6728c65d | ||
|
|
d3336192c3 | ||
|
|
10eadbb7e6 | ||
|
|
36a5282823 | ||
|
|
555be6c229 | ||
|
|
3f5e6883b5 | ||
|
|
ddcf90e95c | ||
|
|
683e9e72b9 | ||
|
|
123eaf77fa | ||
|
|
bb29f20a07 | ||
|
|
866390ece1 | ||
|
|
5b844e45e3 | ||
|
|
1c80771405 | ||
|
|
d42cbbd9f8 | ||
|
|
18873a9659 | ||
|
|
7859397790 | ||
|
|
bc23f9cd33 | ||
|
|
02f0057578 | ||
|
|
63761d515a | ||
|
|
5cc4b31f35 | ||
|
|
a03bf2cb8e | ||
|
|
312902ea77 | ||
|
|
961a9236fd | ||
|
|
364e63da14 | ||
|
|
27c62b3d78 | ||
|
|
51623b47f0 | ||
|
|
824cfc0c9c | ||
|
|
398e170e2d | ||
|
|
f1de6887cd | ||
|
|
7d31a838c1 | ||
|
|
61e3dc10dd | ||
|
|
7877ff4528 | ||
|
|
e8766b265d | ||
|
|
da5d1033c3 | ||
|
|
13323e423e | ||
|
|
5297252efb | ||
|
|
5ce2bef556 | ||
|
|
472c8d7808 | ||
|
|
a51b377d6b | ||
|
|
f5d764e3df | ||
|
|
f71f6d9a0d | ||
|
|
78b8c811af | ||
|
|
10d8d71d8b | ||
|
|
9e48943daf | ||
|
|
9f118c6b82 | ||
|
|
2c8dedcb85 | ||
|
|
f950dc90b9 | ||
|
|
92ca7a598a | ||
|
|
97f9d747c0 | ||
|
|
159dd13c2d | ||
|
|
98c6df0c10 | ||
|
|
8acce9a2f5 | ||
|
|
52fbd3aeb8 | ||
|
|
e9b2d8ecdf | ||
|
|
cdc4154cdf | ||
|
|
16cacec43c | ||
|
|
877fbe63c1 | ||
|
|
322d846bd9 | ||
|
|
ca8c055a58 | ||
|
|
2d8014775a | ||
|
|
699b797e0f | ||
|
|
a8e2fcdfea | ||
|
|
99016baa42 | ||
|
|
6187bb928a | ||
|
|
fab8a98cf7 | ||
|
|
00092b79af | ||
|
|
ba26407469 | ||
|
|
63e40c9e03 | ||
|
|
cbac122525 | ||
|
|
9af56d52c2 | ||
|
|
2a9c40f0d2 | ||
|
|
3ae18be21f | ||
|
|
9f5dbb21a7 | ||
|
|
2d14990b9e | ||
|
|
169c8ecb62 | ||
|
|
d608cf40f5 | ||
|
|
51a4e7daa3 | ||
|
|
7538bfc713 | ||
|
|
48e1f443ea | ||
|
|
2292ebe762 | ||
|
|
5425b52615 | ||
|
|
74f605e045 | ||
|
|
1918566581 | ||
|
|
ee8ba6696d | ||
|
|
15df3cb11e | ||
|
|
b77db024f5 | ||
|
|
c8a87e368a | ||
|
|
277ca23c52 | ||
|
|
55f66e236e | ||
|
|
70be08212d | ||
|
|
acb91990bf | ||
|
|
cd37cdd675 | ||
|
|
935a391525 | ||
|
|
d0f9231603 | ||
|
|
e461ec7027 | ||
|
|
5dc63f0632 | ||
|
|
f3dbf34842 | ||
|
|
66a9c4df25 | ||
|
|
e95a31c114 | ||
|
|
8565208d30 | ||
|
|
c1573057df | ||
|
|
904f820555 | ||
|
|
5172eda6b9 | ||
|
|
594a05a097 | ||
|
|
9ccdb62872 | ||
|
|
28d32cf740 | ||
|
|
ecc9b991ab | ||
|
|
5b83a91f9b | ||
|
|
bb7ae777b0 | ||
|
|
06e86a2f3e | ||
|
|
0a84dbb302 | ||
|
|
804f9041a6 | ||
|
|
7e8756a536 | ||
|
|
3b91e79675 | ||
|
|
dfc25e4519 | ||
|
|
d40aecb05d | ||
|
|
34e0b0392f | ||
|
|
8cc4a3c8b9 | ||
|
|
354a3c002a | ||
|
|
7d5eec779e | ||
|
|
90029003be | ||
|
|
c781884532 | ||
|
|
7272fd62a0 | ||
|
|
f21bd62ed0 | ||
|
|
842d0a9aef | ||
|
|
e06645a631 | ||
|
|
ebb65ea90c | ||
|
|
a7831ad809 | ||
|
|
80cfb80397 | ||
|
|
ae281e9935 | ||
|
|
b800ad8427 | ||
|
|
051cf67ce9 | ||
|
|
85e1333ad9 | ||
|
|
f02c7557af | ||
|
|
e82a5cf150 | ||
|
|
c92ce56110 | ||
|
|
4cae954eba | ||
|
|
b9d5838398 | ||
|
|
fcf723c679 | ||
|
|
06b67dcf44 | ||
|
|
61e9cacceb | ||
|
|
475c2f4606 | ||
|
|
20f2bfa449 | ||
|
|
4c0c36d233 | ||
|
|
59f1ee1e1e | ||
|
|
1af90a208e | ||
|
|
22c6b72a75 | ||
|
|
d8c7f8de81 | ||
|
|
f76122f0b0 | ||
|
|
63927db9e4 | ||
|
|
6b28af8329 | ||
|
|
ccebccf8e6 | ||
|
|
279a4efb83 | ||
|
|
ceac1ab25f | ||
|
|
2ba6bcf172 | ||
|
|
ae0669fa07 | ||
|
|
71627f97f7 | ||
|
|
e35338b73d | ||
|
|
a112d38943 | ||
|
|
b705c63a65 | ||
|
|
b4c8f7d097 | ||
|
|
74bac9806f | ||
|
|
65248d7d29 | ||
|
|
dc037bc8dd | ||
|
|
a22db037c7 | ||
|
|
44cc0f7e9a | ||
|
|
eafb337cd1 | ||
|
|
9b3be66287 | ||
|
|
1a10a00f74 | ||
|
|
a196bc27b8 | ||
|
|
ac8e4d9828 | ||
|
|
a6ade336b7 | ||
|
|
350443ad34 | ||
|
|
4c37ef7a2c | ||
|
|
3eedc2a49d | ||
|
|
aaeb1a90e5 | ||
|
|
ed89f9af20 | ||
|
|
863ad0b0e6 | ||
|
|
e2d701a8cc | ||
|
|
2710273069 | ||
|
|
07af18e284 | ||
|
|
519e37f567 | ||
|
|
7cf61eb776 | ||
|
|
f81446909c | ||
|
|
b4115593c0 | ||
|
|
f8bd8b616e | ||
|
|
be55ccd6f4 | ||
|
|
e7db18bd80 | ||
|
|
dff41e0fcb | ||
|
|
43be4324af | ||
|
|
c33baf4c96 | ||
|
|
f95a356025 | ||
|
|
1ba7765898 | ||
|
|
0346fca434 | ||
|
|
d267b2499d | ||
|
|
e3e5f1fbfa | ||
|
|
4697192b43 | ||
|
|
38a293f8f6 | ||
|
|
13e8f992b5 | ||
|
|
c384d0d3a9 | ||
|
|
2b71fa512b | ||
|
|
d381ceb040 | ||
|
|
e18c428f52 | ||
|
|
9fc32dc59b | ||
|
|
6f45622ef1 | ||
|
|
e56c7070c2 | ||
|
|
0aef7a36aa | ||
|
|
c030cf941e | ||
|
|
f6760e4ac7 | ||
|
|
9060c77307 | ||
|
|
a1d018eef4 | ||
|
|
3f724d8fb7 | ||
|
|
49d69a5a02 | ||
|
|
6db9e42876 | ||
|
|
ad3e8f9f53 | ||
|
|
9f39caa247 | ||
|
|
1402a63324 | ||
|
|
a9863e65c3 | ||
|
|
646c58f7d1 | ||
|
|
a78ea7ca9c | ||
|
|
8b8565bf60 | ||
|
|
b9e30f3c1b | ||
|
|
96b6edccf8 | ||
|
|
2af9dc88e6 | ||
|
|
eda25ca3c9 | ||
|
|
c99da17973 | ||
|
|
9e147d7842 | ||
|
|
d7afaf871f | ||
|
|
c4f6d37aa1 | ||
|
|
a5663872d9 | ||
|
|
007283aab3 | ||
|
|
3b612376f2 | ||
|
|
1a312e2140 | ||
|
|
6f5d0400b8 | ||
|
|
aec86cecc0 | ||
|
|
bf1dde7cd1 | ||
|
|
91e9005f08 | ||
|
|
57f9ea2865 | ||
|
|
1f6425fbfd | ||
|
|
e169979bab | ||
|
|
6e9e9c9a6a | ||
|
|
102a369bca | ||
|
|
b318b987a7 | ||
|
|
78ce68160a | ||
|
|
6aff616af4 | ||
|
|
0140a49641 | ||
|
|
732754c566 | ||
|
|
b360a9e572 | ||
|
|
f88fa81616 | ||
|
|
e0e66119f5 | ||
|
|
ba4784f149 | ||
|
|
7fb7c3de9c | ||
|
|
3d2d449d31 | ||
|
|
ca60c33dda | ||
|
|
162512496a | ||
|
|
7819c97839 | ||
|
|
e9c8603c3c | ||
|
|
9e165c337a | ||
|
|
58af1b98c0 | ||
|
|
6a077333c6 | ||
|
|
cb234e6b1b | ||
|
|
67a9f35176 | ||
|
|
9396e8b0c0 | ||
|
|
200d857012 | ||
|
|
1a22b7d0dd | ||
|
|
035cccb97b | ||
|
|
ca1c00acb0 | ||
|
|
8836669c9f | ||
|
|
13e818e135 | ||
|
|
fc0fd2d08c | ||
|
|
cc91cfe7b5 | ||
|
|
33564a311b | ||
|
|
2de416c1fa | ||
|
|
64838df712 | ||
|
|
84ad0200a8 | ||
|
|
046f9c53ab | ||
|
|
62f1139193 | ||
|
|
373be54b04 | ||
|
|
00c3ea07e7 | ||
|
|
5a64bd76fb | ||
|
|
57dbd3cf54 | ||
|
|
e772831f7c | ||
|
|
9363b79454 | ||
|
|
cf97ff724c | ||
|
|
c1f1c0d341 | ||
|
|
fd47225d30 | ||
|
|
0e9e884ab4 | ||
|
|
85d13ddfdf | ||
|
|
deadd8ad07 | ||
|
|
b9e5e5f114 | ||
|
|
e5d948af44 | ||
|
|
352ffa589c | ||
|
|
2dac69b679 | ||
|
|
a062fe0d0b | ||
|
|
67692149a2 | ||
|
|
ec4ab7c49c | ||
|
|
6efa4f2475 | ||
|
|
3a2a129f44 | ||
|
|
a828cacbfe | ||
|
|
5d840a5072 | ||
|
|
db5e63411f | ||
|
|
7457480f02 | ||
|
|
c834627949 | ||
|
|
2a0b87ee3e | ||
|
|
ff83276a2b | ||
|
|
0bea2926d2 | ||
|
|
aa3a8f24b8 | ||
|
|
be493c5343 | ||
|
|
47a2943682 | ||
|
|
5201f8791a | ||
|
|
0f4af44220 | ||
|
|
78bdbe2c3f | ||
|
|
e781bc9458 | ||
|
|
847d1dd4b7 | ||
|
|
05a79ec793 | ||
|
|
20fd544ded | ||
|
|
0b65acb528 | ||
|
|
75bb460ccf | ||
|
|
6afb7ba9a6 | ||
|
|
f1ad9dc2e0 | ||
|
|
9d76c54288 | ||
|
|
9ac039a408 | ||
|
|
275e7b00a9 | ||
|
|
44dde32bab | ||
|
|
f72fb4063b | ||
|
|
710dab8b76 | ||
|
|
fde975ba62 | ||
|
|
d75ab7b246 | ||
|
|
46c91b7566 | ||
|
|
206a4afd76 | ||
|
|
570ae81a37 | ||
|
|
5d0d23ac63 | ||
|
|
d61295a8a1 | ||
|
|
a52f9313a6 | ||
|
|
29945f4809 | ||
|
|
b942ce9378 | ||
|
|
1bf0bd6bca | ||
|
|
5706d077e2 | ||
|
|
f1e5903bd1 | ||
|
|
397b94da79 | ||
|
|
649a4ffd46 | ||
|
|
ba57b1afff | ||
|
|
d68f1572a3 | ||
|
|
8c15e940d8 | ||
|
|
89c914272c | ||
|
|
c879f5f04d | ||
|
|
c307a819f6 | ||
|
|
123fa6681f | ||
|
|
46597bd6e7 | ||
|
|
aae0ffc3b3 | ||
|
|
ce5f7ba317 | ||
|
|
1c04a41081 | ||
|
|
9e33839b31 | ||
|
|
ab809875f7 | ||
|
|
ac8e088e50 | ||
|
|
e95b964b78 | ||
|
|
34b2577b97 | ||
|
|
d7cad9d560 | ||
|
|
c6213eb160 | ||
|
|
b5f16c52c9 | ||
|
|
78a4f9b792 | ||
|
|
0792d89c46 | ||
|
|
09426643cf | ||
|
|
1d119cbd36 | ||
|
|
3dd9a303c3 | ||
|
|
31073fb5df | ||
|
|
bc1827fb4a | ||
|
|
aeeca7c343 | ||
|
|
a7fa33286d | ||
|
|
754f658489 | ||
|
|
679711534a | ||
|
|
238bd46480 | ||
|
|
e4d4bec175 | ||
|
|
2b3fbaa360 | ||
|
|
8949753874 | ||
|
|
16115a3a16 | ||
|
|
7c17d80ae8 | ||
|
|
511548060a | ||
|
|
00780929e5 | ||
|
|
a89f762a66 | ||
|
|
82a03c36c6 | ||
|
|
7968578a25 | ||
|
|
62b6411bb6 | ||
|
|
b3bce9e5ae | ||
|
|
ed37bedee2 | ||
|
|
2182a1e452 | ||
|
|
4eea924c02 | ||
|
|
de3b6d2a9f | ||
|
|
2a090d8034 | ||
|
|
238def34cf | ||
|
|
43c4ec0808 | ||
|
|
7910554625 | ||
|
|
56d2af197e | ||
|
|
466a36dc93 | ||
|
|
1fc5d6e97e | ||
|
|
7156df5b99 | ||
|
|
2c8c98aaf3 | ||
|
|
afcedd0f3c | ||
|
|
f253939f28 | ||
|
|
98cba457f2 | ||
|
|
f7e7750cfb | ||
|
|
d9749f3da6 | ||
|
|
45b7f53294 | ||
|
|
27765b47d7 | ||
|
|
185e9d4f58 | ||
|
|
39991da2cf | ||
|
|
f968d5e70a | ||
|
|
f846eb9234 | ||
|
|
126b0d385f | ||
|
|
306c979adb | ||
|
|
99d6012743 | ||
|
|
a94ba85a98 | ||
|
|
f618194587 | ||
|
|
e9c4774695 | ||
|
|
6421df7fa0 | ||
|
|
4ffc2bca5f | ||
|
|
79a252652c | ||
|
|
9eddb71e92 | ||
|
|
ac65b23ccf | ||
|
|
1f6483daae | ||
|
|
c8ecd47ff5 | ||
|
|
50885e258c | ||
|
|
164d305528 | ||
|
|
183de81a57 | ||
|
|
e12999d44f | ||
|
|
8982f17ce1 | ||
|
|
c8f1690057 | ||
|
|
aa57309057 | ||
|
|
fb81619fc5 | ||
|
|
5a5656020b | ||
|
|
0ff44a2f22 | ||
|
|
4d04ea325e | ||
|
|
42ce6dcc58 | ||
|
|
b033d0268a | ||
|
|
4aea40d34f | ||
|
|
e5a170fb28 | ||
|
|
d1cf5578fc | ||
|
|
4b29af6b5f | ||
|
|
f3481576ff | ||
|
|
455a91a5c6 | ||
|
|
297ab194a8 | ||
|
|
077a88a803 | ||
|
|
02c232440e | ||
|
|
f727b9295f | ||
|
|
0d0bec3aad | ||
|
|
cfb8589bef | ||
|
|
65730e256e | ||
|
|
7b8b911fee | ||
|
|
036286a1d6 | ||
|
|
d550254f31 | ||
|
|
b1a71d55d7 | ||
|
|
17ed45799c | ||
|
|
e5681382b0 | ||
|
|
c27cb25afe | ||
|
|
baf5aa14e8 | ||
|
|
29b6ce7721 | ||
|
|
4f95c45e50 | ||
|
|
72dd609247 | ||
|
|
fed74afffe | ||
|
|
204f34cccb | ||
|
|
c81777a475 | ||
|
|
778bca3031 | ||
|
|
336fa304ce | ||
|
|
f14b69166c | ||
|
|
e405595a11 | ||
|
|
cabe48d66a | ||
|
|
8d7f46024b | ||
|
|
d7f6c2bbf0 | ||
|
|
3c69645169 | ||
|
|
abe2fa4dd4 | ||
|
|
863fd12488 | ||
|
|
50c4748d40 | ||
|
|
f83840a3bc | ||
|
|
1466d7d149 | ||
|
|
d0fe034db5 | ||
|
|
8225f5e363 | ||
|
|
c641835d0f | ||
|
|
35ee92869f | ||
|
|
9b7a5ffdd1 | ||
|
|
581c2e621c | ||
|
|
f3117f3037 | ||
|
|
877ef58dfb | ||
|
|
19e61747b8 | ||
|
|
b4bf363237 | ||
|
|
f8af9c4fae | ||
|
|
9fa426d97f | ||
|
|
e3c95e376a | ||
|
|
00ed794c50 | ||
|
|
b52d5629e2 | ||
|
|
9d8e646d4e | ||
|
|
850c0b97e4 | ||
|
|
87035d0812 | ||
|
|
ef0168c9ff | ||
|
|
df1a5a25d4 | ||
|
|
c424884201 | ||
|
|
0a464a5223 | ||
|
|
8cd62bc132 | ||
|
|
123a74b38b | ||
|
|
dbeca806bb | ||
|
|
f790d3e3ed | ||
|
|
a12f7fc4d2 | ||
|
|
456ce38a10 | ||
|
|
72ef1668f2 | ||
|
|
fce8f52574 | ||
|
|
8fcfd7a308 | ||
|
|
04a41395c8 | ||
|
|
18e8201167 | ||
|
|
27b8794d8c | ||
|
|
3cb0df579c |
@@ -9,5 +9,8 @@ indent_style = space
|
|||||||
max_line_length = 80
|
max_line_length = 80
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
[Makefile]
|
[Makefile]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# The build artifacts of the jitsi-meet project.
|
# The build artifacts of the jitsi-meet project.
|
||||||
build/*
|
build/*
|
||||||
|
|
||||||
|
doc/*
|
||||||
|
|
||||||
# Third-party source code which we (1) do not want to modify or (2) try to
|
# Third-party source code which we (1) do not want to modify or (2) try to
|
||||||
# modify as little as possible.
|
# modify as little as possible.
|
||||||
libs/*
|
libs/*
|
||||||
|
|||||||
16
.github/stale.yml
vendored
16
.github/stale.yml
vendored
@@ -1,16 +0,0 @@
|
|||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 90
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 7
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- confirmed
|
|
||||||
staleLabel: wontfix
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
||||||
closeComment: false
|
|
||||||
|
|
||||||
34
.github/workflows/ci.yml
vendored
34
.github/workflows/ci.yml
vendored
@@ -12,14 +12,24 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 16
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@v35
|
||||||
|
- name: Get changed lang files
|
||||||
|
id: lang-files
|
||||||
|
run: echo "all=$(echo "${{ steps.changed-files.outputs.all_changed_files }}" | grep -oE 'lang\/\S+' | tr '\n' ' ')" >> "$GITHUB_OUTPUT"
|
||||||
- run: npm install
|
- run: npm install
|
||||||
- name: Check git status
|
- name: Check git status
|
||||||
run: git status
|
run: git status
|
||||||
- name: Normalize lang files to ensure sorted
|
- name: Normalize lang files to ensure sorted
|
||||||
|
if: steps.lang-files.outputs.all
|
||||||
run: npm run lang-sort
|
run: npm run lang-sort
|
||||||
|
- name: Check lang files are formatted correctly
|
||||||
|
if: steps.lang-files.outputs.all
|
||||||
|
run: npm run lint:lang
|
||||||
- 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:ci
|
- run: npm run lint:ci && npm run tsc:ci
|
||||||
linux-build:
|
linux-build:
|
||||||
name: Build Frontend (Linux)
|
name: Build Frontend (Linux)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -42,3 +52,25 @@ jobs:
|
|||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
- run: npm install
|
- run: npm install
|
||||||
- run: make
|
- run: make
|
||||||
|
android-build:
|
||||||
|
name: Build mobile bundle (Android)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
cache: 'npm'
|
||||||
|
- run: npm install
|
||||||
|
- run: npx react-native bundle --entry-file react/index.native.js --platform android --bundle-output /tmp/android.bundle --reset-cache
|
||||||
|
ios-build:
|
||||||
|
name: Build mobile bundle (iOS)
|
||||||
|
runs-on: macOS-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
cache: 'npm'
|
||||||
|
- run: npm install
|
||||||
|
- run: npx react-native bundle --entry-file react/index.native.js --platform ios --bundle-output /tmp/ios.bundle --reset-cache
|
||||||
|
|||||||
21
.github/workflows/stale.yml
vendored
Normal file
21
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
name: 'Close stale issues and PRs'
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '30 1 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v8
|
||||||
|
with:
|
||||||
|
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
|
||||||
|
stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
|
||||||
|
stale-issue-label: 'stale'
|
||||||
|
stale-pr-label: 'stale'
|
||||||
|
exempt-issue-labels: 'confirmed,help-needed'
|
||||||
|
exempt-pr-labels: 'confirmed'
|
||||||
|
days-before-issue-stale: 60
|
||||||
|
days-before-pr-stale: 90
|
||||||
|
days-before-issue-close: 10
|
||||||
|
days-before-pr-close: 10
|
||||||
22
.gitignore
vendored
22
.gitignore
vendored
@@ -61,8 +61,9 @@ buck-out/
|
|||||||
|
|
||||||
# fastlane
|
# fastlane
|
||||||
#
|
#
|
||||||
*/fastlane/report.xml
|
**/fastlane/report.xml
|
||||||
*/fastlane/Preview.html
|
**/fastlane/Preview.html
|
||||||
|
**/fastlane/test_output
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
*.jsbundle
|
*.jsbundle
|
||||||
@@ -93,3 +94,20 @@ twa/*.aab
|
|||||||
twa/assetlinks.json
|
twa/assetlinks.json
|
||||||
|
|
||||||
tsconfig.json
|
tsconfig.json
|
||||||
|
|
||||||
|
# React Native SDK
|
||||||
|
#
|
||||||
|
react-native-sdk/*.tgz
|
||||||
|
react-native-sdk/android/src
|
||||||
|
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/JitsiMeetOngoingConferenceService.java
|
||||||
|
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/JitsiMeetReactNativePackage.java
|
||||||
|
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/JMOngoingConferenceModule.java
|
||||||
|
!react-native-sdk/android/src/main/java/org/jitsi/meet/sdk/RNOngoingNotification.java
|
||||||
|
react-native-sdk/images
|
||||||
|
react-native-sdk/ios
|
||||||
|
react-native-sdk/lang
|
||||||
|
react-native-sdk/modules
|
||||||
|
react-native-sdk/node_modules
|
||||||
|
react-native-sdk/react
|
||||||
|
react-native-sdk/service
|
||||||
|
react-native-sdk/sounds
|
||||||
|
|||||||
12
Makefile
12
Makefile
@@ -44,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 \
|
||||||
@@ -67,11 +63,7 @@ deploy-appbundle:
|
|||||||
|
|
||||||
deploy-lib-jitsi-meet:
|
deploy-lib-jitsi-meet:
|
||||||
cp \
|
cp \
|
||||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.js \
|
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.* \
|
||||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.map \
|
|
||||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.e2ee-worker.js \
|
|
||||||
$(LIBJITSIMEET_DIR)/connection_optimization/external_connect.js \
|
|
||||||
$(LIBJITSIMEET_DIR)/modules/browser/capabilities.json \
|
|
||||||
$(DEPLOY_DIR)
|
$(DEPLOY_DIR)
|
||||||
|
|
||||||
deploy-olm:
|
deploy-olm:
|
||||||
@@ -131,7 +123,7 @@ dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-mode
|
|||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -81,14 +81,15 @@ dependencies {
|
|||||||
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
|
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
|
||||||
|
|
||||||
if (!rootProject.ext.libreBuild) {
|
if (!rootProject.ext.libreBuild) {
|
||||||
implementation 'com.google.android.gms:play-services-auth:16.0.1'
|
// Sync with react-native-google-signin
|
||||||
|
implementation 'com.google.android.gms:play-services-auth:20.5.0'
|
||||||
|
|
||||||
// Firebase
|
// Firebase
|
||||||
// - Crashlytics
|
// - Crashlytics
|
||||||
// - Dynamic Links
|
// - Dynamic Links
|
||||||
implementation 'com.google.firebase:firebase-analytics:17.5.0'
|
implementation 'com.google.firebase:firebase-analytics:21.3.0'
|
||||||
implementation 'com.google.firebase:firebase-crashlytics:17.2.1'
|
implementation 'com.google.firebase:firebase-crashlytics:18.4.3'
|
||||||
implementation 'com.google.firebase:firebase-dynamic-links:19.1.0'
|
implementation 'com.google.firebase:firebase-dynamic-links:21.1.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
implementation project(':sdk')
|
implementation project(':sdk')
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
android:extractNativeLibs="true"
|
android:extractNativeLibs="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:name=".MainApplication"
|
|
||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
<meta-data
|
<meta-data
|
||||||
@@ -17,7 +16,8 @@
|
|||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
|
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleInstance"
|
||||||
|
android:taskAffinity=""
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:resizeableActivity="true"
|
android:resizeableActivity="true"
|
||||||
android:supportsPictureInPicture="true"
|
android:supportsPictureInPicture="true"
|
||||||
|
|||||||
@@ -152,7 +152,6 @@ public class MainActivity extends JitsiMeetActivity {
|
|||||||
= new JitsiMeetConferenceOptions.Builder()
|
= new JitsiMeetConferenceOptions.Builder()
|
||||||
.setServerURL(buildURL(defaultURL))
|
.setServerURL(buildURL(defaultURL))
|
||||||
.setFeatureFlag("welcomepage.enabled", true)
|
.setFeatureFlag("welcomepage.enabled", true)
|
||||||
.setFeatureFlag("call-integration.enabled", false)
|
|
||||||
.setFeatureFlag("resolution", 360)
|
.setFeatureFlag("resolution", 360)
|
||||||
.setFeatureFlag("server-url-change.enabled", !configurationByRestrictions)
|
.setFeatureFlag("server-url-change.enabled", !configurationByRestrictions)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright @ 2022-present 8x8, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jitsi.meet;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import com.facebook.react.ReactApplication;
|
|
||||||
import com.facebook.react.ReactNativeHost;
|
|
||||||
|
|
||||||
import org.jitsi.meet.sdk.JitsiReactNativeHost;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Application class for Jitsi Meet. The only reason why this exists is for Detox
|
|
||||||
* to believe our app is a "greenfield" app. SDK users need not use this.
|
|
||||||
*/
|
|
||||||
public class MainApplication extends Application implements ReactApplication {
|
|
||||||
private final ReactNativeHost mReactNativeHost = new JitsiReactNativeHost(this);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReactNativeHost getReactNativeHost() {
|
|
||||||
return mReactNativeHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
|
|
||||||
// Initialize RN
|
|
||||||
Log.d(this.getClass().getCanonicalName(), "app onCreate");
|
|
||||||
getReactNativeHost().getReactInstanceManager();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,28 +10,24 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:7.0.4'
|
classpath 'com.android.tools.build:gradle:7.3.1'
|
||||||
classpath 'com.google.gms:google-services:4.3.14'
|
classpath 'com.google.gms:google-services:4.4.0'
|
||||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
|
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
buildToolsVersion = "31.0.0"
|
kotlinVersion = "1.7.0"
|
||||||
compileSdkVersion = 32
|
buildToolsVersion = "33.0.2"
|
||||||
minSdkVersion = 23
|
compileSdkVersion = 33
|
||||||
targetSdkVersion = 32
|
minSdkVersion = 24
|
||||||
|
targetSdkVersion = 33
|
||||||
supportLibVersion = "28.0.0"
|
supportLibVersion = "28.0.0"
|
||||||
|
|
||||||
if (System.properties['os.arch'] == "aarch64") {
|
// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
|
||||||
// For M1 Users we need to use the NDK 24 which added support for aarch64
|
ndkVersion = "23.1.7779620"
|
||||||
ndkVersion = "24.0.8215888"
|
|
||||||
} else {
|
|
||||||
// Otherwise we default to the side-by-side NDK version from AGP.
|
|
||||||
ndkVersion = "21.4.7075529"
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Maven artifact groupdId of the third-party react-native modules which
|
// The Maven artifact groupId of the third-party react-native modules which
|
||||||
// Jitsi Meet SDK for Android depends on and which are not available in
|
// Jitsi Meet SDK for Android depends on and which are not available in
|
||||||
// third-party Maven repositories so we have to deploy to a Maven repository
|
// third-party Maven repositories so we have to deploy to a Maven repository
|
||||||
// of ours.
|
// of ours.
|
||||||
|
|||||||
@@ -26,5 +26,5 @@ android.useAndroidX=true
|
|||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
android.bundle.enableUncompressedNativeLibs=false
|
android.bundle.enableUncompressedNativeLibs=false
|
||||||
|
|
||||||
appVersion=99.0.0
|
appVersion=23.6.0
|
||||||
sdkVersion=99.0.0
|
sdkVersion=8.6.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@@ -29,14 +29,18 @@ if [[ $MVN_HTTP == 1 ]]; then
|
|||||||
# Push React Native
|
# Push React Native
|
||||||
echo "Pushing React Native ${RN_VERSION} to the Maven repo"
|
echo "Pushing React Native ${RN_VERSION} to the Maven repo"
|
||||||
pushd ${THIS_DIR}/../../node_modules/react-native/android/com/facebook/react/react-native/${RN_VERSION}
|
pushd ${THIS_DIR}/../../node_modules/react-native/android/com/facebook/react/react-native/${RN_VERSION}
|
||||||
|
cat react-native-${RN_VERSION}.pom \
|
||||||
|
| sed "s#<packaging>pom</packaging>#<packaging>aar</packaging>#" \
|
||||||
|
| sed "/<optional>/d" \
|
||||||
|
> react-native-${RN_VERSION}-fixed.pom
|
||||||
mvn \
|
mvn \
|
||||||
deploy:deploy-file \
|
deploy:deploy-file \
|
||||||
-Durl=${MVN_REPO} \
|
-Durl=${MVN_REPO} \
|
||||||
-DrepositoryId=${MVN_REPO_ID} \
|
-DrepositoryId=${MVN_REPO_ID} \
|
||||||
-Dfile=react-native-${RN_VERSION}.aar \
|
-Dfile=react-native-${RN_VERSION}-release.aar \
|
||||||
-Dpackaging=aar \
|
-Dpackaging=aar \
|
||||||
-DgeneratePom=false \
|
-DgeneratePom=false \
|
||||||
-DpomFile=react-native-${RN_VERSION}.pom || true
|
-DpomFile=react-native-${RN_VERSION}-fixed.pom || true
|
||||||
popd
|
popd
|
||||||
# Push JSC
|
# Push JSC
|
||||||
echo "Pushing JSC ${JSC_VERSION} to the Maven repo"
|
echo "Pushing JSC ${JSC_VERSION} to the Maven repo"
|
||||||
@@ -55,13 +59,17 @@ else
|
|||||||
if [[ ! -d ${MVN_REPO}/com/facebook/react/react-native/${RN_VERSION} ]]; then
|
if [[ ! -d ${MVN_REPO}/com/facebook/react/react-native/${RN_VERSION} ]]; then
|
||||||
echo "Pushing React Native ${RN_VERSION} to the Maven repo"
|
echo "Pushing React Native ${RN_VERSION} to the Maven repo"
|
||||||
pushd ${THIS_DIR}/../../node_modules/react-native/android/com/facebook/react/react-native/${RN_VERSION}
|
pushd ${THIS_DIR}/../../node_modules/react-native/android/com/facebook/react/react-native/${RN_VERSION}
|
||||||
|
cat react-native-${RN_VERSION}.pom \
|
||||||
|
| sed "s#<packaging>pom</packaging>#<packaging>aar</packaging>#" \
|
||||||
|
| sed "/<optional>/d" \
|
||||||
|
> react-native-${RN_VERSION}-fixed.pom
|
||||||
mvn \
|
mvn \
|
||||||
deploy:deploy-file \
|
deploy:deploy-file \
|
||||||
-Durl=${MVN_REPO} \
|
-Durl=${MVN_REPO} \
|
||||||
-Dfile=react-native-${RN_VERSION}.aar \
|
-Dfile=react-native-${RN_VERSION}-release.aar \
|
||||||
-Dpackaging=aar \
|
-Dpackaging=aar \
|
||||||
-DgeneratePom=false \
|
-DgeneratePom=false \
|
||||||
-DpomFile=react-native-${RN_VERSION}.pom
|
-DpomFile=react-native-${RN_VERSION}-fixed.pom
|
||||||
popd
|
popd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
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-immersive')
|
implementation project(':react-native-immersive-mode')
|
||||||
implementation project(':react-native-keep-awake')
|
implementation project(':react-native-keep-awake')
|
||||||
implementation project(':react-native-orientation-locker')
|
implementation project(':react-native-orientation-locker')
|
||||||
implementation project(':react-native-pager-view')
|
implementation project(':react-native-pager-view')
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
|
|||||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||||
import com.facebook.react.module.annotations.ReactModule;
|
import com.facebook.react.module.annotations.ReactModule;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -32,7 +33,10 @@ import java.util.Map;
|
|||||||
class AppInfoModule
|
class AppInfoModule
|
||||||
extends ReactContextBaseJavaModule {
|
extends ReactContextBaseJavaModule {
|
||||||
|
|
||||||
|
private static final String BUILD_CONFIG = "org.jitsi.meet.sdk.BuildConfig";
|
||||||
public static final String NAME = "AppInfo";
|
public static final String NAME = "AppInfo";
|
||||||
|
public static final boolean GOOGLE_SERVICES_ENABLED = getGoogleServicesEnabled();
|
||||||
|
public static final boolean LIBRE_BUILD = getLibreBuild();
|
||||||
|
|
||||||
public AppInfoModule(ReactApplicationContext reactContext) {
|
public AppInfoModule(ReactApplicationContext reactContext) {
|
||||||
super(reactContext);
|
super(reactContext);
|
||||||
@@ -75,8 +79,8 @@ class AppInfoModule
|
|||||||
constants.put(
|
constants.put(
|
||||||
"version",
|
"version",
|
||||||
packageInfo == null ? "" : packageInfo.versionName);
|
packageInfo == null ? "" : packageInfo.versionName);
|
||||||
constants.put("LIBRE_BUILD", BuildConfig.LIBRE_BUILD);
|
constants.put("LIBRE_BUILD", LIBRE_BUILD);
|
||||||
constants.put("GOOGLE_SERVICES_ENABLED", BuildConfig.GOOGLE_SERVICES_ENABLED);
|
constants.put("GOOGLE_SERVICES_ENABLED", GOOGLE_SERVICES_ENABLED);
|
||||||
|
|
||||||
return constants;
|
return constants;
|
||||||
}
|
}
|
||||||
@@ -85,4 +89,47 @@ class AppInfoModule
|
|||||||
public String getName() {
|
public String getName() {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if libre google services object is null based on build configuration.
|
||||||
|
*/
|
||||||
|
private static boolean getGoogleServicesEnabled() {
|
||||||
|
Object googleServicesEnabled = getBuildConfigValue("GOOGLE_SERVICES_ENABLED");
|
||||||
|
|
||||||
|
if (googleServicesEnabled !=null) {
|
||||||
|
return (Boolean) googleServicesEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if libre build field is null based on build configuration.
|
||||||
|
*/
|
||||||
|
private static boolean getLibreBuild() {
|
||||||
|
Object libreBuild = getBuildConfigValue("LIBRE_BUILD");
|
||||||
|
|
||||||
|
if (libreBuild !=null) {
|
||||||
|
return (Boolean) libreBuild;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets build config value of a certain field.
|
||||||
|
*
|
||||||
|
* @param fieldName Field from build config.
|
||||||
|
*/
|
||||||
|
private static Object getBuildConfigValue(String fieldName) {
|
||||||
|
try {
|
||||||
|
Class<?> c = Class.forName(BUILD_CONFIG);
|
||||||
|
Field f = c.getDeclaredField(fieldName);
|
||||||
|
f.setAccessible(true);
|
||||||
|
return f.get(null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,12 @@ class AudioDeviceHandlerGeneric implements
|
|||||||
*/
|
*/
|
||||||
private AudioModeModule module;
|
private AudioModeModule module;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constant defining a Hearing Aid. Only available on API level >= 28.
|
||||||
|
* The value of: AudioDeviceInfo.TYPE_HEARING_AID
|
||||||
|
*/
|
||||||
|
private static final int TYPE_HEARING_AID = 23;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constant defining a USB headset. Only available on API level >= 26.
|
* Constant defining a USB headset. Only available on API level >= 26.
|
||||||
* The value of: AudioDeviceInfo.TYPE_USB_HEADSET
|
* The value of: AudioDeviceInfo.TYPE_USB_HEADSET
|
||||||
@@ -85,6 +91,7 @@ class AudioDeviceHandlerGeneric implements
|
|||||||
break;
|
break;
|
||||||
case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
|
case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
|
||||||
case AudioDeviceInfo.TYPE_WIRED_HEADSET:
|
case AudioDeviceInfo.TYPE_WIRED_HEADSET:
|
||||||
|
case TYPE_HEARING_AID:
|
||||||
case TYPE_USB_HEADSET:
|
case TYPE_USB_HEADSET:
|
||||||
devices.add(AudioModeModule.DEVICE_HEADPHONES);
|
devices.add(AudioModeModule.DEVICE_HEADPHONES);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -77,7 +77,8 @@ public class BroadcastAction {
|
|||||||
CLOSE_CHAT("org.jitsi.meet.CLOSE_CHAT"),
|
CLOSE_CHAT("org.jitsi.meet.CLOSE_CHAT"),
|
||||||
SEND_CHAT_MESSAGE("org.jitsi.meet.SEND_CHAT_MESSAGE"),
|
SEND_CHAT_MESSAGE("org.jitsi.meet.SEND_CHAT_MESSAGE"),
|
||||||
SET_VIDEO_MUTED("org.jitsi.meet.SET_VIDEO_MUTED"),
|
SET_VIDEO_MUTED("org.jitsi.meet.SET_VIDEO_MUTED"),
|
||||||
SET_CLOSED_CAPTIONS_ENABLED("org.jitsi.meet.SET_CLOSED_CAPTIONS_ENABLED");
|
SET_CLOSED_CAPTIONS_ENABLED("org.jitsi.meet.SET_CLOSED_CAPTIONS_ENABLED"),
|
||||||
|
TOGGLE_CAMERA("org.jitsi.meet.TOGGLE_CAMERA");
|
||||||
|
|
||||||
private final String action;
|
private final String action;
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ public class BroadcastEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
|
CONFERENCE_BLURRED("org.jitsi.meet.CONFERENCE_BLURRED"),
|
||||||
|
CONFERENCE_FOCUSED("org.jitsi.meet.CONFERENCE_FOCUSED"),
|
||||||
CONFERENCE_JOINED("org.jitsi.meet.CONFERENCE_JOINED"),
|
CONFERENCE_JOINED("org.jitsi.meet.CONFERENCE_JOINED"),
|
||||||
CONFERENCE_TERMINATED("org.jitsi.meet.CONFERENCE_TERMINATED"),
|
CONFERENCE_TERMINATED("org.jitsi.meet.CONFERENCE_TERMINATED"),
|
||||||
CONFERENCE_WILL_JOIN("org.jitsi.meet.CONFERENCE_WILL_JOIN"),
|
CONFERENCE_WILL_JOIN("org.jitsi.meet.CONFERENCE_WILL_JOIN"),
|
||||||
@@ -89,6 +91,8 @@ public class BroadcastEvent {
|
|||||||
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED"),
|
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED"),
|
||||||
READY_TO_CLOSE("org.jitsi.meet.READY_TO_CLOSE");
|
READY_TO_CLOSE("org.jitsi.meet.READY_TO_CLOSE");
|
||||||
|
|
||||||
|
private static final String CONFERENCE_BLURRED_NAME = "CONFERENCE_BLURRED";
|
||||||
|
private static final String CONFERENCE_FOCUSED_NAME = "CONFERENCE_FOCUSED";
|
||||||
private static final String CONFERENCE_WILL_JOIN_NAME = "CONFERENCE_WILL_JOIN";
|
private static final String CONFERENCE_WILL_JOIN_NAME = "CONFERENCE_WILL_JOIN";
|
||||||
private static final String CONFERENCE_JOINED_NAME = "CONFERENCE_JOINED";
|
private static final String CONFERENCE_JOINED_NAME = "CONFERENCE_JOINED";
|
||||||
private static final String CONFERENCE_TERMINATED_NAME = "CONFERENCE_TERMINATED";
|
private static final String CONFERENCE_TERMINATED_NAME = "CONFERENCE_TERMINATED";
|
||||||
@@ -124,6 +128,10 @@ public class BroadcastEvent {
|
|||||||
|
|
||||||
private static Type buildTypeFromName(String name) {
|
private static Type buildTypeFromName(String name) {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
|
case CONFERENCE_BLURRED_NAME:
|
||||||
|
return CONFERENCE_BLURRED;
|
||||||
|
case CONFERENCE_FOCUSED_NAME:
|
||||||
|
return CONFERENCE_FOCUSED;
|
||||||
case CONFERENCE_WILL_JOIN_NAME:
|
case CONFERENCE_WILL_JOIN_NAME:
|
||||||
return CONFERENCE_WILL_JOIN;
|
return CONFERENCE_WILL_JOIN;
|
||||||
case CONFERENCE_JOINED_NAME:
|
case CONFERENCE_JOINED_NAME:
|
||||||
|
|||||||
@@ -54,4 +54,14 @@ public class BroadcastIntentHelper {
|
|||||||
intent.putExtra("enabled", enabled);
|
intent.putExtra("enabled", enabled);
|
||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Intent buildRetrieveParticipantsInfo(String requestId) {
|
||||||
|
Intent intent = new Intent(BroadcastAction.Type.RETRIEVE_PARTICIPANTS_INFO.getAction());
|
||||||
|
intent.putExtra("requestId", requestId);
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Intent buildToggleCameraIntent() {
|
||||||
|
return new Intent(BroadcastAction.Type.TOGGLE_CAMERA.getAction());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import android.telecom.PhoneAccount;
|
|||||||
import android.telecom.PhoneAccountHandle;
|
import android.telecom.PhoneAccountHandle;
|
||||||
import android.telecom.TelecomManager;
|
import android.telecom.TelecomManager;
|
||||||
import android.telecom.VideoProfile;
|
import android.telecom.VideoProfile;
|
||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import com.facebook.react.bridge.Promise;
|
import com.facebook.react.bridge.Promise;
|
||||||
@@ -357,7 +358,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
|||||||
JitsiMeetLogger.i(TAG + " onDisconnect " + getCallUUID());
|
JitsiMeetLogger.i(TAG + " onDisconnect " + getCallUUID());
|
||||||
WritableNativeMap data = new WritableNativeMap();
|
WritableNativeMap data = new WritableNativeMap();
|
||||||
data.putString("callUUID", getCallUUID());
|
data.putString("callUUID", getCallUUID());
|
||||||
ReactInstanceManagerHolder.emitEvent(
|
RNConnectionService.getInstance().emitEvent(
|
||||||
"org.jitsi.meet:features/connection_service#disconnect",
|
"org.jitsi.meet:features/connection_service#disconnect",
|
||||||
data);
|
data);
|
||||||
// The JavaScript side will not go back to the native with
|
// The JavaScript side will not go back to the native with
|
||||||
@@ -377,7 +378,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
|||||||
JitsiMeetLogger.i(TAG + " onAbort " + getCallUUID());
|
JitsiMeetLogger.i(TAG + " onAbort " + getCallUUID());
|
||||||
WritableNativeMap data = new WritableNativeMap();
|
WritableNativeMap data = new WritableNativeMap();
|
||||||
data.putString("callUUID", getCallUUID());
|
data.putString("callUUID", getCallUUID());
|
||||||
ReactInstanceManagerHolder.emitEvent(
|
RNConnectionService.getInstance().emitEvent(
|
||||||
"org.jitsi.meet:features/connection_service#abort",
|
"org.jitsi.meet:features/connection_service#abort",
|
||||||
data);
|
data);
|
||||||
// The JavaScript side will not go back to the native with
|
// The JavaScript side will not go back to the native with
|
||||||
@@ -406,7 +407,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
|||||||
@Override
|
@Override
|
||||||
public void onCallAudioStateChanged(CallAudioState state) {
|
public void onCallAudioStateChanged(CallAudioState state) {
|
||||||
JitsiMeetLogger.d(TAG + " onCallAudioStateChanged: " + state);
|
JitsiMeetLogger.d(TAG + " onCallAudioStateChanged: " + state);
|
||||||
RNConnectionService module = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
|
RNConnectionService module = RNConnectionService.getInstance();
|
||||||
if (module != null) {
|
if (module != null) {
|
||||||
module.onCallAudioStateChange(state);
|
module.onCallAudioStateChange(state);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ class ExternalAPIModule extends ReactContextBaseJavaModule {
|
|||||||
constants.put("SEND_CHAT_MESSAGE", BroadcastAction.Type.SEND_CHAT_MESSAGE.getAction());
|
constants.put("SEND_CHAT_MESSAGE", BroadcastAction.Type.SEND_CHAT_MESSAGE.getAction());
|
||||||
constants.put("SET_VIDEO_MUTED", BroadcastAction.Type.SET_VIDEO_MUTED.getAction());
|
constants.put("SET_VIDEO_MUTED", BroadcastAction.Type.SET_VIDEO_MUTED.getAction());
|
||||||
constants.put("SET_CLOSED_CAPTIONS_ENABLED", BroadcastAction.Type.SET_CLOSED_CAPTIONS_ENABLED.getAction());
|
constants.put("SET_CLOSED_CAPTIONS_ENABLED", BroadcastAction.Type.SET_CLOSED_CAPTIONS_ENABLED.getAction());
|
||||||
|
constants.put("TOGGLE_CAMERA", BroadcastAction.Type.TOGGLE_CAMERA.getAction());
|
||||||
|
|
||||||
return constants;
|
return constants;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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));
|
|
||||||
}
|
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jitsi.meet.sdk;
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -177,8 +178,11 @@ public class JitsiMeetActivity extends AppCompatActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void leave() {
|
protected void leave() {
|
||||||
Intent hangupBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent();
|
if (this.jitsiView != null) {
|
||||||
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(hangupBroadcastIntent);
|
this.jitsiView.abort();
|
||||||
|
} else {
|
||||||
|
JitsiMeetLogger.w("Cannot leave, view is null");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private @Nullable
|
private @Nullable
|
||||||
@@ -295,6 +299,7 @@ public class JitsiMeetActivity extends AppCompatActivity
|
|||||||
JitsiMeetActivityDelegate.requestPermissions(this, permissions, requestCode, listener);
|
JitsiMeetActivityDelegate.requestPermissions(this, permissions, requestCode, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("MissingSuperCall")
|
||||||
@Override
|
@Override
|
||||||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||||
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.facebook.react.ReactRootView;
|
import com.facebook.react.ReactRootView;
|
||||||
import com.rnimmersive.RNImmersiveModule;
|
|
||||||
|
|
||||||
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
||||||
|
|
||||||
@@ -157,6 +156,14 @@ public class JitsiMeetView extends FrameLayout {
|
|||||||
setProps(options != null ? options.asProps() : new Bundle());
|
setProps(options != null ? options.asProps() : new Bundle());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal method which aborts running RN by passing empty props.
|
||||||
|
* This is only meant to be used from the enclosing Activity's onDestroy.
|
||||||
|
*/
|
||||||
|
public void abort() {
|
||||||
|
setProps(new Bundle());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the {@code ReactRootView} for the given app name with the given
|
* 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}.
|
* props. Once created it's set as the view of this {@code FrameLayout}.
|
||||||
@@ -221,22 +228,4 @@ public class JitsiMeetView extends FrameLayout {
|
|||||||
dispose();
|
dispose();
|
||||||
super.onDetachedFromWindow();
|
super.onDetachedFromWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
package org.jitsi.meet.sdk;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
|
|
||||||
import com.facebook.react.ReactInstanceManager;
|
|
||||||
import com.facebook.react.ReactNativeHost;
|
|
||||||
import com.facebook.react.ReactPackage;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the minimal implementation of ReactNativeHost that will make things like the
|
|
||||||
* Detox testing framework believe we are a "greenfield" app.
|
|
||||||
*
|
|
||||||
* Generally speaking, apps using the SDK (other than the Jitsi Meet app itself) should not
|
|
||||||
* need to use this because the
|
|
||||||
*/
|
|
||||||
public class JitsiReactNativeHost extends ReactNativeHost {
|
|
||||||
public JitsiReactNativeHost(Application application) {
|
|
||||||
super(application);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getUseDeveloperSupport() {
|
|
||||||
// Unused since we override `createReactInstanceManager`.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<ReactPackage> getPackages() {
|
|
||||||
// Unused since we override `createReactInstanceManager`.
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReactInstanceManager createReactInstanceManager() {
|
|
||||||
ReactInstanceManagerHolder.initReactInstanceManager(this.getApplication());
|
|
||||||
|
|
||||||
return ReactInstanceManagerHolder.getReactInstanceManager();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,14 +10,19 @@ import android.telecom.PhoneAccount;
|
|||||||
import android.telecom.PhoneAccountHandle;
|
import android.telecom.PhoneAccountHandle;
|
||||||
import android.telecom.TelecomManager;
|
import android.telecom.TelecomManager;
|
||||||
import android.telecom.VideoProfile;
|
import android.telecom.VideoProfile;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
|
import com.facebook.react.bridge.NativeModule;
|
||||||
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.ReactContext;
|
||||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||||
import com.facebook.react.bridge.ReactMethod;
|
import com.facebook.react.bridge.ReactMethod;
|
||||||
import com.facebook.react.bridge.ReadableMap;
|
import com.facebook.react.bridge.ReadableMap;
|
||||||
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;
|
||||||
|
|
||||||
@@ -35,6 +40,7 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
|||||||
|
|
||||||
private static final String TAG = ConnectionService.TAG;
|
private static final String TAG = ConnectionService.TAG;
|
||||||
|
|
||||||
|
private static RNConnectionService sRNConnectionServiceInstance;
|
||||||
/**
|
/**
|
||||||
* Handler for dealing with call state changes. We are acting as a proxy between ConnectionService
|
* Handler for dealing with call state changes. We are acting as a proxy between ConnectionService
|
||||||
* and other modules such as {@link AudioModeModule}.
|
* and other modules such as {@link AudioModeModule}.
|
||||||
@@ -57,6 +63,11 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
|||||||
|
|
||||||
RNConnectionService(ReactApplicationContext reactContext) {
|
RNConnectionService(ReactApplicationContext reactContext) {
|
||||||
super(reactContext);
|
super(reactContext);
|
||||||
|
sRNConnectionServiceInstance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RNConnectionService getInstance() {
|
||||||
|
return sRNConnectionServiceInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ReactMethod
|
@ReactMethod
|
||||||
@@ -226,4 +237,22 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
|||||||
interface CallAudioStateListener {
|
interface CallAudioStateListener {
|
||||||
void onCallAudioStateChange(android.telecom.CallAudioState callAudioState);
|
void onCallAudioStateChange(android.telecom.CallAudioState callAudioState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to send an event to JavaScript.
|
||||||
|
*
|
||||||
|
* @param eventName {@code String} containing the event name.
|
||||||
|
* @param data {@code Object} optional ancillary data for the event.
|
||||||
|
*/
|
||||||
|
void emitEvent(
|
||||||
|
String eventName,
|
||||||
|
@Nullable Object data) {
|
||||||
|
ReactContext reactContext = getReactApplicationContext();
|
||||||
|
|
||||||
|
if (reactContext != null) {
|
||||||
|
reactContext
|
||||||
|
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
||||||
|
.emit(eventName, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package org.jitsi.meet.sdk;
|
package org.jitsi.meet.sdk;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Application;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -32,17 +31,17 @@ 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.EglUtils;
|
||||||
import com.oney.WebRTCModule.RTCVideoViewManager;
|
import com.oney.WebRTCModule.WebRTCModuleOptions;
|
||||||
import com.oney.WebRTCModule.WebRTCModule;
|
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoDecoderFactory;
|
||||||
|
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoEncoderFactory;
|
||||||
|
|
||||||
import org.devio.rn.splashscreen.SplashScreenModule;
|
import org.devio.rn.splashscreen.SplashScreenModule;
|
||||||
import org.webrtc.EglBase;
|
import org.webrtc.EglBase;
|
||||||
import org.webrtc.audio.AudioDeviceModule;
|
|
||||||
import org.webrtc.audio.JavaAudioDeviceModule;
|
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
class ReactInstanceManagerHolder {
|
class ReactInstanceManagerHolder {
|
||||||
@@ -79,30 +78,11 @@ class ReactInstanceManagerHolder {
|
|||||||
nativeModules.add(new RNConnectionService(reactContext));
|
nativeModules.add(new RNConnectionService(reactContext));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the WebRTC module by hand, since we want to override some
|
|
||||||
// initialization options.
|
|
||||||
WebRTCModule.Options options = new WebRTCModule.Options();
|
|
||||||
|
|
||||||
AudioDeviceModule adm = JavaAudioDeviceModule.builder(reactContext)
|
|
||||||
.setEnableVolumeLogger(false)
|
|
||||||
.createAudioDeviceModule();
|
|
||||||
options.setAudioDeviceModule(adm);
|
|
||||||
|
|
||||||
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
|
||||||
|
|
||||||
options.setVideoDecoderFactory(new WebRTCVideoDecoderFactory(eglContext));
|
|
||||||
options.setVideoEncoderFactory(new WebRTCVideoEncoderFactory(eglContext));
|
|
||||||
|
|
||||||
nativeModules.add(new WebRTCModule(reactContext, options));
|
|
||||||
|
|
||||||
return nativeModules;
|
return nativeModules;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
private static List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||||
return Arrays.<ViewManager>asList(
|
return Collections.emptyList();
|
||||||
// WebRTC, see createNativeModules for details.
|
|
||||||
new RTCVideoViewManager()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static List<ReactPackage> getReactNativePackages() {
|
static List<ReactPackage> getReactNativePackages() {
|
||||||
@@ -122,9 +102,10 @@ class ReactInstanceManagerHolder {
|
|||||||
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.oney.WebRTCModule.WebRTCModulePackage(),
|
||||||
new com.swmansion.gesturehandler.RNGestureHandlerPackage(),
|
new com.swmansion.gesturehandler.RNGestureHandlerPackage(),
|
||||||
new org.linusu.RNGetRandomValuesPackage(),
|
new org.linusu.RNGetRandomValuesPackage(),
|
||||||
new com.rnimmersive.RNImmersivePackage(),
|
new com.rnimmersivemode.RNImmersiveModePackage(),
|
||||||
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(),
|
||||||
@@ -239,35 +220,6 @@ class ReactInstanceManagerHolder {
|
|||||||
return reactInstanceManager;
|
return reactInstanceManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal method to initialize the React Native instance manager. We
|
|
||||||
* create a single instance in order to load the JavaScript bundle a single
|
|
||||||
* time. All {@code ReactRootView} instances will be tied to the one and
|
|
||||||
* only {@code ReactInstanceManager}.
|
|
||||||
*
|
|
||||||
* This method is only meant to be called when integrating with {@code JitsiReactNativeHost}.
|
|
||||||
*
|
|
||||||
* @param app {@code Application} current running Application.
|
|
||||||
*/
|
|
||||||
static void initReactInstanceManager(Application app) {
|
|
||||||
if (reactInstanceManager != null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.d(TAG, "initializing RN with Application");
|
|
||||||
|
|
||||||
reactInstanceManager
|
|
||||||
= ReactInstanceManager.builder()
|
|
||||||
.setApplication(app)
|
|
||||||
.setBundleAssetName("index.android.bundle")
|
|
||||||
.setJSMainModulePath("index.android")
|
|
||||||
.setJavaScriptExecutorFactory(getReactNativeJSFactory())
|
|
||||||
.addPackages(getReactNativePackages())
|
|
||||||
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
|
||||||
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal method to initialize the React Native instance manager. We
|
* Internal method to initialize the React Native instance manager. We
|
||||||
* create a single instance in order to load the JavaScript bundle a single
|
* create a single instance in order to load the JavaScript bundle a single
|
||||||
@@ -281,7 +233,15 @@ class ReactInstanceManagerHolder {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.d(ReactInstanceManagerHolder.class.getCanonicalName(), "initializing RN with Activity");
|
// Initialize the WebRTC module options.
|
||||||
|
WebRTCModuleOptions options = WebRTCModuleOptions.getInstance();
|
||||||
|
|
||||||
|
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
||||||
|
|
||||||
|
options.videoDecoderFactory = new H264AndSoftwareVideoDecoderFactory(eglContext);
|
||||||
|
options.videoEncoderFactory = new H264AndSoftwareVideoEncoderFactory(eglContext);
|
||||||
|
|
||||||
|
Log.d(TAG, "initializing RN with Activity");
|
||||||
|
|
||||||
reactInstanceManager
|
reactInstanceManager
|
||||||
= ReactInstanceManager.builder()
|
= ReactInstanceManager.builder()
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
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()]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
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()]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -27,8 +27,8 @@ include ':react-native-giphy'
|
|||||||
project(':react-native-giphy').projectDir = new File(rootProject.projectDir, '../node_modules/@giphy/react-native-sdk/android')
|
project(':react-native-giphy').projectDir = new File(rootProject.projectDir, '../node_modules/@giphy/react-native-sdk/android')
|
||||||
include ':react-native-google-signin'
|
include ':react-native-google-signin'
|
||||||
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-google-signin/google-signin/android')
|
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-google-signin/google-signin/android')
|
||||||
include ':react-native-immersive'
|
include ':react-native-immersive-mode'
|
||||||
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
|
project(':react-native-immersive-mode').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive-mode/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-orientation-locker'
|
include ':react-native-orientation-locker'
|
||||||
|
|||||||
13
app.js
13
app.js
@@ -18,7 +18,6 @@ import './react/features/base/jitsi-local-storage/setup';
|
|||||||
import conference from './conference';
|
import conference from './conference';
|
||||||
import API from './modules/API';
|
import API from './modules/API';
|
||||||
import UI from './modules/UI/UI';
|
import UI from './modules/UI/UI';
|
||||||
import keyboardshortcut from './modules/keyboardshortcut/keyboardshortcut';
|
|
||||||
import translation from './modules/translation/translation';
|
import translation from './modules/translation/translation';
|
||||||
|
|
||||||
// Initialize Olm as early as possible.
|
// Initialize Olm as early as possible.
|
||||||
@@ -33,23 +32,11 @@ 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
|
||||||
},
|
},
|
||||||
|
|
||||||
keyboardshortcut,
|
|
||||||
translation,
|
translation,
|
||||||
UI
|
UI
|
||||||
};
|
};
|
||||||
|
|||||||
734
conference.js
734
conference.js
File diff suppressed because it is too large
Load Diff
310
config.js
310
config.js
@@ -46,21 +46,40 @@ var config = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// BOSH URL. FIXME: use XEP-0156 to discover it.
|
// BOSH URL. FIXME: use XEP-0156 to discover it.
|
||||||
bosh: '//jitsi-meet.example.com/' + subdir + 'http-bind',
|
bosh: 'https://jitsi-meet.example.com/' + subdir + 'http-bind',
|
||||||
|
|
||||||
// Websocket URL
|
// Websocket URL (XMPP)
|
||||||
// websocket: 'wss://jitsi-meet.example.com/' + subdir + 'xmpp-websocket',
|
// websocket: 'wss://jitsi-meet.example.com/' + subdir + 'xmpp-websocket',
|
||||||
|
|
||||||
|
// Whether BOSH should be preferred over WebSocket if both are configured.
|
||||||
|
// preferBosh: false,
|
||||||
|
|
||||||
// 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.
|
||||||
//
|
//
|
||||||
|
|
||||||
testing: {
|
testing: {
|
||||||
|
// Allows the setting of a custom bandwidth value from the UI.
|
||||||
|
// assumeBandwidth: true,
|
||||||
|
|
||||||
// Disables the End to End Encryption feature. Useful for debugging
|
// Disables the End to End Encryption feature. Useful for debugging
|
||||||
// issues related to insertable streams.
|
// issues related to insertable streams.
|
||||||
// disableE2EE: false,
|
// disableE2EE: false,
|
||||||
@@ -126,9 +145,6 @@ var config = {
|
|||||||
// Media
|
// Media
|
||||||
//
|
//
|
||||||
|
|
||||||
// Enable unified plan implementation support on Chromium based browsers.
|
|
||||||
// enableUnifiedOnChrome: false,
|
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
|
|
||||||
// Disable measuring of audio levels.
|
// Disable measuring of audio levels.
|
||||||
@@ -184,6 +200,22 @@ var config = {
|
|||||||
// enableOpusDtx: false,
|
// enableOpusDtx: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
|
// Noise suppression configuration. By default rnnoise is used. Optionally Krisp
|
||||||
|
// can be used by enabling it below, but the Krisp JS SDK files must be supplied in your
|
||||||
|
// installation. Specifically, these files are needed:
|
||||||
|
// - https://meet.example.com/libs/krisp/krisp.mjs
|
||||||
|
// - https://meet.example.com/libs/krisp/models/model_8.kw
|
||||||
|
// - https://meet.example.com/libs/krisp/models/model_16.kw
|
||||||
|
// - https://meet.example.com/libs/krisp/models/model_32.kw
|
||||||
|
// NOTE: Krisp JS SDK v1.0.9 was tested.
|
||||||
|
// noiseSuppression: {
|
||||||
|
// krisp: {
|
||||||
|
// enabled: false,
|
||||||
|
// logProcessStats: false,
|
||||||
|
// debugLogs: false,
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
|
||||||
// Video
|
// Video
|
||||||
|
|
||||||
// Sets the preferred resolution (height) for local video. Defaults to 720.
|
// Sets the preferred resolution (height) for local video. Defaults to 720.
|
||||||
@@ -244,12 +276,6 @@ var config = {
|
|||||||
// Enable / disable simulcast support.
|
// Enable / disable simulcast support.
|
||||||
// disableSimulcast: false,
|
// disableSimulcast: false,
|
||||||
|
|
||||||
// Enable / disable layer suspension. If enabled, endpoints whose HD layers are not in use will be suspended
|
|
||||||
// (no longer sent) until they are requested again. This is enabled by default. This must be enabled for screen
|
|
||||||
// sharing to work as expected on Chrome. Disabling this might result in low resolution screenshare being sent
|
|
||||||
// by the client.
|
|
||||||
// enableLayerSuspension: false,
|
|
||||||
|
|
||||||
// Every participant after the Nth will start video muted.
|
// Every participant after the Nth will start video muted.
|
||||||
// startVideoMuted: 10,
|
// startVideoMuted: 10,
|
||||||
|
|
||||||
@@ -402,43 +428,11 @@ var config = {
|
|||||||
// value will be used when the quality level is selected using "Manage Video Quality" slider.
|
// value will be used when the quality level is selected using "Manage Video Quality" slider.
|
||||||
// startLastN: 1,
|
// startLastN: 1,
|
||||||
|
|
||||||
// Provides a way to use different "last N" values based on the number of participants in the conference.
|
|
||||||
// The keys in an Object represent number of participants and the values are "last N" to be used when number of
|
|
||||||
// participants gets to or above the number.
|
|
||||||
//
|
|
||||||
// For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than
|
|
||||||
// 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN'
|
|
||||||
// will be used as default until the first threshold is reached.
|
|
||||||
//
|
|
||||||
// lastNLimits: {
|
|
||||||
// 5: 20,
|
|
||||||
// 30: 15,
|
|
||||||
// 50: 10,
|
|
||||||
// 70: 5,
|
|
||||||
// 90: 2,
|
|
||||||
// },
|
|
||||||
|
|
||||||
// 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
|
|
||||||
// // here will be removed from the list of codecs present in the SDP answer generated by the client. If the
|
|
||||||
// // same codec is specified for both the disabled and preferred option, the disable settings will prevail.
|
|
||||||
// // Note that 'VP8' cannot be disabled since it's a mandatory codec, the setting will be ignored in this case.
|
|
||||||
// disabledCodec: 'H264',
|
|
||||||
//
|
//
|
||||||
// // Provides a way to set a preferred video codec for the JVB connection. If 'H264' is specified here,
|
// // Provides a way to set the codec preference on desktop based endpoints.
|
||||||
// // simulcast will be automatically disabled since JVB doesn't support H264 simulcast yet. This will only
|
// codecPreferenceOrder: [ 'VP9', 'VP8', 'H264' ],
|
||||||
// // rearrange the the preference order of the codecs in the SDP answer generated by the browser only if the
|
|
||||||
// // preferred codec specified here is present. Please ensure that the JVB offers the specified codec for this
|
|
||||||
// // to take effect.
|
|
||||||
// preferredCodec: 'VP8',
|
|
||||||
//
|
|
||||||
// // Provides a way to enforce the preferred codec for the conference even when the conference has endpoints
|
|
||||||
// // that do not support the preferred codec. For example, older versions of Safari do not support VP9 yet.
|
|
||||||
// // This will result in Safari not being able to decode video from endpoints sending VP9 video.
|
|
||||||
// // When set to false, the conference falls back to VP8 whenever there is an endpoint that doesn't support the
|
|
||||||
// // preferred codec and goes back to the preferred codec when that endpoint leaves.
|
|
||||||
// enforcePreferredCodec: false,
|
|
||||||
//
|
//
|
||||||
// // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for
|
// // 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
|
||||||
@@ -478,6 +472,24 @@ var config = {
|
|||||||
// 720: 'high',
|
// 720: 'high',
|
||||||
// },
|
// },
|
||||||
//
|
//
|
||||||
|
// // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based endpoint
|
||||||
|
// mobileCodecPreferenceOrder: [ 'VP8', 'VP9', 'H264' ],
|
||||||
|
//
|
||||||
|
// // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
|
||||||
|
// // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified
|
||||||
|
// // here will be removed from the list of codecs present in the SDP answer generated by the client. If the
|
||||||
|
// // same codec is specified for both the disabled and preferred option, the disable settings will prevail.
|
||||||
|
// // Note that 'VP8' cannot be disabled since it's a mandatory codec, the setting will be ignored in this case.
|
||||||
|
// disabledCodec: 'H264',
|
||||||
|
//
|
||||||
|
// // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
|
||||||
|
// // Provides a way to set a preferred video codec for the JVB connection. If 'H264' is specified here,
|
||||||
|
// // simulcast will be automatically disabled since JVB doesn't support H264 simulcast yet. This will only
|
||||||
|
// // rearrange the the preference order of the codecs in the SDP answer generated by the browser only if the
|
||||||
|
// // preferred codec specified here is present. Please ensure that the JVB offers the specified codec for this
|
||||||
|
// // to take effect.
|
||||||
|
// preferredCodec: 'VP8',
|
||||||
|
//
|
||||||
// },
|
// },
|
||||||
|
|
||||||
// Notification timeouts
|
// Notification timeouts
|
||||||
@@ -561,6 +573,9 @@ var config = {
|
|||||||
// Require users to always specify a display name.
|
// Require users to always specify a display name.
|
||||||
// requireDisplayName: true,
|
// requireDisplayName: true,
|
||||||
|
|
||||||
|
// Enables webhid functionality for Audio.
|
||||||
|
// enableWebHIDFeature: false,
|
||||||
|
|
||||||
// DEPRECATED! Use 'welcomePage.disabled' instead.
|
// 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.
|
||||||
@@ -576,7 +591,7 @@ var config = {
|
|||||||
// },
|
// },
|
||||||
|
|
||||||
// Configs for the lobby screen.
|
// Configs for the lobby screen.
|
||||||
// lobby {
|
// lobby: {
|
||||||
// // If Lobby is enabled, it starts knocking automatically. Replaces `autoKnockLobby`.
|
// // If Lobby is enabled, it starts knocking automatically. Replaces `autoKnockLobby`.
|
||||||
// autoKnock: false,
|
// autoKnock: false,
|
||||||
// // Enables the lobby chat. Replaces `enableLobbyChat`.
|
// // Enables the lobby chat. Replaces `enableLobbyChat`.
|
||||||
@@ -620,6 +635,7 @@ var config = {
|
|||||||
// hideDominantSpeakerBadge: false,
|
// hideDominantSpeakerBadge: false,
|
||||||
|
|
||||||
// Default language for the user interface. Cannot be overwritten.
|
// Default language for the user interface. Cannot be overwritten.
|
||||||
|
// DEPRECATED! Use the `lang` iframe option directly instead.
|
||||||
// defaultLanguage: 'en',
|
// defaultLanguage: 'en',
|
||||||
|
|
||||||
// Disables profile and the edit of all fields from the profile settings (display name and email)
|
// Disables profile and the edit of all fields from the profile settings (display name and email)
|
||||||
@@ -814,6 +830,42 @@ var config = {
|
|||||||
// 'whiteboard',
|
// 'whiteboard',
|
||||||
// ],
|
// ],
|
||||||
|
|
||||||
|
// Participant context menu buttons which have their click/tap event exposed through the API on
|
||||||
|
// `participantMenuButtonClick`. Passing a string for the button key will
|
||||||
|
// prevent execution of the click/tap routine; passing an object with `key` and
|
||||||
|
// `preventExecution` flag on false will not prevent execution of the click/tap
|
||||||
|
// routine. Below array with mixed mode for passing the buttons.
|
||||||
|
// participantMenuButtonsWithNotifyClick: [
|
||||||
|
// 'allow-video',
|
||||||
|
// {
|
||||||
|
// key: 'ask-unmute',
|
||||||
|
// preventExecution: false
|
||||||
|
// },
|
||||||
|
// 'conn-status',
|
||||||
|
// 'flip-local-video',
|
||||||
|
// 'grant-moderator',
|
||||||
|
// {
|
||||||
|
// key: 'kick',
|
||||||
|
// preventExecution: true
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// key: 'hide-self-view',
|
||||||
|
// preventExecution: false
|
||||||
|
// },
|
||||||
|
// 'mute',
|
||||||
|
// 'mute-others',
|
||||||
|
// 'mute-others-video',
|
||||||
|
// 'mute-video',
|
||||||
|
// 'pinToStage',
|
||||||
|
// 'privateMessage',
|
||||||
|
// {
|
||||||
|
// key: 'remote-control',
|
||||||
|
// preventExecution: false
|
||||||
|
// },
|
||||||
|
// 'send-participant-to-room',
|
||||||
|
// 'verify',
|
||||||
|
// ],
|
||||||
|
|
||||||
// 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: [],
|
||||||
@@ -823,7 +875,7 @@ var config = {
|
|||||||
// customParticipantMenuButtons: [],
|
// customParticipantMenuButtons: [],
|
||||||
|
|
||||||
// An array with custom option buttons for the toolbar
|
// An array with custom option buttons for the toolbar
|
||||||
// type: Array<{ icon: string; id: string; text: string; }>
|
// type: Array<{ icon: string; id: string; text: string; backgroundColor?: string; }>
|
||||||
// customToolbarButtons: [],
|
// customToolbarButtons: [],
|
||||||
|
|
||||||
// Stats
|
// Stats
|
||||||
@@ -917,9 +969,6 @@ var config = {
|
|||||||
// connection.
|
// connection.
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
|
||||||
// Enable unified plan implementation support on Chromium for p2p connection.
|
|
||||||
// enableUnifiedOnChrome: false,
|
|
||||||
|
|
||||||
// Sets the ICE transport policy for the p2p connection. At the time
|
// Sets the ICE transport policy for the p2p connection. At the time
|
||||||
// of this writing the list of possible values are 'all' and 'relay',
|
// of this writing the list of possible values are 'all' and 'relay',
|
||||||
// but that is subject to change in the future. The enum is defined in
|
// but that is subject to change in the future. The enum is defined in
|
||||||
@@ -928,12 +977,12 @@ var config = {
|
|||||||
// If not set, the effective value is 'all'.
|
// If not set, the effective value is 'all'.
|
||||||
// iceTransportPolicy: 'all',
|
// iceTransportPolicy: 'all',
|
||||||
|
|
||||||
// Provides a way to set the video codec preference on the p2p connection. Acceptable
|
// Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based
|
||||||
// codec values are 'VP8', 'VP9' and 'H264'.
|
// endpoints.
|
||||||
// preferredCodec: 'H264',
|
// mobileCodecPreferenceOrder: [ 'H264', 'VP8', 'VP9' ],
|
||||||
|
//
|
||||||
// Provides a way to prevent a video codec from being negotiated on the p2p connection.
|
// Provides a way to set the codec preference on desktop based endpoints.
|
||||||
// disabledCodec: '',
|
// codecPreferenceOrder: [ 'VP9', 'VP8', 'H264 ],
|
||||||
|
|
||||||
// How long we're going to wait, before going back to P2P after the 3rd
|
// How long we're going to wait, before going back to P2P after the 3rd
|
||||||
// participant has left the conference (to filter out page reload).
|
// participant has left the conference (to filter out page reload).
|
||||||
@@ -945,6 +994,15 @@ var config = {
|
|||||||
// { 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' },
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
|
||||||
|
// Provides a way to set the video codec preference on the p2p connection. Acceptable
|
||||||
|
// codec values are 'VP8', 'VP9' and 'H264'.
|
||||||
|
// preferredCodec: 'H264',
|
||||||
|
|
||||||
|
// DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead.
|
||||||
|
// Provides a way to prevent a video codec from being negotiated on the p2p connection.
|
||||||
|
// disabledCodec: '',
|
||||||
},
|
},
|
||||||
|
|
||||||
analytics: {
|
analytics: {
|
||||||
@@ -961,6 +1019,10 @@ var config = {
|
|||||||
// The Amplitude APP Key:
|
// The Amplitude APP Key:
|
||||||
// amplitudeAPPKey: '<APP_KEY>',
|
// amplitudeAPPKey: '<APP_KEY>',
|
||||||
|
|
||||||
|
// Enables Amplitude UTM tracking:
|
||||||
|
// Default value is false.
|
||||||
|
// amplitudeIncludeUTM: false,
|
||||||
|
|
||||||
// Obfuscates room name sent to analytics (amplitude, rtcstats)
|
// Obfuscates room name sent to analytics (amplitude, rtcstats)
|
||||||
// Default value is false.
|
// Default value is false.
|
||||||
// obfuscateRoomName: false,
|
// obfuscateRoomName: false,
|
||||||
@@ -990,6 +1052,11 @@ var config = {
|
|||||||
// "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",
|
||||||
// ],
|
// ],
|
||||||
|
|
||||||
|
// By enabling watchRTCEnabled option you would want to use watchRTC feature
|
||||||
|
// This would also require to configure watchRTCConfigParams.
|
||||||
|
// Please remember to keep rtcstatsEnabled disabled for watchRTC to work.
|
||||||
|
// watchRTCEnabled: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
// Logs that should go be passed through the 'log' event if a handler is defined for it
|
// Logs that should go be passed through the 'log' event if a handler is defined for it
|
||||||
@@ -1061,7 +1128,12 @@ var config = {
|
|||||||
// },
|
// },
|
||||||
|
|
||||||
// e2ee: {
|
// e2ee: {
|
||||||
// labels,
|
// labels: {
|
||||||
|
// description: '',
|
||||||
|
// label: '',
|
||||||
|
// tooltip: '',
|
||||||
|
// warning: '',
|
||||||
|
// },
|
||||||
// externallyManagedKey: false,
|
// externallyManagedKey: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
@@ -1146,6 +1218,13 @@ var config = {
|
|||||||
// }
|
// }
|
||||||
// },
|
// },
|
||||||
|
|
||||||
|
// // 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,
|
||||||
@@ -1223,6 +1302,16 @@ var config = {
|
|||||||
// A list of images that can be used as video backgrounds.
|
// A list of images that can be used as video backgrounds.
|
||||||
// When this field is present, the default images will be replaced with those provided.
|
// When this field is present, the default images will be replaced with those provided.
|
||||||
virtualBackgrounds: ['https://example.com/img.jpg'],
|
virtualBackgrounds: ['https://example.com/img.jpg'],
|
||||||
|
// Object containing customized icons that should replace the default ones.
|
||||||
|
// The keys need to be the exact same icon names used in here:
|
||||||
|
// https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/icons/svg/index.ts
|
||||||
|
// To avoid having the icons trimmed or displayed in an unexpected way, please provide svg
|
||||||
|
// files containing svg xml icons in the size that the default icons come in.
|
||||||
|
customIcons: {
|
||||||
|
IconArrowUp: 'https://example.com/arrow-up.svg',
|
||||||
|
IconDownload: 'https://example.com/download.svg',
|
||||||
|
IconRemoteControlStart: 'https://example.com/remote-start.svg',
|
||||||
|
},
|
||||||
// Object containing a theme's properties. It also supports partial overwrites of the main theme.
|
// Object containing a theme's properties. It also supports partial overwrites of the main theme.
|
||||||
// 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
|
||||||
@@ -1238,7 +1327,6 @@ var config = {
|
|||||||
ui03: "violet",
|
ui03: "violet",
|
||||||
ui04: "magenta",
|
ui04: "magenta",
|
||||||
ui05: "blueviolet",
|
ui05: "blueviolet",
|
||||||
field02Hover: 'red',
|
|
||||||
action01: 'green',
|
action01: 'green',
|
||||||
action01Hover: 'lightgreen',
|
action01Hover: 'lightgreen',
|
||||||
disabled01: 'beige',
|
disabled01: 'beige',
|
||||||
@@ -1277,6 +1365,9 @@ var config = {
|
|||||||
// hideJoinRoomButton: false,
|
// hideJoinRoomButton: false,
|
||||||
// },
|
// },
|
||||||
|
|
||||||
|
// When true, virtual background feature will be disabled.
|
||||||
|
// disableVirtualBackground: 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.
|
||||||
// Only the default ones from will be available.
|
// Only the default ones from will be available.
|
||||||
// disableAddingBackgroundImages: false,
|
// disableAddingBackgroundImages: false,
|
||||||
@@ -1354,6 +1445,31 @@ var config = {
|
|||||||
// 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)
|
||||||
|
|
||||||
|
// You can use external service for authentication that will redirect back passing a jwt token
|
||||||
|
// You can use tokenAuthUrl config to point to a URL of such service.
|
||||||
|
// The URL for the service supports few params which will be filled in by the code.
|
||||||
|
// tokenAuthUrl:
|
||||||
|
// 'https://myservice.com/auth/{room}?code_challenge_method=S256&code_challenge={code_challenge}&state={state}'
|
||||||
|
// Supported parameters in tokenAuthUrl:
|
||||||
|
// {room} - will be replaced with the room name
|
||||||
|
// {code_challenge} - (A web only). A oauth 2.0 code challenge that will be sent to the service. See:
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc7636. The code verifier will be saved in the sessionStorage
|
||||||
|
// under key: 'code_verifier'.
|
||||||
|
// {state} - A json with the current state before redirecting. Keys that are included in the state:
|
||||||
|
// - room (The current room name as shown in the address bar)
|
||||||
|
// - roomSafe (the backend safe room name to use (lowercase), that is passed to the backend)
|
||||||
|
// - tenant (The tenant if any)
|
||||||
|
// - config.xxx (all config overrides)
|
||||||
|
// - interfaceConfig.xxx (all interfaceConfig overrides)
|
||||||
|
// - ios=true (in case ios mobile app is used)
|
||||||
|
// - android=true (in case android mobile app is used)
|
||||||
|
// - electron=true (when web is loaded in electron app)
|
||||||
|
// If there is a logout service you can specify its URL with:
|
||||||
|
// tokenLogoutUrl: 'https://myservice.com/logout'
|
||||||
|
// You can enable tokenAuthUrlAutoRedirect which will detect that you have logged in successfully before
|
||||||
|
// and will automatically redirect to the token service to get the token for the meeting.
|
||||||
|
// tokenAuthUrlAutoRedirect: false
|
||||||
|
|
||||||
// List of undocumented settings used in jitsi-meet
|
// List of undocumented settings used in jitsi-meet
|
||||||
/**
|
/**
|
||||||
_immediateReloadThreshold
|
_immediateReloadThreshold
|
||||||
@@ -1365,8 +1481,6 @@ var config = {
|
|||||||
dialOutRegionUrl
|
dialOutRegionUrl
|
||||||
disableRemoteControl
|
disableRemoteControl
|
||||||
displayJids
|
displayJids
|
||||||
externalConnectUrl
|
|
||||||
e2eeLabels
|
|
||||||
firefox_fake_device
|
firefox_fake_device
|
||||||
googleApiApplicationClientID
|
googleApiApplicationClientID
|
||||||
iAmRecorder
|
iAmRecorder
|
||||||
@@ -1375,7 +1489,6 @@ var config = {
|
|||||||
peopleSearchQueryTypes
|
peopleSearchQueryTypes
|
||||||
peopleSearchUrl
|
peopleSearchUrl
|
||||||
requireDisplayName
|
requireDisplayName
|
||||||
tokenAuthUrl
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1389,7 +1502,6 @@ var config = {
|
|||||||
/**
|
/**
|
||||||
_peerConnStatusOutOfLastNTimeout
|
_peerConnStatusOutOfLastNTimeout
|
||||||
_peerConnStatusRtcMuteTimeout
|
_peerConnStatusRtcMuteTimeout
|
||||||
abTesting
|
|
||||||
avgRtpStatsN
|
avgRtpStatsN
|
||||||
callStatsConfIDNamespace
|
callStatsConfIDNamespace
|
||||||
callStatsCustomScriptUrl
|
callStatsCustomScriptUrl
|
||||||
@@ -1398,9 +1510,9 @@ var config = {
|
|||||||
disableAGC
|
disableAGC
|
||||||
disableAP
|
disableAP
|
||||||
disableHPF
|
disableHPF
|
||||||
|
disableLocalStats
|
||||||
disableNS
|
disableNS
|
||||||
enableTalkWhileMuted
|
enableTalkWhileMuted
|
||||||
forceJVB121Ratio
|
|
||||||
forceTurnRelay
|
forceTurnRelay
|
||||||
hiddenDomain
|
hiddenDomain
|
||||||
hiddenFromRecorderFeatureEnabled
|
hiddenFromRecorderFeatureEnabled
|
||||||
@@ -1424,6 +1536,7 @@ var config = {
|
|||||||
*/
|
*/
|
||||||
// notifications: [
|
// notifications: [
|
||||||
// 'connection.CONNFAIL', // shown when the connection fails,
|
// 'connection.CONNFAIL', // shown when the connection fails,
|
||||||
|
// 'dialog.cameraConstraintFailedError', // shown when the camera failed
|
||||||
// 'dialog.cameraNotSendingData', // shown when there's no feed from user's camera
|
// 'dialog.cameraNotSendingData', // shown when there's no feed from user's camera
|
||||||
// 'dialog.kickTitle', // shown when user has been kicked
|
// 'dialog.kickTitle', // shown when user has been kicked
|
||||||
// 'dialog.liveStreaming', // livestreaming notifications (pending, on, off, limits)
|
// 'dialog.liveStreaming', // livestreaming notifications (pending, on, off, limits)
|
||||||
@@ -1434,10 +1547,12 @@ var config = {
|
|||||||
// 'dialog.recording', // recording notifications (pending, on, off, limits)
|
// 'dialog.recording', // recording notifications (pending, on, off, limits)
|
||||||
// 'dialog.remoteControlTitle', // remote control notifications (allowed, denied, start, stop, error)
|
// 'dialog.remoteControlTitle', // remote control notifications (allowed, denied, start, stop, error)
|
||||||
// 'dialog.reservationError',
|
// 'dialog.reservationError',
|
||||||
|
// 'dialog.screenSharingFailedTitle', // shown when the screen sharing failed
|
||||||
// 'dialog.serviceUnavailable', // shown when server is not reachable
|
// 'dialog.serviceUnavailable', // shown when server is not reachable
|
||||||
// 'dialog.sessTerminated', // shown when there is a failed conference session
|
// 'dialog.sessTerminated', // shown when there is a failed conference session
|
||||||
// 'dialog.sessionRestarted', // show when a client reload is initiated because of bridge migration
|
// 'dialog.sessionRestarted', // show when a client reload is initiated because of bridge migration
|
||||||
// 'dialog.tokenAuthFailed', // show when an invalid jwt is used
|
// 'dialog.tokenAuthFailed', // show when an invalid jwt is used
|
||||||
|
// 'dialog.tokenAuthFailedWithReasons', // show when an invalid jwt is used with the reason behind the error
|
||||||
// 'dialog.transcribing', // transcribing notifications (pending, off)
|
// 'dialog.transcribing', // transcribing notifications (pending, off)
|
||||||
// 'dialOut.statusMessage', // shown when dial out status is updated.
|
// 'dialOut.statusMessage', // shown when dial out status is updated.
|
||||||
// 'liveStreaming.busy', // shown when livestreaming service is busy
|
// 'liveStreaming.busy', // shown when livestreaming service is busy
|
||||||
@@ -1445,37 +1560,45 @@ var config = {
|
|||||||
// 'liveStreaming.unavailableTitle', // shown when livestreaming service is not reachable
|
// 'liveStreaming.unavailableTitle', // shown when livestreaming service is not reachable
|
||||||
// 'lobby.joinRejectedMessage', // shown when while in a lobby, user's request to join is rejected
|
// 'lobby.joinRejectedMessage', // shown when while in a lobby, user's request to join is rejected
|
||||||
// 'lobby.notificationTitle', // shown when lobby is toggled and when join requests are allowed / denied
|
// 'lobby.notificationTitle', // shown when lobby is toggled and when join requests are allowed / denied
|
||||||
|
// 'notify.audioUnmuteBlockedTitle', // shown when mic unmute blocked
|
||||||
// 'notify.chatMessages', // shown when receiving chat messages while the chat window is closed
|
// 'notify.chatMessages', // shown when receiving chat messages while the chat window is closed
|
||||||
// 'notify.disconnected', // shown when a participant has left
|
|
||||||
// 'notify.connectedOneMember', // show when a participant joined
|
// 'notify.connectedOneMember', // show when a participant joined
|
||||||
// 'notify.connectedTwoMembers', // show when two participants joined simultaneously
|
|
||||||
// 'notify.connectedThreePlusMembers', // show when more than 2 participants joined simultaneously
|
// 'notify.connectedThreePlusMembers', // show when more than 2 participants joined simultaneously
|
||||||
// 'notify.leftOneMember', // show when a participant left
|
// 'notify.connectedTwoMembers', // show when two participants joined simultaneously
|
||||||
// 'notify.leftTwoMembers', // show when two participants left simultaneously
|
// 'notify.dataChannelClosed', // shown when the bridge channel has been disconnected
|
||||||
// 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously
|
|
||||||
// 'notify.grantedTo', // shown when moderator rights were granted to a participant
|
|
||||||
// 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute
|
// 'notify.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
|
||||||
// 'notify.kickParticipant', // shown when a participant is kicked
|
// 'notify.kickParticipant', // shown when a participant is kicked
|
||||||
|
// 'notify.leftOneMember', // show when a participant left
|
||||||
|
// 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously
|
||||||
|
// 'notify.leftTwoMembers', // show when two participants left simultaneously
|
||||||
// 'notify.linkToSalesforce', // shown when joining a meeting with salesforce integration
|
// 'notify.linkToSalesforce', // shown when joining a meeting with salesforce integration
|
||||||
// 'notify.moderationStartedTitle', // shown when AV moderation is activated
|
// 'notify.localRecordingStarted', // shown when the local recording has been started
|
||||||
// 'notify.moderationStoppedTitle', // shown when AV moderation is deactivated
|
// 'notify.localRecordingStopped', // shown when the local recording has been stopped
|
||||||
|
// 'notify.moderationInEffectCSTitle', // shown when user attempts to share content during AV moderation
|
||||||
// 'notify.moderationInEffectTitle', // shown when user attempts to unmute audio during AV moderation
|
// 'notify.moderationInEffectTitle', // shown when user attempts to unmute audio during AV moderation
|
||||||
// 'notify.moderationInEffectVideoTitle', // shown when user attempts to enable video during AV moderation
|
// 'notify.moderationInEffectVideoTitle', // shown when user attempts to enable video during AV moderation
|
||||||
// 'notify.moderationInEffectCSTitle', // shown when user attempts to share content during AV moderation
|
// 'notify.moderator', // shown when user gets moderator privilege
|
||||||
// 'notify.mutedRemotelyTitle', // shown when user is muted by a remote party
|
// 'notify.mutedRemotelyTitle', // shown when user is muted by a remote party
|
||||||
// 'notify.mutedTitle', // shown when user has been muted upon joining,
|
// 'notify.mutedTitle', // shown when user has been muted upon joining,
|
||||||
// 'notify.newDeviceAudioTitle', // prompts the user to use a newly detected audio device
|
// 'notify.newDeviceAudioTitle', // prompts the user to use a newly detected audio device
|
||||||
// 'notify.newDeviceCameraTitle', // prompts the user to use a newly detected camera
|
// 'notify.newDeviceCameraTitle', // prompts the user to use a newly detected camera
|
||||||
|
// 'notify.noiseSuppressionFailedTitle', // shown when failed to start noise suppression
|
||||||
// 'notify.participantWantsToJoin', // shown when lobby is enabled and participant requests to join meeting
|
// 'notify.participantWantsToJoin', // shown when lobby is enabled and participant requests to join meeting
|
||||||
|
// 'notify.participantsWantToJoin', // shown when lobby is enabled and participants request to join meeting
|
||||||
// 'notify.passwordRemovedRemotely', // shown when a password has been removed remotely
|
// 'notify.passwordRemovedRemotely', // shown when a password has been removed remotely
|
||||||
// 'notify.passwordSetRemotely', // shown when a password has been set remotely
|
// 'notify.passwordSetRemotely', // shown when a password has been set remotely
|
||||||
// 'notify.raisedHand', // shown when a partcipant used raise hand,
|
// 'notify.raisedHand', // shown when a partcipant used raise hand,
|
||||||
|
// 'notify.screenShareNoAudio', // shown when the audio could not be shared for the selected screen
|
||||||
|
// 'notify.screenSharingAudioOnlyTitle', // shown when the best performance has been affected by screen sharing
|
||||||
|
// 'notify.selfViewTitle', // show "You can always un-hide the self-view from settings"
|
||||||
// 'notify.startSilentTitle', // shown when user joined with no audio
|
// 'notify.startSilentTitle', // shown when user joined with no audio
|
||||||
|
// 'notify.suboptimalExperienceTitle', // show the browser warning
|
||||||
// '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.videoMutedRemotelyTitle', // shown when user's video is muted by a remote party,
|
// 'notify.videoMutedRemotelyTitle', // shown when user's video is muted by a remote party,
|
||||||
|
// 'notify.videoUnmuteBlockedTitle', // shown when camera unmute and desktop sharing are blocked
|
||||||
// 'prejoin.errorDialOut',
|
// 'prejoin.errorDialOut',
|
||||||
// 'prejoin.errorDialOutDisconnected',
|
// 'prejoin.errorDialOutDisconnected',
|
||||||
// 'prejoin.errorDialOutFailed',
|
// 'prejoin.errorDialOutFailed',
|
||||||
@@ -1498,6 +1621,8 @@ var config = {
|
|||||||
// disableFilmstripAutohiding: false,
|
// disableFilmstripAutohiding: false,
|
||||||
|
|
||||||
// filmstrip: {
|
// filmstrip: {
|
||||||
|
// // Disable the vertical/horizonal filmstrip.
|
||||||
|
// disabled: false,
|
||||||
// // Disables user resizable filmstrip. Also, allows configuration of the filmstrip
|
// // Disables user resizable filmstrip. Also, allows configuration of the filmstrip
|
||||||
// // (width, tiles aspect ratios) through the interfaceConfig options.
|
// // (width, tiles aspect ratios) through the interfaceConfig options.
|
||||||
// disableResizable: false,
|
// disableResizable: false,
|
||||||
@@ -1520,6 +1645,8 @@ var config = {
|
|||||||
|
|
||||||
// Tile view related config options.
|
// Tile view related config options.
|
||||||
// tileView: {
|
// tileView: {
|
||||||
|
// // Whether tileview should be disabled.
|
||||||
|
// disabled: false,
|
||||||
// // 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,
|
||||||
@@ -1571,6 +1698,45 @@ var config = {
|
|||||||
// // The server used to support whiteboard collaboration.
|
// // The server used to support whiteboard collaboration.
|
||||||
// // https://github.com/jitsi/excalidraw-backend
|
// // https://github.com/jitsi/excalidraw-backend
|
||||||
// collabServerBaseUrl: 'https://excalidraw-backend.example.com',
|
// collabServerBaseUrl: 'https://excalidraw-backend.example.com',
|
||||||
|
// // The user access limit to the whiteboard, introduced as a means
|
||||||
|
// // to control the performance.
|
||||||
|
// userLimit: 25,
|
||||||
|
// // The url for more info about the whiteboard and its usage limitations.
|
||||||
|
// limitUrl: 'https://example.com/blog/whiteboard-limits,
|
||||||
|
// },
|
||||||
|
|
||||||
|
// The watchRTC initialize config params as described :
|
||||||
|
// https://testrtc.com/docs/installing-the-watchrtc-javascript-sdk/#h-set-up-the-sdk
|
||||||
|
// https://www.npmjs.com/package/@testrtc/watchrtc-sdk
|
||||||
|
// watchRTCConfigParams: {
|
||||||
|
// /** Watchrtc api key */
|
||||||
|
// rtcApiKey: string;
|
||||||
|
// /** Identifier for the session */
|
||||||
|
// rtcRoomId?: string;
|
||||||
|
// /** Identifier for the current peer */
|
||||||
|
// rtcPeerId?: string;
|
||||||
|
// /**
|
||||||
|
// * ["tag1", "tag2", "tag3"]
|
||||||
|
// * @deprecated use 'keys' instead
|
||||||
|
// */
|
||||||
|
// rtcTags?: string[];
|
||||||
|
// /** { "key1": "value1", "key2": "value2"} */
|
||||||
|
// keys?: any;
|
||||||
|
// /** Enables additional logging */
|
||||||
|
// debug?: boolean;
|
||||||
|
// rtcToken?: string;
|
||||||
|
// /**
|
||||||
|
// * @deprecated No longer needed. Use "proxyUrl" instead.
|
||||||
|
// */
|
||||||
|
// wsUrl?: string;
|
||||||
|
// proxyUrl?: string;
|
||||||
|
// console?: {
|
||||||
|
// level: string;
|
||||||
|
// override: boolean;
|
||||||
|
// };
|
||||||
|
// allowBrowserLogCollection?: boolean;
|
||||||
|
// collectionInterval?: number;
|
||||||
|
// logGetStats?: boolean;
|
||||||
// },
|
// },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
254
connection.js
254
connection.js
@@ -1,254 +0,0 @@
|
|||||||
/* global APP, JitsiMeetJS, config */
|
|
||||||
|
|
||||||
import { jitsiLocalStorage } from '@jitsi/js-utils';
|
|
||||||
import Logger from '@jitsi/logger';
|
|
||||||
|
|
||||||
import { redirectToTokenAuthService } from './modules/UI/authentication/AuthHandler';
|
|
||||||
import { LoginDialog } from './react/features/authentication/components';
|
|
||||||
import { isTokenAuthEnabled } from './react/features/authentication/functions';
|
|
||||||
import {
|
|
||||||
connectionEstablished,
|
|
||||||
connectionFailed,
|
|
||||||
constructOptions
|
|
||||||
} from './react/features/base/connection/actions.web';
|
|
||||||
import { openDialog } from './react/features/base/dialog/actions';
|
|
||||||
import { setJWT } from './react/features/base/jwt';
|
|
||||||
import {
|
|
||||||
JitsiConnectionErrors,
|
|
||||||
JitsiConnectionEvents
|
|
||||||
} from './react/features/base/lib-jitsi-meet';
|
|
||||||
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
|
|
||||||
import { getCustomerDetails } from './react/features/jaas/actions.any';
|
|
||||||
import { getJaasJWT, isVpaasMeeting } from './react/features/jaas/functions';
|
|
||||||
import {
|
|
||||||
setPrejoinDisplayNameRequired
|
|
||||||
} from './react/features/prejoin/actions';
|
|
||||||
const logger = Logger.getLogger(__filename);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The feature announced so we can distinguish jibri participants.
|
|
||||||
*
|
|
||||||
* @type {string}
|
|
||||||
*/
|
|
||||||
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.
|
|
||||||
* @param {string} [id]
|
|
||||||
* @param {string} [password]
|
|
||||||
* @returns {Promise<JitsiConnection>} connection if
|
|
||||||
* everything is ok, else error.
|
|
||||||
*/
|
|
||||||
export async function connect(id, password) {
|
|
||||||
const state = APP.store.getState();
|
|
||||||
let { jwt } = state['features/base/jwt'];
|
|
||||||
const { iAmRecorder, iAmSipGateway } = state['features/base/config'];
|
|
||||||
|
|
||||||
if (!iAmRecorder && !iAmSipGateway && isVpaasMeeting(state)) {
|
|
||||||
await APP.store.dispatch(getCustomerDetails());
|
|
||||||
|
|
||||||
if (!jwt) {
|
|
||||||
jwt = await getJaasJWT(state);
|
|
||||||
APP.store.dispatch(setJWT(jwt));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const connection = new JitsiMeetJS.JitsiConnection(null, jwt, constructOptions(state));
|
|
||||||
|
|
||||||
if (config.iAmRecorder) {
|
|
||||||
connection.addFeature(DISCO_JIBRI_FEATURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
connection.addEventListener(
|
|
||||||
JitsiConnectionEvents.CONNECTION_ESTABLISHED,
|
|
||||||
handleConnectionEstablished);
|
|
||||||
connection.addEventListener(
|
|
||||||
JitsiConnectionEvents.CONNECTION_FAILED,
|
|
||||||
handleConnectionFailed);
|
|
||||||
connection.addEventListener(
|
|
||||||
JitsiConnectionEvents.CONNECTION_FAILED,
|
|
||||||
connectionFailedHandler);
|
|
||||||
connection.addEventListener(
|
|
||||||
JitsiConnectionEvents.DISPLAY_NAME_REQUIRED,
|
|
||||||
displayNameRequiredHandler
|
|
||||||
);
|
|
||||||
|
|
||||||
/* eslint-disable max-params */
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function connectionFailedHandler(error, message, credentials, details) {
|
|
||||||
/* eslint-enable max-params */
|
|
||||||
APP.store.dispatch(
|
|
||||||
connectionFailed(
|
|
||||||
connection, {
|
|
||||||
credentials,
|
|
||||||
details,
|
|
||||||
message,
|
|
||||||
name: error
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (isFatalJitsiConnectionError(error)) {
|
|
||||||
connection.removeEventListener(
|
|
||||||
JitsiConnectionEvents.CONNECTION_FAILED,
|
|
||||||
connectionFailedHandler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function unsubscribe() {
|
|
||||||
connection.removeEventListener(
|
|
||||||
JitsiConnectionEvents.CONNECTION_ESTABLISHED,
|
|
||||||
handleConnectionEstablished);
|
|
||||||
connection.removeEventListener(
|
|
||||||
JitsiConnectionEvents.CONNECTION_FAILED,
|
|
||||||
handleConnectionFailed);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function handleConnectionEstablished() {
|
|
||||||
APP.store.dispatch(connectionEstablished(connection, Date.now()));
|
|
||||||
unsubscribe();
|
|
||||||
resolve(connection);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function handleConnectionFailed(err) {
|
|
||||||
unsubscribe();
|
|
||||||
logger.error('CONNECTION FAILED:', err);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Marks the display name for the prejoin screen as required.
|
|
||||||
* This can happen if a user tries to join a room with lobby enabled.
|
|
||||||
*/
|
|
||||||
function displayNameRequiredHandler() {
|
|
||||||
APP.store.dispatch(setPrejoinDisplayNameRequired());
|
|
||||||
}
|
|
||||||
|
|
||||||
checkForAttachParametersAndConnect(id, password, connection);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open JitsiConnection using provided credentials.
|
|
||||||
* If retry option is true it will show auth dialog on PASSWORD_REQUIRED error.
|
|
||||||
*
|
|
||||||
* @param {object} options
|
|
||||||
* @param {string} [options.id]
|
|
||||||
* @param {string} [options.password]
|
|
||||||
* @param {string} [options.roomName]
|
|
||||||
* @param {boolean} [retry] if we should show auth dialog
|
|
||||||
* on PASSWORD_REQUIRED error.
|
|
||||||
*
|
|
||||||
* @returns {Promise<JitsiConnection>}
|
|
||||||
*/
|
|
||||||
export function openConnection({ id, password, retry, roomName }) {
|
|
||||||
const usernameOverride
|
|
||||||
= jitsiLocalStorage.getItem('xmpp_username_override');
|
|
||||||
const passwordOverride
|
|
||||||
= jitsiLocalStorage.getItem('xmpp_password_override');
|
|
||||||
|
|
||||||
if (usernameOverride && usernameOverride.length > 0) {
|
|
||||||
id = usernameOverride; // eslint-disable-line no-param-reassign
|
|
||||||
}
|
|
||||||
if (passwordOverride && passwordOverride.length > 0) {
|
|
||||||
password = passwordOverride; // eslint-disable-line no-param-reassign
|
|
||||||
}
|
|
||||||
|
|
||||||
return connect(id, password, roomName).catch(err => {
|
|
||||||
if (retry) {
|
|
||||||
const { jwt } = APP.store.getState()['features/base/jwt'];
|
|
||||||
|
|
||||||
if (err === JitsiConnectionErrors.PASSWORD_REQUIRED && !jwt) {
|
|
||||||
return requestAuth(roomName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Authentication Dialog and try to connect with new credentials.
|
|
||||||
* If failed to connect because of PASSWORD_REQUIRED error
|
|
||||||
* then ask for password again.
|
|
||||||
* @param {string} [roomName] name of the conference room
|
|
||||||
*
|
|
||||||
* @returns {Promise<JitsiConnection>}
|
|
||||||
*/
|
|
||||||
function requestAuth(roomName) {
|
|
||||||
const config = APP.store.getState()['features/base/config'];
|
|
||||||
|
|
||||||
if (isTokenAuthEnabled(config)) {
|
|
||||||
// This Promise never resolves as user gets redirected to another URL
|
|
||||||
return new Promise(() => redirectToTokenAuthService(roomName));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Promise(resolve => {
|
|
||||||
const onSuccess = connection => {
|
|
||||||
resolve(connection);
|
|
||||||
};
|
|
||||||
|
|
||||||
APP.store.dispatch(
|
|
||||||
openDialog(LoginDialog, { onSuccess,
|
|
||||||
roomName })
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mixins that mimic the way Atlaskit fills the screen with modals at low screen widths.
|
|
||||||
*/
|
|
||||||
@mixin full-size-modal-positioner() {
|
|
||||||
height: 100%;
|
|
||||||
left: 0;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
max-width: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin full-size-modal-dialog() {
|
|
||||||
height: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Move the @atlaskit/flag container up a little bit so it does not cover the
|
|
||||||
* toolbar with the first notification.
|
|
||||||
*/
|
|
||||||
.atlaskit-portal > #notifications-container {
|
|
||||||
bottom: calc(#{$newToolbarSizeWithPadding}) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Keep overflow menu within screen vertical bounds and make it scrollable.
|
|
||||||
*/
|
|
||||||
.toolbox-button-wth-dialog > div:nth-child(2) {
|
|
||||||
background: $menuBG;
|
|
||||||
max-height: calc(100vh - #{$newToolbarSizeWithPadding} - 46px);
|
|
||||||
margin-bottom: 4px;
|
|
||||||
padding: 0;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove background color and box-shadow for the context menu container.
|
|
||||||
*/
|
|
||||||
.toolbox-button-wth-dialog.context-menu > div:nth-child(2) {
|
|
||||||
background: transparent;
|
|
||||||
box-shadow: none;
|
|
||||||
overflow-y: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
.audio-preview > div:nth-child(2),
|
|
||||||
.video-preview > div:nth-child(2) {
|
|
||||||
margin-bottom: 4px;
|
|
||||||
outline: none;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The following selectors keep the chat modal full-size anywhere between 100px
|
|
||||||
* and 580px for desktop or 680px for mobile.
|
|
||||||
*/
|
|
||||||
@media (min-width: 100px) and (max-width: 320px) {
|
|
||||||
.smiley-input {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.shift-right .focus-lock > div > div {
|
|
||||||
@include full-size-modal-positioner();
|
|
||||||
}
|
|
||||||
|
|
||||||
.shift-right .focus-lock [role="dialog"] {
|
|
||||||
@include full-size-modal-dialog();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 480px) and (max-width: 580px) {
|
|
||||||
.shift-right .focus-lock > div > div {
|
|
||||||
@include full-size-modal-positioner();
|
|
||||||
}
|
|
||||||
|
|
||||||
.shift-right .focus-lock [role="dialog"] {
|
|
||||||
@include full-size-modal-dialog();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
// Override Atlaskit inline style for the modal background.
|
|
||||||
// Important is unfortunately needed for that.
|
|
||||||
.shift-right .focus-lock [role="dialog"][style] {
|
|
||||||
background-color: $chatBackgroundColor !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove Atlaskit padding from the chat dialog.
|
|
||||||
.shift-right .focus-lock [role="dialog"] > div:first-child > div:nth-child(2) {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
div.Tooltip {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 14px;
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// make modal full screen on landscape orientation
|
|
||||||
@media (max-height: 420px) {
|
|
||||||
.atlaskit-portal {
|
|
||||||
.css-1oc7v0j {
|
|
||||||
height: 100%;
|
|
||||||
padding: 0;
|
|
||||||
max-width: 100%;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
&> div {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
.audio-preview {
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
&-content {
|
|
||||||
position: relative;
|
|
||||||
right: auto;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
max-height: 456px;
|
|
||||||
overflow: auto;
|
|
||||||
width: 300px;
|
|
||||||
|
|
||||||
&-ul {
|
|
||||||
margin:0;
|
|
||||||
padding:0;
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-header:hover {
|
|
||||||
background-color: initial;
|
|
||||||
cursor: initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-entry-text {
|
|
||||||
display: inline-block;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
max-width: 213px;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
|
|
||||||
&.left-margin {
|
|
||||||
margin-left: 36px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-speaker {
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&:hover, &:focus-within, &:focus {
|
|
||||||
.audio-preview-test-button {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.audio-preview-entry-text {
|
|
||||||
max-width: 178px;
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.audio-preview-entry-text {
|
|
||||||
max-width: 238px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-microphone {
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&--nometer {
|
|
||||||
.audio-preview-entry-text {
|
|
||||||
max-width: 238px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&--withmeter {
|
|
||||||
.audio-preview-entry-text {
|
|
||||||
max-width: 178px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
&-icon {
|
|
||||||
border-radius: 50%;
|
|
||||||
display: inline-block;
|
|
||||||
width: 14px;
|
|
||||||
|
|
||||||
&--exclamation {
|
|
||||||
margin-left: 6px;
|
|
||||||
|
|
||||||
& svg {
|
|
||||||
fill: #E54B4B;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-test-button {
|
|
||||||
display: none;
|
|
||||||
padding: 4px 10px;
|
|
||||||
position: absolute;
|
|
||||||
right: 16px;
|
|
||||||
top: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-meter-mic {
|
|
||||||
position: absolute;
|
|
||||||
right: 16px;
|
|
||||||
top: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-checkbox-container {
|
|
||||||
padding: 10px 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -31,8 +31,8 @@ body {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
color: $defaultColor;
|
color: #F1F1F1;
|
||||||
background: $defaultBackground;
|
background: #040404; // should match DEFAULT_BACKGROUND from interface_config
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -66,10 +66,6 @@ body, input, textarea, keygen, select, button {
|
|||||||
font-family: $baseFontFamily !important;
|
font-family: $baseFontFamily !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#nowebrtc {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
button, input, select, textarea {
|
button, input, select, textarea {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
vertical-align: baseline;
|
vertical-align: baseline;
|
||||||
@@ -94,7 +90,7 @@ input[type='text'], input[type='password'], textarea {
|
|||||||
|
|
||||||
button {
|
button {
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
background-color: $buttonBackground;
|
background-color: #44A5FF;
|
||||||
border-radius: $borderRadius;
|
border-radius: $borderRadius;
|
||||||
|
|
||||||
&.no-icon {
|
&.no-icon {
|
||||||
@@ -145,22 +141,7 @@ form {
|
|||||||
font-size: 11pt;
|
font-size: 11pt;
|
||||||
color: rgba(255,255,255,.50);
|
color: rgba(255,255,255,.50);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
z-index: $poweredByZ;
|
z-index: 100;
|
||||||
}
|
|
||||||
|
|
||||||
.connected {
|
|
||||||
color: #21B9FC;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lastN, .disconnected {
|
|
||||||
color: #a3a3a3;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#inviteLinkRef {
|
|
||||||
-webkit-user-select: text;
|
|
||||||
user-select: text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -185,7 +166,7 @@ form {
|
|||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar-thumb {
|
||||||
background: rgba(0, 0, 0, .5);
|
background: #3D3D3D;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,3 +174,16 @@ form {
|
|||||||
.jitsi-icon svg path {
|
.jitsi-icon svg path {
|
||||||
fill: inherit !important;
|
fill: inherit !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sr-only {
|
||||||
|
border: 0 !important;
|
||||||
|
clip: rect(1px, 1px, 1px, 1px) !important;
|
||||||
|
clip-path: inset(50%) !important;
|
||||||
|
height: 1px !important;
|
||||||
|
margin: -1px !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
position: absolute !important;
|
||||||
|
width: 1px !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
}
|
||||||
|
|||||||
179
css/_chat.scss
179
css/_chat.scss
@@ -1,35 +1,3 @@
|
|||||||
#sideToolbarContainer {
|
|
||||||
background-color: $chatBackgroundColor;
|
|
||||||
flex-shrink: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
position: relative;
|
|
||||||
transition: width .16s ease-in-out;
|
|
||||||
width: $sidebarWidth;
|
|
||||||
z-index: $sideToolbarContainerZ;
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
height: 100vh;
|
|
||||||
height: -webkit-fill-available;
|
|
||||||
left: 0;
|
|
||||||
position: fixed;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-panel {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
// extract header + tabs height
|
|
||||||
height: calc(100% - 119px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-panel-no-tabs {
|
|
||||||
// extract header height
|
|
||||||
height: calc(100% - 70px);
|
|
||||||
}
|
|
||||||
|
|
||||||
#chat-conversation-container {
|
#chat-conversation-container {
|
||||||
// extract message input height
|
// extract message input height
|
||||||
height: calc(100% - 64px);
|
height: calc(100% - 64px);
|
||||||
@@ -76,27 +44,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.chat-header {
|
|
||||||
height: 70px;
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
z-index: 1;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 16px;
|
|
||||||
align-items: center;
|
|
||||||
box-sizing: border-box;
|
|
||||||
color: #fff;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 24px;
|
|
||||||
line-height: 32px;
|
|
||||||
|
|
||||||
.jitsi-icon {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-input-container {
|
.chat-input-container {
|
||||||
padding: 0 16px 24px;
|
padding: 0 16px 24px;
|
||||||
}
|
}
|
||||||
@@ -112,61 +59,6 @@
|
|||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.smiley-button {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 38px;
|
|
||||||
width: 38px;
|
|
||||||
margin: 2px;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#chat-input .smiley-button {
|
|
||||||
@media (hover: hover) and (pointer: fine) {
|
|
||||||
&:hover {
|
|
||||||
background-color: #484A4F;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.remoteuser {
|
|
||||||
color: #B8C7E0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.usrmsg-form {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#usermsg {
|
|
||||||
-ms-overflow-style: none;
|
|
||||||
border: 0px none;
|
|
||||||
border-radius:0;
|
|
||||||
box-shadow: none;
|
|
||||||
color: white;
|
|
||||||
font-size: 14px;
|
|
||||||
padding: 10px;
|
|
||||||
overflow-y: auto;
|
|
||||||
resize: none;
|
|
||||||
scrollbar-width: none;
|
|
||||||
width: 100%;
|
|
||||||
word-break: break-word;
|
|
||||||
|
|
||||||
&::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#usermsg:hover {
|
|
||||||
border: 0px none;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
#usermsg:focus,
|
|
||||||
#usermsg:active {
|
|
||||||
border-bottom: 1px solid white;
|
|
||||||
padding-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#nickname {
|
#nickname {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #9d9d9d;
|
color: #9d9d9d;
|
||||||
@@ -174,11 +66,6 @@
|
|||||||
margin: auto 0;
|
margin: auto 0;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
|
|
||||||
#nickname-title {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
label[for="nickinput"] {
|
label[for="nickinput"] {
|
||||||
> div > span {
|
> div > span {
|
||||||
color: #B8C7E0;
|
color: #B8C7E0;
|
||||||
@@ -191,24 +78,6 @@
|
|||||||
label {
|
label {
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.enter-chat {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
margin-top: 16px;
|
|
||||||
height: 40px;
|
|
||||||
background: #1B67EC;
|
|
||||||
border-radius: 3px;
|
|
||||||
color: #fff;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
color: #AFB6BC;
|
|
||||||
background: #11336E;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.mobile-browser {
|
.mobile-browser {
|
||||||
@@ -216,14 +85,6 @@
|
|||||||
input {
|
input {
|
||||||
height: 48px;
|
height: 48px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.enter-chat {
|
|
||||||
height: 48px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#usermsg {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.chatmessage .usermessage {
|
.chatmessage .usermessage {
|
||||||
@@ -231,32 +92,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sideToolbarContainer {
|
|
||||||
* {
|
|
||||||
-webkit-user-select: text;
|
|
||||||
user-select: text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.sr-only {
|
|
||||||
border: 0 !important;
|
|
||||||
clip: rect(1px, 1px, 1px, 1px) !important;
|
|
||||||
clip-path: inset(50%) !important;
|
|
||||||
height: 1px !important;
|
|
||||||
margin: -1px !important;
|
|
||||||
overflow: hidden !important;
|
|
||||||
padding: 0 !important;
|
|
||||||
position: absolute !important;
|
|
||||||
width: 1px !important;
|
|
||||||
white-space: nowrap !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chatmessage {
|
.chatmessage {
|
||||||
&.localuser {
|
|
||||||
background-color: $chatLocalMessageBackgroundColor;
|
|
||||||
border-radius: 6px 0px 6px 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.error {
|
&.error {
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
|
|
||||||
@@ -288,13 +124,6 @@
|
|||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#smileysarea {
|
|
||||||
display: flex;
|
|
||||||
max-height: 150px;
|
|
||||||
min-height: 35px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.smiley-input {
|
.smiley-input {
|
||||||
display: flex;
|
display: flex;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -324,7 +153,7 @@
|
|||||||
|
|
||||||
#smileysContainer {
|
#smileysContainer {
|
||||||
background-color: $chatBackgroundColor;
|
background-color: $chatBackgroundColor;
|
||||||
border-top: 1px solid $chatInputSeparatorColor;
|
border-top: 1px solid #A4B8D1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,15 +169,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.smileyContainer:hover {
|
.smileyContainer:hover {
|
||||||
background-color: $newToolbarButtonToggleColor;
|
background-color: rgba(255, 255, 255, 0.15);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
#usermsg::-webkit-scrollbar-track-piece {
|
|
||||||
background: #3a3a3a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-group {
|
.chat-message-group {
|
||||||
&.local {
|
&.local {
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
.cpick {
|
|
||||||
border: 1px solid #A4B8D1;
|
|
||||||
color: #fff;
|
|
||||||
display: flex;
|
|
||||||
font-size: 15px;
|
|
||||||
height: 38px;
|
|
||||||
line-height: 24px;
|
|
||||||
|
|
||||||
&-selector {
|
|
||||||
align-items: center;
|
|
||||||
background-color: #283447;
|
|
||||||
border-right: 1px solid #A4B8D1;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
padding: 8px 10px;
|
|
||||||
position: relative;
|
|
||||||
width: 88px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-icon {
|
|
||||||
margin-right: 8px;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
top: 12px;
|
|
||||||
|
|
||||||
& > svg {
|
|
||||||
fill: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-input {
|
|
||||||
padding: 8px;
|
|
||||||
background: #1C2025;
|
|
||||||
border: 0;
|
|
||||||
margin: 0;
|
|
||||||
color: #fff;
|
|
||||||
caret-color: #0376DA;
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-dropdown {
|
|
||||||
height: 190px;
|
|
||||||
overflow-y: auto;
|
|
||||||
width: 343px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-dropdown-entry {
|
|
||||||
align-items: center;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
height: 40px;
|
|
||||||
padding: 0 10px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #66768b;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-text {
|
|
||||||
color: #fff;
|
|
||||||
flex-grow: 1;
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Override @Atlaskit/inline-dialog styles
|
|
||||||
.cpick-container > div:nth-child(2) {
|
|
||||||
outline: none;
|
|
||||||
padding: 8px 0 0 0;
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
.drawer-portal {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: $drawerZ;
|
|
||||||
border-radius: 16px 16px 0 0;
|
|
||||||
|
|
||||||
&.notification-portal {
|
|
||||||
z-index: $dropdownZ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.drawer-portal::after {
|
|
||||||
content: '';
|
|
||||||
background-color: $participantsPaneBgColor;
|
|
||||||
margin-bottom: env(safe-area-inset-bottom, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.drawer-menu-container {
|
|
||||||
height: 100vh;
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drawer-menu {
|
|
||||||
overflow-y: auto;
|
|
||||||
margin-bottom: env(safe-area-inset-bottom, 0);
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.drawer-toggle {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
height: 44px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
fill: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&#{&} .overflow-menu {
|
|
||||||
margin: auto;
|
|
||||||
font-size: 1.2em;
|
|
||||||
list-style-type: none;
|
|
||||||
padding: 0;
|
|
||||||
height: calc(80vh - 144px - 64px);
|
|
||||||
overflow-y: auto;
|
|
||||||
|
|
||||||
.overflow-menu-item {
|
|
||||||
box-sizing: border-box;
|
|
||||||
height: 48px;
|
|
||||||
padding: 12px 16px;
|
|
||||||
|
|
||||||
align-items: center;
|
|
||||||
color: $overflowMenuItemColor;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
font-size: 16px;
|
|
||||||
|
|
||||||
div {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.unclickable {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
@media (hover: hover) and (pointer: fine) {
|
|
||||||
&.unclickable:hover {
|
|
||||||
background: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.disabled {
|
|
||||||
cursor: initial;
|
|
||||||
color: #3b475c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.profile-text {
|
|
||||||
max-width: 100%;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#e2ee-section {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
.description {
|
|
||||||
font-size: 13px;
|
|
||||||
margin: 15px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.control-row {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
margin-top: 15px;
|
|
||||||
|
|
||||||
label {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,20 +3,20 @@
|
|||||||
@include border-radius(4px);
|
@include border-radius(4px);
|
||||||
padding: 40px 38px 44px;
|
padding: 40px 38px 44px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background: $inlayColorBg;
|
background: lighten(#474747, 20%);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
&__title {
|
&__title {
|
||||||
margin: 17px 0;
|
margin: 17px 0;
|
||||||
padding-bottom: 17px;
|
padding-bottom: 17px;
|
||||||
color: $popoverFontColor;
|
color: #ffffff;
|
||||||
font-size: 21px;
|
font-size: 21px;
|
||||||
letter-spacing: 0.3px;
|
letter-spacing: 0.3px;
|
||||||
border-bottom: 1px solid $inlayBorderColor;
|
border-bottom: 1px solid lighten(#FFFFFF, 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
&__text {
|
&__text {
|
||||||
color: $popoverFontColor;
|
color: #ffffff;
|
||||||
display: block;
|
display: block;
|
||||||
margin-top: 22px;
|
margin-top: 22px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
|||||||
@@ -1,18 +1,4 @@
|
|||||||
/*Initialize*/
|
|
||||||
div.loginmenu {
|
|
||||||
position: absolute;
|
|
||||||
margin: 0;
|
|
||||||
padding: 5px;
|
|
||||||
top: 40px;
|
|
||||||
left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.disabled {
|
a.disabled {
|
||||||
color: gray !important;
|
color: gray !important;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.loginmenu.extendedToolbarPopup {
|
|
||||||
top: 20px;
|
|
||||||
left: 40px;
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
@@ -99,11 +101,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
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 {
|
||||||
color: #5E6D7A;
|
color: #5E6D7A;
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
.filmstrip-toolbox,
|
|
||||||
.always-on-top-toolbox {
|
.always-on-top-toolbox {
|
||||||
background-color: $newToolbarBackgroundColor;
|
background-color: $newToolbarBackgroundColor;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
@@ -29,7 +28,3 @@
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
padding: 3px !important;
|
padding: 3px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.filmstrip-toolbox {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
.jqistates {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jqistates h2 {
|
|
||||||
padding-bottom: 10px;
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
font-size: 18px;
|
|
||||||
line-height: 25px;
|
|
||||||
text-align: center;
|
|
||||||
color: #424242;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jqistates input {
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jqistates input[type='text'], input[type='password'] {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
button.jqidefaultbutton #inviteLinkRef {
|
|
||||||
color: #2c8ad2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#inviteLinkRef {
|
|
||||||
-webkit-user-select: text;
|
|
||||||
user-select: text;
|
|
||||||
}
|
|
||||||
@@ -75,6 +75,3 @@
|
|||||||
margin-bottom: 36px;
|
margin-bottom: 36px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
.navigate-section-list-empty {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
.notice {
|
|
||||||
position: absolute;
|
|
||||||
left: 50%;
|
|
||||||
z-index: $zindex3;
|
|
||||||
margin-top: 6px;
|
|
||||||
|
|
||||||
@include transform(translateX(-50%));
|
|
||||||
|
|
||||||
&__message {
|
|
||||||
background-color: #000000;
|
|
||||||
color: white;
|
|
||||||
padding: 3px;
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
.notification-appear, .notification-enter {
|
|
||||||
opacity: 0;
|
|
||||||
position: relative;
|
|
||||||
left: -200px;
|
|
||||||
transition: all .2s !important; // !important needed to overwrite atlaskit default style
|
|
||||||
|
|
||||||
&-active {
|
|
||||||
opacity: 1;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification-exit {
|
|
||||||
opacity: 1;
|
|
||||||
position: relative;
|
|
||||||
left: 0;
|
|
||||||
transition: all .2s !important; // !important needed to overwrite atlaskit default style
|
|
||||||
|
|
||||||
&-active {
|
|
||||||
opacity: 0;
|
|
||||||
left: -200px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +1,3 @@
|
|||||||
.participants_pane {
|
|
||||||
background-color: $participantsPaneBgColor;
|
|
||||||
flex-shrink: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
position: relative;
|
|
||||||
transition: width .16s ease-in-out;
|
|
||||||
width: 315px;
|
|
||||||
z-index: $zindex0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.participants_pane-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
font-weight: 600;
|
|
||||||
height: 100%;
|
|
||||||
width: 315px;
|
|
||||||
|
|
||||||
& > *:first-child,
|
|
||||||
& > *:last-child {
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
.participants_pane {
|
|
||||||
height: 100vh;
|
|
||||||
height: -webkit-fill-available;
|
|
||||||
left: 0;
|
|
||||||
position: fixed;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.participants_pane-content {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.jitsi-icon {
|
.jitsi-icon {
|
||||||
&-dominant-speaker {
|
&-dominant-speaker {
|
||||||
background-color: #1EC26A;
|
background-color: #1EC26A;
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
#polls-panel {
|
|
||||||
height: calc(100% - 119px);
|
|
||||||
}
|
|
||||||
@@ -1,49 +1,33 @@
|
|||||||
/**
|
|
||||||
* Mousemove padding styles are used to add invisible elements to the popover
|
|
||||||
* to allow mouse movement from the popover trigger to the popover itself
|
|
||||||
* without triggering a mouseleave event.
|
|
||||||
*/
|
|
||||||
%vertical-popover-padding {
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
width: 20px;
|
|
||||||
padding: 20px 0;
|
|
||||||
top: -20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
%horizontal-popover-padding {
|
|
||||||
height: 25px;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
width: 100%;
|
|
||||||
padding: 0 35px;
|
|
||||||
left: -35px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-mousemove-padding-left {
|
|
||||||
@extend %vertical-popover-padding;
|
|
||||||
left: -35px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-mousemove-padding-right {
|
|
||||||
@extend %vertical-popover-padding;
|
|
||||||
right: -35px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-mousemove-padding-bottom {
|
|
||||||
@extend %horizontal-popover-padding;
|
|
||||||
bottom: -40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-mousemove-padding-top {
|
|
||||||
@extend %horizontal-popover-padding;
|
|
||||||
top: -40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover {
|
.popover {
|
||||||
margin: -16px -24px;
|
z-index: 8;
|
||||||
z-index: $popoverZ;
|
|
||||||
|
.popover-content {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.hover {
|
||||||
|
margin: -16px -24px;
|
||||||
|
|
||||||
|
.popover-content {
|
||||||
|
margin: 16px 24px;
|
||||||
|
|
||||||
|
&.top {
|
||||||
|
bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.bottom {
|
||||||
|
top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.left {
|
||||||
|
right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.right {
|
||||||
|
left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.excalidraw .popover {
|
.excalidraw .popover {
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
.reactions-menu {
|
.reactions-menu {
|
||||||
width: 280px;
|
width: 280px;
|
||||||
background: $menuBG;
|
background: #242528;
|
||||||
box-shadow: 0px 3px 16px rgba(0, 0, 0, 0.6), 0px 0px 4px 1px rgba(0, 0, 0, 0.25);
|
box-shadow: 0px 3px 16px rgba(0, 0, 0, 0.6), 0px 0px 4px 1px rgba(0, 0, 0, 0.25);
|
||||||
border-radius: 3px;
|
border-radius: 6px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
|
||||||
&.with-gif {
|
&.with-gif {
|
||||||
@@ -104,10 +104,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.reactions-menu-container {
|
|
||||||
padding-bottom: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.reactions-animations-container {
|
.reactions-animations-container {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 20%;
|
width: 20%;
|
||||||
@@ -158,17 +154,17 @@ $reactionCount: 20;
|
|||||||
}
|
}
|
||||||
|
|
||||||
70% {
|
70% {
|
||||||
transform: translate(40px, -70vh) scale(1.5);
|
transform: translate(40px, -70dvh) scale(1.5);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
75% {
|
75% {
|
||||||
transform: translate(40px, -70vh) scale(1.5);
|
transform: translate(40px, -70dvh) scale(1.5);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
100% {
|
100% {
|
||||||
transform: translate(140px, -50vh) scale(1);
|
transform: translate(140px, -50dvh) scale(1);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -191,17 +187,17 @@ $reactionCount: 20;
|
|||||||
}
|
}
|
||||||
|
|
||||||
70% {
|
70% {
|
||||||
transform: translate(#{$topX}px, -#{$topY}vh) scale(1.5);
|
transform: translate(#{$topX}px, -#{$topY}dvh) scale(1.5);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
75% {
|
75% {
|
||||||
transform: translate(#{$topX}px, -#{$topY}vh) scale(1.5);
|
transform: translate(#{$topX}px, -#{$topY}dvh) scale(1.5);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
100% {
|
100% {
|
||||||
transform: translate(#{$bottomX}px, -#{$bottomY}vh) scale(1);
|
transform: translate(#{$bottomX}px, -#{$bottomY}dvh) scale(1);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
.recordingSpinner {
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
.recording-dialog {
|
.recording-dialog {
|
||||||
flex: 0;
|
flex: 0;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -50,10 +46,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.recording-switch-disabled {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.recording-icon-container {
|
.recording-icon-container {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -156,8 +148,7 @@
|
|||||||
*/
|
*/
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
||||||
.broadcast-dropdown,
|
.broadcast-dropdown {
|
||||||
.broadcast-dropdown-trigger {
|
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,7 +177,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.google-error {
|
.google-error {
|
||||||
color: $errorColor;
|
color: #c61600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.google-panel {
|
.google-panel {
|
||||||
@@ -197,14 +188,6 @@
|
|||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.helper-link {
|
|
||||||
cursor: pointer;
|
|
||||||
font-weight: bold;
|
|
||||||
display: inline-block;
|
|
||||||
flex-shrink: 0;
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.warning-text {
|
.warning-text {
|
||||||
color:#FFD740;
|
color:#FFD740;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
|
|
||||||
.thanks-msg {
|
.thanks-msg {
|
||||||
border-bottom: 1px solid $selectBg;
|
border-bottom: 1px solid #FFFFFF;
|
||||||
padding-left: 30px;
|
padding-left: 30px;
|
||||||
padding-right: 30px;
|
padding-right: 30px;
|
||||||
p {
|
p {
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.hint-msg{
|
.hint-msg {
|
||||||
p {
|
p {
|
||||||
margin: 26px auto;
|
margin: 26px auto;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -28,7 +28,13 @@
|
|||||||
width: 120px;
|
width: 120px;
|
||||||
height: 86px;
|
height: 86px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
background: $happySoftwareBackground;
|
background: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.forbidden-msg {
|
||||||
|
p {
|
||||||
|
font-size: 16px;
|
||||||
|
margin-top: 15px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,30 +3,33 @@
|
|||||||
display: block;
|
display: block;
|
||||||
|
|
||||||
#enter_room {
|
#enter_room {
|
||||||
position: relative;
|
|
||||||
height: 42px;
|
|
||||||
|
|
||||||
.welcome-page-button {
|
.welcome-page-button {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
left: 0;
|
left: 0;
|
||||||
position: absolute;
|
text-align: center;
|
||||||
top: 68px;
|
width: 100%;
|
||||||
text-align: center;
|
|
||||||
width: 100%;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
background-color: #002637;
|
background-color: #002637;
|
||||||
|
|
||||||
|
.insecure-room-name-warning {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
#enter_room {
|
#enter_room {
|
||||||
.enter-room-input-container {
|
width: 100%;
|
||||||
padding-right: 0;
|
|
||||||
|
.join-meeting-container {
|
||||||
|
padding: 0;
|
||||||
|
flex-direction: column;
|
||||||
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning-without-link,
|
.enter-room-input-container {
|
||||||
.warning-with-link {
|
padding-right: 0;
|
||||||
top: 120px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,20 +34,20 @@
|
|||||||
background: #F2F3F4;
|
background: #F2F3F4;
|
||||||
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: #040404;
|
fill: #040404;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.settings-button-small-icon--disabled {
|
&.settings-button-small-icon--disabled {
|
||||||
background: #36383C;
|
background: #36383C;
|
||||||
|
|
||||||
&> svg {
|
& svg {
|
||||||
fill: #929292;
|
fill: #929292;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
& > svg {
|
& svg {
|
||||||
fill: #fff;
|
fill: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
background-color: #36383c;
|
background-color: #36383c;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
|
|
||||||
&> svg {
|
& svg {
|
||||||
fill: #929292;
|
fill: #929292;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,14 +34,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.subject-info {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
max-width: 80%;
|
|
||||||
height: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-container {
|
.details-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
* Round badge.
|
* Round badge.
|
||||||
*/
|
*/
|
||||||
.badge-round {
|
.badge-round {
|
||||||
background-color: $toolbarBadgeBackground;
|
background-color: #165ECC;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
color: $toolbarBadgeColor;
|
color: #FFFFFF;
|
||||||
// Do not inherit the font-family from the toolbar button, because it's an
|
// Do not inherit the font-family from the toolbar button, because it's an
|
||||||
// icon style.
|
// icon style.
|
||||||
font-family: $baseFontFamily;
|
font-family: $baseFontFamily;
|
||||||
@@ -32,6 +32,14 @@
|
|||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
z-index: $toolbarZ + 2;
|
z-index: $toolbarZ + 2;
|
||||||
|
|
||||||
|
&.shift-up {
|
||||||
|
bottom: calc(((#{$newToolbarSize} + 30px) * 2) * -1);
|
||||||
|
|
||||||
|
.toolbox-content {
|
||||||
|
margin-bottom: 46px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&.visible {
|
&.visible {
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
}
|
}
|
||||||
@@ -50,21 +58,6 @@
|
|||||||
z-index: $toolbarZ;
|
z-index: $toolbarZ;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
.button-group-center,
|
|
||||||
.button-group-left,
|
|
||||||
.button-group-right {
|
|
||||||
display: flex;
|
|
||||||
width: 33%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-group-center {
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-group-right {
|
|
||||||
justify-content: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolbox-button-wth-dialog {
|
.toolbox-button-wth-dialog {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
@@ -104,16 +97,6 @@
|
|||||||
padding-bottom: env(safe-area-inset-bottom, 0);
|
padding-bottom: env(safe-area-inset-bottom, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.beta-tag {
|
|
||||||
background: #36383C;
|
|
||||||
border-radius: 3px;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 12px;
|
|
||||||
margin-left: 8px;
|
|
||||||
padding: 0 4px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.overflow-menu-hr {
|
.overflow-menu-hr {
|
||||||
border-top: 1px solid #4C4D50;
|
border-top: 1px solid #4C4D50;
|
||||||
border-bottom: 0;
|
border-bottom: 0;
|
||||||
@@ -184,7 +167,7 @@ div.hangup-menu-button {
|
|||||||
background: none;
|
background: none;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: $newToolbarButtonHoverColor;
|
background: rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
1px 0px 1px rgba(0,0,0,0.3),
|
1px 0px 1px rgba(0,0,0,0.3),
|
||||||
0px 0px 1px rgba(0,0,0,0.3);
|
0px 0px 1px rgba(0,0,0,0.3);
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
z-index: $subtitlesZ;
|
z-index: 7;
|
||||||
|
|
||||||
&.lifted {
|
&.lifted {
|
||||||
// Lift subtitle above toolbar+dominant speaker box.
|
// Lift subtitle above toolbar+dominant speaker box.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.hidden {
|
.hidden {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,19 +25,34 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows an inline element.
|
* resets default button styles,
|
||||||
|
* mostly intended to be used on interactive elements that
|
||||||
|
* differ from their default styles (e.g. <a>) or have custom styles
|
||||||
*/
|
*/
|
||||||
.show-inline {
|
.invisible-button {
|
||||||
display: inline-block !important;
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: inherit;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows a flex element.
|
* style an element the same as an <a>
|
||||||
|
* useful on some cases where we visually have a link but it's actually a <button>
|
||||||
*/
|
*/
|
||||||
.show-flex {
|
.as-link {
|
||||||
display: -webkit-box !important;
|
@extend .invisible-button;
|
||||||
display: -moz-box !important;
|
|
||||||
display: -ms-flexbox !important;
|
display: inline;
|
||||||
display: -webkit-flex !important;
|
color: #44A5FF;
|
||||||
display: flex !important;
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:hover,
|
||||||
|
&:active {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
@import "themes/light";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Style variables
|
* Style variables
|
||||||
*/
|
*/
|
||||||
@@ -10,83 +8,26 @@ $baseFontFamily: -apple-system, BlinkMacSystemFont, 'open_sanslight', 'Helvetica
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Video layout.
|
// Video layout.
|
||||||
$thumbnailVideoMargin: 2px;
|
|
||||||
$thumbnailsBorder: 2px;
|
$thumbnailsBorder: 2px;
|
||||||
$thumbnailVideoBorder: 2px;
|
|
||||||
$filmstripToggleButtonWidth: 17px;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Color variables.
|
|
||||||
*/
|
|
||||||
$defaultColor: #F1F1F1;
|
|
||||||
$defaultSideBarFontColor: #44A5FF;
|
|
||||||
$defaultSemiDarkColor: #ACACAC;
|
|
||||||
$defaultDarkColor: #2b3d5c;
|
|
||||||
$defaultWarningColor: rgb(215, 121, 118);
|
|
||||||
$participantsPaneBgColor: #141414;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toolbar
|
* Toolbar
|
||||||
*/
|
*/
|
||||||
$newToolbarBackgroundColor: #131519;
|
$newToolbarBackgroundColor: #131519;
|
||||||
$newToolbarButtonHoverColor: rgba(255, 255, 255, 0.2);
|
|
||||||
$newToolbarButtonToggleColor: rgba(255, 255, 255, 0.15);
|
|
||||||
$menuBG:#242528;
|
|
||||||
$newToolbarFontSize: 24px;
|
|
||||||
$newToolbarHangupFontSize: 32px;
|
|
||||||
$newToolbarSize: 48px;
|
$newToolbarSize: 48px;
|
||||||
$newToolbarSizeMobile: 60px;
|
$newToolbarSizeMobile: 60px;
|
||||||
$newToolbarSizeWithPadding: calc(#{$newToolbarSize} + 24px);
|
$newToolbarSizeWithPadding: calc(#{$newToolbarSize} + 24px);
|
||||||
$toolbarTitleFontSize: 19px;
|
|
||||||
$overflowMenuItemColor: #fff;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Video layout
|
|
||||||
*/
|
|
||||||
$participantNameColor: #fff;
|
|
||||||
$audioLevelBg: #44A5FF;
|
|
||||||
$audioLevelShadow: rgba(9, 36, 77, 0.9);
|
|
||||||
$videoStateIndicatorColor: $defaultColor;
|
|
||||||
$videoStateIndicatorBackground: $toolbarBackground;
|
|
||||||
$videoStateIndicatorSize: 40px;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Feedback Modal
|
|
||||||
*/
|
|
||||||
$feedbackContentBg: #fff;
|
|
||||||
$feedbackInputBg: #fff;
|
|
||||||
$feedbackTextColor: #000;
|
|
||||||
$feedbackInputTextColor: #333;
|
|
||||||
$feedbackInputPlaceholderColor: #777;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modals
|
|
||||||
*/
|
|
||||||
$modalButtonFontSize: 14px;
|
|
||||||
$modalMockAKInputBackground: #fafbfc;
|
|
||||||
$modalMockAKInputBorder: 1px solid #f4f5f7;
|
|
||||||
$modalTextColor: #333;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chat
|
* Chat
|
||||||
*/
|
*/
|
||||||
$chatActionsSeparatorColor: rgb(173, 105, 112);
|
|
||||||
$chatBackgroundColor: #131519;
|
$chatBackgroundColor: #131519;
|
||||||
$chatInputSeparatorColor: #A4B8D1;
|
|
||||||
$chatLobbyActionsSeparatorColor: #6A50D3;
|
|
||||||
$chatLocalMessageBackgroundColor: #484A4F;
|
|
||||||
$chatPrivateMessageBackgroundColor: rgb(153, 69, 77);
|
|
||||||
$chatRemoteMessageBackgroundColor: #242528;
|
|
||||||
$sidebarWidth: 315px;
|
$sidebarWidth: 315px;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Misc.
|
* Misc.
|
||||||
*/
|
*/
|
||||||
$borderRadius: 4px;
|
$borderRadius: 4px;
|
||||||
$happySoftwareBackground: transparent;
|
|
||||||
$desktopAppDragBarHeight: 25px;
|
|
||||||
$scrollHeight: 7px;
|
$scrollHeight: 7px;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -96,38 +37,11 @@ $zindex0: 0;
|
|||||||
$zindex1: 1;
|
$zindex1: 1;
|
||||||
$zindex2: 2;
|
$zindex2: 2;
|
||||||
$zindex3: 3;
|
$zindex3: 3;
|
||||||
$subtitlesZ: 7;
|
|
||||||
$popoverZ: 8;
|
|
||||||
$reloadZ: 20;
|
|
||||||
$poweredByZ: 100;
|
|
||||||
$ringingZ: 300;
|
|
||||||
$sideToolbarContainerZ: 300;
|
|
||||||
$toolbarZ: 250;
|
$toolbarZ: 250;
|
||||||
$drawerZ: 351;
|
|
||||||
$dropdownZ: 901;
|
|
||||||
$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.
|
||||||
$filmstripVideosZ: $toolbarZ + 1;
|
$filmstripVideosZ: $toolbarZ + 1;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Font Colors
|
|
||||||
*/
|
|
||||||
$defaultFontColor: #777;
|
|
||||||
$defaultLightFontColor: #F1F1F1;
|
|
||||||
$defaultDarkFontColor: #000;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forms
|
|
||||||
*/
|
|
||||||
//inputs
|
|
||||||
$inputControlEmColor: #f29424;
|
|
||||||
//buttons
|
|
||||||
$linkFontColor: #489afe;
|
|
||||||
$linkHoverFontColor: #287ade;
|
|
||||||
$formPadding: 16px;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unsupported browser
|
* Unsupported browser
|
||||||
*/
|
*/
|
||||||
@@ -161,7 +75,7 @@ $welcomePageHeaderBackground: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(0,
|
|||||||
$welcomePageHeaderBackgroundPosition: center;
|
$welcomePageHeaderBackgroundPosition: center;
|
||||||
$welcomePageHeaderBackgroundRepeat: none;
|
$welcomePageHeaderBackgroundRepeat: none;
|
||||||
$welcomePageHeaderBackgroundSize: cover;
|
$welcomePageHeaderBackgroundSize: cover;
|
||||||
$welcomePageHeaderPaddingBottom: 0px;
|
$welcomePageHeaderPaddingBottom: 15px;
|
||||||
$welcomePageHeaderTitleMaxWidth: initial;
|
$welcomePageHeaderTitleMaxWidth: initial;
|
||||||
$welcomePageHeaderTextAlign: center;
|
$welcomePageHeaderTextAlign: center;
|
||||||
|
|
||||||
@@ -201,11 +115,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;
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
.video-preview {
|
|
||||||
background: none;
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
&-container {
|
|
||||||
max-height: 344px;
|
|
||||||
background: $menuBG;
|
|
||||||
border-radius: 3px;
|
|
||||||
overflow: auto;
|
|
||||||
padding: 8px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-entry {
|
|
||||||
cursor: pointer;
|
|
||||||
height: 168px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
position: relative;
|
|
||||||
width: 284px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--selected {
|
|
||||||
border: 3px solid #31B76A;
|
|
||||||
border-radius: 3px;
|
|
||||||
cursor: default;
|
|
||||||
height: 162px;
|
|
||||||
width: 278px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-video {
|
|
||||||
border-radius: 3px;
|
|
||||||
height: 100%;
|
|
||||||
object-fit: cover;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-overlay {
|
|
||||||
background: rgba(42, 58, 75, 0.6);
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-error {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-label {
|
|
||||||
bottom: 8px;
|
|
||||||
color: #fff;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
z-index: 2;
|
|
||||||
|
|
||||||
&-container {
|
|
||||||
margin: 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-text {
|
|
||||||
background-color: #131519;
|
|
||||||
border-radius: 3px;
|
|
||||||
padding: 2px 8px;
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 20px;
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: calc(100% - 16px);
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
width: fit-content;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Override @atlaskit/InlineDialog container which is made with styled components
|
|
||||||
& > div:nth-child(2) {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -76,9 +76,42 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.animatedFadeIn {
|
||||||
|
opacity: 0;
|
||||||
|
animation: fadeInAnimation 0.3s ease forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeInAnimation {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.animatedFadeOut {
|
||||||
|
opacity: 1;
|
||||||
|
animation: fadeOutAnimation 0.3s ease forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeOutAnimation {
|
||||||
|
from {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#largeVideoContainer {
|
#largeVideoContainer {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#largeVideoWrapper {
|
#largeVideoWrapper {
|
||||||
@@ -156,7 +189,7 @@
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@include circle(5px);
|
@include circle(5px);
|
||||||
background: $audioLevelShadow;
|
background: rgba(9, 36, 77, 0.9);
|
||||||
margin: 1px 0 1px 0;
|
margin: 1px 0 1px 0;
|
||||||
transition: opacity .25s ease-in-out;
|
transition: opacity .25s ease-in-out;
|
||||||
-moz-transition: opacity .25s ease-in-out;
|
-moz-transition: opacity .25s ease-in-out;
|
||||||
@@ -172,27 +205,10 @@
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
-webkit-filter: blur(0.5px);
|
-webkit-filter: blur(0.5px);
|
||||||
filter: blur(0.5px);
|
filter: blur(0.5px);
|
||||||
background: $audioLevelBg;
|
background: #44A5FF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#reloadPresentation {
|
|
||||||
display: none;
|
|
||||||
position: absolute;
|
|
||||||
color: #FFFFFF;
|
|
||||||
top: 0;
|
|
||||||
right:0;
|
|
||||||
padding: 10px 10px;
|
|
||||||
font-size: 11pt;
|
|
||||||
cursor: pointer;
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
border-radius: 5px;
|
|
||||||
background-clip: padding-box;
|
|
||||||
-webkit-border-radius: 5px;
|
|
||||||
-webkit-background-clip: padding-box;
|
|
||||||
z-index: $reloadZ; /*The reload button should appear on top of the header!*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#dominantSpeaker {
|
#dominantSpeaker {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
width: 300px;
|
width: 300px;
|
||||||
@@ -203,10 +219,6 @@
|
|||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
#mixedstream {
|
|
||||||
display:none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dominantSpeakerAvatarContainer,
|
#dominantSpeakerAvatarContainer,
|
||||||
.dynamic-shadow {
|
.dynamic-shadow {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
@@ -254,10 +266,10 @@
|
|||||||
#avatarContainer {
|
#avatarContainer {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 50vh;
|
height: 50dvh;
|
||||||
margin-top: 25vh;
|
margin-top: 25dvh;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
width: 50vh;
|
width: 50dvh;
|
||||||
|
|
||||||
#avatar {
|
#avatar {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -276,11 +288,6 @@
|
|||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.videoMessageFilter {
|
|
||||||
-webkit-filter: grayscale(.5) opacity(0.8);
|
|
||||||
filter: grayscale(.5) opacity(0.8);
|
|
||||||
}
|
|
||||||
|
|
||||||
#remotePresenceMessage,
|
#remotePresenceMessage,
|
||||||
#remoteConnectionMessage {
|
#remoteConnectionMessage {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -332,7 +339,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.presence-label {
|
.presence-label {
|
||||||
color: $participantNameColor;
|
color: #fff;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 100;
|
font-weight: 100;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ body.welcome-page {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
font-family: $welcomePageFontFamily;
|
font-family: $welcomePageFontFamily;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
min-height: 100vh;
|
min-height: 100dvh;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
@@ -20,7 +20,6 @@ body.welcome-page {
|
|||||||
background-size: $welcomePageHeaderBackgroundSize;
|
background-size: $welcomePageHeaderBackgroundSize;
|
||||||
padding-bottom: $welcomePageHeaderPaddingBottom;
|
padding-bottom: $welcomePageHeaderPaddingBottom;
|
||||||
background-color: #131519;
|
background-color: #131519;
|
||||||
height: 400px;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
@@ -62,26 +61,58 @@ body.welcome-page {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.insecure-room-name-warning {
|
||||||
|
align-items: center;
|
||||||
|
color: rgb(215, 121, 118);
|
||||||
|
font-weight: 600;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
margin-top: 15px;
|
||||||
|
max-width: 480px;
|
||||||
|
width: $welcomePageEnterRoomWidth;
|
||||||
|
|
||||||
|
.jitsi-icon {
|
||||||
|
margin-right: 15px;
|
||||||
|
|
||||||
|
svg {
|
||||||
|
fill: rgb(215, 121, 118);
|
||||||
|
|
||||||
|
& > *:first-child {
|
||||||
|
fill: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::placeholder {
|
||||||
|
color: #253858;
|
||||||
|
}
|
||||||
|
|
||||||
#enter_room {
|
#enter_room {
|
||||||
display: $welcomePageEnterRoomDisplay;
|
display: $welcomePageEnterRoomDisplay;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
max-width: 480px;
|
max-width: 480px;
|
||||||
width: $welcomePageEnterRoomWidth;
|
width: $welcomePageEnterRoomWidth;
|
||||||
z-index: $zindex2;
|
z-index: $zindex2;
|
||||||
background-color: #fff;
|
height: fit-content;
|
||||||
padding: $welcomePageEnterRoomPadding;
|
|
||||||
border-radius: 4px;
|
|
||||||
margin: $welcomePageEnterRoomMargin;
|
|
||||||
|
|
||||||
.enter-room-input-container {
|
.join-meeting-container {
|
||||||
|
margin: $welcomePageEnterRoomMargin;
|
||||||
|
padding: $welcomePageEnterRoomPadding;
|
||||||
|
border-radius: 4px;
|
||||||
|
background-color: #fff;
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: #253858;
|
color: #253858;
|
||||||
|
}
|
||||||
|
|
||||||
|
.enter-room-input-container {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
height: fit-content;
|
|
||||||
padding-right: 4px;
|
padding-right: 4px;
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.enter-room-input {
|
.enter-room-input {
|
||||||
|
border-radius: 4px;
|
||||||
border: 0;
|
border: 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@@ -90,48 +121,17 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.insecure-room-name-warning {
|
|
||||||
align-items: center;
|
|
||||||
color: $defaultWarningColor;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
margin-top: 15px;
|
|
||||||
|
|
||||||
.jitsi-icon {
|
|
||||||
margin-right: 15px;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
fill: $defaultWarningColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::placeholder {
|
|
||||||
color: #253858;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.warning-without-link {
|
|
||||||
position: absolute;
|
|
||||||
top: 44px;
|
|
||||||
left: -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.warning-with-link {
|
|
||||||
position: absolute;
|
|
||||||
top: 84px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#moderated-meetings {
|
#moderated-meetings {
|
||||||
max-width: calc(100% - 40px);
|
max-width: calc(100% - 40px);
|
||||||
padding: 16px 0 39px 0;
|
padding: 16px 0 0;
|
||||||
width: $welcomePageEnterRoomWidth;
|
width: $welcomePageEnterRoomWidth;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
@@ -167,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;
|
||||||
@@ -176,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,101 +0,0 @@
|
|||||||
.button-control {
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: inline-block;
|
|
||||||
border: 1px solid $buttonBorder;
|
|
||||||
vertical-align: baseline;
|
|
||||||
height: 30px;
|
|
||||||
min-width: 60px;
|
|
||||||
padding: 4px 10px;
|
|
||||||
margin: 0;
|
|
||||||
line-height: 1.5em;
|
|
||||||
outline: none;
|
|
||||||
background-color: transparent;
|
|
||||||
float: right;
|
|
||||||
font-size: 14px;
|
|
||||||
margin-left: 10px;
|
|
||||||
color: $buttonColor;
|
|
||||||
font-weight: $buttonFontWeight;
|
|
||||||
@include transition(background-color .1s ease-out);
|
|
||||||
|
|
||||||
&[disabled] {
|
|
||||||
color: #666;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
&_full-width {
|
|
||||||
margin: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
border: 1px solid $buttonHoverBorder;
|
|
||||||
background-color: $buttonHoverBackground;
|
|
||||||
@include transition(background-color .1s ease-in);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
@include box-shadow(0, 0, 1px, $buttonShadowColor, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
&_light {
|
|
||||||
color: $defaultDarkColor;
|
|
||||||
background-color: $buttonLightBackground;
|
|
||||||
border: 1px solid $buttonLightBorder;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
border: 1px solid $buttonLightHoverBorder;
|
|
||||||
background-color: $buttonLightHoverBackground;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&_link {
|
|
||||||
color: $buttonLinkColor;
|
|
||||||
background-color: $buttonLinkBackground;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $buttonLinkBackground;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&_overlay {
|
|
||||||
color: $primaryButtonColor;
|
|
||||||
background-color: $overlayButtonBg;
|
|
||||||
border-radius: 2px;
|
|
||||||
border: none;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $primaryButtonBackground;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&_primary {
|
|
||||||
background-color: $primaryButtonBackground;
|
|
||||||
border: 1px solid $primaryButtonBackground;
|
|
||||||
color: $primaryButtonColor !important;
|
|
||||||
font-weight: $primaryButtonFontWeight;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
border: 1px solid $primaryButtonHoverBackground;
|
|
||||||
background-color: $primaryButtonHoverBackground;
|
|
||||||
}
|
|
||||||
|
|
||||||
&[disabled] {
|
|
||||||
color: $primaryButtonColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&_close {
|
|
||||||
color: $defaultFontColor;
|
|
||||||
}
|
|
||||||
&_submit {
|
|
||||||
color: $linkFontColor;
|
|
||||||
&:hover {
|
|
||||||
color: $linkHoverFontColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&_center {
|
|
||||||
float: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
.form-control {
|
|
||||||
padding: $formPadding 0;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
padding-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__text {
|
|
||||||
margin: 8px 0;
|
|
||||||
font-size: 1em
|
|
||||||
}
|
|
||||||
|
|
||||||
&__label {
|
|
||||||
font-size: 1em;
|
|
||||||
font-weight: $labelFontWeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__em {
|
|
||||||
color: $inputControlEmColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__container {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
@include flex();
|
|
||||||
|
|
||||||
.button-control {
|
|
||||||
margin: 1px 0 1px 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__right {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a specific color for read only style.
|
|
||||||
*/
|
|
||||||
input:read-only {
|
|
||||||
color: $readOnlyInputColor;
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
.input-control {
|
|
||||||
@include transition(all .2s ease-in);
|
|
||||||
display: inline-block;
|
|
||||||
width: 100%;
|
|
||||||
padding: 5px 7px;
|
|
||||||
border-radius: $borderRadius;
|
|
||||||
line-height: 32px;
|
|
||||||
height: 32px;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::selection {
|
|
||||||
background-color: $defaultDarkSelectionColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
&.error {
|
|
||||||
color: $errorColor;
|
|
||||||
border-color: $errorColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@include placeholder {
|
|
||||||
color: $placeHolderColor;
|
|
||||||
}
|
|
||||||
@@ -19,7 +19,7 @@ input[type=range]:focus {
|
|||||||
* Include the mixin for a range input style.
|
* Include the mixin for a range input style.
|
||||||
*/
|
*/
|
||||||
@include slider {
|
@include slider {
|
||||||
background: $sliderTrackBackground;
|
background: #474747;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -33,9 +33,9 @@ input[type=range]:focus {
|
|||||||
@include slider-thumb {
|
@include slider-thumb {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
background: white;
|
background: white;
|
||||||
border: 1px solid $sliderThumbBackground;
|
border: 1px solid #3572b0;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
box-shadow: 0px 0px 1px $sliderThumbBackground;
|
box-shadow: 0px 0px 1px #3572b0;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
height: 14px;
|
height: 14px;
|
||||||
margin-top: -4px;
|
margin-top: -4px;
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
.link {
|
|
||||||
cursor: pointer;
|
|
||||||
color: $linkFontColor;
|
|
||||||
@include transition(color .1s ease-out);
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: $linkHoverFontColor;
|
|
||||||
text-decoration: underline;
|
|
||||||
@include transition(color .1s ease-in);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper links are links that are meant to open a documentation page or more
|
|
||||||
* detailed info.
|
|
||||||
*/
|
|
||||||
.helper-link {
|
|
||||||
@extend .link;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
.deep-linking-mobile {
|
.deep-linking-mobile {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
height: 100vh;
|
height: 100dvh;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
width: auto;
|
width: auto;
|
||||||
|
|
||||||
&__title {
|
&__title {
|
||||||
border-bottom: 1px solid $inlayBorderColor;
|
border-bottom: 1px solid lighten(#FFFFFF, 10%);
|
||||||
color: $unsupportedBrowserTitleColor;
|
color: $unsupportedBrowserTitleColor;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.5px;
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
position: relative;
|
position: relative;
|
||||||
background-size: contain;
|
background-size: contain;
|
||||||
border: $thumbnailVideoBorder solid transparent;
|
border: 2px solid transparent;
|
||||||
border-radius: $borderRadius;
|
border-radius: $borderRadius;
|
||||||
margin: 0 $thumbnailVideoMargin;
|
margin: 0 2px;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
cursor: hand;
|
cursor: hand;
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ $flagsImagePath: "../images/";
|
|||||||
|
|
||||||
/* Modules BEGIN */
|
/* Modules BEGIN */
|
||||||
@import 'reset';
|
@import 'reset';
|
||||||
@import 'atlaskit_overrides';
|
|
||||||
@import 'base';
|
@import 'base';
|
||||||
@import 'utils';
|
@import 'utils';
|
||||||
@import 'overlay/overlay';
|
@import 'overlay/overlay';
|
||||||
@@ -33,15 +32,11 @@ $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/feedback/feedback';
|
|
||||||
@import 'modals/invite/info';
|
@import 'modals/invite/info';
|
||||||
@import 'modals/screen-share/share-audio';
|
@import 'modals/screen-share/share-audio';
|
||||||
@import 'modals/screen-share/share-screen-warning';
|
@import 'modals/screen-share/share-screen-warning';
|
||||||
@import 'videolayout_default';
|
@import 'videolayout_default';
|
||||||
@import 'notice';
|
|
||||||
@import 'subject';
|
@import 'subject';
|
||||||
@import 'popup_menu';
|
@import 'popup_menu';
|
||||||
@import 'recording';
|
@import 'recording';
|
||||||
@@ -53,10 +48,6 @@ $flagsImagePath: "../images/";
|
|||||||
@import 'welcome_page_settings_toolbar';
|
@import 'welcome_page_settings_toolbar';
|
||||||
@import 'toolbars';
|
@import 'toolbars';
|
||||||
@import 'redirect_page';
|
@import 'redirect_page';
|
||||||
@import 'components/form-control';
|
|
||||||
@import 'components/link';
|
|
||||||
@import 'components/button-control';
|
|
||||||
@import 'components/input-control';
|
|
||||||
@import 'components/input-slider';
|
@import 'components/input-slider';
|
||||||
@import '404';
|
@import '404';
|
||||||
@import 'policy';
|
@import 'policy';
|
||||||
@@ -68,7 +59,6 @@ $flagsImagePath: "../images/";
|
|||||||
@import 'filmstrip/vertical_filmstrip';
|
@import 'filmstrip/vertical_filmstrip';
|
||||||
@import 'filmstrip/vertical_filmstrip_overrides';
|
@import 'filmstrip/vertical_filmstrip_overrides';
|
||||||
@import 'unsupported-browser/main';
|
@import 'unsupported-browser/main';
|
||||||
@import 'modals/invite/add-people';
|
|
||||||
@import 'deep-linking/main';
|
@import 'deep-linking/main';
|
||||||
@import 'transcription-subtitles';
|
@import 'transcription-subtitles';
|
||||||
@import '_meetings_list.scss';
|
@import '_meetings_list.scss';
|
||||||
@@ -79,19 +69,12 @@ $flagsImagePath: "../images/";
|
|||||||
@import 'chrome-extension-banner';
|
@import 'chrome-extension-banner';
|
||||||
@import 'settings-button';
|
@import 'settings-button';
|
||||||
@import 'meter';
|
@import 'meter';
|
||||||
@import 'audio-preview';
|
|
||||||
@import 'video-preview';
|
|
||||||
@import 'premeeting/main';
|
@import 'premeeting/main';
|
||||||
@import 'country-picker';
|
|
||||||
@import 'modals/invite/invite_more';
|
@import 'modals/invite/invite_more';
|
||||||
@import 'modals/security/security';
|
@import 'modals/security/security';
|
||||||
@import 'e2ee';
|
|
||||||
@import 'responsive';
|
@import 'responsive';
|
||||||
@import 'drawer';
|
|
||||||
@import 'participants-pane';
|
@import 'participants-pane';
|
||||||
@import 'reactions-menu';
|
@import 'reactions-menu';
|
||||||
@import 'plan-limit';
|
@import 'plan-limit';
|
||||||
@import 'polls';
|
|
||||||
@import 'notifications';
|
|
||||||
|
|
||||||
/* Modules END */
|
/* Modules END */
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
margin-top: 5px !important;
|
margin-top: 5px !important;
|
||||||
|
|
||||||
.input-control {
|
.input-control {
|
||||||
background: $modalMockAKInputBackground;
|
background: #fafbfc;
|
||||||
border: $modalMockAKInputBorder;
|
border: 1px solid #f4f5f7;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12,24 +12,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling inline dialog errors.
|
|
||||||
*/
|
|
||||||
.inline-dialog-error {
|
|
||||||
margin-top: 16px;
|
|
||||||
|
|
||||||
&-text {
|
|
||||||
color: $dialogErrorText;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-button {
|
|
||||||
display: block;
|
|
||||||
margin: 16px auto 0 auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Styling shared video dialog errors.
|
* Styling shared video dialog errors.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
.embed-meeting {
|
|
||||||
&-dialog {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-copy {
|
|
||||||
color: white;
|
|
||||||
font-size: 15px;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-top: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-code {
|
|
||||||
background: transparent;
|
|
||||||
border: 1px solid #A4B8D1;
|
|
||||||
color: white;
|
|
||||||
font-size: 15px;
|
|
||||||
height: 165px;
|
|
||||||
line-height: 24px;
|
|
||||||
padding: 8px;
|
|
||||||
width: 100%;
|
|
||||||
resize: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-trigger {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
padding: 8px 8px 8px 16px;
|
|
||||||
margin-top: 24px;
|
|
||||||
width: calc(100% - 24px);
|
|
||||||
height: 24px;
|
|
||||||
background: #2A3A4B;
|
|
||||||
border: 1px solid #5E6D7A;
|
|
||||||
border-radius: 4px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
.jitsi-icon {
|
|
||||||
margin-right: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
@-webkit-keyframes shake-rotate {
|
|
||||||
0% {
|
|
||||||
-webkit-transform:scale(1) rotate(0deg);
|
|
||||||
transform:scale(1) rotate(0deg)
|
|
||||||
}
|
|
||||||
|
|
||||||
50% {
|
|
||||||
-webkit-transform:scale(.8) rotate(-5deg);
|
|
||||||
transform:scale(.8) rotate(-5deg)
|
|
||||||
}
|
|
||||||
|
|
||||||
to {
|
|
||||||
-webkit-transform:scale(1) rotate(3deg);
|
|
||||||
transform:scale(1) rotate(3deg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes shake-rotate {
|
|
||||||
0% {
|
|
||||||
-webkit-transform:scale(1) rotate(0deg);
|
|
||||||
transform:scale(1) rotate(0deg)
|
|
||||||
}
|
|
||||||
|
|
||||||
50% {
|
|
||||||
-webkit-transform:scale(.8) rotate(-5deg);
|
|
||||||
transform:scale(.8) rotate(-5deg)
|
|
||||||
}
|
|
||||||
|
|
||||||
to {
|
|
||||||
-webkit-transform:scale(1) rotate(3deg);
|
|
||||||
transform:scale(1) rotate(3deg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.shake-rotate {
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
-webkit-animation-duration: .4s;
|
|
||||||
animation-duration: .4s;
|
|
||||||
-webkit-animation-iteration-count: infinite;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
-webkit-animation-name: shake-rotate;
|
|
||||||
animation-name: shake-rotate;
|
|
||||||
-webkit-animation-timing-function: ease-in-out;
|
|
||||||
animation-timing-function: ease-in-out
|
|
||||||
}
|
|
||||||
|
|
||||||
.feedback-dialog {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
|
|
||||||
.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -41,10 +41,3 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Styles errors in the MultiSelectAutocomplete.
|
|
||||||
*/
|
|
||||||
.autocomplete-error {
|
|
||||||
min-width: 260px;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -50,17 +50,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.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;
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
|
|
||||||
thead {
|
* {
|
||||||
text-align: left;
|
user-select: text;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr {
|
thead {
|
||||||
border-bottom: 1px solid #d1dbe8;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.flag-cell {
|
.flag-cell {
|
||||||
@@ -91,6 +93,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 {
|
||||||
@@ -119,11 +122,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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,4 @@
|
|||||||
.invite-more {
|
.invite-more {
|
||||||
&-container {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
transition: margin-bottom 0.3s;
|
|
||||||
|
|
||||||
&.elevated {
|
|
||||||
margin-bottom: 36px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
padding: 16px;
|
|
||||||
background: rgba(0, 0, 0, 0.7);
|
|
||||||
border-radius: 8px;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 24px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-header {
|
|
||||||
max-width: 100%;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-button {
|
|
||||||
display: flex;
|
|
||||||
max-width: 100%;
|
|
||||||
height: 40px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 8px 16px;
|
|
||||||
background: #0376DA;
|
|
||||||
border-radius: 3px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
@media (hover: hover) and (pointer: fine) {
|
|
||||||
&:hover {
|
|
||||||
background: #278ADF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-text {
|
|
||||||
margin-left: 8px;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&-dialog {
|
&-dialog {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
@@ -65,59 +12,6 @@
|
|||||||
background: #5E6D7A;
|
background: #5E6D7A;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.email-container {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
padding: 8px 8px 8px 16px;
|
|
||||||
margin-top: 24px;
|
|
||||||
width: calc(100% - 26px);
|
|
||||||
height: 22px;
|
|
||||||
|
|
||||||
background: #2A3A4B;
|
|
||||||
border: 1px solid #5E6D7A;
|
|
||||||
border-radius: 3px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
border-radius: 3px 3px 0 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.invite-buttons {
|
|
||||||
width: 100%;
|
|
||||||
text-align: right;
|
|
||||||
margin-top: 8px;
|
|
||||||
|
|
||||||
& > a {
|
|
||||||
display: inline-block;
|
|
||||||
height: 24px;
|
|
||||||
min-width: 48px;
|
|
||||||
border-radius: 3px;
|
|
||||||
text-align: center;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-cancel {
|
|
||||||
margin-right: 16px;
|
|
||||||
padding: 7px 15px;
|
|
||||||
background: #2A3A4B;
|
|
||||||
border: 1px solid #5E6D7A;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-add {
|
|
||||||
padding: 8px 16px;
|
|
||||||
background: #0376DA;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
& > a {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.stream {
|
&.stream {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -158,14 +52,3 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.mobile-browser {
|
|
||||||
.invite-more-content {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.invite-more-button {
|
|
||||||
height: 48px;
|
|
||||||
padding: 12px 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
.share-audio-dialog-container {
|
|
||||||
max-height: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-audio-dialog {
|
.share-audio-dialog {
|
||||||
.share-audio-animation {
|
.share-audio-animation {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
&-actions {
|
&-actions {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
a {
|
button {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|||||||
@@ -6,12 +6,12 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: $overlayZ;
|
z-index: 1016;
|
||||||
background: $defaultBackground;
|
background: #474747;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__container-light {
|
&__container-light {
|
||||||
@include transparentBg($defaultBackground, 0.7);
|
@include transparentBg(#474747, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
&__content {
|
&__content {
|
||||||
|
|||||||
@@ -208,3 +208,26 @@
|
|||||||
.lobby-button-margin {
|
.lobby-button-margin {
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lobby-prejoin-error {
|
||||||
|
background-color: #E04757;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: white;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
margin-top: -8px;
|
||||||
|
padding: 4px;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lobby-prejoin-input {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
& input {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
@import 'lobby';
|
@import 'lobby';
|
||||||
@import 'premeeting-screens';
|
@import 'premeeting-screens';
|
||||||
@import 'prejoin';
|
|
||||||
@import 'prejoin-third-party';
|
@import 'prejoin-third-party';
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ $sidePanelWidth: 300px;
|
|||||||
.prejoin-third-party {
|
.prejoin-third-party {
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
z-index: auto;
|
z-index: auto;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
height: auto;
|
height: auto;
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
.prejoin {
|
|
||||||
&-input-area {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-avatar {
|
|
||||||
margin: 8px auto 16px;
|
|
||||||
|
|
||||||
&-name {
|
|
||||||
color: white;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
line-height: 26px;
|
|
||||||
margin-bottom: 32px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-container {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-error {
|
|
||||||
background-color: #E04757;
|
|
||||||
border-radius: 6px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
color: white;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 16px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
margin-top: -8px;
|
|
||||||
padding: 4px;
|
|
||||||
text-align: center;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.prejoin-preview {
|
|
||||||
&-dropdown-btns {
|
|
||||||
padding: 8px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-dropdown-container {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Override default InlineDialog behaviour, since it does not play nicely with relative widths
|
|
||||||
*/
|
|
||||||
& > div:nth-child(2) {
|
|
||||||
background: #E0E0E0;
|
|
||||||
padding: 0;
|
|
||||||
position: absolute !important;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.prejoin-input {
|
|
||||||
margin-bottom: 16px;
|
|
||||||
|
|
||||||
& input {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
.toolbox-content-wrapper,
|
.toolbox-content-wrapper,
|
||||||
.toolbox-content-items {
|
.toolbox-content-items {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 100%;
|
width: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
width: 180px;
|
width: 180px;
|
||||||
|
|
||||||
.progress-indicator-fill {
|
.progress-indicator-fill {
|
||||||
background: $reloadProgressBarBg;
|
background: #0074E0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
transition: width .5s;
|
transition: width .5s;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: $ringingZ;
|
z-index: 300;
|
||||||
@include transparentBg(#283447, 0.95);
|
@include transparentBg(#283447, 0.95);
|
||||||
|
|
||||||
&.solidBG {
|
&.solidBG {
|
||||||
background: $defaultBackground;
|
background: #040404;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__content {
|
&__content {
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
/**
|
|
||||||
* Base
|
|
||||||
*/
|
|
||||||
$baseLight: #FFFFFF;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controls
|
|
||||||
*/
|
|
||||||
$sliderTrackBackground: #474747;
|
|
||||||
$sliderThumbBackground: #3572b0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Buttons
|
|
||||||
*/
|
|
||||||
$buttonBackground: #44A5FF;
|
|
||||||
$buttonHoverBackground: #2c4062;
|
|
||||||
$buttonBorder: transparent;
|
|
||||||
$buttonHoverBorder: transparent;
|
|
||||||
$buttonColor: #eceef1;
|
|
||||||
|
|
||||||
$buttonLightBackground: #f5f5f5;
|
|
||||||
$buttonLightHoverBackground: #e9e9e9;
|
|
||||||
$buttonLightBorder: #ccc;
|
|
||||||
$buttonLightHoverBorder: #999;
|
|
||||||
|
|
||||||
$buttonLinkBackground: transparent;
|
|
||||||
$buttonLinkColor: #0090e8;
|
|
||||||
|
|
||||||
$primaryButtonBackground: #3572b0;
|
|
||||||
$primaryButtonHoverBackground: #2a67a5;
|
|
||||||
$primaryButtonColor: $baseLight;
|
|
||||||
$primaryButtonFontWeight: 400;
|
|
||||||
|
|
||||||
$buttonShadowColor: #192d4f;
|
|
||||||
|
|
||||||
$overlayButtonBg: #0074E0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Color variables
|
|
||||||
**/
|
|
||||||
$defaultBackground: #474747;
|
|
||||||
$reloadProgressBarBg: #0074E0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dialog colors
|
|
||||||
**/
|
|
||||||
$dialogErrorText: #344563;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inlay colors
|
|
||||||
**/
|
|
||||||
$inlayColorBg: lighten($defaultBackground, 20%);
|
|
||||||
$inlayBorderColor: lighten($baseLight, 10%);
|
|
||||||
|
|
||||||
// Main controls
|
|
||||||
$placeHolderColor: #a7a7a7;
|
|
||||||
$readOnlyInputColor: #a7a7a7;
|
|
||||||
$defaultDarkSelectionColor: #ccc;
|
|
||||||
$buttonFontWeight: 400;
|
|
||||||
$labelFontWeight: 400;
|
|
||||||
$linkFontColor: #3572b0;
|
|
||||||
$linkHoverFontColor: darken(#3572b0, 10%);
|
|
||||||
$errorColor: #c61600;
|
|
||||||
|
|
||||||
|
|
||||||
// Popover colors
|
|
||||||
$popoverFontColor: #ffffff !important;
|
|
||||||
|
|
||||||
// Toolbar
|
|
||||||
$toolbarBackground: rgba(0, 0, 0, 0.5);
|
|
||||||
$toolbarBadgeBackground: #165ECC;
|
|
||||||
$toolbarBadgeColor: #FFFFFF;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forms
|
|
||||||
*/
|
|
||||||
$selectBg: $baseLight;
|
|
||||||
@@ -25,11 +25,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&__link {
|
&__link {
|
||||||
color: $linkFontColor;
|
color: #489afe;
|
||||||
@include transition(color .1s ease-out);
|
@include transition(color .1s ease-out);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $linkHoverFontColor;
|
color: #287ade;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|
||||||
|
|||||||
5
debian/jitsi-meet-tokens.postinst
vendored
5
debian/jitsi-meet-tokens.postinst
vendored
@@ -38,6 +38,11 @@ case "$1" in
|
|||||||
if [ "$RET" = "false" ] ; then
|
if [ "$RET" = "false" ] ; then
|
||||||
echo "Application secret is mandatory"
|
echo "Application secret is mandatory"
|
||||||
fi
|
fi
|
||||||
|
# Not allowed unix special characters in secret: /, \, ", ', `
|
||||||
|
if echo "$RET" | grep -q "[/\\\"\`\']" ; then
|
||||||
|
echo "Application secret contains invalid characters: /, \\, \", ', \`"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
APP_SECRET=$RET
|
APP_SECRET=$RET
|
||||||
|
|
||||||
PROSODY_HOST_CONFIG="/etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua"
|
PROSODY_HOST_CONFIG="/etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user