Compare commits

..

424 Commits

Author SHA1 Message Date
paweldomas
cf83b4142a ref(config): move loggingConfig to config.js 2016-12-01 16:59:39 -06:00
yanas
75b3bc6190 Merge pull request #1176 from jitsi/net_or_infra
Add 'isNetworkFailure' argument to PageReloadOverlay
2016-12-01 16:57:39 -06:00
paweldomas
6c716bcbb1 fix(conference.js): handle CONNECTION_DROPPED_ERROR 2016-12-01 15:55:00 -06:00
paweldomas
44beed6216 feat: distinguish between network and infra... failure 2016-12-01 11:38:44 -06:00
paweldomas
2352811c20 chore(package.json): use fixed version of Strophe
There was functionality added to lib-jitsi-meet that depends on
particular version of Strophe. It could be possibly broken without
testing the update.
2016-12-01 11:38:44 -06:00
Lyubomir Marinov
c1df375af4 Extend ./react/.eslintrc.js from ./.eslintrc.js 2016-12-01 08:30:35 -06:00
Дамян Минков
e8c631de01 Merge pull request #1174 from jitsi/fix-disabled-welcome-page
Fix disabled Welcome page broken with the introduction of React
2016-11-30 21:49:25 -06:00
Lyubomir Marinov
bdc67201e2 Fix disabled Welcome page broken with the introduction of React
The React-based rewrite looks whether there's a room name (in the
window's location) in order to choose between WelcomePage and
Conference. But app.js expects Conference to be rendered before it
builds a room name if WelcomePage is disabled and there's no room name.
A quick and dirty workaround is to render Conference within WelcomePage
so that the rendered result closely resembles index.html before the
React-based rewrite.
2016-11-30 19:54:09 -06:00
Lyubomir Marinov
0db33bb45c React propTypes as static class properties 2016-11-30 19:53:40 -06:00
Дамян Минков
9f26270a98 Merge pull request #1169 from jitsi/page_reload_reason
Log more details on page reload
2016-11-30 15:25:09 -06:00
paweldomas
df721cbd2e feat(analytics): add reason as label to page reload event 2016-11-30 14:30:44 -06:00
hristoterezov
8745efb81f Merge pull request #1158 from jitsi/log_collector
Log collector
2016-11-30 13:07:18 -06:00
yanas
e56f1a9ded Merge pull request #1167 from jitsi/fix_anonymous_domain
Fix the UI when anonymous domain auth is in use
2016-11-30 10:51:24 -06:00
Lyubomir Marinov
52fbb8f02c [RN] Fix React.PropTypes warning 2016-11-30 10:06:29 -06:00
Lyubomir Marinov
a1639b67a5 [RN] Don't display background colors underneath text on WelcomePage 2016-11-30 10:00:59 -06:00
paweldomas
3475ad4674 ref(LogCollector): adapts to caching in LogCollector 2016-11-30 07:38:39 -06:00
damencho
685d117a91 Fixes custom cert and key files for apache config. 2016-11-29 23:54:19 -06:00
damencho
e51f791ab0 Configures to use apache when this is the available web server. 2016-11-29 23:11:15 -06:00
yanas
0f2ba1cefe refactor(UIUtils): merges show and hide functions and cleans visibility setting 2016-11-29 15:07:18 -06:00
Lyubomir Marinov
1f457dfca5 Hyperlinks to legalese such as Privacy Policy and Terms of Service 2016-11-29 14:30:58 -06:00
Paweł Domas
841050953f Merge pull request #1172 from bgrozev/enable-tab-sharing
feat: Enables by default tab sharing for chrome.
2016-11-29 14:08:38 -06:00
Дамян Минков
c6296821c0 Merge pull request #1164 from gerfigna/patch-1
Update api.md. There is still work to be done, cause handling parameters in executeCommand is not currently correct and needs fixing. But for now displayname is the only command that requires a parameter.
2016-11-29 13:18:55 -06:00
paweldomas
7c8ca45d9a ref(LogCollector): extract JitsiMeetLogStorage 2016-11-29 11:30:37 -06:00
Boris Grozev
142f6e4518 feat: Enables by default tab sharing for chrome. 2016-11-29 11:30:02 -06:00
Lyubomir Marinov
f72e7ffbc2 Fix ESLint errors 2016-11-28 20:07:10 -06:00
Lyubomir Marinov
111b6e1c27 React Native 0.38.0, React 15.4.1 2016-11-28 20:07:10 -06:00
Дамян Минков
4add2d0590 Merge pull request #1168 from jitsi/exclude_build_dir
Add 'build' dir to jshintignore
2016-11-28 16:16:38 -06:00
Дамян Минков
cb0f7417b6 Merge pull request #1166 from jitsi/fix-reload-overlay-layout
fix(PageReloadOverlay):Basic layout fix
2016-11-28 16:00:35 -06:00
paweldomas
06eb7c6109 fix(jshintignore): exclude 'build' dir 2016-11-28 15:48:07 -06:00
damencho
4d0701cfda Fixes build. Wrong changelog file. 2016-11-28 14:18:23 -06:00
Дамян Минков
86bce1e5f6 Merge pull request #1152 from jitsi/deb-update
Updates debian packaging.
2016-11-28 13:45:51 -06:00
damencho
8da0d3a1f1 Removes dependencies to other components.
Now the web app can be installed separately from jicofo and jitsi-videobridge, or can be installed on machine running nginx or apache. Currently only nginx will be configured and apache config is left to user. Later we can add and the apache config. Renames jitsi-meet to jitsi-meet-web (just the web content) and jitsi-meet-web-config (configuring jetty, nginx or apache). A new jitsi-meet package will be introduced, a meta package depending on jicofo, jvb and the current packages.
2016-11-28 13:13:08 -06:00
hristoterezov
f32438b219 Merge pull request #1161 from jitsi/pinning-local-not-signal-unpin
Sending unpin after clicking local video and unpinning remote.
2016-11-28 12:06:56 -06:00
paweldomas
0238a10a4b fix(MessageHandler): hide the close button when 'persistent' 2016-11-28 11:05:18 -06:00
paweldomas
6669a96fd8 fix(Toolbar.js): hide recording and SIP buttons from the start 2016-11-28 11:05:18 -06:00
paweldomas
09406bfbfc fix(Toolbar): move login buttons to Profile
Authentication buttons no longer belong to the Toolbar.
2016-11-28 11:05:18 -06:00
paweldomas
51da40e90c ref(UIUtil): add showOrHideElement 2016-11-28 11:05:18 -06:00
paweldomas
52847bd28d fix(conference): crash with anonymous domain config 2016-11-28 11:05:18 -06:00
yanas
835d3c6a25 fix(PageReloadOverlay):Basic layout fix 2016-11-28 10:08:47 -06:00
Germán Figna
00e6e98a61 Update api.md 2016-11-24 11:34:24 +01:00
Lyubomir Marinov
6d90adcdf6 Fix make failure caused by npm link 2016-11-24 02:21:21 -06:00
Ilya Daynatovich
06d2fb0aca Optimize React in production 2016-11-24 02:21:21 -06:00
Ilya Daynatovich
c3428e8213 Split React components out of index.html 2016-11-24 02:21:02 -06:00
hristoterezov
57b0736ebb Merge pull request #1160 from jitsi/fix-unpinning-local-dominant-speaker
Fixes unpinning local user which is dominant speaker.
2016-11-23 17:40:47 -06:00
damencho
6211566c0c Sending unpin after clicking local video and unpinning remote.
If we:
 - pin a remote and click it, unpin is signalled.
 - pin a remote and the click another remote, the new one is pinned and signalled.
 - pin a remote and then click local. UI pins local, but unpinning remote is not signaled, fix addressed with this commit.
 - pin/unpin local, nothing is signalled.
2016-11-23 17:02:24 -06:00
Ilya Daynatovich
48bb427f71 The Makefile file format requires tab characters 2016-11-23 15:54:03 -06:00
hristoterezov
56f15356c7 Merge pull request #1159 from jitsi/non-focusable-close-toastr
Makes close button non-focusable.
2016-11-23 15:41:11 -06:00
damencho
8e6fd0ca95 Fixes unpinning local user which is dominant speaker.
It was not switching and staying on local video on unpinning, after change the last shown video will be used to switch to it.
2016-11-23 15:35:03 -06:00
damencho
b5dfc2a520 Makes close button non-focusable.
Prevents the close button to take focus while user clicks tab in the page, which will privent the toast to be closed.
2016-11-23 14:48:15 -06:00
Дамян Минков
4900fe020d Merge pull request #1156 from BeatC/fix-popover
Fix popover
2016-11-23 12:52:50 -06:00
paweldomas
94bd6bc330 feat(logging_config): add "disableLogCollector" option 2016-11-23 11:32:58 -06:00
paweldomas
36bcc6831b feat: use LogCollector to capture JS console logs 2016-11-23 11:32:58 -06:00
paweldomas
76c89845a8 feat: add logging config 2016-11-23 11:32:58 -06:00
paweldomas
b58f1cdd16 use logger instead of console 2016-11-23 11:32:55 -06:00
Ilya Daynatovich
141c64cd00 Add new variable 2016-11-23 12:32:59 +02:00
Ilya Daynatovich
51b802da84 fix problem with popover 2016-11-23 12:27:34 +02:00
yanas
71c27f308c Merge pull request #1155 from jitsi/removes-click-listeners
Removes click handlers when popup is hidden.
2016-11-22 17:33:30 -06:00
damencho
75b9adf01b Updates comments. 2016-11-22 17:31:01 -06:00
damencho
a079914603 Removes click handlers when popup is hidden. 2016-11-22 17:06:19 -06:00
yanas
4d3ca4a85a Merge pull request #1148 from jitsi/analytics
feat(Analytics): Multiple analytics handlers support
2016-11-22 13:53:02 -06:00
Lyubomir Marinov
afa1d5423c Merge branch 'prepare-for-react-1' 2016-11-21 21:00:13 -06:00
Ilya Daynatovich
766eb94c7d Prepare for React: Use Haste resolver for Web
In preparation for and as another early step in rewriting the Web
version of jitsi-meet using React, use Haste resolver which is able to
distinguish among platform-independent files, Web-specific and
mobile-specific ones.

Additionally, (1) make sure that Babel is capable of understanding React
files and (2) introduce React as a dependency.

The purpose is to repeatedly take small steps towards our goal and merge
them before they get in conflict with the separate ongoing advancement
of the Web version of jitsi-meet.
2016-11-21 20:26:50 -06:00
Дамян Минков
ad6e793615 Merge pull request #1146 from jitsi/adorable-io-avatars
fix: replace robohash avatars with adorable io
2016-11-21 10:00:57 -06:00
Paweł Domas
d900d3c3fd Merge pull request #1149 from jitsi/ss_resize
Fixes issue with not resizing properly if SS is on and the filmstrip is hidden
2016-11-18 12:42:11 -06:00
hristoterezov
7f315ef105 fix(VideoLayout): Issue with not resizing properly if SS is on and the filmstrip is hidden 2016-11-18 11:26:33 -06:00
hristoterezov
dc0a7e7628 feat(Analytics): Multiple analytics handlers support 2016-11-16 16:36:32 -06:00
yanas
6d1f42bf30 Merge pull request #1115 from jitsi/remove_css_classes
Removes unused css classes
2016-11-16 13:00:26 -06:00
yanas
c26b144f0d Merge pull request #1144 from kkrisstoff/chat-animation-fix
Chat animation fix
2016-11-16 12:45:40 -06:00
yanas
752f4dd5de Merge pull request #1141 from kkrisstoff/404-link-color
link class added
2016-11-16 11:24:48 -06:00
yanas
693ebbea9d Merge pull request #1143 from BeatC/visual-problems
Fix some ui bugs
2016-11-16 11:23:29 -06:00
yanas
b24a54aab2 fix: replace robohash avatars with adorable io 2016-11-16 11:06:25 -06:00
Konstantyn Pahsura
00aee89709 doc added 2016-11-16 14:09:22 +02:00
Дамян Минков
a5f243e18d Merge pull request #1142 from jitsi/fix-ff-desktop-sharing-message
fix: Firefox desktop sharing extension required dialog
2016-11-15 13:48:17 -06:00
yanas
d05ff9b4ee fix: Firefox desktop sharing extension required dialog 2016-11-15 12:41:24 -06:00
Konstantyn Pahsura
a67087b6de focus for chat changes 2016-11-15 20:18:40 +02:00
Ilya Daynatovich
e2ea16ea3f Fix some ui bugs 2016-11-15 16:37:09 +02:00
yanas
5098b64666 Merge pull request #1137 from BeatC/thumbnail-avatars
Thumbnail avatars
2016-11-14 17:47:59 -06:00
hristoterezov
66fbc28385 Merge branch 'kkrisstoff-add/tip-randomiser' 2016-11-14 15:02:58 -06:00
hristoterezov
4bcd75f15c refactor(close_pages): Refactor the close pages. 2016-11-14 15:02:27 -06:00
Konstantyn Pahsura
da6af88910 fixes and changes 2016-11-14 15:02:27 -06:00
Konstantyn Pahsura
1a91f4953b tip randomiser added 2016-11-14 15:02:27 -06:00
yanas
9a0d28720d Merge pull request #1139 from BeatC/FIX-adjust-branding1
Fix visual bugs in sidebar
2016-11-14 14:26:21 -06:00
hristoterezov
5b6956e25b Merge pull request #1101 from jitsi/stop_media_when_xmpp_drops
Stop the media when XMPP connection is dropped
2016-11-14 13:06:53 -06:00
Lyubomir Marinov
fd51108ae3 [iOS] Remove unnecessary CODE_SIGN_IDENTITY 2016-11-14 08:44:29 -06:00
Lyubomir Marinov
73a2eca51c [iOS] Strip unwanted architectures from embedded frameworks 2016-11-14 08:32:47 -06:00
Ilya Daynatovich
9bc24e1caa Fix aligning of indicator icon; Update logic for dynamically change of thumb indicators via font-size 2016-11-14 12:45:28 +02:00
Konstantyn Pahsura
3fc02bf6c2 link class added 2016-11-14 12:42:01 +02:00
Ilya Daynatovich
3bd4f1d5d8 Updated layout 2016-11-14 11:09:07 +02:00
Ilya Daynatovich
f3dbeea091 Make filmstrip indicators to resize dynamically 2016-11-14 11:09:07 +02:00
Ilya Daynatovich
d2ef94a7eb Fix problem with hint 2016-11-14 11:02:11 +02:00
Ilya Daynatovich
1d1d8defda Updated calculation of offset 2016-11-14 11:01:50 +02:00
Ilya Daynatovich
d0127b879d fixed dropdown colors 2016-11-14 11:01:50 +02:00
Ilya Daynatovich
cbc6943305 work on colors 2016-11-14 11:01:50 +02:00
Maxim Voloshin
9124aa2c87 Adjusted CSS for side toolbar elements 2016-11-14 11:01:50 +02:00
Lyubomir Marinov
8817f0c53d [iOS] Prepare for App Store release 2016-11-13 18:45:40 -06:00
Lyubomir Marinov
e4f9c17f8a [iOS] Prepare for App Store release 2016-11-13 18:27:23 -06:00
yanas
686ee1111a Merge pull request #1129 from BeatC/make-identical-text-input
Make identical text input
2016-11-11 15:45:46 -06:00
bgrozev
4b11767ac5 Merge pull request #1140 from jitsi/fix-desktop-sharing-screen-size
fix: desktop streming screen size
2016-11-11 13:53:39 -06:00
yanas
5545c0d905 fix: desktop streming screen size 2016-11-11 13:26:07 -06:00
bgrozev
611edf7e34 Merge pull request #1134 from jitsi/cosmetic-changes
Comment and empty lines removed
2016-11-11 13:18:41 -06:00
Lyubomir Marinov
7a37d70fb6 React Native 0.37.0 2016-11-11 11:57:25 -06:00
yanas
b2577090bd Merge pull request #1135 from BeatC/fix-js-from-styles-editions
Editions to "clean css from js"
2016-11-11 10:18:49 -06:00
Ilya Daynatovich
5b0777d4db Made inputs identical 2016-11-11 17:22:47 +02:00
Ilya Daynatovich
12c1574f07 renamed files 2016-11-11 17:13:18 +02:00
Ilya Daynatovich
5623a06996 renamed input-control block to form-control 2016-11-11 17:13:18 +02:00
Ilya Daynatovich
148960c6d2 made editions 2016-11-11 12:27:29 +02:00
yanas
ff8c6690ef Comment and empty lines removed 2016-11-10 17:27:19 -06:00
yanas
c926e95822 Merge pull request #1133 from jitsi/fix-tip-text-close-page
Modifies tip text in close page
2016-11-10 17:24:43 -06:00
yanas
0a28dd0cd3 Modifies tip text in close page 2016-11-10 17:02:34 -06:00
yanas
8caae4bfde Merge pull request #1111 from BeatC/FIX-clean-js-from-styles-1
Fix clean js from styles 1
2016-11-10 15:40:07 -06:00
yanas
a67c5a8dc7 Merge pull request #1108 from bgrozev/restrict-eslint-versions
chore: Only uses jslint 3+
2016-11-10 14:45:29 -06:00
yanas
cf38fde207 Updates to >= to match versions of 3+ 2016-11-10 14:20:30 -06:00
hristoterezov
4549b766f5 Merge pull request #1131 from jitsi/suspended-detection
Suspended detection
2016-11-10 13:45:14 -06:00
yanas
45126d4f3d Merge pull request #1132 from jitsi/calculate-correct-size-for-thumbnails
Calculate correct size for thumbnails
2016-11-10 13:17:32 -06:00
damencho
82926ef8c6 Detects suspended event, stops local video and shows overlay.
Also removes device change listener, cause when PC wakeups devices will be reconnected and we can try open the local video again.
2016-11-10 13:17:23 -06:00
yanas
42604971dc Merge pull request #1125 from BeatC/small-avatar-images
Fixed problem with resizing thumb avatars
2016-11-10 13:12:03 -06:00
yanas
95fcf5bae5 Change method name to fit better its purpose 2016-11-10 11:14:31 -06:00
Ilya Daynatovich
34acadc3b5 Rename method 2016-11-10 11:14:31 -06:00
Ilya Daynatovich
d3df082e3d Fix thumbnail overflow 2016-11-10 11:13:31 -06:00
Yana Stamcheva
fe7e9f333f [iOS] Fix launch screen text 2016-11-10 10:48:30 -06:00
Дамян Минков
92901e09e1 Merge pull request #1128 from BeatC/fix-toggle-filmstrip-shortcut
Moved keyboard initialization to filmstrip toolbar
2016-11-10 10:30:59 -06:00
Ilya Daynatovich
128b301a39 Fix the tests 2016-11-10 14:45:42 +02:00
Ilya Daynatovich
1b1b9475a4 Clean up js from styles 2016-11-10 13:32:12 +02:00
Ilya Daynatovich
5aff96e3b7 Updated in videolayout 2016-11-10 13:32:12 +02:00
Ilya Daynatovich
fb4e9b3c6d Work on fixing the tests 2016-11-10 13:32:12 +02:00
Ilya Daynatovich
a8a6b38c28 Updated method for showing/hiding elements 2016-11-10 13:32:12 +02:00
Maxim Voloshin
68ab87cc0d Hide DOM elements using css class 2016-11-10 13:32:12 +02:00
Ilya Daynatovich
986c29ca5d updated filmstrip handler 2016-11-10 12:18:33 +02:00
Yana Stamcheva
d7fc20b607 [iOS] Center launch screen text 2016-11-09 19:58:48 -06:00
damencho
96b280668d Adds suspend overlay. 2016-11-09 16:32:09 -06:00
Lyubomir Marinov
66b7404961 [iOS] Try to fix the launch screen 2016-11-09 15:06:07 -06:00
hristoterezov
7f3323f7c0 Merge pull request #1130 from jitsi/fix-stopping-sharedvideo
Stops player update before sending stopping of shared video.
2016-11-09 14:20:38 -06:00
damencho
e34d86b485 Stops player update before sending stopping of shared video.
We used to stop player updates on self presence received, so between stop and self presence we can send a playing update which will provoke adding the video again to other participants.
2016-11-09 12:42:47 -06:00
Lyubomir Marinov
34ea330aa3 [iOS] Try to fix the launch screen
The launch screen appears not centered and/or clipped on certain
devices. Unfortunately, I cannot reproduce it when I deploy the app to
devices and Simulator from Xcode 8.1. It may (or may very well not) be
that the Xcode version matters and the enterprise build server does
appear to use an older Xcode version.
2016-11-09 12:41:20 -06:00
Дамян Минков
70c3c1a21c Merge pull request #1102 from jitsi/limit_display_name
Limit long display names
2016-11-09 10:51:46 -06:00
hristoterezov
98d3755859 Merge pull request #1121 from jitsi/fix-two-panels-shown
Hides all side panels before showing new one.
2016-11-09 10:42:49 -06:00
hristoterezov
a4a1579c84 style(conference): Rename MAX_DISPLAYNAME_LENGTH 2016-11-09 10:22:43 -06:00
Ilya Daynatovich
20c6dba599 Moved keyboard initialization to filmstrip toolbar; Replaced toggle filmstrip button from extended toolbar 2016-11-09 12:41:23 +02:00
Lyubomir Marinov
056fc64f7a Try to fix the enterprise build of the iOS app
LaunchScreen.xib compiles locally with Xcode 8.1 but the enterprise
build fails. A possibility is that the enterprise build machine is
running an older Xcode version.
2016-11-08 18:14:43 -06:00
Yana Stamcheva
cb0ec3f702 [iOS] App icon(s) 2016-11-08 17:47:23 -06:00
yanas
084929f875 Merge pull request #1122 from jitsi/thumbnail-calculations
Thumbnail calculations
2016-11-08 17:40:46 -06:00
Yana Stamcheva
10f3f01da8 [iOS] Launch screen 2016-11-08 16:12:20 -06:00
Дамян Минков
1f75683581 Merge pull request #1055 from BeatC/incorrect-password-hint
Incorrect password hint
2016-11-08 14:29:06 -06:00
bgrozev
29b86a7fe3 Merge pull request #1126 from jitsi/fix-thumbnail-menu-css-class
fix: Use a separate css class for thumbnail menu
2016-11-08 12:20:55 -06:00
yanas
bb80bf4144 fix: Use a separate css class for thumbnail menu 2016-11-08 11:47:22 -06:00
yanas
92df64f706 fix: Adds a separate css class for thumbnail menu 2016-11-08 11:45:28 -06:00
Yana Stamcheva
fc3e0147e0 [Android] Launcher icons 2016-11-08 10:38:13 -06:00
Дамян Минков
b2d2209236 Merge pull request #1123 from bgrozev/log-pinned
Logs pinned/unpinned events
2016-11-08 10:16:01 -06:00
Ilya Daynatovich
f4e6dceaa4 Return Impormptu api when create dialog 2016-11-08 17:16:00 +02:00
Ilya Daynatovich
f09a9be523 Fixed problem with resizing thumb avatars 2016-11-08 13:36:43 +02:00
Ilya Daynatovich
2b08950294 Fix the tests 2016-11-08 13:18:10 +02:00
Ilya Daynatovich
62713bf87c Editions in PR 2016-11-08 13:18:10 +02:00
Ilya Daynatovich
7a2eca3706 fix reopening require pass dialog 2016-11-08 13:18:10 +02:00
Ilya Daynatovich
22b7142159 Add select input after incorrect input 2016-11-08 13:18:10 +02:00
Ilya Daynatovich
cba5528478 Move error color to theme 2016-11-08 13:18:10 +02:00
Ilya Daynatovich
5e8c5b3ce4 Add JSDoc 2016-11-08 13:18:10 +02:00
Ilya Daynatovich
d4df6f2dda Got rid of direct usage of room locker 2016-11-08 13:18:10 +02:00
Ilya Daynatovich
257bb49c52 Add Require password dialog 2016-11-08 13:18:09 +02:00
Boris Grozev
6740b9edf6 feat: Logs pin/unpin events via analytics. 2016-11-07 22:13:21 -06:00
Boris Grozev
cf241effbf style: Fixes indentation, spelling. 2016-11-07 21:23:33 -06:00
Boris Grozev
c0c198098b style: Renames variables, adds a FIXME. 2016-11-07 20:47:43 -06:00
Boris Grozev
ac0ee771ed docs: Adds a FIXME. 2016-11-07 20:45:52 -06:00
Boris Grozev
0ca9389e4b cleanup: Simplify code. 2016-11-07 20:39:28 -06:00
Boris Grozev
9910caf29f docs: Fix some documentation. 2016-11-07 20:38:14 -06:00
yanas
78dbaa9b21 Revert wrongly removed comment 2016-11-07 17:00:50 -06:00
yanas
5c956de99e Merges changes with latest master. 2016-11-07 16:50:08 -06:00
damencho
91340a5268 Hides all side panels before showing new one. 2016-11-07 14:30:02 -06:00
bgrozev
38e44440d0 Merge pull request #1114 from jitsi/fix_page_reload_log
Log the page reload from one place
2016-11-06 11:09:56 -06:00
yanas
02495e3b31 Merge pull request #1116 from jitsi/edit-displayname-overlap
Adds a property to hide display name and disable update view.
2016-11-05 10:19:31 -05:00
bgrozev
3360c62392 Merge pull request #1117 from jitsi/directory-name-casing-fix
Fixes casing of the tokendata directory.
2016-11-04 18:32:46 -05:00
Emil Ivov
05e9dfca92 Fixes casing of the tokendata command. 2016-11-04 17:41:16 -05:00
damencho
510c650b7b Adds a property to hide display name and disable update view.
Adds a property to hide display name and disable update view in SmallVideo. Localvideo hides displayName and disabled update view while users is editing its name and resumes normal behaviour when editing finishes.
2016-11-04 17:02:30 -05:00
hristoterezov
c41c219206 fix(Thumbnails): removes unused css classes 2016-11-04 15:24:05 -05:00
Lyubomir Marinov
4d335e086b Reduce the number of unnecessary Redux state changes 2016-11-04 13:28:47 -05:00
Lyubomir Marinov
3fa62c3757 Fix thumbnail reordering
Don't use Array.prototype.sort() because (1) it operates in place and,
thus, mutes the Redux state and (2) it is not necessarily stable and,
thus, unnecessarily shuffles the thumbnails.
2016-11-04 13:13:26 -05:00
paweldomas
d256bc317a fix(log): log the page reload from one place 2016-11-03 16:18:05 -05:00
yanas
101c413a3c Merge pull request #1110 from jitsi/filmstrip-button-editions
Filmstrip button editions
2016-11-03 15:46:00 -05:00
yanas
c3e0d7ff56 Fix conflicts. 2016-11-03 14:42:23 -05:00
Дамян Минков
826a7fd220 Merge pull request #1109 from jitsi/fix_toolbar_popups2
fix(toolbar): popups
2016-11-03 14:36:33 -05:00
Дамян Минков
e5607d0371 Merge pull request #1096 from kkrisstoff/task/video-thumbnail-menu-should-appear-on-hover
show/hide video thumbnail menu on hover
2016-11-03 13:52:08 -05:00
hristoterezov
b3b50fe346 fix(toolbar): popups 2016-11-03 13:47:15 -05:00
Boris Grozev
16a2b0377a chore: Only uses jslint 3+
because older versions don't work with our .jslintrc file
2016-11-03 13:18:56 -05:00
Ilya Daynatovich
8ba7a354e5 Remove duplicate event handler 2016-11-03 20:02:44 +02:00
Ilya Daynatovich
bbbd01b26c Adjustments in filmstrip section 2016-11-03 17:54:23 +02:00
Konstantyn Pahsura
e7d089c815 Merge branch 'jit/master' into task/video-thumbnail-menu-should-appear-on-hover 2016-11-03 17:30:19 +02:00
Ilya Daynatovich
24169743e7 Clean up filmstrip styles 2016-11-03 17:07:48 +02:00
Ilya Daynatovich
02ae3b3053 Add wrapper 2016-11-03 16:26:56 +02:00
Ilya Daynatovich
69e4f49e74 Add bunch of JSDocs 2016-11-03 16:21:14 +02:00
Ilya Daynatovich
1328870a2b fix bug with F shortcut 2016-11-03 16:21:14 +02:00
Ilya Daynatovich
51d48e18c6 Refactor filmstrip module 2016-11-03 16:21:14 +02:00
hristoterezov
4b1dfb9a33 Merge pull request #1095 from BeatC/shortcuts-reversed
Shortcuts reversed
2016-11-03 09:14:05 -05:00
Konstantyn Pahsura
9633919e32 css class for remote video specified 2016-11-03 15:40:43 +02:00
Konstantyn Pahsura
76e55f1132 show/hide menu if elem hovered 2016-11-03 15:40:43 +02:00
Ilya Daynatovich
30e717bd20 Rename classname; Refactor click on video method 2016-11-03 12:13:03 +02:00
Ilya Daynatovich
d703271c96 Fix bug with resizing when using shortcut for switching btw videos 2016-11-03 11:48:48 +02:00
Ilya Daynatovich
c6c701330a Change order of remote videos when clicking on shortcut 2016-11-03 11:48:48 +02:00
yanas
f02f050e56 Merge pull request #1106 from jitsi/disabled-sidepanels-load
Disables loading side panels when they are disabled.
2016-11-02 18:16:13 -05:00
damencho
f6609524ea Disables loading side panels when they are disabled.
Adds some safety checks for disabled contactlist.
2016-11-02 16:14:36 -05:00
Lyubomir Marinov
6eb767ba11 [React Native] Disable audio levels
The audio levels are gathered by lib-jitsi-meet via polling of
RTCPeerConnection.getStats() which is very slow on Android. Since the
mobile app makes no use of audio levels, it is easiest to disable them
for now in order to not penalize the app.
2016-11-02 14:44:42 -05:00
yanas
c4d0340956 Merge pull request #1034 from m-voloshin/FEATURE-hide-filmstrip
Filmstrip is extended with "Hide" button
2016-11-02 14:24:45 -05:00
hristoterezov
10f04575ed Merge pull request #1060 from kkrisstoff/task/toolbar-side-panel
make side panels init from js
2016-11-02 13:22:55 -05:00
Дамян Минков
a9c984e7db Merge pull request #1091 from BeatC/customer-agreement
Customer agreement
2016-11-02 13:18:33 -05:00
yanas
03fd87476a Merge pull request #1104 from BeatC/adjust-notification-width
Adjusted notification width
2016-11-02 12:40:05 -05:00
Дамян Минков
317f0e736c Merge pull request #1105 from jitsi/fix_frozen_msg
fix(LargeVideoManager): frozen displayname in a msg
2016-11-02 11:58:58 -05:00
Konstantyn Pahsura
9f280e320d _.template removed 2016-11-02 18:42:39 +02:00
Konstantyn Pahsura
a1e098680d make side panels init from js 2016-11-02 18:42:39 +02:00
paweldomas
ede4808ec4 fix(LargeVideoManager): frozen displayname in a msg
The "data-i18n-options" attribute value is stored in jQuery cache and
at the time when i18-next tries to access it to do the translation
it gets the old value from the cache and the message is not updated
correctly. Passing the "msgOptions" explicitly to "translateElement"
fixes the problem by avoiding jQuery cache.
2016-11-02 11:32:40 -05:00
yanas
e86294191a Merge pull request #1098 from BeatC/toolbar-splitter-restyle
Restyled toolbar splitter
2016-11-02 09:27:08 -05:00
yanas
0bf372b8ab Merge pull request #1103 from jitsi/esc-shortcuts-dialog
Esc closes shortcuts dialog
2016-11-02 09:22:34 -05:00
Ilya Daynatovich
ae7ad8b456 Adjusted notification width 2016-11-02 13:09:18 +02:00
Ilya Daynatovich
16c70fddba Restyled toolbar splitter 2016-11-02 12:13:30 +02:00
Дамян Минков
e679509c56 Merge pull request #1094 from bgrozev/conn-quality
Conn quality
2016-11-01 17:46:13 -05:00
hristoterezov
f08e9afc19 Merge pull request #1069 from jitsi/update-i18next
Updates i18next and bundles default translations.
2016-11-01 17:02:17 -05:00
damencho
215d8b1355 Updates show/hide of shortcuts dialog.
Fixes not able to close it with esc button.
2016-11-01 16:48:29 -05:00
hristoterezov
b1f129a53a fix(Chat): Display long nicknames with ... 2016-11-01 16:41:58 -05:00
hristoterezov
a6a7e81a0f feat(DisplayName): Limit local and remote display name to 50 chars 2016-11-01 16:40:52 -05:00
damencho
aaca510f8a Updates jsdoc. 2016-11-01 15:34:21 -05:00
yanas
3ad1573130 Merge pull request #1100 from jitsi/close-page-update
Close page update
2016-11-01 15:31:43 -05:00
paweldomas
d60146c6a8 fix(conference): leave the room when XMPP connection is dropped
It looks weird when the page reload overlay appears and the conference
continues in the background (the connection to the JVB remains active).
The library will not recover and the conference can not continue without
the signalling, so the room should be left and media stopped.
2016-11-01 15:08:59 -05:00
Дамян Минков
31d6a41759 Merge pull request #1099 from jitsi/fix_toolbar_popups
fix(toolbar): popups
2016-11-01 15:07:15 -05:00
hristoterezov
e731f6c3f3 feat(translation): ES6 support 2016-11-01 15:05:43 -05:00
damencho
1f200b63a7 Updates i18next and bundles default translations. 2016-11-01 15:05:23 -05:00
damencho
ae01275729 Renames variables. 2016-11-01 14:46:47 -05:00
Lyubomir Marinov
fab93a170e [iOS] Mark the app as VoIP 2016-11-01 13:59:53 -05:00
damencho
f28311a2ce Changes line color for static pages. 2016-11-01 13:28:04 -05:00
damencho
7da8db74b0 Adds default title to static pages. 2016-11-01 13:25:05 -05:00
damencho
5feeef0122 Handles data from feedback callback and use it for correct close page. 2016-11-01 13:14:21 -05:00
damencho
87f7be2182 Updates close page and adds a second one.
Close pages text are different depending whether feedback was provided or not.
2016-11-01 13:13:07 -05:00
damencho
e81a10de4a Reports to close callback whether feedback is submitted. 2016-11-01 13:10:58 -05:00
hristoterezov
8d9863a635 fix(toolbar): popups 2016-11-01 11:07:27 -05:00
Lyubomir Marinov
456b3030e3 [iOS] Fix the Xcode project file for CocoaPods 2016-11-01 07:58:26 -05:00
Ilya Daynatovich
d72695ae0f Added app substitution 2016-11-01 11:30:01 +02:00
yanas
e6748cf153 Merge pull request #1093 from jitsi/text-updates
Text updates.
2016-10-31 17:40:18 -05:00
yanas
a5e7c86125 Merge pull request #1092 from jitsi/update-lock-state
Updates lock state
2016-10-31 17:29:11 -05:00
hristoterezov
a7a7f269c3 Merge pull request #1054 from kkrisstoff/task/make-extended-toolbar-dynamically-created-buttons
make extended buttons dynamic
2016-10-31 16:50:14 -05:00
Boris Grozev
c815b1f25b feat: Updates the GSM bars' thresholds.
Adapts to changes in lib-jitsi-meet. Uses an Array which guarantees the
order of its elements, and avoids setting a css property multiple times.
2016-10-31 16:08:24 -05:00
Boris Grozev
c98ffdc817 refactor: Don't calculate remote connection quality. 2016-10-31 16:07:25 -05:00
Boris Grozev
09016c2182 refactor: Moves more code to lib-jitsi-meet. 2016-10-31 16:07:25 -05:00
Boris Grozev
22b2f17234 refactor: Moves more code to lib-jitsi-meet. 2016-10-31 16:07:25 -05:00
Boris Grozev
0c1bef927b Don't use no double non-positives. 2016-10-31 16:07:25 -05:00
Boris Grozev
4aa47a7901 feat: moves isConnectionInterrupted to lib-jitsi-meet. 2016-10-31 16:07:25 -05:00
Boris Grozev
051db50b3f feat: Moves connectionquality to lib-jitsi-meet. 2016-10-31 16:07:25 -05:00
yanas
c726a1a879 Text updates. 2016-10-31 16:00:11 -05:00
damencho
2edb279d22 Fixes password set remotely text. 2016-10-31 14:40:46 -05:00
Lyubomir Marinov
20e7c6d873 [iOS] Crashlytics 2016-10-31 14:08:25 -05:00
damencho
96479e0474 Fixes password and isModerator check in invite dialog. 2016-10-31 14:01:22 -05:00
Дамян Минков
1036768b2a Merge pull request #1080 from jitsi/dont_show_again
Implement dont show again util
2016-10-31 13:36:50 -05:00
Konstantyn Pahsura
77e28a6a45 toolbar buttons fixes 2016-10-31 20:25:27 +02:00
hristoterezov
a8b69d5cd8 feat(MessageHandler): Implement dont show again utility 2016-10-31 13:02:41 -05:00
Дамян Минков
9054e72b7f Merge pull request #1090 from jitsi/file_loading_err
Prevent from displaying broken page
2016-10-31 13:00:06 -05:00
Maxim Voloshin
dc93940bbd Filmstrip is extended with "Hide" button 2016-10-31 19:59:45 +02:00
Lyubomir Marinov
b6a6c99c9d [React Native] Enable scrolling of the thumbnails 2016-10-31 12:33:53 -05:00
Ilya Daynatovich
544792b9cc Editions in colors 2016-10-31 19:21:15 +02:00
hristoterezov
7e2fe30472 feat(JitsiLocalStorage): Implement localStorage wrapper 2016-10-31 12:11:03 -05:00
Ilya Daynatovich
5e7e5b317b Fix texts 2016-10-31 19:02:32 +02:00
Ilya Daynatovich
a63bb5d906 Add policy section 2016-10-31 18:23:28 +02:00
paweldomas
0354dd2c24 feat(index.html): prevent from displaying broken page
The commit adds an error listener which will replace the document body
with an error message if any of the files required for the app to
be displayed correctly fails to load.
2016-10-31 10:50:01 -05:00
Ilya Daynatovich
647f577332 Rearrange overlay layout 2016-10-31 17:35:22 +02:00
Kostiantyn Pashura
be1ba21166 make extended buttons dynamic 2016-10-31 13:30:16 +02:00
Lyubomir Marinov
8b2491c7a2 [tvOS] Automatic Xcode project file fixes
Xcode insists on automatically fixing the project file with tvOS
support. In order to not have to constantly ignore these automatic
changes when committing, commit them.
2016-10-30 20:43:29 -05:00
Lyubomir Marinov
f987a53313 [iOS] Clean up the Xcode project file 2016-10-30 20:26:39 -05:00
Lyubomir Marinov
d875b35b32 [Android] Crashlytics 2016-10-30 18:12:33 -05:00
yanas
df76d6990e Merge pull request #1062 from m-voloshin/FEATURE-tooltip-for-contact-list
New tooltip for contact list
2016-10-28 16:11:01 -05:00
yanas
86ffccb95a Merge pull request #1076 from kkrisstoff/UI/bugs-and-adjustments
audio_level oppacity and addParticipant button name
2016-10-28 16:10:47 -05:00
yanas
50494eb745 Updates to master 2016-10-28 13:20:38 -05:00
Konstantyn Pahsura
28f719b58a dropdown styles fixes 2016-10-28 13:09:47 -05:00
yanas
d384cd77c6 Merge pull request #1085 from jitsi/video-thumbnail-hover
Update _variables.scss
2016-10-28 12:54:25 -05:00
yanas
bb3384dc7c Update _variables.scss 2016-10-28 12:53:50 -05:00
yanas
ae9819a45c Merge pull request #1075 from BeatC/menu-restyling-editions
Adjust alignment of remote video menu
2016-10-28 12:43:12 -05:00
yanas
40473a16c7 Merge pull request #1084 from jitsi/toolbar_animation
fix(Toolbar): Both toolbars are displayed in the same time
2016-10-28 12:40:37 -05:00
hristoterezov
baad364b04 fix(Toolbar): Both toolbars are displayed in the same time 2016-10-28 12:39:25 -05:00
Дамян Минков
d2f52b534a Merge pull request #1083 from jitsi/fix_hover_thumbnail
fix(Thubmnail_PopupMenu): the thumbnail should be considered hovered when the popup menu is hovered
2016-10-28 11:59:36 -05:00
Lyubomir Marinov
532010c916 Update project files as recommended by Xcode 2016-10-28 11:30:04 -05:00
paweldomas
e349cc59ad style(translation): adds comment about lang auto detection 2016-10-28 11:17:09 -05:00
hristoterezov
634a18e847 fix(Thubmnail_PopupMenu): the thumbnail should be considered hovered when the popup menu is hovered 2016-10-28 11:16:40 -05:00
paweldomas
01581196f0 Merge pull request #1082 from 'BeatC/config-option-to-freeze-translation'
Add detect translation freeze in interface config
2016-10-28 11:14:22 -05:00
Konstantyn Pahsura
d7ed0bac69 audio_level oppacity and addParticipant button name 2016-10-28 18:39:40 +03:00
Ilya Daynatovich
209272f940 Add detect translation freeze in interface config 2016-10-28 16:18:08 +03:00
Ilya Daynatovich
138ed6a487 Fixed interface 2016-10-28 13:52:08 +03:00
Ilya Daynatovich
d84d0b65ca Adjust alignment of remote video menu 2016-10-28 13:52:08 +03:00
Paweł Domas
2fe69d409b Merge pull request #1071 from jitsi/ongoing-work-video-thumbnails
Ongoing work video thumbnails
2016-10-27 17:13:27 -05:00
damencho
9764fe52de Removed not needed setting of the quality to 0.
We now just hide the icon with values and show the interrupted one. Calling this one was causing troubles like flickering and stats popover not able to hide, once shown. On hover we are calling updateView which ends to this call which destroy and create the popover, which maybe is leading to this problems.
2016-10-27 16:56:32 -05:00
damencho
131d5cc256 Change the colour of the connection indicator badge. 2016-10-27 15:27:28 -05:00
Дамян Минков
7fead897ed Merge pull request #1079 from jitsi/fix_avatar_z_index
Do not display avatar on top of the connection problem messages
2016-10-27 15:26:22 -05:00
paweldomas
e3d5bd3dfb fix(css): do not display avatar on top of the messages
Previously the z-index was introduced in order to have the avatar
visible on top of the black video element, but now we're always hiding
the video element when the avatar is displayed, so it's no longer
required.
2016-10-27 14:52:32 -05:00
damencho
e3edef2999 Renames videocontainer overlay to hoverOverlay. 2016-10-27 14:32:22 -05:00
damencho
328ff54423 Fixes undefined error and shared video. 2016-10-27 14:08:06 -05:00
damencho
2807346bdf Makes decision what to show in avatar consistent (in updateView). 2016-10-27 13:17:17 -05:00
damencho
fec8f4e005 Fixes an issue with mixing visibility functions for elements.
In small video we use UIUtil.setVisibility, so we should not use jquery show/hide for the same element.
2016-10-26 17:36:07 -05:00
damencho
3ae299cf2b Fixes comments. 2016-10-26 17:18:36 -05:00
Дамян Минков
bbf68a97bb Merge pull request #1072 from jitsi/fix_stop_rec_dialog
Make the stop recording dialog work again
2016-10-26 16:14:28 -05:00
paweldomas
739e2bd35a fix(Recording): broken stop recording dialog 2016-10-26 16:10:45 -05:00
damencho
7acda03024 Adds an overlay to dim videos when showing displayname. 2016-10-26 15:51:09 -05:00
damencho
5cead57723 Reverts hover over small video to show display name. 2016-10-26 15:51:09 -05:00
Ilya Daynatovich
1e24be6dd4 Fix editing the name 2016-10-26 15:51:09 -05:00
Ilya Daynatovich
8d80e13e31 Fix connection indicator bars 2016-10-26 15:51:09 -05:00
Ilya Daynatovich
69b79b7687 Fix icon styles 2016-10-26 15:51:09 -05:00
Ilya Daynatovich
698b3caeb8 fix styles in connection indicators 2016-10-26 15:51:09 -05:00
Ilya Daynatovich
323684c5fe fix conflicts after rebase 2016-10-26 15:51:09 -05:00
Ilya Daynatovich
09e3fb9917 Fixed hack with displayname margin 2016-10-26 15:51:09 -05:00
yanas
a17a98991c Ongoing work on video thumbnail layout 2016-10-26 15:51:09 -05:00
yanas
3fe43abdea Move the display name to the center 2016-10-26 15:51:09 -05:00
Lyubomir Marinov
64112e00e6 react-native-webrtc 0.53.1 2016-10-26 15:20:06 -05:00
Дамян Минков
61651f7060 Merge pull request #1070 from jitsi/mute_participant_dialog
feat(Mute_Participant): Implement warning dialog for muting remote participant
2016-10-26 15:05:29 -05:00
hristoterezov
09c8e14465 feat(Mute_Participant): Implement warning dialog for muting remote participant 2016-10-26 14:57:09 -05:00
hristoterezov
0bb772d242 Merge pull request #1059 from BeatC/toolbar-animation
Change main toolbar animation; optimize mousemove handler
2016-10-26 11:52:01 -05:00
George Politis
68b587b110 Merge pull request #1064 from jitsi/5xx_reloads
Page reloads on BOSH HTTP errors
2016-10-26 11:39:44 -05:00
Дамян Минков
dd4a5f2705 Adds 404 error page in default configs. 2016-10-26 09:21:15 -05:00
yanas
79c52e1a77 Merge pull request #1061 from BeatC/button-shifted
Button shifted
2016-10-25 22:29:52 -05:00
hristoterezov
221f6d1d68 Merge pull request #1056 from jitsi/translations-update
Translations update
2016-10-25 18:11:15 -05:00
hristoterezov
ea0f0da8a4 feat(JitsiPopover): Add onBeforePosition option 2016-10-25 17:57:29 -05:00
hristoterezov
d2ccd20c78 Merge branch 'm-voloshin-FIX-frozen-tooltips' 2016-10-25 16:52:29 -05:00
hristoterezov
8762aae111 fix(SmallVideo): Add translateElement call removed by previous commit 2016-10-25 16:52:11 -05:00
hristoterezov
05fcaa2554 Merge branch 'FIX-frozen-tooltips' of git://github.com/m-voloshin/jitsi-meet into m-voloshin-FIX-frozen-tooltips 2016-10-25 16:51:03 -05:00
paweldomas
3c6d464b32 feat(PageReload): make the reload interval random, between 10-30 sec 2016-10-25 15:58:09 -05:00
paweldomas
c95c46edac feat(conference): reload the page when XMPP connection is dropped 2016-10-25 15:57:53 -05:00
damencho
b2a1c9881e Fixes comments from review.
Adds a safe check, i18n is expecting undefined not null. Fix a method name and translation to be at placeholder.
2016-10-25 15:18:56 -05:00
Lyubomir Marinov
9f10a059ef React Native 0.36.0, React 15.3.2 2016-10-25 14:57:18 -05:00
Maxim Voloshin
86f1d287d7 Fix comments 2016-10-25 20:40:43 +03:00
Maxim Voloshin
6820ec8d23 Show and hide indicators using pure js 2016-10-25 20:40:00 +03:00
Lyubomir Marinov
4997ae79e3 Fix toolbar's mute buttons when starting muted
The toolbar's mute buttons depict respective features/base/media states.
However, (un)muting is practically carried out by features/base/tracks.
When the mobile app enters a conference configured to invite the joining
participant to mute themselves, the tracks would be muted but the
toolbar's mute buttons would not reflect that.
2016-10-25 11:43:15 -05:00
Maxim Voloshin
c76fa50aa5 New tooltip for contact list 2016-10-25 19:27:27 +03:00
Maxim Voloshin
1c218191b0 Apply tooltip for indicator once 2016-10-25 17:50:28 +03:00
Ilya Daynatovich
84d71d558e fix invite dialog design 2016-10-25 17:33:51 +03:00
Ilya Daynatovich
659c84d696 fix margin 2016-10-25 17:24:11 +03:00
Ilya Daynatovich
99d50ade11 Change main toolbar animation; optimize mousemove handler 2016-10-25 14:55:43 +03:00
Дамян Минков
f271eb4610 Merge pull request #980 from kkrisstoff/task/add-error-page
error layout added
2016-10-24 16:31:16 -05:00
damencho
076f7a82de Updates translation readme. 2016-10-24 14:42:23 -05:00
damencho
547f96c0c1 Merge branch 'master' into translations-update 2016-10-24 14:40:50 -05:00
damencho
8a789aa608 Fixes some translations. 2016-10-24 14:17:22 -05:00
yanas
8fd23771f4 Merge pull request #1058 from kkrisstoff/select2-background-changes
dropdown color changes
2016-10-24 13:02:54 -05:00
Konstantyn Pahsura
15bc3b9ad4 dropdown color changes 2016-10-24 20:40:23 +03:00
yanas
3196ffd941 Merge pull request #1042 from m-voloshin/FEATURE-hd-label-relocation
Relocate "HD" label
2016-10-24 12:21:26 -05:00
Kostiantyn Pashura
84d2b79b4f 404 error page added 2016-10-24 19:33:08 +03:00
bgrozev
a4e1f939cd Merge pull request #1057 from jitsi/fix_connection_problem_z_idx
Reduce the z index of the connection problems message
2016-10-24 11:09:48 -05:00
damencho
563ea1244c Updates openMessageDialog to get only key and options. 2016-10-21 22:10:33 -05:00
hristoterezov
3dca6f2354 Merge pull request #1008 from jitsi/page_reload_overlay
Page reload overlay
2016-10-21 14:36:06 -05:00
paweldomas
bf5a1d1f8e fix(videolayout css): reduce conn problem msg z-index
For small window sizes and many video thumbnails the message may go on
top of the thumbnails.
2016-10-21 14:03:34 -05:00
paweldomas
a615649933 fix(PageReloadOverlay): changes text and adjusts style 2016-10-21 13:50:23 -05:00
paweldomas
3c0c823a37 ref(Overlay): introduce base class 2016-10-21 13:50:08 -05:00
damencho
efed4bf13c Merge branch 'master' into translations-update 2016-10-21 13:19:23 -05:00
damencho
5217bf0bb8 Removes translateString and use translateElement.
Removing translateString forces using data-i18n attributes, to make sure we do not forget to set them. Missing data-i18n attributes is a problem with late loading where we can end up without translation, without text. Missing data-i18n attributes is also problem that strings will not be translated when changing language.
Fixes a bug in invite dialog, where remove password button was shown for non moderators.
2016-10-21 12:11:22 -05:00
paweldomas
98de4c90b5 fix(RingOverlay): puts the "ring overlay" back below the toolbars 2016-10-21 10:47:21 -05:00
paweldomas
8c426e8bb7 fix(ToolbarToggle): restore call overlay to the timeout check 2016-10-21 10:27:10 -05:00
paweldomas
5bc727804f fix(PageReloadOverlay): do not log message every second 2016-10-21 10:18:03 -05:00
yanas
32bfebc924 Merge pull request #1033 from BeatC/add-jsdoc
Add JSDoc and rename method
2016-10-21 10:12:31 -05:00
paweldomas
8f8b1385fa ref(ConferenceUrl): converts to class and binds instance to global APP
Converts ConferenceUrl to a class and binds an instance to the global
APP variable, as requested by HTerezov.
2016-10-21 09:46:09 -05:00
paweldomas
d342f93547 fix(Invite): remove unused 'updateInviteUrl' 2016-10-21 09:25:14 -05:00
paweldomas
ecfc56461e fix(ToolbarToggler): remove Yoda condition
Is not very readable and is not used across the project
2016-10-21 09:22:17 -05:00
Maxim Voloshin
d09a8b1896 Adjusted styles for "Live Streaming" indicator. 2016-10-21 13:38:12 +03:00
Maxim Voloshin
88be44b472 Relocated "HD" label 2016-10-21 13:38:12 +03:00
Дамян Минков
4b82bc0e33 Merge pull request #1049 from jitsi/fix_thank_you_dialog
fix(feedback): Fixes the logic for the thank you dialog
2016-10-20 22:30:18 -05:00
hristoterezov
3022754f19 fix(feedback): Fixes the logic for the thank you dialog 2016-10-20 14:20:28 -05:00
paweldomas
f7bfe8d8bf feat: introduce ConferenceUrl module
We need to make sure that on the page reload all original parameters
used to load the conference are preserved. New modules helps to manage
different types of conference URLs like the one used for invites and
the one for reloading the page.
2016-10-20 13:53:24 -05:00
paweldomas
210605d8f3 fix(MessageHandler): suppress the notifications on top of the overlay 2016-10-20 13:52:35 -05:00
paweldomas
52344ff741 fix(ToolbarToggler): restore 'force' arg in timeout logic 2016-10-20 13:52:35 -05:00
paweldomas
687b0cad8e fix(ToolbarToggler): remove call overlay from the timeout check
Remove check for the call overlay being visible in postponing
the toolbar being hidden, as we don't want to have it displayed at all
when the overlay is there.
2016-10-20 13:52:35 -05:00
paweldomas
0053c4df49 feat(PageReloadOverlay): log the reload event 2016-10-20 13:52:35 -05:00
paweldomas
2a5b4dde31 feat: implement PageReloadOverlay 2016-10-20 13:52:35 -05:00
paweldomas
d2690444ac fix(overlay): bring overlay on top of the toolbars 2016-10-20 13:52:35 -05:00
paweldomas
c473178dfe fix(UserMediaPermissionsGuidanceOverlay): broken display 2016-10-20 13:50:11 -05:00
paweldomas
229a3b4418 fix(conference): disconnect on VIDEOBRIDGE_NOT_AVAILABLE error
Will disconnect on ConferenceErrors.VIDEOBRIDGE_NOT_AVAILABLE.
Show the same message when either JVB is not available or Jicofo
disconnects.
2016-10-20 13:50:11 -05:00
yanas
63dfa5247f Merge pull request #1048 from BeatC/menu-restyle
Menu restyle
2016-10-20 13:48:19 -05:00
Maxim Voloshin
469dee36ee Initialised variable for notification opacity 2016-10-20 13:03:00 -05:00
Maxim Voloshin
abb1482456 Applied updated design for notifications 2016-10-20 13:03:00 -05:00
Lyubomir Marinov
e1c5ea11bc Merge branch 'kkrisstoff-task/dropdown-aui-changes'
the commit.
2016-10-20 12:39:23 -05:00
Lyubomir Marinov
55b741d11b Merge branch 'master' into kkrisstoff-task/dropdown-aui-changes 2016-10-20 12:10:50 -05:00
Ilya Daynatovich
8f57179aa4 return default value 2016-10-20 19:41:04 +03:00
yanas
0fa5aa48af Merge pull request #992 from kkrisstoff/task/make-extended-toolbar-dynamically-created
toolbar: authentication button changed
2016-10-20 11:40:35 -05:00
hristoterezov
a65fca851c refactor(FilmStrip): calculateThumbnailSizeFromAvailable 2016-10-20 11:34:14 -05:00
Ilya Daynatovich
62af73ea09 Add new option to jitsi-popover 2016-10-20 19:28:19 +03:00
Ilya Daynatovich
0e8297ea8d restyle of menu 2016-10-20 19:28:19 +03:00
Ilya Daynatovich
70861465e1 Editions in jitsi popover styles 2016-10-20 19:28:19 +03:00
yanas
3bf8b7fbe2 Merge pull request #1007 from BeatC/connection-indicator-restyle
Connection indicator restyle
2016-10-20 11:08:51 -05:00
Kostiantyn Pashura
436f3b9d9b auth btn removed. login/logout --> Profile 2016-10-20 12:28:58 +03:00
Kostiantyn Pashura
71475038ba toolbar: authentication button changed 2016-10-20 12:26:53 +03:00
Lyubomir Marinov
c9edc0ae15 Merge branch 'master' into kkrisstoff-task/dropdown-aui-changes 2016-10-19 19:06:58 -05:00
Lyubomir Marinov
242c1419fd Format source code for (some) consistency 2016-10-19 18:54:21 -05:00
yanas
8ca0943881 Merge pull request #880 from jitsi/ring-overlay-style
style(LargeVideo): Rename LARGE_VIDEO_AVATAR_DISPLAYED event
2016-10-19 16:24:34 -05:00
hristoterezov
58a07355fb style(RingOverlay): Rename onAvatarDisplayed to onAvatarVisible 2016-10-19 15:58:36 -05:00
hristoterezov
4acfb033c8 style(LargeVideo): Rename LARGE_VIDEO_AVATAR_DISPLAYED event 2016-10-19 15:57:02 -05:00
Lyubomir Marinov
572fb20dd4 Merge branch 'task/dropdown-aui-changes' of https://github.com/kkrisstoff/jitsi-meet into kkrisstoff-task/dropdown-aui-changes 2016-10-19 13:38:38 -05:00
Lyubomir Marinov
d15413cd18 Merge branch 'mlaux-bugfix/android-launcher-intent' 2016-10-19 12:24:37 -05:00
Matt Laux
c18caf52d0 Fix Android launcher intent so that app appears in drawer. 2016-10-19 10:59:09 -05:00
Ilya Daynatovich
c09e10a584 updates in connection indicator styles 2016-10-19 17:57:16 +03:00
Lyubomir Marinov
1ff0bdbcfd Fix the in-app icons on Android
Bundle our custom icon font jitsi.ttf in the Android app (which we
already do for the iOS app).

Additionally, remove icon font files which are not in use.
2016-10-19 09:10:11 -05:00
Kostiantyn Pashura
736b98869f dropdown restyle 2016-10-19 12:40:03 +03:00
Kostiantyn Pashura
91fd16e9b4 aui checkbox removed 2016-10-19 12:40:03 +03:00
Kostiantyn Pashura
8118b4aea1 aui select and checkbox added 2016-10-19 12:40:03 +03:00
Дамян Минков
f62d7dbdf7 Merge pull request #1040 from jitsi/fix-feedback-color-and-size
Fix feedback button color and star size
2016-10-18 15:25:40 -05:00
yanas
1bf2920f3e Fix feedback button color and star size 2016-10-18 15:23:52 -05:00
Дамян Минков
8ecf079a3f Merge pull request #1039 from jitsi/stop-logging-servers-in-the-name
Stop logging servers in the event name
2016-10-18 15:18:44 -05:00
Emil Ivov
05ae9134a8 Update conference.js 2016-10-18 15:15:47 -05:00
damencho
040f4a6618 Adds data-i18n attribute. 2016-10-18 15:02:09 -05:00
damencho
a9aa29d0ad Adds data-i18n attribute to the feedback. 2016-10-18 15:01:58 -05:00
damencho
54cfbaaba0 Updates some translations for login dialog. 2016-10-18 15:01:50 -05:00
damencho
0455c26fb2 Uses titleKey to generate title string containing data-i18n attribute. 2016-10-18 15:00:09 -05:00
damencho
65f8c9ad97 Removes title param from openTwoButtonDialog. 2016-10-18 14:54:30 -05:00
damencho
f0ac52614b Removes title param from openTwoButtonDialog. 2016-10-18 14:54:22 -05:00
damencho
b5f0d30298 Removes not used parameter of openMessageDialog (title).
We pass key which is enough to obtain the title.
2016-10-18 14:54:14 -05:00
Дамян Минков
d97ed17052 Merge pull request #1038 from jitsi/api_commands
fix(iframe_api): toggleScreenSharing command
2016-10-18 14:52:21 -05:00
hristoterezov
dc43135980 fix(iframe_api): toggleScreenSharing command 2016-10-18 14:37:55 -05:00
Дамян Минков
27158752b0 Merge pull request #1025 from BeatC/display-name-required-dialog-fixes
fix display name required dialog
2016-10-18 14:36:03 -05:00
Дамян Минков
5c6f897ce7 Merge pull request #1030 from coresh/patch-1
Fixes issue of method 'setTooltip'
2016-10-18 14:35:53 -05:00
Дамян Минков
d415a15e93 Merge pull request #1037 from jitsi/add-specific-read-only-color
Add specific color for read-only input
2016-10-18 14:35:47 -05:00
yanas
19709cd3fc Adds comments. 2016-10-18 14:30:59 -05:00
yanas
89e15b6d3d Add specific color for read-only input 2016-10-18 14:27:16 -05:00
yanas
dcf2d64067 Merge pull request #1036 from jitsi/fix-placeholder-style
Fixes placeholder color
2016-10-18 13:00:22 -05:00
yanas
c459e3cffd Merge pull request #1031 from BeatC/invite-dialog-visual-bugs
Fix some visual bugs
2016-10-18 11:59:11 -05:00
yanas
8eb7303bd9 Fixes placeholder color 2016-10-18 11:57:38 -05:00
yanas
de67abd21d Merge pull request #1032 from kkrisstoff/Feedback-dialog-theme
feedback style variables
2016-10-18 11:20:44 -05:00
yanas
bb5495b495 Merge pull request #990 from jitsi/chatmessage_position
fix(chat): Issue with position of chat messages
2016-10-18 11:13:26 -05:00
Kostiantyn Pashura
124303b8b8 feedback style variables 2016-10-18 18:37:32 +03:00
Ilya Daynatovich
9078596f3a fix after rebase 2016-10-18 18:23:08 +03:00
Ilya Daynatovich
3254bbaabb Change styles in jitsi poppover 2016-10-18 17:57:19 +03:00
Ilya Daynatovich
26792625f2 BEMificated classes and add title 2016-10-18 17:57:19 +03:00
Ilya Daynatovich
c54938374d Editions in jitsi popover styles 2016-10-18 17:57:19 +03:00
Ilya Daynatovich
83e7f23d0f Update Connection indicator and popover js 2016-10-18 17:57:19 +03:00
Ilya Daynatovich
b7fccf5040 Update styles for popover 2016-10-18 17:57:19 +03:00
Ilya Daynatovich
cbc7fe5d98 Add JSDoc and rename method 2016-10-18 17:20:48 +03:00
Ilya Daynatovich
a4c3348630 Fix some visual bugs 2016-10-18 16:53:28 +03:00
coresh
6bd5d6e4d5 Fixes issue of method 'setTooltip'
Fixes issue of method 'setTooltip' in modules/UI/util/UIUtil.js: Excluded 'Uncaught TypeError':
```
UIUtil.js:134 Uncaught TypeError: Cannot read property 'setAttribute' of null
```
2016-10-18 09:34:09 +00:00
Ilya Daynatovich
25aeb184af fix display name required dialog 2016-10-17 17:29:41 +03:00
hristoterezov
53cb40be4c fix(chat): Issue with position of chat messages 2016-10-07 11:23:33 -05:00
225 changed files with 7219 additions and 4617 deletions

View File

@@ -8,3 +8,6 @@ indent_size = 4
indent_style = space
max_line_length = 80
trim_trailing_whitespace = true
[Makefile]
indent_style = tab

View File

@@ -1,3 +1,4 @@
build/
debian/
libs/
node_modules/

12
404.html Normal file
View File

@@ -0,0 +1,12 @@
<html>
<head>
<link rel="stylesheet" href="css/all.css"/>
<!--#include virtual="title.html" -->
</head>
<body>
<div class="error_page">
<h2>404 Not Found</h2>
<p class="error_page__message">You can create new conversation <a class="link" href="/">here</a></p>
</div>
</body>
</html>

View File

@@ -27,5 +27,7 @@
action + '.' + data.browserName, label, value);
};
ctx.Analytics = Analytics;
if(typeof ctx.analyticsHandlers === "undefined")
ctx.analyticsHandlers = [];
ctx.analyticsHandlers.push(Analytics);
}(window));

View File

@@ -1,4 +1,15 @@
apply plugin: "com.android.application"
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
import com.android.build.OutputFile
@@ -65,7 +76,7 @@ import com.android.build.OutputFile
* ]
*/
apply from: "../../node_modules/react-native/react.gradle"
apply from: '../../node_modules/react-native/react.gradle'
/**
* Set this to true to create two separate APKs instead of one:
@@ -84,24 +95,24 @@ def enableProguardInReleaseBuilds = false
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
buildToolsVersion '23.0.1'
defaultConfig {
applicationId "org.jitsi.jitsi_meet_react"
applicationId 'org.jitsi.jitsi_meet_react'
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
versionName '1.0'
ndk {
abiFilters "armeabi-v7a", "x86"
abiFilters 'armeabi-v7a', 'x86'
}
packagingOptions {
// The project react-native does not provide 64-bit binaries at the
// time of this writing. Unfortunately, packaging any 64-bit
// binaries into the .apk will crash the app at runtime on 64-bit
// platforms.
exclude "lib/x86_64/libjingle_peerconnection_so.so"
exclude "lib/arm64-v8a/libjingle_peerconnection_so.so"
exclude 'lib/x86_64/libjingle_peerconnection_so.so'
exclude 'lib/arm64-v8a/libjingle_peerconnection_so.so'
}
}
splits {
@@ -109,13 +120,13 @@ android {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86"
include 'armeabi-v7a', 'x86'
}
}
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// applicationVariants are e.g. debug, release
@@ -123,7 +134,7 @@ android {
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
def versionCodes = ["armeabi-v7a":1, "x86":2]
def versionCodes = ['armeabi-v7a':1, 'x86':2]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
@@ -133,19 +144,27 @@ android {
}
}
if (project.hasProperty("JITSI_SIGNING")
&& new File(project.property("JITSI_SIGNING")).exists()) {
apply from: project.property("JITSI_SIGNING");
if (project.hasProperty('JITSI_SIGNING')
&& new File(project.property('JITSI_SIGNING')).exists()) {
apply from: project.property('JITSI_SIGNING');
}
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
compile project(':react-native-vector-icons')
compile project(':react-native-webrtc')
compile fileTree(dir: "libs", include: ["*.jar"])
compile "com.android.support:appcompat-v7:23.0.1"
compile "com.facebook.react:react-native:+" // From node_modules
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.facebook.react:react-native:+'
compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
transitive = true
}
}
apply from: '../../node_modules/react-native-vector-icons/fonts.gradle'
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {

View File

@@ -29,10 +29,12 @@
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:host="beta.meet.jit.si" android:scheme="https" />
<data android:host="chaos.hipchat.me" android:scheme="https" />
<data android:host="enso.me" android:scheme="https" />
@@ -41,5 +43,8 @@
</activity>
<activity
android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<meta-data
android:name="io.fabric.ApiKey"
android:value="a8ae24a58302ba79da1d312138e941f6b86e3242" />
</application>
</manifest>

View File

@@ -1,8 +1,11 @@
package org.jitsi.jitsi_meet_react;
import android.os.Bundle;
import com.crashlytics.android.Crashlytics;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import io.fabric.sdk.android.Fabric;
public class MainActivity extends ReactActivity {
/**
@@ -43,4 +46,11 @@ public class MainActivity extends ReactActivity {
protected String getMainComponentName() {
return "App";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

152
app.js
View File

@@ -1,5 +1,6 @@
/* global $, config, getRoomName */
/* global $, config, getRoomName, loggingConfig, JitsiMeetJS */
/* application specific logic */
const logger = require("jitsi-meet-logger").getLogger(__filename);
import "babel-polyfill";
import "jquery";
@@ -18,16 +19,24 @@ import 'aui-experimental-css';
window.toastr = require("toastr");
const Logger = require("jitsi-meet-logger");
const LogCollector = Logger.LogCollector;
import JitsiMeetLogStorage from "./modules/util/JitsiMeetLogStorage";
import URLProcessor from "./modules/config/URLProcessor";
import RoomnameGenerator from './modules/util/RoomnameGenerator';
import UI from "./modules/UI/UI";
import settings from "./modules/settings/Settings";
import conference from './conference';
import ConferenceUrl from './modules/URL/ConferenceUrl';
import API from './modules/API/API';
import UIEvents from './service/UI/UIEvents';
import getTokenData from "./modules/TokenData/TokenData";
import getTokenData from "./modules/tokendata/TokenData";
import translation from "./modules/translation/translation";
const ConferenceEvents = JitsiMeetJS.events.conference;
/**
* Tries to push history state with the following parameters:
@@ -40,13 +49,25 @@ function pushHistoryState(roomName, URL) {
'VideoChat', `Room: ${roomName}`, URL
);
} catch (e) {
console.warn("Push history state failed with parameters:",
logger.warn("Push history state failed with parameters:",
'VideoChat', `Room: ${roomName}`, URL, e);
return e;
}
return null;
}
/**
* Replaces current history state(replaces the URL displayed by the browser).
* @param {string} newUrl the URL string which is to be displayed by the browser
* to the user.
*/
function replaceHistoryState (newUrl) {
if (window.history
&& typeof window.history.replaceState === 'function') {
window.history.replaceState({}, document.title, newUrl);
}
}
/**
* Builds and returns the room name.
*/
@@ -64,6 +85,36 @@ function buildRoomName () {
return roomName;
}
/**
* Adjusts the logging levels.
* @private
*/
function configureLoggingLevels () {
// NOTE The library Logger is separated from the app loggers, so the levels
// have to be set in two places
// Set default logging level
const defaultLogLevel
= loggingConfig.defaultLogLevel || JitsiMeetJS.logLevels.TRACE;
Logger.setLogLevel(defaultLogLevel);
JitsiMeetJS.setLogLevel(defaultLogLevel);
// NOTE console was used on purpose here to go around the logging
// and always print the default logging level to the console
console.info("Default logging level set to: " + defaultLogLevel);
// Set log level for each logger
if (loggingConfig) {
Object.keys(loggingConfig).forEach(function(loggerName) {
if ('defaultLogLevel' !== loggerName) {
const level = loggingConfig[loggerName];
Logger.setLogLevelById(level, loggerName);
JitsiMeetJS.setLogLevelById(level, loggerName);
}
});
}
}
const APP = {
// Used by do_external_connect.js if we receive the attach data after
// connect was already executed. status property can be "initialized",
@@ -82,14 +133,44 @@ const APP = {
UI,
settings,
conference,
translation,
/**
* The log collector which captures JS console logs for this app.
* @type {LogCollector}
*/
logCollector: null,
/**
* Indicates if the log collector has been started (it will not be started
* if the welcome page is displayed).
*/
logCollectorStarted : false,
/**
* After the APP has been initialized provides utility methods for dealing
* with the conference room URL(address).
* @type ConferenceUrl
*/
ConferenceUrl : null,
connection: null,
API,
init () {
this.initLogging();
this.keyboardshortcut =
require("./modules/keyboardshortcut/keyboardshortcut");
this.translation = require("./modules/translation/translation");
this.configFetch = require("./modules/config/HttpConfigFetch");
this.tokenData = getTokenData();
},
initLogging () {
// Adjust logging level
configureLoggingLevels();
// Create the LogCollector and register it as the global log transport.
// It is done early to capture as much logs as possible. Captured logs
// will be cached, before the JitsiMeetLogStorage gets ready (statistics
// module is initialized).
if (!this.logCollector && !loggingConfig.disableLogCollector) {
this.logCollector = new LogCollector(new JitsiMeetLogStorage());
Logger.addGlobalTransport(this.logCollector);
JitsiMeetJS.addGlobalLogTransport(this.logCollector);
}
}
};
@@ -107,21 +188,64 @@ function setTokenData() {
function init() {
setTokenData();
var isUIReady = APP.UI.start();
// Initialize the conference URL handler
APP.ConferenceUrl = new ConferenceUrl(window.location);
// Clean up the URL displayed by the browser
replaceHistoryState(APP.ConferenceUrl.getInviteUrl());
// TODO The execution of the mobile app starts from react/index.native.js.
// Similarly, the execution of the Web app should start from
// react/index.web.js for the sake of consistency and ease of understanding.
// Temporarily though because we are at the beginning of introducing React
// into the Web app, allow the execution of the Web app to start from app.js
// in order to reduce the complexity of the beginning step.
require('./react');
const isUIReady = APP.UI.start();
if (isUIReady) {
APP.conference.init({roomName: buildRoomName()}).then(function () {
APP.conference.init({roomName: buildRoomName()}).then(() => {
if (APP.logCollector) {
// Start the LogCollector's periodic "store logs" task only if
// we're in the conference and not on the welcome page. This is
// determined by the value of "isUIReady" const above.
APP.logCollector.start();
APP.logCollectorStarted = true;
// Make an attempt to flush in case a lot of logs have been
// cached, before the collector was started.
APP.logCollector.flush();
// This event listener will flush the logs, before
// the statistics module (CallStats) is stopped.
//
// NOTE The LogCollector is not stopped, because this event can
// be triggered multiple times during single conference
// (whenever statistics module is stopped). That includes
// the case when Jicofo terminates the single person left in the
// room. It will then restart the media session when someone
// eventually join the room which will start the stats again.
APP.conference.addConferenceListener(
ConferenceEvents.BEFORE_STATISTICS_DISPOSED,
() => {
if (APP.logCollector) {
APP.logCollector.flush();
}
}
);
}
APP.UI.initConference();
APP.UI.addListener(UIEvents.LANG_CHANGED, function (language) {
APP.UI.addListener(UIEvents.LANG_CHANGED, language => {
APP.translation.setLanguage(language);
APP.settings.setLanguage(language);
});
APP.keyboardshortcut.init();
}).catch(function (err) {
}).catch(err => {
APP.UI.hideRingOverLay();
APP.API.notifyConferenceLeft(APP.conference.roomName);
console.error(err);
logger.error(err);
});
}
}
@@ -145,7 +269,7 @@ function obtainConfigAndInit() {
if (success) {
var now = APP.connectionTimes["configuration.fetched"] =
window.performance.now();
console.log("(TIME) configuration fetched:\t", now);
logger.log("(TIME) configuration fetched:\t", now);
init();
} else {
// Show obtain config error,
@@ -165,9 +289,10 @@ function obtainConfigAndInit() {
$(document).ready(function () {
var now = APP.connectionTimes["document.ready"] = window.performance.now();
console.log("(TIME) document ready:\t", now);
logger.log("(TIME) document ready:\t", now);
URLProcessor.setConfigParametersFromUrl();
APP.init();
APP.translation.init(settings.getLanguage());
@@ -178,6 +303,11 @@ $(document).ready(function () {
});
$(window).bind('beforeunload', function () {
// Stop the LogCollector
if (APP.logCollectorStarted) {
APP.logCollector.stop();
APP.logCollectorStarted = false;
}
APP.API.dispose();
});

View File

@@ -1,6 +1,7 @@
<html>
<head>
<link rel="stylesheet" href="css/all.css"/>
<!--#include virtual="title.html" -->
</head>
<body>
<div class="redirectPageMessage">Sorry! You are not allowed to be here :(</div>

View File

@@ -1,8 +1,22 @@
<html>
<head>
<link rel="stylesheet" href="css/all.css"/>
<!--#include virtual="title.html" -->
<script><!--#include virtual="/interface_config.js" --></script>
<script src="close.js"></script>
</head>
<body>
<div class="redirectPageMessage">Thank you for your feedback!</div>
<div class="redirectPageMessage">
<div class="thanks-msg">
<p>Thank you for your feedback!</p>
</div>
<div class="hint-msg">
<p>
<span>Did you know?</span>
<span class="hint-msg__holder" id="hintMessage"></span>
</p>
<div class="happy-software"></div>
</div>
</div>
</body>
</html>
</html>

48
close.js Normal file
View File

@@ -0,0 +1,48 @@
/* global interfaceConfig */
//list of tips
var hints = [
"You can pin participants by clicking on their thumbnails.",// jshint ignore:line
"You can tell others you have something to say by using the \"Raise Hand\" feature",// jshint ignore:line
"You can learn about key shortcuts by pressing Shift+?",// jshint ignore:line
"You can learn more about the state of everyone's connection by hovering on the bars in their thumbnail",// jshint ignore:line
"You can hide all thumbnails by using the button in the bottom right corner"// jshint ignore:line
];
/**
* Get a random hint meessage from hint array.
*
* @return {string} the hint message.
*/
function getHint(){
var l = hints.length - 1;
var n = Math.round(Math.random() * l);
return hints[n];
}
/**
* Inserts text message
* into DOM element
*
* @param id {string} element identificator
* @param msg {string} text message
*/
// eslint-disable-next-line no-unused-vars
function insertTextMsg(id, msg){
var el = document.getElementById(id);
if (el)
el.innerText = msg;
}
/**
* Sets the hint and thanks messages. Will be executed on load event.
*/
function onLoad() {
//Works only for close2.html because close.html doesn't have this element.
insertTextMsg('thanksMessage',
'Thank you for using ' + interfaceConfig.APP_NAME);
insertTextMsg('hintMessage', getHint());
}
window.onload = onLoad;

22
close2.html Normal file
View File

@@ -0,0 +1,22 @@
<html>
<head>
<link rel="stylesheet" href="css/all.css"/>
<!--#include virtual="title.html" -->
<script><!--#include virtual="/interface_config.js" --></script>
<script src="close.js"></script>
</head>
<body>
<div class="redirectPageMessage">
<div class="thanks-msg">
<p id="thanksMessage"></p>
</div>
<div class="hint-msg">
<p>
<span>Did you know?</span>
<span class="hint-msg__holder" id="hintMessage"></span>
</p>
<div class="happy-software"></div>
</div>
</div>
</body>
</html>

View File

@@ -1,23 +1,23 @@
/* global $, APP, JitsiMeetJS, config, interfaceConfig */
const logger = require("jitsi-meet-logger").getLogger(__filename);
import {openConnection} from './connection';
import Invite from './modules/UI/invite/Invite';
import ContactList from './modules/UI/side_pannels/contactlist/ContactList';
import AuthHandler from './modules/UI/authentication/AuthHandler';
import ConnectionQuality from './modules/connectionquality/connectionquality';
import Recorder from './modules/recorder/Recorder';
import CQEvents from './service/connectionquality/CQEvents';
import UIEvents from './service/UI/UIEvents';
import mediaDeviceHelper from './modules/devices/mediaDeviceHelper';
import {reportError} from './modules/util/helpers';
import UIEvents from './service/UI/UIEvents';
import UIUtil from './modules/UI/util/UIUtil';
import analytics from './modules/analytics/analytics';
const ConnectionEvents = JitsiMeetJS.events.connection;
const ConnectionErrors = JitsiMeetJS.errors.connection;
const ConferenceEvents = JitsiMeetJS.events.conference;
@@ -26,12 +26,9 @@ const ConferenceErrors = JitsiMeetJS.errors.conference;
const TrackEvents = JitsiMeetJS.events.track;
const TrackErrors = JitsiMeetJS.errors.track;
let room, connection, localAudio, localVideo;
const ConnectionQualityEvents = JitsiMeetJS.events.connectionQuality;
/**
* Indicates whether the connection is interrupted or not.
*/
let connectionIsInterrupted = false;
let room, connection, localAudio, localVideo;
/**
* Indicates whether extension external installation is in progress or not.
@@ -44,7 +41,6 @@ import {VIDEO_CONTAINER_TYPE} from "./modules/UI/videolayout/VideoContainer";
* Known custom conference commands.
*/
const commands = {
CONNECTION_QUALITY: "stats",
EMAIL: "email",
AVATAR_URL: "avatar-url",
AVATAR_ID: "avatar-id",
@@ -53,6 +49,12 @@ const commands = {
CUSTOM_ROLE: "custom-role"
};
/**
* Max length of the display names. If we receive longer display name the
* additional chars are going to be cut.
*/
const MAX_DISPLAY_NAME_LENGTH = 50;
/**
* Open Connection. When authentication failed it shows auth dialog.
* @param roomName the room name to use
@@ -166,7 +168,7 @@ function muteLocalMedia(localMedia, muted, localMediaTypeString) {
const method = muted ? 'mute' : 'unmute';
localMedia[method]().catch(reason => {
console.warn(`${localMediaTypeString} ${method} was rejected:`, reason);
logger.warn(`${localMediaTypeString} ${method} was rejected:`, reason);
});
}
@@ -183,33 +185,35 @@ function muteLocalVideo (muted) {
* If requested show a thank you dialog before that.
* If we have a close page enabled, redirect to it without
* showing any other dialog.
* @param {boolean} showThankYou whether we should show a thank you dialog
*
* @param {object} options used to decide which particular close page to show
* or if close page is disabled, whether we should show the thankyou dialog
* @param {boolean} options.thankYouDialogVisible - whether we should
* show thank you dialog
* @param {boolean} options.feedbackSubmitted - whether feedback was submitted
*/
function maybeRedirectToWelcomePage(showThankYou) {
function maybeRedirectToWelcomePage(options) {
// if close page is enabled redirect to it, without further action
if (config.enableClosePage) {
window.location.pathname = "close.html";
if (options.feedbackSubmitted)
window.location.pathname = "close.html";
else
window.location.pathname = "close2.html";
return;
}
if (showThankYou) {
// else: show thankYou dialog only if there is no feedback
if (options.thankYouDialogVisible)
APP.UI.messageHandler.openMessageDialog(
null, null, null,
APP.translation.translateString(
"dialog.thankYou", {appName:interfaceConfig.APP_NAME}
)
);
}
null, "dialog.thankYou", {appName:interfaceConfig.APP_NAME});
if (!config.enableWelcomePage) {
return;
// if Welcome page is enabled redirect to welcome page after 3 sec.
if (config.enableWelcomePage) {
setTimeout(() => {
APP.settings.setWelcomePageEnabled(true);
window.location.pathname = "/";
}, 3000);
}
// redirect to welcome page
setTimeout(() => {
APP.settings.setWelcomePageEnabled(true);
window.location.pathname = "/";
}, 3000);
}
/**
@@ -252,7 +256,7 @@ function createLocalTracks (options, checkForPermissionPrompt) {
});
return tracks;
}).catch(function (err) {
console.error(
logger.error(
'failed to create local tracks', options.devices, err);
return Promise.reject(err);
});
@@ -279,21 +283,23 @@ function changeLocalEmail(email = '') {
* @param nickname {string} the new display name
*/
function changeLocalDisplayName(nickname = '') {
nickname = nickname.trim();
const formattedNickname
= nickname.trim().substr(0, MAX_DISPLAY_NAME_LENGTH);
if (nickname === APP.settings.getDisplayName()) {
if (formattedNickname === APP.settings.getDisplayName()) {
return;
}
APP.settings.setDisplayName(nickname);
room.setDisplayName(nickname);
APP.UI.changeDisplayName(APP.conference.getMyUserId(), nickname);
APP.settings.setDisplayName(formattedNickname);
room.setDisplayName(formattedNickname);
APP.UI.changeDisplayName(APP.conference.getMyUserId(), formattedNickname);
}
class ConferenceConnector {
constructor(resolve, reject) {
constructor(resolve, reject, invite) {
this._resolve = resolve;
this._reject = reject;
this._invite = invite;
this.reconnectTimeout = null;
room.on(ConferenceEvents.CONFERENCE_JOINED,
this._handleConferenceJoined.bind(this));
@@ -307,7 +313,7 @@ class ConferenceConnector {
this._reject(err);
}
_onConferenceFailed(err, ...params) {
console.error('CONFERENCE FAILED:', err, ...params);
logger.error('CONFERENCE FAILED:', err, ...params);
APP.UI.hideRingOverLay();
switch (err) {
// room is locked by the password
@@ -329,10 +335,6 @@ class ConferenceConnector {
}
break;
case ConferenceErrors.VIDEOBRIDGE_NOT_AVAILABLE:
APP.UI.notifyBridgeDown();
break;
// not enough rights to create conference
case ConferenceErrors.AUTHENTICATION_REQUIRED:
// schedule reconnect to check if someone else created the room
@@ -341,7 +343,8 @@ class ConferenceConnector {
}, 5000);
// notify user that auth is required
AuthHandler.requireAuth(room, this.invite.getRoomLocker().password);
AuthHandler.requireAuth(
room, this._invite.getRoomLocker().password);
break;
case ConferenceErrors.RESERVATION_ERROR:
@@ -367,6 +370,10 @@ class ConferenceConnector {
}
break;
// FIXME FOCUS_DISCONNECTED is confusing event name.
// What really happens there is that the library is not ready yet,
// because Jicofo is not available, but it is going to give
// it another try.
case ConferenceErrors.FOCUS_DISCONNECTED:
{
let [focus, retrySec] = params;
@@ -375,8 +382,13 @@ class ConferenceConnector {
break;
case ConferenceErrors.FOCUS_LEFT:
case ConferenceErrors.VIDEOBRIDGE_NOT_AVAILABLE:
// FIXME the conference should be stopped by the library and not by
// the app. Both the errors above are unrecoverable from the library
// perspective.
room.leave().then(() => connection.disconnect());
APP.UI.notifyFocusLeft();
APP.UI.showPageReloadOverlay(
false /* not a network type of failure */, err);
break;
case ConferenceErrors.CONFERENCE_MAX_USERS:
@@ -391,7 +403,7 @@ class ConferenceConnector {
}
}
_onConferenceError(err, ...params) {
console.error('CONFERENCE Error:', err, params);
logger.error('CONFERENCE Error:', err, params);
switch (err) {
case ConferenceErrors.CHAT_ERROR:
{
@@ -400,7 +412,7 @@ class ConferenceConnector {
}
break;
default:
console.error("Unknown error.");
logger.error("Unknown error.", err);
}
}
_unsubscribe() {
@@ -422,19 +434,6 @@ class ConferenceConnector {
}
}
/**
* Sends statistics from APP.tokenData
*/
function sendTokenDataStats() {
let {server, group} = APP.tokenData;
if(server) {
APP.conference.logEvent("server." + server, 1);
}
if(group) {
APP.conference.logEvent("group", group);
}
}
/**
* Disconnects the connection.
* @returns resolved Promise. We need this in order to make the Promise.all
@@ -446,26 +445,6 @@ function disconnect() {
return Promise.resolve();
}
/**
* Set permanent ptoperties to analytics.
* NOTE: Has to be used after JitsiMeetJS.init. otherwise analytics will be
* null.
*/
function setAnalyticsPermanentProperties() {
let permanentProperties = {
userAgent: navigator.userAgent,
roomName: APP.conference.roomName
};
let {server, group} = APP.tokenData;
if(server) {
permanentProperties.server = server;
}
if(group) {
permanentProperties.group = group;
}
JitsiMeetJS.analytics.addPermanentProperties(permanentProperties);
}
export default {
isModerator: false,
audioMuted: false,
@@ -488,8 +467,6 @@ export default {
*/
init(options) {
this.roomName = options.roomName;
JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.TRACE);
// attaches global error handler, if there is already one, respect it
if(JitsiMeetJS.getGlobalOnErrorHandler){
var oldOnErrorHandler = window.onerror;
@@ -512,19 +489,22 @@ export default {
};
}
return JitsiMeetJS.init(config)
.then(() => {
setAnalyticsPermanentProperties();
sendTokenDataStats();
return JitsiMeetJS.init(
Object.assign(
{enableAnalyticsLogging: analytics.isEnabled()}, config)
).then(() => {
analytics.init();
return createInitialLocalTracksAndConnect(options.roomName);
}).then(([tracks, con]) => {
console.log('initialized with %s local tracks', tracks.length);
logger.log('initialized with %s local tracks', tracks.length);
APP.connection = connection = con;
this._bindConnectionFailedHandler(con);
this._createRoom(tracks);
this.isDesktopSharingEnabled =
JitsiMeetJS.isDesktopSharingEnabled();
APP.UI.ContactList = new ContactList(room);
if (UIUtil.isButtonEnabled('contacts'))
APP.UI.ContactList = new ContactList(room);
// if user didn't give access to mic or camera or doesn't have
// them at all, we disable corresponding toolbar buttons
@@ -544,7 +524,8 @@ export default {
// XXX The API will take care of disconnecting from the XMPP
// server (and, thus, leaving the room) on unload.
return new Promise((resolve, reject) => {
(new ConferenceConnector(resolve, reject)).connect();
(new ConferenceConnector(
resolve, reject, this.invite)).connect();
});
});
},
@@ -556,6 +537,47 @@ export default {
isLocalId (id) {
return this.getMyUserId() === id;
},
/**
* Binds a handler that will handle the case when the connection is dropped
* in the middle of the conference.
* @param {JitsiConnection} connection the connection to which the handler
* will be bound to.
* @private
*/
_bindConnectionFailedHandler (connection) {
const handler = function (error, errMsg) {
/* eslint-disable no-case-declarations */
switch (error) {
case ConnectionErrors.CONNECTION_DROPPED_ERROR:
case ConnectionErrors.OTHER_ERROR:
case ConnectionErrors.SERVER_ERROR:
logger.error("XMPP connection error: " + errMsg);
// From all of the cases above only CONNECTION_DROPPED_ERROR
// is considered a network type of failure
const isNetworkFailure
= error === ConnectionErrors.CONNECTION_DROPPED_ERROR;
APP.UI.showPageReloadOverlay(
isNetworkFailure,
"xmpp-conn-dropped:" + errMsg);
connection.removeEventListener(
ConnectionEvents.CONNECTION_FAILED, handler);
// FIXME it feels like the conference should be stopped
// by lib-jitsi-meet
if (room)
room.leave();
break;
}
/* eslint-enable no-case-declarations */
};
connection.addEventListener(
ConnectionEvents.CONNECTION_FAILED, handler);
},
/**
* Simulates toolbar button click for audio mute. Used by shortcuts and API.
* @param mute true for mute and false for unmute.
@@ -665,7 +687,7 @@ export default {
* false otherwise.
*/
isConnectionInterrupted () {
return connectionIsInterrupted;
return this._room.isConnectionInterrupted();
},
/**
* Finds JitsiParticipant for given id.
@@ -754,7 +776,7 @@ export default {
* Returns the stats.
*/
getStats() {
return ConnectionQuality.getStats();
return room.connectionQuality.getStats();
},
// end used by torture
@@ -873,7 +895,7 @@ export default {
} else if (track.isVideoTrack()) {
return this.useVideoStream(track);
} else {
console.error(
logger.error(
"Ignored not an audio nor a video track: ", track);
return Promise.resolve();
}
@@ -965,11 +987,11 @@ export default {
videoSwitchInProgress: false,
toggleScreenSharing (shareScreen = !this.isSharingScreen) {
if (this.videoSwitchInProgress) {
console.warn("Switch in progress.");
logger.warn("Switch in progress.");
return;
}
if (!this.isDesktopSharingEnabled) {
console.warn("Cannot toggle screen sharing: not supported.");
logger.warn("Cannot toggle screen sharing: not supported.");
return;
}
@@ -1023,7 +1045,7 @@ export default {
this.videoSwitchInProgress = false;
JitsiMeetJS.analytics.sendEvent(
'conference.sharingDesktop.start');
console.log('sharing local desktop');
logger.log('sharing local desktop');
}).catch((err) => {
// close external installation dialog to show the error.
if(externalInstallation)
@@ -1035,7 +1057,7 @@ export default {
return;
}
console.error('failed to share local desktop', err);
logger.error('failed to share local desktop', err);
if (err.name === TrackErrors.FIREFOX_EXTENSION_NEEDED) {
APP.UI.showExtensionRequiredDialog(
@@ -1050,21 +1072,20 @@ export default {
// TrackErrors.GENERAL
// and any other
let dialogTxt;
let dialogTitle;
let dialogTitleKey;
if (err.name === TrackErrors.PERMISSION_DENIED) {
dialogTxt = APP.translation.generateTranslationHTML(
"dialog.screenSharingPermissionDeniedError");
dialogTitle = APP.translation.generateTranslationHTML(
"dialog.error");
dialogTitleKey = "dialog.error";
} else {
dialogTxt = APP.translation.generateTranslationHTML(
"dialog.failtoinstall");
dialogTitle = APP.translation.generateTranslationHTML(
"dialog.permissionDenied");
dialogTitleKey = "dialog.permissionDenied";
}
APP.UI.messageHandler.openDialog(dialogTitle, dialogTxt, false);
APP.UI.messageHandler.openDialog(
dialogTitleKey, dialogTxt, false);
});
} else {
createLocalTracks({ devices: ['video'] }).then(
@@ -1073,11 +1094,11 @@ export default {
this.videoSwitchInProgress = false;
JitsiMeetJS.analytics.sendEvent(
'conference.sharingDesktop.stop');
console.log('sharing local video');
logger.log('sharing local video');
}).catch((err) => {
this.useVideoStream(null);
this.videoSwitchInProgress = false;
console.error('failed to share local video', err);
logger.error('failed to share local video', err);
});
}
},
@@ -1089,7 +1110,6 @@ export default {
room.on(ConferenceEvents.CONFERENCE_JOINED, () => {
APP.UI.mucJoined();
APP.API.notifyConferenceJoined(APP.conference.roomName);
connectionIsInterrupted = false;
APP.UI.markVideoInterrupted(false);
});
@@ -1100,12 +1120,11 @@ export default {
}
);
room.on(ConferenceEvents.USER_JOINED, (id, user) => {
if (user.isHidden())
return;
console.log('USER %s connnected', id, user);
logger.log('USER %s connnected', id, user);
APP.API.notifyUserJoined(id);
APP.UI.addUser(user);
@@ -1113,7 +1132,7 @@ export default {
APP.UI.updateUserRole(user);
});
room.on(ConferenceEvents.USER_LEFT, (id, user) => {
console.log('USER %s LEFT', id, user);
logger.log('USER %s LEFT', id, user);
APP.API.notifyUserLeft(id);
APP.UI.removeUser(id, user.getDisplayName());
APP.UI.onSharedVideoStop(id);
@@ -1122,7 +1141,7 @@ export default {
room.on(ConferenceEvents.USER_ROLE_CHANGED, (id, role) => {
if (this.isLocalId(id)) {
console.info(`My role changed, new role: ${role}`);
logger.info(`My role changed, new role: ${role}`);
if (this.isModerator !== room.isModerator()) {
this.isModerator = room.isModerator();
APP.UI.updateLocalRole(room.isModerator());
@@ -1180,7 +1199,7 @@ export default {
{
this.audioLevelsMap[id] = lvl;
if(config.debugAudioLevels)
console.log("AudioLevel:" + id + "/" + lvl);
logger.log("AudioLevel:" + id + "/" + lvl);
}
APP.UI.setAudioLevel(id, lvl);
@@ -1239,19 +1258,18 @@ export default {
}
room.on(ConferenceEvents.CONNECTION_INTERRUPTED, () => {
connectionIsInterrupted = true;
ConnectionQuality.updateLocalConnectionQuality(0);
APP.UI.showLocalConnectionInterrupted(true);
});
room.on(ConferenceEvents.CONNECTION_RESTORED, () => {
connectionIsInterrupted = false;
APP.UI.showLocalConnectionInterrupted(false);
});
room.on(ConferenceEvents.DISPLAY_NAME_CHANGED, (id, displayName) => {
APP.API.notifyDisplayNameChanged(id, displayName);
APP.UI.changeDisplayName(id, displayName);
const formattedDisplayName
= displayName.substr(0, MAX_DISPLAY_NAME_LENGTH);
APP.API.notifyDisplayNameChanged(id, formattedDisplayName);
APP.UI.changeDisplayName(id, formattedDisplayName);
});
room.on(ConferenceEvents.PARTICIPANT_PROPERTY_CHANGED,
@@ -1262,20 +1280,40 @@ export default {
});
room.on(ConferenceEvents.RECORDER_STATE_CHANGED, (status, error) => {
console.log("Received recorder status change: ", status, error);
logger.log("Received recorder status change: ", status, error);
APP.UI.updateRecordingState(status);
});
room.on(ConferenceEvents.USER_STATUS_CHANGED, function (id, status) {
APP.UI.updateUserStatus(id, status);
});
room.on(ConferenceEvents.KICKED, () => {
APP.UI.hideStats();
APP.UI.notifyKicked();
// FIXME close
});
room.on(ConferenceEvents.SUSPEND_DETECTED, () => {
// After wake up, we will be in a state where conference is left
// there will be dialog shown to user.
// We do not want video/audio as we show an overlay and after it
// user need to rejoin or close, while waking up we can detect
// camera wakeup as a problem with device.
// We also do not care about device change, which happens
// on resume after suspending PC.
if (this.deviceChangeListener)
JitsiMeetJS.mediaDevices.removeEventListener(
JitsiMeetJS.events.mediaDevices.DEVICE_LIST_CHANGED,
this.deviceChangeListener);
// stop local video
if (localVideo)
localVideo.dispose();
// stop local audio
if (localAudio)
localAudio.dispose();
// show overlay
APP.UI.showSuspendedOverlay();
});
room.on(ConferenceEvents.DTMF_SUPPORT_CHANGED, (isDTMFSupported) => {
APP.UI.updateDTMFSupport(isDTMFSupported);
});
@@ -1301,59 +1339,16 @@ export default {
});
}
room.on(ConferenceEvents.CONNECTION_STATS, function (stats) {
// if we say video muted we will use old method of calculating
// quality and will not depend on localVideo if it is missing
ConnectionQuality.updateLocalStats(
stats,
connectionIsInterrupted,
localVideo ? localVideo.videoType : undefined,
localVideo ? localVideo.isMuted() : true,
localVideo ? localVideo.resolution : null);
room.on(ConnectionQualityEvents.LOCAL_STATS_UPDATED,
(stats) => {
APP.UI.updateLocalStats(stats.connectionQuality, stats);
});
ConnectionQuality.addListener(CQEvents.LOCALSTATS_UPDATED,
(percent, stats) => {
APP.UI.updateLocalStats(percent, stats);
// Send only the data that remote participants care about.
let data = {
bitrate: stats.bitrate,
packetLoss: stats.packetLoss};
if (localVideo && localVideo.resolution) {
data.resolution = localVideo.resolution;
}
try {
room.broadcastEndpointMessage({
type: this.commands.defaults.CONNECTION_QUALITY,
values: data });
} catch (e) {
reportError(e);
}
});
room.on(ConferenceEvents.ENDPOINT_MESSAGE_RECEIVED,
(participant, payload) => {
switch(payload.type) {
case this.commands.defaults.CONNECTION_QUALITY: {
let remoteVideo = participant.getTracks()
.find(tr => tr.isVideoTrack());
ConnectionQuality.updateRemoteStats(
participant.getId(),
payload.values,
remoteVideo ? remoteVideo.videoType : undefined,
remoteVideo ? remoteVideo.isMuted() : undefined);
break;
}
default:
console.warn("Unknown datachannel message", payload);
}
});
ConnectionQuality.addListener(CQEvents.REMOTESTATS_UPDATED,
(id, percent, stats) => {
APP.UI.updateRemoteStats(id, percent, stats);
});
room.on(ConnectionQualityEvents.REMOTE_STATS_UPDATED,
(id, stats) => {
APP.UI.updateRemoteStats(id, stats.connectionQuality, stats);
});
room.addCommandListener(this.commands.defaults.ETHERPAD, ({value}) => {
APP.UI.initEtherpad(value);
@@ -1364,9 +1359,10 @@ export default {
APP.UI.setUserEmail(from, data.value);
});
room.addCommandListener(this.commands.defaults.AVATAR_URL,
(data, from) => {
APP.UI.setUserAvatarUrl(from, data.value);
room.addCommandListener(
this.commands.defaults.AVATAR_URL,
(data, from) => {
APP.UI.setUserAvatarUrl(from, data.value);
});
room.addCommandListener(this.commands.defaults.AVATAR_ID,
@@ -1481,11 +1477,21 @@ export default {
});
APP.UI.addListener(UIEvents.PINNED_ENDPOINT, (smallVideo, isPinned) => {
var smallVideoId = smallVideo.getId();
let smallVideoId = smallVideo.getId();
let isLocal = APP.conference.isLocalId(smallVideoId);
let eventName
= (isPinned ? "pinned" : "unpinned") + "." +
(isLocal ? "local" : "remote");
let participantCount = room.getParticipantCount();
JitsiMeetJS.analytics.sendEvent(
eventName,
{ value: participantCount });
// FIXME why VIDEO_CONTAINER_TYPE instead of checking if
// the participant is on the large video ?
if (smallVideo.getVideoType() === VIDEO_CONTAINER_TYPE
&& !APP.conference.isLocalId(smallVideoId)) {
&& !isLocal) {
// When the library starts supporting multiple pins we would
// pass the isPinned parameter together with the identifier,
@@ -1510,7 +1516,7 @@ export default {
})
.then(([stream]) => {
this.useVideoStream(stream);
console.log('switched local video device');
logger.log('switched local video device');
APP.settings.setCameraDeviceId(cameraDeviceId, true);
})
.catch((err) => {
@@ -1532,7 +1538,7 @@ export default {
})
.then(([stream]) => {
this.useAudioStream(stream);
console.log('switched local audio device');
logger.log('switched local audio device');
APP.settings.setMicDeviceId(micDeviceId, true);
})
.catch((err) => {
@@ -1548,9 +1554,9 @@ export default {
JitsiMeetJS.analytics.sendEvent(
'settings.changeDevice.audioOut');
APP.settings.setAudioOutputDeviceId(audioOutputDeviceId)
.then(() => console.log('changed audio output device'))
.then(() => logger.log('changed audio output device'))
.catch((err) => {
console.warn('Failed to change audio output device. ' +
logger.warn('Failed to change audio output device. ' +
'Default or previously set audio output device ' +
'will be used instead.', err);
APP.UI.setSelectedAudioOutputFromSettings();
@@ -1642,11 +1648,12 @@ export default {
APP.UI.onAvailableDevicesChanged(devices);
});
this.deviceChangeListener = (devices) =>
window.setTimeout(
() => this._onDeviceListChanged(devices), 0);
JitsiMeetJS.mediaDevices.addEventListener(
JitsiMeetJS.events.mediaDevices.DEVICE_LIST_CHANGED,
(devices) =>
window.setTimeout(
() => this._onDeviceListChanged(devices), 0));
this.deviceChangeListener);
}
},
/**
@@ -1745,14 +1752,25 @@ export default {
* @param {string} name the event name
* @param {int} value the value (it's int because google analytics supports
* only int).
* @param {string} label short text which provides more info about the event
* which allows to distinguish between few event cases of the same name
* NOTE: Should be used after conference.init
*/
logEvent(name, value) {
logEvent(name, value, label) {
if(JitsiMeetJS.analytics) {
JitsiMeetJS.analytics.sendEvent(name, {value});
JitsiMeetJS.analytics.sendEvent(name, {value, label});
}
if(room) {
room.sendApplicationLog(JSON.stringify({name, value}));
room.sendApplicationLog(JSON.stringify({name, value, label}));
}
},
/**
* Methods logs an application event given in the JSON format.
* @param {string} logJSON an event to be logged in JSON format
*/
logJSON(logJSON) {
if (room) {
room.sendApplicationLog(logJSON);
}
},
/**
@@ -1763,8 +1781,11 @@ export default {
hangup (requestFeedback = false) {
APP.UI.hideRingOverLay();
let requestFeedbackPromise = requestFeedback
? APP.UI.requestFeedback().catch(() => Promise.resolve())
: Promise.resolve();
? APP.UI.requestFeedbackOnHangup()
// false - because the thank you dialog shouldn't be displayed
.catch(() => Promise.resolve(false))
: Promise.resolve(true);// true - because the thank you dialog
//should be displayed
// All promises are returning Promise.resolve to make Promise.all to
// be resolved when both Promises are finished. Otherwise Promise.all
// will reject on first rejected Promise and we can redirect the page
@@ -1772,9 +1793,9 @@ export default {
Promise.all([
requestFeedbackPromise,
room.leave().then(disconnect, disconnect)
]).then(() => {
]).then(values => {
APP.API.notifyReadyToClose();
maybeRedirectToWelcomePage();
maybeRedirectToWelcomePage(values[0]);
});
}
};

View File

@@ -26,7 +26,7 @@ var config = { // eslint-disable-line no-unused-vars
desktopSharingChromeExtId: 'diibjkoicjeejcmhdnailmkgecihlobk',
// The media sources to use when using screen sharing with the Chrome
// extension.
desktopSharingChromeSources: ['screen', 'window'],
desktopSharingChromeSources: ['screen', 'window', 'tab'],
// Required version of Chrome extension
desktopSharingChromeMinExtVersion: '0.1',
@@ -78,3 +78,13 @@ var config = { // eslint-disable-line no-unused-vars
// edit their profile.
enableUserRolesBasedOnToken: false
};
// Logging configuration
var loggingConfig = { // eslint-disable-line no-unused-vars
//default log level for the app and lib-jitsi-meet
defaultLogLevel: 'trace',
// Option to disable LogCollector (which stores the logs on CallStats)
//disableLogCollector: true,
// Logging level adjustments for verbose modules:
'modules/xmpp/strophe.util.js': 'log'
};

View File

@@ -1,5 +1,8 @@
/* global APP, JitsiMeetJS, config */
const logger = require("jitsi-meet-logger").getLogger(__filename);
import AuthHandler from './modules/UI/authentication/AuthHandler';
import jitsiLocalStorage from './modules/util/JitsiLocalStorage';
const ConnectionEvents = JitsiMeetJS.events.connection;
const ConnectionErrors = JitsiMeetJS.errors.connection;
@@ -83,7 +86,7 @@ function connect(id, password, roomName) {
function handleConnectionFailed(err) {
unsubscribe();
console.error("CONNECTION FAILED:", err);
logger.error("CONNECTION FAILED:", err);
reject(err);
}
@@ -107,9 +110,9 @@ function connect(id, password, roomName) {
export function openConnection({id, password, retry, roomName}) {
let usernameOverride
= window.localStorage.getItem("xmpp_username_override");
= jitsiLocalStorage.getItem("xmpp_username_override");
let passwordOverride
= window.localStorage.getItem("xmpp_password_override");
= jitsiLocalStorage.getItem("xmpp_password_override");
if (usernameOverride && usernameOverride.length > 0) {
id = usernameOverride;

14
css/404.scss Normal file
View File

@@ -0,0 +1,14 @@
.error_page {
width: 60%;
margin: 20% auto;
text-align: center;
h2 {
font-size: 36px;
}
&__message {
font-size: 24px;
margin-top: 20px;
}
}

View File

@@ -3,7 +3,7 @@
**/
/**
* START of slide in animation for extended toolbar.
* Slide in animation for extended toolbar.
*/
@include keyframes(slideInX) {
0% { transform: translateX(-100%); }
@@ -26,12 +26,9 @@
}
/**
* END of slide out animation for extended toolbar.
* Slide in / out animation for main toolbar.
*/
/**
* START of slide in / out animation for main toolbar.
*/
@include keyframes(slideInY) {
100% { transform: translateY(0%); }
}
@@ -42,11 +39,7 @@
}
/**
* END of slide in / out animation for main toolbar.
*/
/**
* START of slide in animation for extended toolbar (inner) panel.
* Slide in animation for extended toolbar (inner) panel.
*/
// FIX: Can't use percentage because of breaking animation when width is changed
@@ -62,11 +55,7 @@
}
/**
* END of slide in animation for extended toolbar (inner) panel.
*/
/**
* START of slide in animation for extended toolbar container
* Slide in animation for extended toolbar container
**/
@include keyframes(slideOutExtContainer) {
@@ -80,5 +69,15 @@
}
/**
* END of slide in animation for extended toolbar container
**/
* Fade in / out animations
**/
@include keyframes(fadeIn) {
from { opacity: 0; }
to { opacity: 1; }
}
@include keyframes(fadeOut) {
from { opacity: 1; }
to { opacity: 0; }
}

View File

@@ -29,39 +29,11 @@ html, body, input, textarea, keygen, select, button {
color: #636363;
}
input[type='text'], input[type='password'], textarea {
display: inline-block;
width: 100%;
padding: 5px 7px;
color: $inputColor;
border-radius: $borderRadius;
line-height: 32px;
letter-spacing: $letterSpacing;
height: 32px;
text-align: left;
border:1px solid $inputBorderColor;
background-color: $inputBackground;
outline: none; /* removes the default outline */
resize: none; /* prevents the user-resizing, adjust to taste */
}
textarea {
overflow: hidden;
word-wrap: break-word;
resize: none;
line-height: 1.5em;
}
button.no-icon {
padding: 0 1em;
}
button, input, select, textarea {
margin: 0;
vertical-align: baseline;
color: $inputColor;
font-size: 1em;
letter-spacing: $letterSpacing;
}
button, select, input[type="button"],
@@ -73,10 +45,26 @@ input[type="reset"], input[type="submit"] {
cursor: pointer;
}
textarea {
overflow: hidden;
word-wrap: break-word;
resize: none;
line-height: 1.5em;
}
input[type='text'], input[type='password'], textarea {
outline: none; /* removes the default outline */
resize: none; /* prevents the user-resizing, adjust to taste */
}
button {
color: #FFF;
background-color: $buttonBackground;
border-radius: $borderRadius;
&.no-icon {
padding: 0 1em;
}
}
button,
@@ -130,38 +118,6 @@ form {
font-size: 12px;
}
/**
* Hides an element.
*/
.hide {
display: none !important;
}
/**
* Shows an element.
*/
.show {
display: block !important;
}
/**
* Shows an inline element.
*/
.show-inline {
display: inline-block !important;
}
/**
* Shows a flex element.
*/
.show-flex {
display: -webkit-box !important;
display: -moz-box !important;
display: -ms-flexbox !important;
display: -webkit-flex !important;
display: flex !important;
}
/**
* Tooltips
**/
@@ -183,17 +139,6 @@ form {
visibility: visible;
}
.link {
color: $linkFontColor;
@include transition(color .1s ease-out);
&:hover {
color: $linkHoverFontColor;
text-decoration: underline;
@include transition(color .1s ease-in);
}
}
#inviteLinkRef {
-webkit-user-select: text;
user-select: text;

View File

@@ -107,6 +107,10 @@
float: left;
padding-left: 5px;
font-weight: bold;
white-space: nowrap;
text-overflow: ellipsis;
width: 95%;
overflow: hidden;
}
#chat_container .timestamp {
@@ -129,7 +133,7 @@
.chatmessage {
background: #3a3a3a;
width: 93%;
margin-left: 5%;
margin-left: 9px;
margin-right: auto;
border-radius: 5px;
border-top-left-radius: 0px;
@@ -232,4 +236,4 @@
#usermsg::-webkit-scrollbar-track-piece {
background: #3a3a3a;
}
}

43
css/_connection-info.scss Normal file
View File

@@ -0,0 +1,43 @@
%connection-info {
text-align: left;
font-size: 12px;
font-weight: 400;
color: $popoverFontColor;
td {
padding: 2px 0;
}
}
.connection-info
{
float: left;
padding: 5px;
padding-left: 0;
@extend %connection-info;
> table {
white-space: nowrap;
@extend %connection-info;
}
td:nth-child(n-1) {
padding-left: 5px;
}
&__icon {
margin-right: 2px;
}
&__download
{
@extend .connection-info__icon;
color: $downloadConnectionIconColor;
}
&__upload
{
@extend .connection-info__icon;
color: $uploadConnectionIconColor;
}
}

View File

@@ -5,7 +5,7 @@
font-size: 12px;
bottom: 0px;
margin: 0;
margin-top: 16px;
margin-top: 12px;
padding: 0px;
width: 100%;
}
@@ -13,18 +13,24 @@
.clickable {
cursor: pointer;
}
.icon-security,
.icon-security-locked {
font-size: 16px;
}
}
#contacts {
>li {
color: $defaultSideBarFontColor;
display: block;
list-style-type: none;
text-align: left;
white-space: nowrap;
color: #FFF;
font-size: 10pt;
padding: 6px 10%;
color: $baseLight;
font-size: 16px;
padding: 0 10%;
height: 27px;
&:hover,
&:active {
@@ -36,6 +42,7 @@
vertical-align: middle;
margin: 0px;
width: 100%;
line-height: 1.5em;
text-overflow: ellipsis;
overflow: hidden;
}

121
css/_filmstrip.scss Normal file
View File

@@ -0,0 +1,121 @@
%align-right {
@include flex();
flex-direction: row-reverse;
flex-wrap: nowrap;
justify-content: flex-start;
}
.filmstrip {
position: absolute;
bottom: 0;
right: 0;
padding: 10px 5px;
@extend %align-right;
&__toolbar {
@include flex();
flex-direction: column-reverse;
flex-wrap: nowrap;
position: relative;
z-index: 1; // Set z-index to make element visible
width: $hideFilmstripButtonWidth;
button {
font-size: 14px;
line-height: 1.2;
text-align: center;
background: transparent;
opacity: 0.7;
height: auto;
width: 100%;
padding: 0;
margin: 0;
border: none;
outline: none;
-webkit-appearance: none;
&:hover {
opacity: 1;
}
i {
cursor: pointer;
}
}
}
&__videos {
@extend %align-right;
position:relative;
height:196px;
padding: 0;
padding-left: 17px;
bottom: 0;
width:auto;
border: $thumbnailsBorder solid transparent;
z-index: 5;
transition: bottom 2s;
overflow: visible !important;
font-size: 0pt; /*!!!Removes the gap between the local video container and the remote videos.*/
&.hidden {
bottom: -196px;
}
.videocontainer {
display: none;
position: relative;
background-size: contain;
border: $thumbnailVideoBorder solid transparent;
border-radius:1px;
margin: 0 $thumbnailVideoMargin;
&.videoContainerFocused, &:hover {
cursor: hand;
}
/**
* Focused video thumbnail.
*/
&.videoContainerFocused {
transition-duration: 0.5s;
-webkit-transition-duration: 0.5s;
-webkit-animation-name: greyPulse;
-webkit-animation-duration: 2s;
-webkit-animation-iteration-count: 1;
border: $thumbnailVideoBorder solid $videoThumbnailSelected !important;
box-shadow: inset 0 0 3px $videoThumbnailSelected,
0 0 3px $videoThumbnailSelected !important;
}
.remotevideomenu {
display: none;
}
/**
* Hovered video thumbnail.
*/
&:hover {
cursor: hand;
border: $thumbnailVideoBorder solid $videoThumbnailHovered;
box-shadow: inset 0 0 3px $videoThumbnailHovered,
0 0 3px $videoThumbnailHovered;
.remotevideomenu {
display: inline-block;
}
}
/* With TemasysWebRTC plugin <object/> element is used
instead of <video/> */
& > video,
& > object {
cursor: hand;
border-radius:1px;
object-fit: cover;
overflow: hidden;
}
}
}
}

View File

@@ -55,6 +55,9 @@
.icon-kick:before {
content: "\e904";
}
.icon-menu:before {
content: "\e91f";
}
.icon-menu-up:before {
content: "\e91f";
}
@@ -133,4 +136,4 @@
// FIXME not used anymore - consider removing in the next font update
.icon-presentation:before {
content: "\e603";
}
}

33
css/_inlay.scss Normal file
View File

@@ -0,0 +1,33 @@
.inlay {
margin-top: 14%;
@include border-radius(3px);
padding: 40px 38px 44px;
color: #fff;
background: $inlayColorBg;
text-align: center;
&__title {
margin: 17px 0;
padding-bottom: 17px;
color: $popoverFontColor;
font-size: 21px;
letter-spacing: 0.3px;
border-bottom: 1px solid $inlayBorderColor;
}
&__text {
color: $popoverFontColor;
display: block;
margin-top: 22px;
font-size: 16px;
}
&__icon {
margin: 0 10px;
font-size: 50px;
}
&__button {
float: none !important;
}
}

View File

@@ -6,100 +6,42 @@
display: none;
max-width: 300px;
min-width: 100px;
padding: 1px;
text-align: left;
color: #333333;
background-color: #ffffff;
color: $popoverFontColor;
background-color: $popoverBg;
background-clip: padding-box;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
border-radius: 3px;
/*-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);*/
/*box-shadow: 0 5px 10px rgba(0, 0, 0, 0.4);*/
white-space: normal;
margin-top: -10px;
margin-bottom: 35px;
}
margin-top: -$popoverMenuPadding;
.jitsipopover.black
{
background-color: rgba(0,0,0,0.8);
color: #ffffff;
}
&__menu-padding {
height: $popoverMenuPadding;
width: 100px;
position: absolute;
bottom: -$popoverMenuPadding;
}
.jitsipopover-content {
padding: 9px 14px;
font-size: 10pt;
white-space:pre-wrap;
text-align: center;
}
&__showmore {
display: block;
text-align: center;
width: 90px;
margin: 10px auto;
}
.jitsipopover > .arrow,
.jitsipopover > .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.jitsipopover > .arrow {
border-width: 11px;
left: 50%;
margin-left: -11px;
border-bottom-width: 0;
border-top-color: #999999;
border-top-color: rgba(0, 0, 0, 0.25);
bottom: -11px;
}
.jitsipopover > .arrow:after {
border-width: 10px;
content: " ";
bottom: 1px;
margin-left: -10px;
border-bottom-width: 0;
border-top-color: #ffffff;
}
.jitsipopover.black > .arrow:after
{
border-top-color: rgba(0, 0, 0, 0.8);
}
.jitsiPopupmenuPadding {
height: 35px;
width: 100px;
position: absolute;
bottom: -35px;
}
.jitsipopover_green
{
color: #4abd04;
}
.jitsipopover_orange
{
color: #ffa800;
}
.jitsipopover_blue
{
color: #21B9FC;
}
.jitsipopover_showmore
{
background-color: #21B9FC;
color: #ffffff;
cursor: pointer;
border-radius: 3px;
text-align: center;
width: 90px;
height: 16px;
padding-top: 4px;
padding-left: 10px;
padding-right: 10px;
margin: 15px auto 0px auto;
> .arrow {
position: absolute;
display: block;
left: 50%;
bottom: -5px;
margin-left: -5px;
width: 0;
height: 0;
border-color: transparent;
border-top-color: $popoverBg;
border-style: solid;
border-width: 5px;
border-bottom-width: 0;
}
}

View File

@@ -31,24 +31,6 @@ ul.loginmenu:after {
left: 18px;
}
li a.authButton{
background-color: #06a5df;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 29px;
padding-right: 29px;
border-radius: 4px;
cursor: pointer;
}
span.authentication:hover ul.loginmenu, ul.loginmenu:hover {
display:block !important;
}
span.authentication {
position: relative;
}
a.disabled {
color: gray !important;
pointer-events: none;
@@ -73,4 +55,4 @@ ul.loginmenu.extendedToolbarPopup:after {
position: absolute;
top: 18px;
left: -7px;
}
}

View File

@@ -19,11 +19,11 @@
}
@mixin flex() {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
/**
@@ -45,35 +45,109 @@
}
@mixin circle($diameter) {
width: $diameter;
height: $diameter;
border-radius: 50%;
width: $diameter;
height: $diameter;
border-radius: 50%;
}
@mixin absoluteAligning($sizeX, $sizeY) {
top: 50%;
left: 50%;
/**
* Absolute position the element at the top left corner
**/
@mixin topLeft() {
position: absolute;
@include transform(translate(-#{$sizeX / 2}, -#{$sizeY / 2}))
top: 0;
left: 0;
}
@mixin absoluteAligning() {
top: 50%;
left: 50%;
position: absolute;
@include transform(translate(-50%, -50%));
}
/**
* Defines the maximum width and height
**/
@mixin maxSize($value) {
max-width: $value;
max-height: $value;
}
@mixin transform($func) {
-moz-transform: $func;
-ms-transform: $func;
-webkit-transform: $func;
-o-transform: $func;
transform: $func;
-moz-transform: $func;
-ms-transform: $func;
-webkit-transform: $func;
-o-transform: $func;
transform: $func;
}
@mixin transition($transition...) {
-moz-transition: $transition;
-o-transition: $transition;
-webkit-transition: $transition;
transition: $transition;
-moz-transition: $transition;
-o-transition: $transition;
-webkit-transition: $transition;
transition: $transition;
}
@mixin box-shadow($type, $h, $y, $blur, $color) {
-webkit-box-shadow: $type $h $y $blur $color;
-moz-box-shadow: $type $h $y $blur $color;
box-shadow: $type $h $y $blur $color;
/**
* Mixin styling placeholder
**/
@mixin placeholder() {
$selectors: (
"::-webkit-input-placeholder",
"::-moz-placeholder",
":-moz-placeholder",
":-ms-input-placeholder"
);
@each $selector in $selectors {
#{$selector} {
@content;
}
}
}
@mixin box-shadow($h, $y, $blur, $color, $inset: false) {
@if $inset {
-webkit-box-shadow: inset $h $y $blur $color;
-moz-box-shadow: inset $h $y $blur $color;
box-shadow: inset $h $y $blur $color;
} @else {
-webkit-box-shadow: $h $y $blur $color;
-moz-box-shadow: $h $y $blur $color;
box-shadow: $h $y $blur $color;
}
}
@mixin no-box-shadow {
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
@mixin box-sizing($box-model) {
-webkit-box-sizing: $box-model; // Safari <= 5
-moz-box-sizing: $box-model; // Firefox <= 19
box-sizing: $box-model;
}
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
border-radius: $radius;
/* stops bg color from leaking outside the border: */
background-clip: padding-box;
}
@mixin opacity($opacity) {
opacity: $opacity;
$opacity-ie: $opacity * 100;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=$opacity-ie);
filter: alpha(opacity=$opacity-ie); //IE8
}
@mixin text-truncate {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

15
css/_policy.scss Normal file
View File

@@ -0,0 +1,15 @@
.policy {
&__logo {
display: block;
width: 200px;
height: 50px;
margin: 30px auto 0;
}
&__text {
text-align: center;
font-size: 14px;
line-height: 21px;
font-weight: 300;
}
}

View File

@@ -1,58 +1,69 @@
/*Initialize*/
ul.popupmenu {
padding: 0px 10px 0px 10px;
margin: 0;
/**
* Initialize
**/
.popupmenu {
padding: 0;
margin: 2px 0;
bottom: 0;
width: 100px;
height: auto;
}
ul.popupmenu li {
list-style-type: none;
text-align: left;
}
&:first-child {
margin-top: 2px;
}
ul.popupmenu li:hover {
background-color: rgba(256, 256, 256, .2);
border-radius:3px;
}
&__item {
list-style-type: none;
text-align: left;
height: 35px;
/*Link Appearance*/
ul.popupmenu li a {
display: block;
text-decoration: none;
color: #fff;
padding: 5px;
font-size: 9pt;
width: 100%;
cursor: hand;
}
&:hover {
background-color: $popupMenuSelectedItemBackground;
}
}
ul.popupmenu li a i.icon-kick {
font-size: 8pt;
}
// Link Appearance
&__link {
display: block;
box-sizing: border-box;
text-decoration: none;
color: #fff;
padding: 5px;
height: 100%;
font-size: 9pt;
width: 100%;
cursor: hand;
ul.popupmenu li a span {
display: inline-block;
width: 20px;
height: 16px;
text-align: center;
}
&.disabled {
color: gray !important;
pointer-events: none;
}
}
ul.popupmenu li a div {
display: inline-block;
line-height: 25px;
}
&__text {
display: inline-block;
vertical-align: middle;
}
ul.popupmenu li a i {
line-height: 25px;
&__icon {
vertical-align: middle;
position: relative;
display: inline-block;
width: 20px;
height: 100%;
text-align: center;
> * {
@include absoluteAligning();
}
}
.icon-kick {
font-size: 8pt;
}
}
span.remotevideomenu:hover ul.popupmenu, ul.popupmenu:hover {
display:block !important;
}
a.disabled {
color: gray !important;
pointer-events: none;
}

View File

@@ -1,4 +1,4 @@
.recordingSpinner {
display: none;
vertical-align: text-bottom;
vertical-align: top;
}

View File

@@ -6,7 +6,36 @@ html, body {
}
.redirectPageMessage {
width: 30%;
margin: 20% auto;
text-align: center;
font-size: 36px;
margin-top: 20%;
font-size: 24px;
.thanks-msg {
border-bottom: 1px solid $selectBg;
padding-left: 30px;
padding-right: 30px;
p {
margin: 30px auto;
font-size: 24px;
line-height: 24px;
}
}
.hint-msg{
p {
margin: 26px auto;
font-weight: 600;
font-size: 16px;
line-height: 18px;
.hint-msg__holder{
font-weight: 200;
}
}
.happy-software{
width: 120px;
height: 86px;
margin: 0 auto;
background: $happySoftwareBackground;
}
}
}

View File

@@ -2,60 +2,50 @@
* Toolbar side panel main container element.
*/
#sideToolbarContainer {
display: inline-block;
position:absolute;
top: 0px;
left: $defaultToolbarSize;
width: 0;
background-color: rgba(0,0,0,0.8);
height: 100%;
left: $defaultToolbarSize;
max-width: $sidebarWidth;
z-index: 800;
overflow: hidden;
letter-spacing: $titleLetterSpacing;
position: absolute;
top: 0;
width: 0;
z-index: 800;
/**
* Labels inside the side panel.
*/
label {
color: $defaultColor;
color: $baseLight;
}
/**
* Form elements and blocks.
*/
input, label, select, a,
.sideToolbarBlock, .input-control, .button-control {
display: inline-block;
input, select, a,
.sideToolbarBlock, .form-control, .button-control {
display: block;
margin-top: 15px;
margin-left: 10%;
width: 80%;
}
/**
* Specify colors for edit elements.
*/
select, input[type="button"], input[type="text"],
input[type="reset"], input[type="submit"] {
color: $inputColor;
background: $inputBackground;
border: none;
}
/**
* Specify styling of elements inside a block.
*/
.sideToolbarBlock {
input, label, button, a, select {
margin-top: 5px;
input, button, a, select {
margin-left: 0;
margin-top: 5px;
width: 100%;
}
.startMutedLabel,
.followMeLabel {
input[type='checkbox'] {
display: inline;
margin-top: 0;
width: auto !important;
> label {
margin-top: 5px;
width: 80%;
}
}
}
@@ -70,39 +60,42 @@
box-sizing: border-box;
color: #FFF;
.input-control {
border: 0;
}
/**
* Titles and subtitles of inner containers.
*/
> div.title,
div.subTitle {
text-align: left;
margin: 10px 0px 10px 0px;
div.title, div.subTitle {
margin: 24px 0 11px;
}
/**
* Main title size.
*/
> div.title {
color: $defaultColor !important;
div.title {
color: $toolbarTitleColor;
text-align: center;
font-size: 16px;
font-size: $toolbarTitleFontSize;
}
/**
* Subtitle specific properties.
*/
> div.subTitle {
div.subTitle {
color: $defaultSideBarFontColor !important;
font-size: 11px;
font-weight: 500;
color: $defaultSideBarFontColor !important;
margin-left: 10%;
text-align: left;
}
/**
* First element after a title.
*/
.first {
margin-top: 0px !important;
margin-top: 0 !important;
}
/**
@@ -120,8 +113,28 @@
text-align: center;
}
#startAudioMuted,
#startVideoMuted,
#followMeCheckBox {
width: 13px !important;
/**
* Profile
*/
.auth_container {
ul {
padding: 0;
li {
list-style-type: none;
a.authButton {
width: 160px;
margin: 10px 20px;
padding: 3px 29px;
box-sizing: border-box;
background-color: #06a5df;
border-radius: 4px;
cursor: pointer;
color: $defaultColor;
text-decoration: none;
text-align: center;
}
}
}
}

View File

@@ -7,206 +7,101 @@
*
* Author: John Papa and Hans Fjällemark
* Project: https://github.com/CodeSeven/toastr
*
* Last updated: October 13, 2016
*/
.toast-title {
.toast-title,
.toast-message .nickname {
font-weight: bold;
margin: 0 0 3px;
@include text-truncate;
}
.toast-message {
-ms-word-wrap: break-word;
word-wrap: break-word;
}
.toast-message a,
.toast-message label {
color: #ffffff;
}
.toast-message .nickname {
font-weight: bold;
}
.toast-message a:hover {
color: #cccccc;
.toast-message label,
.toast-message .connected,
.toast-message .disconnected {
color: $notificationLinkColor;
text-decoration: none;
}
.toast-message a:hover {
text-decoration: underline;
}
.toast-message br {
display: none;
}
// close button
.toast-close-button {
position: relative;
right: -0.3em;
top: -0.3em;
float: right;
color: $notificationColor;
background: transparent;
font-size: 15px;
height: 15px;
width: 15px;
font-weight: bold;
color: #ffffff;
background: transparent !important;
-webkit-text-shadow: 0 1px 0 #ffffff;
text-shadow: 0 1px 0 #ffffff;
opacity: 0.8;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
filter: alpha(opacity=80);
line-height: 1.2;
height: 20px;
width: 20px;
padding: 0;
border: 0;
margin: -6px -10px 0 0;
float: right;
cursor: pointer;
@include opacity(0.4);
/* Additional properties for button version
iOS requires the button element instead of an anchor tag.
If you want the anchor version, it requires `href="#"`. */
-webkit-appearance: none;
}
.toast-close-button:hover,
.toast-close-button:focus {
color: #ffffff;
text-decoration: none;
cursor: pointer;
opacity: 1;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
filter: alpha(opacity=100);
@include opacity(1);
}
/*Additional properties for button version
iOS requires the button element instead of an anchor tag.
If you want the anchor version, it requires `href="#"`.*/
button.toast-close-button {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
.toast {
color: $notificationColor;
background-color: $notificationBackground;
font-size: $notificationFontSize;
padding: $notificationPadding;
border: 1px solid lighten($notificationBackground, 10%);
@include border-radius($notificationBorderRadius);
@include box-shadow(1px, 1px, 2px, rgba(0,0,0,0.3));
@include opacity($notificationOpacity);
}
.toast-top-full-width {
top: 0;
right: 0;
width: 100%;
}
.toast-bottom-full-width {
bottom: 0;
right: 0;
width: 100%;
}
.toast-top-left {
top: 12px;
left: 12px;
}
.toast-top-right {
top: 12px;
right: 12px;
}
.toast-bottom-right {
right: 12px;
bottom: 12px;
}
.toast-bottom-left {
bottom: 12px;
left: 12px;
.toast:hover {
@include opacity(1);
}
#toast-container {
position: fixed;
z-index: 1012;
/*overrides*/
}
#toast-container * {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
#toast-container > div {
margin: 0 0 6px;
padding: 15px 15px 15px 15px;
width: 300px;
-moz-border-radius: 3px 3px 3px 3px;
-webkit-border-radius: 3px 3px 3px 3px;
border-radius: 3px 3px 3px 3px;
background-position: 15px center;
background-repeat: no-repeat;
-moz-box-shadow: 0 0 12px #999999;
-webkit-box-shadow: 0 0 12px #999999;
box-shadow: 0 0 12px #999999;
color: #ffffff;
opacity: 0.8;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
filter: alpha(opacity=80);
}
#toast-container > :hover {
-moz-box-shadow: 0 0 12px #000000;
-webkit-box-shadow: 0 0 12px #000000;
box-shadow: 0 0 12px #000000;
opacity: 1;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
filter: alpha(opacity=100);
cursor: pointer;
}
#toast-container .toast-info,
#toast-container .toast-success,
#toast-container .toast-error,
#toast-container .toast-warning
{
padding: 10px 10px 10px 10px !important;
}
#toast-container.toast-top-full-width > div,
#toast-container.toast-bottom-full-width > div {
width: 100%;
margin: auto;
}
.toast {
background-color: #030303;
}
.toast-success {
background-color: #51a351;
}
.toast-error {
background-color: #bd362f;
}
.toast-info {
background-color: #2f96b4;
}
.toast-warning {
background-color: #f89406;
}
/*Responsive Design*/
@media all and (max-width: 240px) {
#toast-container > div {
padding: 8px 8px 8px 8px;
width: 11em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 241px) and (max-width: 480px) {
#toast-container > div {
padding: 8px 8px 8px 8px;
width: 18em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 481px) and (max-width: 768px) {
#toast-container > div {
padding: 15px 15px 15px 15px;
width: 25em;
}
z-index: $notificationZ;
}
#toast-container.notification-bottom-right {
bottom: 140px;
right: 5px;
$videoOffset: 2 * ($thumbnailVideoMargin + $thumbnailsBorder) + $thumbnailVideoBorder;
bottom: 135px;
right: $hideFilmstripButtonWidth + $videoOffset;
}
#toast-container.notification-bottom-right-center {
right: 205px;
#toast-container * {
@include box-sizing(border-box);
}
#toast-container .toast-info {
-webkit-box-shadow: none;
box-shadow: none;
}
.toast-close-button {
right: -7px;
top: -19px;
}
#toast-container .toast-info {
background-color: black;
border: 1px solid #3a3a3a;
width: 220px;
padding: 10px 10px 10px 50px;
#toast-container .toast {
width: $notificationWidth;
margin: 0 0 8px;
}

View File

@@ -1,9 +1,21 @@
.toolbar {
background-color: rgba(0,0,0,0.5);
background-color: $toolbarBackground;
position: relative;
z-index: $toolbarZ;
height: 100%;
pointer-events: auto;
/**
* Splitter button in the toolbar.
*/
&__splitter {
display: inline-block;
vertical-align: middle;
width: 1px;
height: 50%;
margin: 0 $splitterToolbarButtonMargin;
background: $splitterColor;
}
}
#mainToolbarContainer{
@@ -16,8 +28,7 @@
z-index: $toolbarZ;
pointer-events: none;
min-height: 100px;
transform: translateY(-100%);
-webkit-transform: translateY(-100%);
opacity: 0;
}
#subject {
@@ -43,29 +54,14 @@
margin-right: auto;
width: auto;
border-radius: 3px;
/**
* First button in the toolbar.
*/
.first {
.button:first-child {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
/**
* Last button in the toolbar.
*/
.last {
.button:last-child {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
/**
* Splitter button in the toolbar.
*/
.splitter {
margin-left: $splitterToolbarButtonLeftMargin;
}
}
#extendedToolbar {
@@ -76,8 +72,8 @@
display: flex;
width: $defaultToolbarSize;
height: 100%;
top: 0px;
left: 0px;
top: 0;
left: 0;
padding-top: 10px;
box-sizing: border-box;
flex-direction: column;
@@ -256,7 +252,7 @@ a.button>#avatar {
*/
@include keyframes(slideInExt) {
from { width: 0px; }
to { width: 200px; } // TO FIX: Make this value a percentage.
to { width: $sidebarWidth; } // TO FIX: Make this value a percentage.
}
.slideInExt {
@@ -264,7 +260,7 @@ a.button>#avatar {
}
@include keyframes(slideOutExt) {
from { width: 200px; } // TO FIX: Make this value a percentage.
from { width: $sidebarWidth; } // TO FIX: Make this value a percentage.
to { width: 0px; }
}
@@ -273,5 +269,12 @@ a.button>#avatar {
}
/**
* END of slide in animation for extended toolbar panel.
* START of fade in animation for main toolbar
*/
.fadeIn {
@include animation('fadeIn .3s linear .2s forwards');
}
.fadeOut {
@include animation('fadeOut .5s linear forwards');
}

38
css/_utils.scss Normal file
View File

@@ -0,0 +1,38 @@
/**
* Hides an element.
*/
.hide {
display: none !important;
}
/**
* Shows an element.
*/
.show {
display: block !important;
}
/**
* Shows an inline element.
*/
.show-inline {
display: inline-block !important;
}
/**
* Shows as a list item
**/
.show-list-item {
display: list-item !important;
}
/**
* Shows a flex element.
*/
.show-flex {
display: -webkit-box !important;
display: -moz-box !important;
display: -ms-flexbox !important;
display: -webkit-flex !important;
display: flex !important;
}

View File

@@ -1,3 +1,5 @@
@import "themes/light";
/**
* Style variables
*/
@@ -11,10 +13,14 @@ $hangupFontSize: 2em;
$defaultToolbarSize: 50px;
// Video layout.
$thumbnailIndicatorSize: 23px;
$thumbnailIndicatorBorder: 0px;
$thumbnailToolbarHeight: 22px;
$thumbnailIndicatorBorder: 0;
$thumbnailIndicatorSize: 3em;
$thumbnailVideoMargin: 2px;
$thumbnailToolbarHeight: 25px;
$thumbnailsBorder: 2px;
$thumbnailVideoBorder: 2px;
$hideFilmstripButtonWidth: 17px;
/**
* Color variables.
@@ -23,58 +29,101 @@ $defaultColor: #F1F1F1;
$defaultSideBarFontColor: #44A5FF;
$defaultSemiDarkColor: #ACACAC;
$defaultDarkColor: #2b3d5c;
$defaultBackground: #474747;
$tooltipBg: rgba(0,0,0, 0.7);
// Toolbar
/**
* Toolbar
*/
$toolbarTitleColor: #FFFFFF;
$toolbarTitleFontSize: 19px;
$toolbarBackground: rgba(0, 0, 0, 0.5);
$toolbarSelectBackground: rgba(0, 0, 0, .6);
$toolbarBadgeBackground: #165ECC;
$toolbarBadgeColor: #FFFFFF;
$toolbarToggleBackground: #12499C;
$splitterToolbarButtonLeftMargin: 0px;
$splitterToolbarButtonMargin: 18px;
// Main controls
/*
* Main controls
* TODO: looks like we don't use it
*/
$inputSemiBackground: rgba(132, 132, 132, .8);
$inputLightBackground: #EBEBEB;
// Video layout.
$videoThumbnailHovered: #BFEBFF;
/*
* Video layout
*/
$videoThumbnailHovered: rgba(22, 94, 204, .4);
$videoThumbnailSelected: #165ECC;
$participantNameColor: #fff;
$thumbnailPictogramColor: #fff;
$dominantSpeakerBg: #165ecc;
$raiseHandBg: #D6D61E;
$audioLevelBg: #44A5FF;
$connectionIndicatorBg: #165ecc;
$audioLevelShadow: rgba(9, 36, 77, 0.9);
$videoStateIndicatorColor: $defaultColor;
$videoStateIndicatorBackground: $toolbarBackground;
/**
* Feedback Modal
*/
$feedbackContentBg: #fff;
$feedbackInputBg: #fff;
$feedbackTextColor: #000;
$feedbackInputTextColor: #333;
$feedbackInputPlaceholderColor: #777;
$rateStarLabelColor: #333;
$rateStarDefault: #ccc;
$rateStarActivity: #165ecc;
$rateStarLabelColor: #333;
$rateStarSize: 34px;
/**
* Notifications
*/
$notificationFontSize: 13px;
$notificationColor: #FFFFFF;
$notificationBackground: $tooltipBg;
$notificationTitleColor: $notificationColor;
$notificationMessageColor: $notificationColor;
$notificationLinkColor: $notificationColor;
$notificationOpacity: 0.9;
$notificationPadding: 15px 20px;
$notificationBorderRadius: 4px;
$notificationWidth: 215px;
/**
* Misc.
*/
$borderRadius: 4px;
$borderRadius: 3px;
$defaultWatermarkLink: '../images/watermark.png';
$sidebarWidth: 200px;
$sidebarWidth: 220px;
$popoverMenuPadding: 13px;
$happySoftwareBackground: transparent;
/**
* Z-indexes. TODO: Replace this by a function.
*/
$tooltipsZ: 901;
$toolbarZ: 900;
$overlayZ: 800;
$overlayZ: 902;
$notificationZ: 1012;
$ringingZ: 800;
$dropdownZ: 901;
$dropdownMaskZ: 900;
/**
* Font Colors TODO: Change colors when general dialogs are implemented.
* Font Colors
*/
$defaultFontColor: #777;
$defaultLightFontColor: #F1F1F1;
$defaultDarkFontColor: #000;
$buttonFontColor: #777;
$buttonHoverFontColor: #287ade;
$auiPrimaryButtonBg: #3572b0;
$auiPrimaryButtonHoverBg: #57647b;
$auiPrimaryButtonColor: #fff;
$auiIconColor: #707070;
$inputControlEmColor: #f29424;
/**
* Forms
*/
//inputs
$inputControlEmColor: #f29424;
//buttons
$linkFontColor: #489afe;
$linkHoverFontColor: #287ade;

View File

@@ -12,110 +12,113 @@
overflow: hidden;
}
#remoteVideos {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
flex-direction: row-reverse;
flex-wrap: nowrap;
justify-content: flex-start;
position:absolute;
text-align:right;
height:196px;
padding: 10px 10px 10px 5px;
bottom: 0;
left: 0;
right: 0;
width:auto;
border: 2px solid transparent;
z-index: 5;
transition: bottom 2s;
overflow: visible !important;
font-size: 0pt; /*!!!Removes the gap between the local video container and the remote videos.*/
}
#remotevideos.hidden {
bottom: -196px;
}
.videocontainer {
position: relative;
text-align: center;
}
#remoteVideos .videocontainer {
display: none;
position: relative;
background-color: black;
background-size: contain;
border-radius:1px;
margin: 0 $thumbnailVideoMargin;
}
&__background {
@include topLeft();
width: 100%;
height: 100%;
background-color: black;
}
/**
* The toolbar of the video thumbnail.
*/
.videocontainer__toolbar {
position: absolute;
bottom: 0;
left: 0;
z-index: 1;
width: 100%;
box-sizing: border-box; // Includes the padding in the 100% width.
height: $thumbnailToolbarHeight;
max-height: 100%;
background-color: rgba(0, 0, 0, 0.5);
padding: 0 5px 0 5px;
}
/**
* The toolbar of the video thumbnail.
*/
&__toolbar,
&__toptoolbar {
position: absolute;
left: 0;
z-index: 3;
width: 100%;
box-sizing: border-box; // Includes the padding in the 100% width.
}
#remoteVideos .videocontainer.videoContainerFocused,
#remoteVideos .videocontainer:hover {
cursor: hand;
margin-right: $thumbnailVideoMargin - 2;
margin-left: $thumbnailVideoMargin - 2;
margin-top: -2px;
}
/**
* Focused video thumbnail.
*/
#remoteVideos .videocontainer.videoContainerFocused {
transition-duration: 0.5s;
-webkit-transition-duration: 0.5s;
-webkit-animation-name: greyPulse;
-webkit-animation-duration: 2s;
-webkit-animation-iteration-count: 1;
border: 2px solid $videoThumbnailSelected !important;
box-shadow: inset 0 0 3px $videoThumbnailSelected,
0 0 3px $videoThumbnailSelected !important;
}
&__toolbar {
bottom: 0;
padding: 0 5px 0 5px;
height: $thumbnailToolbarHeight;
}
/**
* Hovered video thumbnail.
*/
#remoteVideos .videocontainer:hover {
cursor: hand;
border: 2px solid $videoThumbnailHovered;
box-shadow: inset 0 0 3px $videoThumbnailHovered,
0 0 3px $videoThumbnailHovered;
&__toptoolbar {
$toolbarPadding: 5px;
top: 0;
padding: $toolbarPadding;
padding-bottom: 0;
span.indicator {
position: relative;
font-size: 8px;
text-align: center;
line-height: $thumbnailIndicatorSize;
display: none;
padding: 0;
margin-right: em(5, 8);
float: left;
@include circle($thumbnailIndicatorSize);
box-sizing: border-box;
z-index: 3;
background: $dominantSpeakerBg;
color: $thumbnailPictogramColor;
border: $thumbnailIndicatorBorder solid $thumbnailPictogramColor;
&:last-child {
margin-right: 0;
}
.indicatoricon {
@include absoluteAligning();
}
.connection {
position: relative;
display: inline-block;
margin: 0 auto;
left: 0;
@include transform(translate(0, -50%));
&_empty
{
color: #8B8B8B;/*#FFFFFF*/
overflow: hidden;
}
&_lost
{
color: #8B8B8B;
overflow: visible;
}
&_full
{
@include topLeft();
color: #FFFFFF;/*#15A1ED*/
overflow: hidden;
}
}
.icon-connection,
.icon-connection-lost {
font-size: 1em;
}
}
}
&__hoverOverlay {
position: relative;
width: 100%;
height: 100%;
visibility: hidden;
background: rgba(0,0,0,.6);
z-index: 2;
}
}
#localVideoWrapper {
display:inline-block;
}
/* With TemasysWebRTC plugin <object/> element is used
instead of <video/> */
#remoteVideos .videocontainer>video,
#remoteVideos .videocontainer>object {
cursor: hand;
border-radius:1px;
object-fit: cover;
overflow: hidden;
}
.flipVideoX {
transform: scale(-1, 1);
-moz-transform: scale(-1, 1);
@@ -176,14 +179,15 @@
.videocontainer .editdisplayname {
display: inline-block;
position: absolute;
left: 30%;
width: 40%;
left: 10%;
width: 80%;
top: 50%;
@include transform(translateY(-40%));
color: $participantNameColor;
text-align: center;
text-overflow: ellipsis;
font-size: 12px;
font-weight: 100;
letter-spacing: 1px;
overflow: hidden;
white-space: nowrap;
line-height: $thumbnailToolbarHeight;
@@ -201,90 +205,10 @@
padding: 0;
}
.videocontainer>span.status {
display: inline-block;
position: absolute;
color: #FFFFFF;
background: rgba(0,0,0,.7);
text-align: center;
text-overflow: ellipsis;
width: 70%;
height: 15%;
left: 15%;
bottom: 2%;
padding: 5px;
font-size: 10pt;
overflow: hidden;
white-space: nowrap;
z-index: 2;
border-radius:3px;
}
.connectionindicator
{
display: inline-block;
position: absolute;
top: 7px;
right: 0;
padding: 0px 5px;
z-index: 3;
width: 18px;
height: 13px;
}
.connection.connection_empty
{
color: #8B8B8B;/*#FFFFFF*/
overflow: hidden;
}
.connection.connection_lost
{
color: #8B8B8B;
overflow: visible;
}
.connection.connection_full
{
color: #FFFFFF;/*#15A1ED*/
overflow: hidden;
}
.connection
{
position: absolute;
left: 0px;
top: 0px;
font-size: 8pt;
border: 0px;
width: 18px;
height: 13px;
}
.connection_info
{
float: left;
padding-bottom: 5px;
}
.connection_info > table
{
white-space: nowrap;
}
.connection_info, .connection_info > table
{
text-align: left;
font-size: 11px;
color: #ffffff;
}
#localVideoContainer>span.status:hover,
#localVideoContainer .displayname:hover {
cursor: text;
}
.videocontainer>span.status,
.videocontainer .displayname {
pointer-events: none;
}
@@ -297,7 +221,6 @@
pointer-events: auto !important;
}
.videocontainer>a.status,
.videocontainer>a.displayname {
display: inline-block;
position: absolute;
@@ -342,25 +265,26 @@
margin: 0px 0px 0px 5px;
}
.videocontainer>span.indicator {
position: absolute;
top: 0px;
left: 0px;
@include circle($thumbnailIndicatorSize);
box-sizing: border-box;
line-height: $thumbnailIndicatorSize - 2*$thumbnailIndicatorBorder;
z-index: 3;
text-align: center;
background: $dominantSpeakerBg;
margin: 7px;
display: inline-block;
color: $thumbnailPictogramColor;
font-size: 8pt;
border: $thumbnailIndicatorBorder solid $thumbnailPictogramColor;
#raisehandindicator {
background: $raiseHandBg;
}
.videocontainer>#raisehandindicator {
background: $raiseHandBg;
#connectionindicator {
background: $connectionIndicatorBg;
}
.remotevideomenu
{
display: inline-block;
position: absolute;
top: 0px;
right: 0;
margin: 7px;
z-index: 3;
width: 18px;
height: 13px;
color: #FFF;
font-size: 8pt;
}
/**
@@ -403,12 +327,6 @@
}
}
#indicatoricon {
width: $thumbnailIndicatorSize - 2*$thumbnailIndicatorBorder;
height: $thumbnailIndicatorSize - 2*$thumbnailIndicatorBorder;
line-height: $thumbnailIndicatorSize - 2*$thumbnailIndicatorBorder;
}
#reloadPresentation {
display: none;
position: absolute;
@@ -457,7 +375,6 @@
margin: auto;
position: relative;
border-radius: 100px;
z-index: 3;
visibility: inherit;
background-color: #000000;
}
@@ -472,8 +389,11 @@
}
.userAvatar {
@include circle(60px);
@include absoluteAligning(60px, 60px);
@include maxSize(60px);
@include absoluteAligning();
border-radius: 50%;
height: 50%;
width: auto;
}
.sharedVideoAvatar {
@@ -530,7 +450,7 @@
display: none;
position: absolute;
width: auto;
z-index: 1011;
z-index: 2;
font-weight: 600;
font-size: 14px;
text-align: center;
@@ -553,7 +473,7 @@
position: absolute;
width: 100%;
top:50%;
z-index: 1011;
z-index: 2;
font-weight: 600;
font-size: 14px;
text-align: center;
@@ -565,47 +485,43 @@
0px 0px 1px rgba(0,0,0,0.3);
}
#videoResolutionLabel {
display: none;
position: absolute;
top: 5px;
right: 5px;
background: rgba(0,0,0,.5);
padding: 10px;
color: rgba(255,255,255,.5);
z-index: 1011;
.video-state-indicator {
background: $videoStateIndicatorBackground;
color: $videoStateIndicatorColor;
font-size: 13px;
line-height: 20px;
text-align: center;
min-width: 40px;
height: 40px;
padding: 10px 5px;
border-radius: 50%;
position: absolute;
box-sizing: border-box;
}
#videoResolutionLabel,
.centeredVideoLabel {
display: none;
z-index: 1011;
}
.centeredVideoLabel {
display: none;
position: absolute;
bottom: 45%;
top: auto;
right: auto;
left: auto;
line-height: 28px;
height: 28px;
width: auto;
padding: 5px;
margin-right: auto;
margin-left: auto;
background: rgba(0,0,0,.5);
color: #FFF;
z-index: 1011;
border-radius: 2px;
-webkit-transition: all 2s 2s linear;
transition: all 2s 2s linear;
&.moveToCorner {
bottom: auto;
}
}
.moveToCorner {
top: 5px;
right: 50px; /*leave free space for the HD label*/
margin-right: 0px;
margin-left: auto;
background: rgba(0,0,0,.3);
color: rgba(255,255,255,.5);
position: absolute;
top: 30px;
right: 30px;
}
.hidden {
}
.moveToCorner + .moveToCorner {
right: 80px;
}

View File

@@ -0,0 +1,68 @@
.select2-container.aui-select2-container {
background-color: transparent !important;
margin-top: 2px;
a.select2-choice {
height: 28px !important;
line-height: 18px !important;
width: 100% !important;
background-color: $selectBg !important;
border-color: $selectBg !important;
color: $selectFontColor !important;
text-shadow: none !important;
font-size: 12px !important;
margin: 0 auto !important;
&:after {
border-top-color: $selectFontColor;
}
}
&.select2-dropdown-open{
a.select2-choice {
background-color: $selectActiveBg !important;
border-color: $selectActiveBg !important;
}
}
}
.select2-drop.aui-select2-drop.aui-style-default {
z-index: $dropdownZ;
background-color: $selectActiveBg;
border-color: $selectActiveBg;
.select2-results{
background-color: $selectActiveBg;
border-color: $selectActiveBg;
&::-webkit-scrollbar {
background-color: transparent;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
&::-webkit-scrollbar-track-piece {
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background-color: $selectActiveItemBg;
}
.select2-result{
&.select2-highlighted{
background-color: $selectActiveItemBg;
}
.select2-result-label{
font-size: 12px;
color: $selectFontColor !important;
line-height: 20px;
}
}
}
}
.select2-drop-mask {
z-index: $dropdownMaskZ;
}

View File

@@ -4,6 +4,7 @@
border: 1px solid $buttonBorder;
vertical-align: baseline;
height: 30px;
min-width: 60px;
padding: 4px 10px;
margin: 0;
line-height: 1.5em;
@@ -13,7 +14,6 @@
font-size: 14px;
margin-left: 10px;
color: $buttonColor;
letter-spacing: $letterSpacing;
font-weight: $buttonFontWeight;
@include transition(background-color .1s ease-out);
@@ -34,7 +34,7 @@
}
&:active {
@include box-shadow(inset, 0, 0, 1px, $buttonShadowColor);
@include box-shadow(0, 0, 1px, $buttonShadowColor, true);
}
&_light {
@@ -60,13 +60,17 @@
&_primary {
background-color: $primaryButtonBackground;
border: 1px solid $primaryButtonBackground;
color: $primaryButtonColor;
color: $primaryButtonColor !important;
font-weight: $primaryButtonFontWeight;
&:hover {
border: 1px solid $primaryButtonHoverBackground;
background-color: $primaryButtonHoverBackground;
}
&[disabled] {
color: $primaryButtonColor;
}
}
&_close {

View File

@@ -1,6 +1,14 @@
.input-control {
.form-control {
padding: 16px 0;
&:first-child {
padding-top: 0;
}
&:last-child {
padding-bottom: 0;
}
&__text {
margin: 8px 0;
font-size: 1em
@@ -11,14 +19,6 @@
font-weight: $labelFontWeight;
}
&__input {
margin: 8px 0;
&::selection {
background-color: $defaultDarkSelectionColor;
}
}
&__em {
color: $inputControlEmColor;
}
@@ -30,15 +30,21 @@
span {
vertical-align: middle;
}
&_error {
color: $errorColor;
}
}
&__container {
position: relative;
width: 100%;
margin-top: 5px;
margin-bottom: 5px;
@include flex();
.button-control {
margin: 9px 0 9px 10px;
margin: 1px 0 1px 10px;
}
}
@@ -46,4 +52,11 @@
position: absolute;
right: 0;
}
}
/**
* Set a specific color for read only style.
*/
input:read-only {
color: $readOnlyInputColor;
}

View File

@@ -0,0 +1,32 @@
.input-control {
@include transition(all .2s ease-in);
display: inline-block;
width: 100%;
padding: 5px 7px;
color: $inputColor;
border-radius: $borderRadius;
line-height: 32px;
height: 32px;
text-align: left;
border:1px solid $inputBorderColor;
background-color: $inputBackground;
margin-bottom: 8px;
&:last-child {
margin-bottom: inherit;
}
&::selection {
background-color: $defaultDarkSelectionColor;
}
&.error {
color: $errorColor;
border-color: $errorColor;
}
}
@include placeholder {
color: $placeHolderColor;
}

11
css/components/_link.scss Normal file
View File

@@ -0,0 +1,11 @@
.link {
cursor: pointer;
color: $linkFontColor;
@include transition(color .1s ease-out);
&:hover {
color: $linkHoverFontColor;
text-decoration: underline;
@include transition(color .1s ease-in);
}
}

View File

@@ -29,15 +29,14 @@
/* Fonts END */
/* Theme BEGIN */
@import "themes/main";
/* Theme END */
/* Modules BEGIN */
@import 'toastr';
@import 'base';
@import 'utils';
@import 'overlay/overlay';
@import 'inlay';
@import 'reload_overlay/reload_overlay';
@import 'modals/dialog';
@import 'modals/feedback/feedback';
@import 'videolayout_default';
@@ -57,9 +56,16 @@
@import 'jquery.contextMenu';
@import 'keyboard-shortcuts';
@import 'redirect_page';
@import 'input-control/input-control';
@import 'components/form-control';
@import 'components/link';
@import 'shortcuts/main';
@import 'buttons/button-control';
@import 'components/button-control';
@import 'components/_input-control.scss';
@import "modals/invite/invite";
@import "connection-info";
@import 'aui-components/dropdown';
@import '404';
@import 'policy';
@import 'filmstrip';
/* Modules END */
/* Modules END */

View File

@@ -2,7 +2,7 @@
visibility: visible;
height: auto;
h3 {
h1, h2, h3, h4, h5, h6 {
color: $auiDialogColor;
}
@@ -37,7 +37,6 @@
h2 {
font-size: em(20, 12);
font-weight: $dialogTitleFontWeight;
letter-spacing: $titleLetterSpacing;
color: $auiDialogColor;
}
@@ -58,7 +57,6 @@
p,span, h3 {
font-weight: $labelFontWeight;
letter-spacing: $letterSpacing;
}
&:last-child {
@@ -74,7 +72,7 @@
}
}
.input-control:not(:last-child) {
.form-control:not(:last-child) {
border-bottom: 1px solid $auiBorderColor;
}
}

View File

@@ -48,18 +48,35 @@
.feedback.aui-dialog2{
.aui-dialog2{
&-header {
background-color: $auiDialogContentBg;
background-color: $feedbackContentBg;
border-bottom-color: transparent;
padding-top: 30px;
h2 {
color: $feedbackTextColor;
text-align: center;
}
}
&-content {
background-color: $feedbackContentBg;
text-align: center;
padding: 10px 40px 20px 40px;
.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;
text-align: center;
@@ -68,10 +85,12 @@
.star-label {
height: 16px;
font-size: 14px;
color: $rateStarLabelColor;
}
.star-btn {
display: inline-block;
color: $rateStarDefault;
font-size: 36px;
font-size: $rateStarSize;
position: relative;
cursor: pointer;
outline: none;
@@ -97,8 +116,12 @@
}
}
&-footer {
background-color: $auiDialogContentBg;
background-color: $feedbackContentBg;
border-top-color: transparent;
.button-control {
color: $feedbackCancelFontColor;
}
}
}
}

View File

@@ -1,48 +1,31 @@
.overlay {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: $overlayZ;
background: #21B9FC; /* Old browsers */
opacity: 0.75;
display: block;
}
&__container {
top: 0;
left: 0;
width: 100%;
height: 100%;
position: fixed;
z-index: $overlayZ;
background: $defaultBackground;
}
.overlay_transparent {
background: rgba(22, 185, 252, .9);
}
&__content {
position: absolute;
margin: 0 auto;
height: 100%;
width: 56%;
left: 50%;
@include transform(translateX(-50%));
.overlay_container {
width: 100%;
height: 100%;
position: fixed;
z-index: $overlayZ;
}
&_bottom {
position: absolute;
bottom: 0;
}
}
.overlay_content {
color: #fff;
font-weight: normal;
font-size: 20px;
text-align: center;
width: 400px;
height: 250px;
top: 50%;
left: 50%;
position:absolute;
margin-top: -125px;
margin-left: -200px;
}
.overlay_text_small {
font-size: 18px;
}
.overlay_icon {
position: relative;
z-index: 1013;
float: none;
font-size: 100px;
}
&__policy {
position: absolute;
bottom: 24px;
width: 100%;
}
}

View File

@@ -0,0 +1,16 @@
.reload_overlay_title {
display: block;
font-size: 16px;
line-height: 20px;
}
.reload_overlay_msg {
display: block;
font-size: 12px;
line-height: 30px;
}
#reloadProgressBar {
width: 180px;
margin: 5px auto;
}

View File

@@ -5,7 +5,7 @@
width: 100%;
height: 100%;
position: fixed;
z-index: $overlayZ;
z-index: $ringingZ;
background: linear-gradient(transparent, #000);
opacity: 0.8;

View File

@@ -1,3 +1,14 @@
/**
* Base
*/
$baseLight: #FFFFFF;
/**
* Controls
*/
$controlBackground: $baseLight;
$controlColor: #333333;
/**
* Buttons
*/
@@ -17,30 +28,68 @@ $buttonLinkColor: #0090e8;
$primaryButtonBackground: #3572b0;
$primaryButtonHoverBackground: #2a67a5;
$primaryButtonColor: #fff;
$primaryButtonColor: $baseLight;
$primaryButtonFontWeight: 400;
$buttonShadowColor: #192d4f;
/**
* Color variables
**/
$defaultBackground: #474747;
/**
* Connection indicator
**/
$downloadConnectionIconColor: #4abd04;
$uploadConnectionIconColor: #ffa800;
/**
* Dialog colors
**/
$auiDialogColor: #333;
$auiDialogBg: #f5f5f5;
$auiDialogContentBg: #fff;
$auiDialogContentBg: $baseLight;
$auiBorderColor: #ccc;
$dialogTitleFontWeight: 400;
/**
* Inlay colors
**/
$inlayColorBg: lighten($defaultBackground, 20%);
$inlayBorderColor: lighten($auiDialogContentBg, 10%);
// Main controls
$inputBackground: #fff;
$inputBackground: $controlBackground;
$inputBorderColor: #ccc;
$inputColor: #333;
$inputColor: $controlColor;
$placeHolderColor: #a7a7a7;
$readOnlyInputColor: #a7a7a7;
$defaultDarkSelectionColor: #ccc;
$titleLetterSpacing: 0;
$letterSpacing: 0;
$buttonFontWeight: 400;
$labelFontWeight: 400;
$hintFontSize: em(13, 14);
$linkFontColor: #3572b0;
$linkHoverFontColor: darken(#3572b0, 10%);
$dropdownColor: #333;
$dropdownColor: #333;
$errorColor: #c61600;
// Feedback colors
$feedbackCancelFontColor: #333;
// Popover colors
$popoverBg: #000;
$popoverFontColor: #ffffff;
$popupMenuSelectedItemBackground: rgba(256, 256, 256, .2);
// Toolbar
$splitterColor: #ccc;
/**
* Forms
*/
//dropdown
$selectFontColor: $controlColor;
$selectBg: $controlBackground;
$selectActiveBg: darken($controlBackground, 5%);
$selectActiveItemBg: darken($controlBackground, 20%);

View File

@@ -1,5 +0,0 @@
/**
* Switch themes here
*/
@import "light";

2
debian/changelog vendored
View File

@@ -1,4 +1,4 @@
jitsi-meet (1.0.1-1) unstable; urgency=low
jitsi-meet-web (1.0.1-1) unstable; urgency=low
* Initial release. (Closes: #760485)

26
debian/control vendored
View File

@@ -1,4 +1,4 @@
Source: jitsi-meet
Source: jitsi-meet-web
Section: net
Priority: extra
Maintainer: Jitsi Team <dev@jitsi.org>
@@ -7,10 +7,10 @@ Build-Depends: debhelper (>= 8.0.0)
Standards-Version: 3.9.6
Homepage: https://jitsi.org/meet
Package: jitsi-meet
Package: jitsi-meet-web
Replaces: jitsi-meet (<= 1.0.1525-1)
Architecture: all
Depends: ${misc:Depends}, jitsi-videobridge, jitsi-meet-prosody,
openjdk-8-jre-headless | nginx
Depends: ${misc:Depends}
Description: WebRTC JavaScript video conferences
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
Videobridge to provide high quality, scalable video conferences.
@@ -19,9 +19,25 @@ Description: WebRTC JavaScript video conferences
forwarding and relaying, configured to work with jetty instance
running embedded into Jitsi Videobridge
Package: jitsi-meet-web-config
Architecture: all
Depends: openssl, openjdk-8-jre-headless | nginx | apache2,
jitsi-meet-web
Description: Configuration for web serving of Jitsi Meet
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
Videobridge to provide high quality, scalable video conferences.
.
It is a web interface to Jitsi Videobridge for audio and video
forwarding and relaying, configured to work with jetty instance
running embedded into Jitsi Videobridge or using a webserver Nginx or
Apache2.
.
This package contains configuration for Nginx to be used with
Jitsi Meet.
Package: jitsi-meet-prosody
Architecture: all
Depends: ${misc:Depends}, openssl, prosody | prosody-trunk, jitsi-videobridge, jicofo
Depends: openssl, prosody | prosody-trunk, jitsi-meet-web
Description: Prosody configuration for Jitsi Meet
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
Videobridge to provide high quality, scalable video conferences.

View File

@@ -1,4 +0,0 @@
#!/bin/sh -e
# Source debconf library.
. /usr/share/debconf/confmodule

View File

@@ -21,13 +21,49 @@ set -e
case "$1" in
configure)
. /etc/jitsi/videobridge/config
. /etc/jitsi/jicofo/config
# loading debconf
. /usr/share/debconf/confmodule
# try to get host from jitsi-videobridge
db_get jitsi-videobridge/jvb-hostname
if [ -z "$RET" ] ; then
# server hostname
db_set jitsi-videobridge/jvb-hostname "localhost"
db_input critical jitsi-videobridge/jvb-hostname || true
db_go
fi
JVB_HOSTNAME="$RET"
db_get jitsi-videobridge/jvbsecret
if [ -z "$RET" ] ; then
db_input critical jitsi-videobridge/jvbsecret || true
db_go
fi
JVB_SECRET="$RET"
db_get jicofo/jicofo-authuser
if [ -z "$RET" ] ; then
db_input critical jicofo/jicofo-authuser || true
db_go
fi
JICOFO_AUTH_USER="$RET"
db_get jicofo/jicofo-authpassword
if [ -z "$RET" ] ; then
db_input critical jicofo/jicofo-authpassword || true
db_go
fi
JICOFO_AUTH_PASSWORD="$RET"
db_get jicofo/jicofosecret
if [ -z "$RET" ] ; then
db_input critical jicofo/jicofosecret || true
db_go
fi
JICOFO_SECRET="$RET"
JICOFO_AUTH_DOMAIN="auth.$JVB_HOSTNAME"
# detect dpkg-reconfigure, just delete old links
db_get jitsi-meet-prosody/jvb-hostname
JVB_HOSTNAME_OLD=$RET
@@ -38,7 +74,7 @@ case "$1" in
fi
# stores the hostname so we will reuse it later, like in purge
db_set jitsi-meet-prosody/jvb-hostname $JVB_HOSTNAME
db_set jitsi-meet-prosody/jvb-hostname "$JVB_HOSTNAME"
# and we're done with debconf
db_stop
@@ -68,21 +104,21 @@ case "$1" in
fi
fi
# UPGRADE to server side focus check if focus is configured
if [ -f $PROSODY_HOST_CONFIG ] && ! grep -q "VirtualHost \"auth.$JVB_HOSTNAME\"" $PROSODY_HOST_CONFIG; then
echo -e "\nVirtualHost \"auth.$JVB_HOSTNAME\"" >> $PROSODY_HOST_CONFIG
if [ -f $PROSODY_HOST_CONFIG ] && ! grep -q "VirtualHost \"$JICOFO_AUTH_DOMAIN\"" $PROSODY_HOST_CONFIG; then
echo -e "\nVirtualHost \"$JICOFO_AUTH_DOMAIN\"" >> $PROSODY_HOST_CONFIG
echo -e " authentication = \"internal_plain\"\n" >> $PROSODY_HOST_CONFIG
sed -i "s/Component \"conference.$JVB_HOSTNAME\" \"muc\"/Component \"conference.$JVB_HOSTNAME\" \"muc\"\nadmins = { \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\" }\n/g" $PROSODY_HOST_CONFIG
sed -i "s/Component \"conference.$JVB_HOSTNAME\" \"muc\"/Component \"conference.$JVB_HOSTNAME\" \"muc\"\nadmins = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\" }\n/g" $PROSODY_HOST_CONFIG
echo -e "Component \"focus.$JVB_HOSTNAME\"" >> $PROSODY_HOST_CONFIG
echo -e " component_secret=\"$JICOFO_SECRET\"\n" >> $PROSODY_HOST_CONFIG
PROSODY_CREATE_JICOFO_USER="true"
# UPGRADE to server side focus on old config(/etc/prosody/prosody.cfg.lua)
elif [ ! -f $PROSODY_HOST_CONFIG ] && ! grep -q "VirtualHost \"auth.$JVB_HOSTNAME\"" $PROSODY_CONFIG_OLD; then
echo -e "\nVirtualHost \"auth.$JVB_HOSTNAME\"" >> $PROSODY_CONFIG_OLD
elif [ ! -f $PROSODY_HOST_CONFIG ] && ! grep -q "VirtualHost \"$JICOFO_AUTH_DOMAIN\"" $PROSODY_CONFIG_OLD; then
echo -e "\nVirtualHost \"$JICOFO_AUTH_DOMAIN\"" >> $PROSODY_CONFIG_OLD
echo -e " authentication = \"internal_plain\"\n" >> $PROSODY_CONFIG_OLD
if ! grep -q "admins = { }" $PROSODY_CONFIG_OLD; then
echo -e "admins = { \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\" }\n" >> $PROSODY_CONFIG_OLD
echo -e "admins = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\" }\n" >> $PROSODY_CONFIG_OLD
else
sed -i "s/admins = { }/admins = { \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\" }\n/g" $PROSODY_CONFIG_OLD
sed -i "s/admins = { }/admins = { \"$JICOFO_AUTH_USER@$JICOFO_AUTH_DOMAIN\" }\n/g" $PROSODY_CONFIG_OLD
fi
echo -e "Component \"focus.$JVB_HOSTNAME\"" >> $PROSODY_CONFIG_OLD
echo -e " component_secret=\"$JICOFO_SECRET\"\n" >> $PROSODY_CONFIG_OLD
@@ -109,8 +145,6 @@ case "$1" in
if [ "$PROSODY_CONFIG_PRESENT" = "false" ]; then
invoke-rc.d prosody restart
invoke-rc.d jitsi-videobridge restart
invoke-rc.d jicofo restart
fi
;;

View File

@@ -36,6 +36,9 @@ case "$1" in
rm -f /etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua
rm -f /etc/prosody/conf.d/$JVB_HOSTNAME.cfg.lua
fi
# Clear the debconf variable
db_purge
;;
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)

View File

@@ -2,3 +2,29 @@ Template: jitsi-meet-prosody/jvb-hostname
Type: string
_Description: The hostname of the current installation:
The value for the hostname that is set in Jitsi Videobridge installation.
Template: jitsi-videobridge/jvb-hostname
Type: string
_Description: The hostname of the current installation:
The value for the hostname that is set in Jitsi Videobridge installation.
Template: jitsi-videobridge/jvbsecret
Type: password
_Description: Jitsi Videobridge Component secret:
The secret used by Jitsi Videobridge to connect to xmpp server as component.
Template: jicofo/jicofo-authuser
Type: string
Default: focus
_Description: Jicofo username:
The jicofo needs an authenticated admin user to connect to xmpp server.
Template: jicofo/jicofo-authpassword
Type: password
_Description: Jicofo user password:
The secret used to connect to xmpp server as jicofo user.
Template: jicofo/jicofosecret
Type: password
_Description: Jicofo Component secret:
The secret used to connect to xmpp server as component

View File

@@ -21,17 +21,12 @@ set -e
case "$1" in
configure)
if [ -f "/etc/jitsi/videobridge/config" ] ; then
. /etc/jitsi/videobridge/config
fi
if [ -f "/etc/jitsi/jicofo/config" ] ; then
. /etc/jitsi/jicofo/config
fi
# loading debconf
. /usr/share/debconf/confmodule
db_get jitsi-meet-prosody/jvb-hostname
JVB_HOSTNAME="$RET"
db_get jitsi-meet-tokens/appid
if [ "$RET" = "false" ] ; then
echo "Application ID is mandatory"
@@ -45,14 +40,10 @@ case "$1" in
fi
APP_SECRET=$RET
# We can adjust Prosody config only if there is Jvb or Jicofo domain configured
PROSODY_HOST_CONFIG="/etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua"
if [ ! -f "$PROSODY_HOST_CONFIG" ] ; then
PROSODY_HOST_CONFIG="/etc/prosody/conf.avail/$JICOFO_HOSTNAME.cfg.lua"
fi
# Store config filename for purge
db_set jitsi-meet-prosody/prosody_config $PROSODY_HOST_CONFIG
db_set jitsi-meet-prosody/prosody_config "$PROSODY_HOST_CONFIG"
db_stop

View File

@@ -52,6 +52,8 @@ case "$1" in
;;
purge)
# Clear the debconf variable
db_purge
;;
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)

View File

@@ -1,5 +1,5 @@
#!/bin/bash
# postinst script for jitsi-meet
# postinst script for jitsi-meet-web-config
#
# see: dh_installdeb(1)
@@ -20,13 +20,19 @@ set -e
case "$1" in
configure)
JVB_ETC_CONFIG="/etc/jitsi/videobridge/config"
. $JVB_ETC_CONFIG
# loading debconf
. /usr/share/debconf/confmodule
# try to get host from jitsi-videobridge
db_get jitsi-videobridge/jvb-hostname
if [ -z "$RET" ] ; then
# server hostname
db_set jitsi-videobridge/jvb-hostname "localhost"
db_input critical jitsi-videobridge/jvb-hostname || true
db_go
fi
JVB_HOSTNAME="$RET"
# detect dpkg-reconfigure
RECONFIGURING="false"
db_get jitsi-meet/jvb-hostname
@@ -49,22 +55,54 @@ case "$1" in
if [ "$NGINX_INSTALL_CHECK" = "installed" ] || [ "$NGINX_INSTALL_CHECK" = "unpacked" ] ; then
FORCE_NGINX="true"
fi
APACHE_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'apache2' 2>/dev/null | awk '{print $3}' || true)"
if [ "$APACHE_INSTALL_CHECK" = "installed" ] || [ "$APACHE_INSTALL_CHECK" = "unpacked" ] ; then
FORCE_APACHE="true"
fi
# SSL for nginx
db_get jitsi-meet/cert-choice
CERT_CHOICE="$RET"
UPLOADED_CERT_CHOICE="A certificate is available and the files are uploaded on the server"
# if first time config ask for certs, or if we are reconfiguring
if [ -z "$JVB_HOSTNAME_OLD" ] || [ "$RECONFIGURING" = "true" ] ; then
# SSL for nginx
db_get jitsi-meet/cert-choice
CERT_CHOICE="$RET"
UPLOADED_CERT_CHOICE="A certificate is available and the files are uploaded on the server"
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
db_set jitsi-meet/cert-path-key "/etc/ssl/$JVB_HOSTNAME.key"
db_input critical jitsi-meet/cert-path-key || true
db_go
db_get jitsi-meet/cert-path-key
CERT_KEY="$RET"
db_set jitsi-meet/cert-path-crt "/etc/ssl/$JVB_HOSTNAME.crt"
db_input critical jitsi-meet/cert-path-crt || true
db_go
db_get jitsi-meet/cert-path-crt
CERT_CRT="$RET"
else
# create self-signed certs
CERT_KEY="/etc/jitsi/meet/$JVB_HOSTNAME.key"
CERT_CRT="/etc/jitsi/meet/$JVB_HOSTNAME.crt"
HOST="$( (hostname -s; echo localhost) | head -n 1)"
DOMAIN="$( (hostname -d; echo localdomain) | head -n 1)"
openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj \
"/O=$DOMAIN/OU=$HOST/CN=$JVB_HOSTNAME/emailAddress=webmaster@$HOST.$DOMAIN" \
-keyout $CERT_KEY \
-out $CERT_CRT
fi
fi
# jitsi meet
JITSI_MEET_CONFIG="/etc/jitsi/meet/$JVB_HOSTNAME-config.js"
if [ ! -f $JITSI_MEET_CONFIG ] ; then
cp /usr/share/doc/jitsi-meet/config.js $JITSI_MEET_CONFIG
cp /usr/share/doc/jitsi-meet-web/config.js $JITSI_MEET_CONFIG
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $JITSI_MEET_CONFIG
fi
# this is new install let's configure jvb to serve meet
if [[ -z $FORCE_NGINX && ( -z $JVB_HOSTNAME_OLD || "$JVB_SERVE" = "true" ) ]] ; then
# no-nginx, no-apache installed on machine, this is new install or reconfiguring old one which have jvb_serve set
if [[ -z "$FORCE_NGINX" && -z "$FORCE_APACHE" && ( -z "$JVB_HOSTNAME_OLD" || ( "$JVB_SERVE" = "true" && "$RECONFIGURING" = "true" )) ]] ; then
JVB_ETC_CONFIG="/etc/jitsi/videobridge/config"
JVB_CONFIG="/etc/jitsi/videobridge/sip-communicator.properties"
# this is a reconfigure, lets just delete old links
@@ -112,34 +150,19 @@ case "$1" in
chmod 755 /etc/authbind/byport/443
fi
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
# create jks from uploaded certs
openssl pkcs12 -export \
-in /etc/ssl/$JVB_HOSTNAME.crt \
-inkey /etc/ssl/$JVB_HOSTNAME.key \
-passout pass:changeit > /etc/jitsi/videobridge/$JVB_HOSTNAME.p12
keytool -importkeystore \
-srckeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.p12 \
-destkeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.jks \
-srcstoretype pkcs12 \
-noprompt -storepass changeit -srcstorepass changeit
else
# create jks from self-signed certs
openssl pkcs12 -export \
-in /var/lib/prosody/$JVB_HOSTNAME.crt \
-inkey /var/lib/prosody/$JVB_HOSTNAME.key \
-passout pass:changeit > /etc/jitsi/videobridge/$JVB_HOSTNAME.p12
keytool -importkeystore \
-srckeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.p12 \
-destkeystore /etc/jitsi/videobridge/$JVB_HOSTNAME.jks \
-srcstoretype pkcs12 \
-noprompt -storepass changeit -srcstorepass changeit
fi
CERT_P12="/etc/jitsi/videobridge/$JVB_HOSTNAME.p12"
CERT_JKS="/etc/jitsi/videobridge/$JVB_HOSTNAME.jks"
# create jks from certs
openssl pkcs12 -export \
-in $CERT_CRT -inkey $CERT_KEY -passout pass:changeit > $CERT_P12
keytool -importkeystore -destkeystore $CERT_JKS \
-srckeystore $CERT_P12 -srcstoretype pkcs12 \
-noprompt -storepass changeit -srcstorepass changeit
db_set jitsi-meet/jvb-serve "true"
invoke-rc.d jitsi-videobridge restart
elif [[ "$FORCE_NGINX" = "true" || ( -n $JVB_HOSTNAME_OLD && "$JVB_SERVE" = "false" ) ]] ; then
elif [[ "$FORCE_NGINX" = "true" && ( -z "$JVB_HOSTNAME_OLD" || "$RECONFIGURING" = "true" ) ]] ; then
# this is a reconfigure, lets just delete old links
if [ "$RECONFIGURING" = "true" ] ; then
rm -f /etc/nginx/sites-enabled/$JVB_HOSTNAME_OLD.conf
@@ -148,7 +171,7 @@ case "$1" in
# nginx conf
if [ ! -f /etc/nginx/sites-available/$JVB_HOSTNAME.conf ] ; then
cp /usr/share/doc/jitsi-meet/jitsi-meet.example /etc/nginx/sites-available/$JVB_HOSTNAME.conf
cp /usr/share/doc/jitsi-meet-web/jitsi-meet.example /etc/nginx/sites-available/$JVB_HOSTNAME.conf
if [ ! -f /etc/nginx/sites-enabled/$JVB_HOSTNAME.conf ] ; then
ln -s /etc/nginx/sites-available/$JVB_HOSTNAME.conf /etc/nginx/sites-enabled/$JVB_HOSTNAME.conf
fi
@@ -156,28 +179,47 @@ case "$1" in
fi
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
db_set jitsi-meet/cert-path-key "/etc/ssl/$JVB_HOSTNAME.key"
db_input critical jitsi-meet/cert-path-key || true
db_go
db_get jitsi-meet/cert-path-key
CERT_KEY="$RET"
db_set jitsi-meet/cert-path-crt "/etc/ssl/$JVB_HOSTNAME.crt"
db_input critical jitsi-meet/cert-path-crt || true
db_go
db_get jitsi-meet/cert-path-crt
CERT_CRT="$RET"
# replace self-signed certificate paths with user provided ones
CERT_KEY_ESC=$(echo $CERT_KEY | sed 's/\./\\\./g')
CERT_KEY_ESC=$(echo $CERT_KEY_ESC | sed 's/\//\\\//g')
sed -i "s/ssl_certificate_key\ \/var\/lib\/prosody\/.*key/ssl_certificate_key\ $CERT_KEY_ESC/g" \
sed -i "s/ssl_certificate_key\ \/etc\/jitsi\/meet\/.*key/ssl_certificate_key\ $CERT_KEY_ESC/g" \
/etc/nginx/sites-available/$JVB_HOSTNAME.conf
CERT_CRT_ESC=$(echo $CERT_CRT | sed 's/\./\\\./g')
CERT_CRT_ESC=$(echo $CERT_CRT_ESC | sed 's/\//\\\//g')
sed -i "s/ssl_certificate\ \/var\/lib\/prosody\/.*crt/ssl_certificate\ $CERT_CRT_ESC/g" \
sed -i "s/ssl_certificate\ \/etc\/jitsi\/meet\/.*crt/ssl_certificate\ $CERT_CRT_ESC/g" \
/etc/nginx/sites-available/$JVB_HOSTNAME.conf
fi
invoke-rc.d nginx reload
elif [[ "$FORCE_APACHE" = "true" && ( -z "$JVB_HOSTNAME_OLD" || "$RECONFIGURING" = "true" ) ]] ; then
# this is a reconfigure, lets just delete old links
if [ "$RECONFIGURING" = "true" ] ; then
a2dissite $JVB_HOSTNAME_OLD.conf
rm -f /etc/jitsi/meet/$JVB_HOSTNAME_OLD-config.js
fi
# apache2 config
if [ ! -f /etc/apache2/sites-available/$JVB_HOSTNAME.conf ] ; then
# when creating new config, make sure all needed modules are enabled
a2enmod rewrite ssl headers proxy_http include
cp /usr/share/doc/jitsi-meet-web/jitsi-meet.example-apache /etc/apache2/sites-available/$JVB_HOSTNAME.conf
a2ensite $JVB_HOSTNAME.conf
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" /etc/apache2/sites-available/$JVB_HOSTNAME.conf
fi
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
# replace self-signed certificate paths with user provided ones
CERT_KEY_ESC=$(echo $CERT_KEY | sed 's/\./\\\./g')
CERT_KEY_ESC=$(echo $CERT_KEY_ESC | sed 's/\//\\\//g')
sed -i "s/SSLCertificateKeyFile\ \/etc\/jitsi\/meet\/.*key/SSLCertificateKeyFile\ $CERT_KEY_ESC/g" \
/etc/apache2/sites-available/$JVB_HOSTNAME.conf
CERT_CRT_ESC=$(echo $CERT_CRT | sed 's/\./\\\./g')
CERT_CRT_ESC=$(echo $CERT_CRT_ESC | sed 's/\//\\\//g')
sed -i "s/SSLCertificateFile\ \/etc\/jitsi\/meet\/.*crt/SSLCertificateFile\ $CERT_CRT_ESC/g" \
/etc/apache2/sites-available/$JVB_HOSTNAME.conf
fi
invoke-rc.d apache2 reload
fi
# and we're done with debconf

View File

@@ -1,5 +1,5 @@
#!/bin/sh
# postrm script for jitsi-meet
# postrm script for jitsi-meet-web-config
#
# see: dh_installdeb(1)
@@ -27,6 +27,9 @@ case "$1" in
if [ -x "/etc/init.d/nginx" ]; then
invoke-rc.d nginx reload
fi
if [ -x "/etc/init.d/apache2" ]; then
invoke-rc.d apache2 reload
fi
;;
purge)
db_get jitsi-meet/jvb-hostname
@@ -35,9 +38,15 @@ case "$1" in
rm -f /etc/jitsi/meet/$JVB_HOSTNAME-config.js
rm -f /etc/nginx/sites-available/$JVB_HOSTNAME.conf
rm -f /etc/nginx/sites-enabled/$JVB_HOSTNAME.conf
rm -f /etc/apache2/sites-available/$JVB_HOSTNAME.conf
rm -f /etc/apache2/sites-enabled/$JVB_HOSTNAME.conf
rm -f /etc/jitsi/videobridge/$JVB_HOSTNAME.jks
rm -f /etc/jitsi/videobridge/$JVB_HOSTNAME.p12
rm -f /etc/jitsi/meet/$JVB_HOSTNAME.key
rm -f /etc/jitsi/meet/$JVB_HOSTNAME.crt
fi
# Clear the debconf variable
db_purge
;;
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;;

View File

@@ -30,3 +30,8 @@ Type: boolean
Default: false
_Description: for internal use
for internal use.
Template: jitsi-videobridge/jvb-hostname
Type: string
_Description: Hostname:
The Jitsi Meet web config package needs the DNS hostname of your instance.

View File

@@ -1,4 +1,5 @@
README.md
doc/debian/jitsi-meet/jitsi-meet.example
doc/debian/jitsi-meet/jitsi-meet.example-apache
doc/debian/jitsi-meet/README
config.js

View File

@@ -1 +1 @@
[type: gettext/rfc822deb] jitsi-meet.templates
[type: gettext/rfc822deb] jitsi-meet-web-config.templates

View File

@@ -1,10 +1,14 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the jitsi-meet-web package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: jitsi-meet\n"
"Report-Msgid-Bugs-To: jitsi-meet@packages.debian.org\n"
"POT-Creation-Date: 2014-09-03 17:26+0200\n"
"Project-Id-Version: jitsi-meet-web\n"
"Report-Msgid-Bugs-To: jitsi-meet-web@packages.debian.org\n"
"POT-Creation-Date: 2016-11-15 22:39+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,25 +19,25 @@ msgstr ""
#. Type: select
#. Choices
#: ../jitsi-meet.templates:1001
#: ../jitsi-meet-web-config.templates:1001
msgid "Self-signed certificate will be generated"
msgstr ""
#. Type: select
#. Choices
#: ../jitsi-meet.templates:1001
#: ../jitsi-meet-web-config.templates:1001
msgid "A certificate is available and the files are uploaded on the server"
msgstr ""
#. Type: select
#. Description
#: ../jitsi-meet.templates:1002
#: ../jitsi-meet-web-config.templates:1002
msgid "SSL certificate for the Jitsi Meet instance"
msgstr ""
#. Type: select
#. Description
#: ../jitsi-meet.templates:1002
#: ../jitsi-meet-web-config.templates:1002
msgid ""
"Jitsi Meet is best to be set up with an SSL certificate. Having no "
"certificate, a self-signed one will be generated. Having a certificate "
@@ -44,13 +48,13 @@ msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet.templates:2001
#: ../jitsi-meet-web-config.templates:2001
msgid "Full local server path to the SSL key file:"
msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet.templates:2001
#: ../jitsi-meet-web-config.templates:2001
msgid ""
"The full path to the SSL key file on the server. If it has not been "
"uploaded, now is a good time to do so."
@@ -58,13 +62,13 @@ msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet.templates:3001
#: ../jitsi-meet-web-config.templates:3001
msgid "Full local server path to the SSL certificate file:"
msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet.templates:3001
#: ../jitsi-meet-web-config.templates:3001
msgid ""
"The full path to the SSL certificate file on the server. If you haven't "
"uploaded it, now is a good time to upload it in another console."
@@ -72,27 +76,38 @@ msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet.templates:4001
#: ../jitsi-meet-web-config.templates:4001
msgid "The hostname of the current installation:"
msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet.templates:4001
#: ../jitsi-meet-web-config.templates:4001
msgid ""
"The value for the hostname that is set in Jitsi Videobridge installation."
msgstr ""
#. Type: string
#. Type: boolean
#. Description
#: ../jitsi-meet.templates:5001
#: ../jitsi-meet-web-config.templates:5001
msgid "for internal use"
msgstr ""
#. Type: boolean
#. Description
#: ../jitsi-meet-web-config.templates:5001
msgid "for internal use."
msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet.templates:5001
msgid ""
"Jitsi Videobridge installation can use its internal jetty to serve static meet pages."
#: ../jitsi-meet-web-config.templates:6001
msgid "Hostname:"
msgstr ""
#. Type: string
#. Description
#: ../jitsi-meet-web-config.templates:6001
msgid ""
"The Jitsi Meet web config package needs the DNS hostname of your instance."
msgstr ""

View File

@@ -33,7 +33,7 @@ You can overwrite options set in config.js and interface_config.js. For example,
```javascript
var configOverwrite = {enableSimulcast: false};
var interfaceConfigOverwrite = {filmStripOnly: true};
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement, true, configOverwrite, interfaceConfigOverwrite);
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement, configOverwrite, interfaceConfigOverwrite);
```
Controlling embedded Jitsi Meet Conference
@@ -54,7 +54,7 @@ Currently we support the following commands:
* **displayName** - sets the display name of the local participant. This command requires one argument -
the new display name to be set
```
api.executeCommand('displayName', ['New Nickname']);
api.executeCommand('displayName', 'New Nickname');
```
* **toggleAudio** - mutes / unmutes the audio for the local participant. No arguments are required.
```

View File

@@ -15,11 +15,12 @@ server {
add_header Strict-Transport-Security "max-age=31536000";
ssl_certificate /var/lib/prosody/jitsi-meet.example.com.crt;
ssl_certificate_key /var/lib/prosody/jitsi-meet.example.com.key;
ssl_certificate /etc/jitsi/meet/jitsi-meet.example.com.crt;
ssl_certificate_key /etc/jitsi/meet/jitsi-meet.example.com.key;
root /usr/share/jitsi-meet;
index index.html index.htm;
error_page 404 /404.html;
location /config.js {
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;

View File

@@ -0,0 +1,43 @@
<VirtualHost *:80>
ServerName jitsi-meet.example.com
Redirect permanent / https://jitsi-meet.example.com/
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName jitsi-meet.example.com
SSLProtocol TLSv1 TLSv1.1 TLSv1.2
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/jitsi/meet/jitsi-meet.example.com.crt
SSLCertificateKeyFile /etc/jitsi/meet/jitsi-meet.example.com.key
SSLCipherSuite "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED"
SSLHonorCipherOrder on
Header set Strict-Transport-Security "max-age=31536000"
DocumentRoot "/usr/share/jitsi-meet"
<Directory "/usr/share/jitsi-meet">
Options Indexes MultiViews Includes FollowSymLinks
AddOutputFilter Includes html
AllowOverride All
Order allow,deny
Allow from all
</Directory>
Alias "/config.js" "/etc/jitsi/meet/jitsi-meet.example.com-config.js"
<Location /config.js>
Require all granted
</Location>
ProxyPreserveHost on
ProxyPass /http-bind http://localhost:5280/http-bind/
ProxyPassReverse /http-bind http://localhost:5280/http-bind/
RewriteEngine on
RewriteRule ^/([a-zA-Z0-9]+)$ /index.html
</VirtualHost>

View File

@@ -6,6 +6,38 @@
<script>
window.indexLoadedTime = window.performance.now();
console.log("(TIME) index.html loaded:\t", indexLoadedTime);
// XXX the code below listeners for errors and displays an error message
// in the document body when any of the required files fails to load.
// The intention is to prevent from displaying broken page.
var criticalFiles = [
"config.js",
"utils.js",
"do_external_connect.js",
"interface_config.js",
"logging_config.js",
"lib-jitsi-meet.min.js",
"app.bundle.min.js",
"all.css"
];
var loadErrHandler = function(e) {
var target = e.target;
// Error on <script> and <link>(CSS)
// <script> will have .src and <link> .href
var fileRef = (target.src ? target.src : target.href);
if (("SCRIPT" === target.tagName || "LINK" === target.tagName)
&& criticalFiles.some(
function(file) { return fileRef.indexOf(file) !== -1 })) {
window.onload = function() {
document.body.innerHTML
= "The application failed to load, missing file: "
+ fileRef;
};
window.removeEventListener(
'error', loadErrHandler, true /* capture phase */);
}
};
window.addEventListener(
'error', loadErrHandler, true /* capture phase type of listener */);
</script>
<script><!--#include virtual="/config.js" --></script><!-- adapt to your needs, i.e. set hosts and bosh path -->
<script src="utils.js?v=1"></script>
@@ -19,238 +51,7 @@
<!--#include virtual="plugin.head.html" -->
</head>
<body>
<div id="welcome_page">
<div id="welcome_page_header">
<a target="_new">
<div class="watermark leftwatermark"></div>
</a>
<a target="_new">
<div class="watermark rightwatermark"></div>
</a>
<a class="poweredby" href="http://jitsi.org" target="_new" ><span data-i18n="poweredby"></span> jitsi.org</a>
<div id="enter_room_container">
<div id="enter_room_form" >
<div id="domain_name"></div>
<div id="enter_room">
<input id="enter_room_field" type="text" autofocus/>
<div class="icon-reload" id="reload_roomname"></div>
<input id="enter_room_button" type="button" data-i18n="[value]welcomepage.go" value="GO" />
</div>
</div>
</div>
<div id="brand_header"></div>
<input type='checkbox' name='checkbox' id="disable_welcome"/>
<label for="disable_welcome" class="disable_welcome_position" data-i18n="welcomepage.disable"></label>
<div id="header_text">
<!--#include virtual="plugin.header.text.html" -->
</div>
</div>
<div id="welcome_page_main">
<div id="features">
<div class="feature_row">
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature1.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature1.content" data-i18n-options='{ "postProcess": "resolveAppName" }'>
</div>
</div>
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature2.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature2.content">
</div>
</div>
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature3.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature3.content" data-i18n-options='{ "postProcess": "resolveAppName" }'>
</div>
</div>
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature4.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature4.content">
</div>
</div>
</div>
<div class="feature_row">
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature5.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature5.content" data-i18n-options='{ "postProcess": "resolveAppName" }'>
</div>
</div>
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature6.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature6.content" data-i18n-options='{ "postProcess": "resolveAppName" }'>
</div>
</div>
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature7.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature7.content" data-i18n-options='{ "postProcess": "resolveAppName" }'></div>
</div>
<div class="feature_holder">
<div class="feature_icon" data-i18n="welcomepage.feature8.title" ></div>
<div class="feature_description" data-i18n="welcomepage.feature8.content"></div>
</div>
</div>
</div>
</div>
<!--#include virtual="plugin.welcomepage.footer.html" -->
</div>
<div id="videoconference_page">
<div id="mainToolbarContainer">
<div id="notice" class="notice" style="display: none">
<span id="noticeText" class="noticeText"></span>
</div>
<span id="mainToolbar" class="toolbar"></span>
</div>
<div id="subject" class="hide"></div>
<div id="extendedToolbar" class="toolbar">
<a class="button" id="toolbar_button_profile" data-container="body" data-placement="right" data-i18n="[content]toolbar.profile" content="Edit your profile">
<img id="avatar" src="images/avatar2.png"/>
</a>
<span id="authentication" class="authentication" style="display: none">
<a class="button icon-avatar" id="toolbar_button_authentication" data-i18n="[content]toolbar.authenticate"></a>
<ul class="loginmenu extendedToolbarPopup">
<span class="loginmenuPadding"></span>
<li id="toolbar_auth_identity"></li>
<li id="toolbar_button_login">
<a class="authButton" data-i18n="toolbar.login"></a>
</li>
<li id="toolbar_button_logout">
<a class="authButton" data-i18n="toolbar.logout"></a>
</li>
</ul>
</span>
<a class="button icon-contactList" id="toolbar_contact_list" shortcut="contactlistpopover">
<span class="badge-round">
<span id="numberOfParticipants"></span>
</span>
</a>
<!--a class="button icon-link" id="toolbar_button_link"></a-->
<a class="button icon-chat" id="toolbar_button_chat" shortcut="toggleChatPopover">
<span class="badge-round">
<span id="unreadMessages"></span>
</span>
</a>
<a class="button" id="toolbar_button_record" style="display: none"></a>
<a class="button icon-share-doc" id="toolbar_button_etherpad"></a>
<a class="button icon-shared-video" id="toolbar_button_sharedvideo" style="display: none">
<ul id="sharedVideoMutedPopup" class="loginmenu extendedToolbarPopup">
<li data-i18n="[html]toolbar.sharedVideoMutedPopup"></li>
</ul>
</a>
<a class="button icon-telephone" id="toolbar_button_sip" style="display: none"></a>
<a class="button icon-dialpad" id="toolbar_button_dialpad" style="display: none"></a>
<a class="button icon-settings" id="toolbar_button_settings"></a>
<a class="button icon-raised-hand" id="toolbar_button_raisehand" shortcut="raiseHandPopover"></a>
<a class="button icon-toggle-filmstrip" id="toolbar_film_strip" data-container="body" shortcut="filmstripPopover"></a>
<a class="button icon-feedback" id="feedbackButton"></a>
<div id="sideToolbarContainer">
<div id="profile_container" class="sideToolbarContainer__inner">
<div class="title" data-i18n="profile.title"></div>
<div class="sideToolbarBlock first">
<label class="first" data-i18n="profile.setDisplayNameLabel"></label>
<input type="text" id="setDisplayName" data-i18n="[placeholder]settings.name" placeholder="Name">
</div>
<div class="sideToolbarBlock">
<label data-i18n="profile.setEmailLabel"></label>
<input type="text" id="setEmail" placeholder="Enter e-mail">
</div>
</div>
<div id="chat_container" class="sideToolbarContainer__inner">
<div id="nickname">
<span data-i18n="chat.nickname.title"></span>
<form>
<input type='text' id="nickinput" data-i18n="[placeholder]chat.nickname.popover" autofocus>
</form>
</div>
<div id="chatconversation"></div>
<audio id="chatNotification" src="sounds/incomingMessage.wav" preload="auto"></audio>
<textarea id="usermsg" data-i18n="[placeholder]chat.messagebox" autofocus></textarea>
<div id="smileysarea">
<div id="smileys" id="toggle_smileys">
<img src="images/smile.svg"/>
</div>
</div>
</div>
<div id="contacts_container" class="sideToolbarContainer__inner">
<div class="title" data-i18n="contactlist"></div>
<ul id="contacts"></ul>
</div>
<div id="settings_container" class="sideToolbarContainer__inner">
<div class="title" data-i18n="settings.title"></div>
<select id="languages_selectbox" class="first hide"></select>
<div id="deviceOptionsTitle" class="subTitle hide" data-i18n="settings.audioVideo"></div>
<div id="devicesOptions" class="hide">
<div class="sideToolbarBlock first">
<label class="first" data-i18n="settings.selectCamera"></label>
<select id="selectCamera"></select>
</div>
<div class="sideToolbarBlock">
<label data-i18n="settings.selectMic"></label>
<select id="selectMic"></select>
</div>
<div class="sideToolbarBlock">
<label data-i18n="settings.selectAudioOutput"></label>
<select id="selectAudioOutput"></select>
</div>
</div>
<div id="moderatorOptionsTitle" class="subTitle hide" data-i18n="settings.moderator"></div>
<div id = "startMutedOptions" class="hide">
<div class="sideToolbarBlock first">
<input type="checkbox" id="startAudioMuted">
<label class="startMutedLabel" for="startAudioMuted" data-i18n="settings.startAudioMuted"></label>
</div>
<div class="sideToolbarBlock">
<input type="checkbox" id="startVideoMuted">
<label class="startMutedLabel" for="startVideoMuted" data-i18n="settings.startVideoMuted"></label>
</div>
</div>
<div id="followMeOptions" class="sideToolbarBlock hide">
<input type="checkbox" id="followMeCheckBox">
<label class="followMeLabel" for="followMeCheckBox" data-i18n="settings.followMe"></label>
</div>
</div>
</div>
</div>
<div id="videospace">
<div id="largeVideoContainer" class="videocontainer">
<div id="sharedVideo"><div id="sharedVideoIFrame"></div></div>
<div id="etherpad"></div>
<a target="_new"><div class="watermark leftwatermark"></div></a>
<a target="_new"><div class="watermark rightwatermark"></div></a>
<a class="poweredby" href="http://jitsi.org" target="_new">
<span data-i18n="poweredby"></span> jitsi.org
</a>
<div id="dominantSpeaker">
<div class="dynamic-shadow"></div>
<img id="dominantSpeakerAvatar" src=""/>
</div>
<span id="remoteConnectionMessage"></span>
<div id="largeVideoWrapper">
<video id="largeVideo" muted="true" autoplay></video>
</div>
<span id="localConnectionMessage"></span>
<span id="videoResolutionLabel">HD</span>
<span id="recordingLabel" class="centeredVideoLabel">
<span id="recordingLabelText"></span>
<img id="recordingSpinner" class="recordingSpinner" src="images/spin.svg"></img>
</span>
</div>
<div id="remoteVideos">
<span id="localVideoContainer" class="videocontainer videocontainer_small">
<span id="localVideoWrapper">
<!--<video id="localVideo" autoplay muted></video> - is now per stream generated -->
</span>
<audio id="localAudio" autoplay muted></audio>
<div class="videocontainer__toolbar"></div>
</span>
<audio id="userJoined" src="sounds/joined.wav" preload="auto"></audio>
<audio id="userLeft" src="sounds/left.wav" preload="auto"></audio>
</div>
</div>
</div>
<div id="react"></div>
<div id="keyboard-shortcuts" class="keyboard-shortcuts" style="display:none;">
<div class="content">
<ul id="keyboard-shortcuts-list" class="shortcuts-list">

View File

@@ -16,17 +16,32 @@ var interfaceConfig = { // eslint-disable-line no-unused-vars
SHOW_POWERED_BY: false,
GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,
APP_NAME: "Jitsi Meet",
LANG_DETECTION: false, // Allow i18n to detect the system language
INVITATION_POWERED_BY: true,
// the toolbar buttons line is intentionally left in one line, to be able
// to easily override values or remove them using regex
MAIN_TOOLBAR_BUTTONS: ['microphone', 'camera', 'desktop', 'invite', 'fullscreen', 'hangup'], // jshint ignore:line
/**
* If we should show authentication block in profile
*/
AUTHENTICATION_ENABLE: true,
/**
* The index of the splitter button in the main toolbar. The splitter
* button is a button in the toolbar that will be applied a special styling
* visually dividing the toolbar buttons.
*/
//MAIN_TOOLBAR_SPLITTER_INDEX: -1,
TOOLBAR_BUTTONS: ['profile', 'authentication', 'microphone', 'camera', 'desktop', 'recording', 'security', 'raisehand', 'chat', 'etherpad', 'sharedvideo', 'sip', 'dialpad', 'settings', 'hangup', 'filmstrip', 'contacts'], // jshint ignore:line
/**
* the toolbar buttons line is intentionally left in one line, to be able
* to easily override values or remove them using regex
*/
TOOLBAR_BUTTONS: [
//main toolbar
'microphone', 'camera', 'desktop', 'invite', 'fullscreen', 'hangup',
//extended toolbar
'profile', 'contacts', 'chat', 'recording', 'etherpad', 'sharedvideo', 'sip', 'dialpad', 'settings', 'raisehand', 'filmstrip'], // jshint ignore:line
/**
* Main Toolbar Buttons
* All of them should be in TOOLBAR_BUTTONS
*/
MAIN_TOOLBAR_BUTTONS: ['microphone', 'camera', 'desktop', 'invite', 'fullscreen', 'hangup'], // jshint ignore:line
SETTINGS_SECTIONS: ['language', 'devices', 'moderator'],
// Determines how the video would fit the screen. 'both' would fit the whole
// screen, 'height' would fit the original video height to the height of the
@@ -41,16 +56,15 @@ var interfaceConfig = { // eslint-disable-line no-unused-vars
RANDOM_AVATAR_URL_PREFIX: false,
RANDOM_AVATAR_URL_SUFFIX: false,
FILM_STRIP_MAX_HEIGHT: 120,
LOCAL_THUMBNAIL_RATIO_WIDTH: 16,
LOCAL_THUMBNAIL_RATIO_HEIGHT: 9,
REMOTE_THUMBNAIL_RATIO_WIDTH: 1,
REMOTE_THUMBNAIL_RATIO_HEIGHT: 1,
// Enables feedback star animation.
ENABLE_FEEDBACK_ANIMATION: false,
DISABLE_FOCUS_INDICATOR: false,
DISABLE_DOMINANT_SPEAKER_INDICATOR: false,
// disables the ringing sound when the RingOverlay is shown.
DISABLE_RINGING: false,
AUDIO_LEVEL_PRIMARY_COLOR: "rgba(255,255,255,0.7)",
AUDIO_LEVEL_SECONDARY_COLOR: "rgba(255,255,255,0.4)"
AUDIO_LEVEL_PRIMARY_COLOR: "rgba(255,255,255,0.4)",
AUDIO_LEVEL_SECONDARY_COLOR: "rgba(255,255,255,0.2)",
POLICY_LOGO: null,
LOCAL_THUMBNAIL_RATIO: 16/9, //16:9
REMOTE_THUMBNAIL_RATIO: 1 //1:1
};

12
ios/Podfile Normal file
View File

@@ -0,0 +1,12 @@
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'jitsi-meet-react' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for jitsi-meet-react
pod 'Crashlytics'
pod 'Fabric'
end

16
ios/Podfile.lock Normal file
View File

@@ -0,0 +1,16 @@
PODS:
- Crashlytics (3.8.3):
- Fabric (~> 1.6.3)
- Fabric (1.6.11)
DEPENDENCIES:
- Crashlytics
- Fabric
SPEC CHECKSUMS:
Crashlytics: 2b6dbe138a42395577cfa73dfa1aa7248cadf39e
Fabric: 5911403591946b8228ab1c51d98f1d7137e863c6
PODFILE CHECKSUM: 672d557f679f28c07b3364884b4580e605000f01
COCOAPODS: 1.1.1

View File

@@ -8,7 +8,8 @@
*/
#import "AppDelegate.h"
#import <Crashlytics/Crashlytics.h>
#import <Fabric/Fabric.h>
#import "RCTBundleURLProvider.h"
#import "RCTLinkingManager.h"
#import "RCTRootView.h"
@@ -28,6 +29,8 @@ continueUserActivity:(NSUserActivity *)userActivity
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[Fabric with:@[[Crashlytics class]]];
NSURL *jsCodeLocation
= [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios"
fallbackResource:nil];

View File

@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
@@ -12,31 +11,23 @@
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
<rect key="frame" x="20" y="439" width="441" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Jitsi Meet" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
<rect key="frame" x="20" y="140" width="441" height="43"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<imageView opaque="NO" userInteractionEnabled="NO" contentMode="center" image="LaunchScreen" translatesAutoresizingMaskIntoConstraints="NO" id="4B8-Xf-NDE">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" red="0.090196078431372548" green="0.62745098039215685" blue="0.85882352941176465" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
<constraint firstAttribute="bottom" secondItem="4B8-Xf-NDE" secondAttribute="bottom" id="aFF-BR-glX"/>
<constraint firstItem="4B8-Xf-NDE" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="glR-YN-1GF"/>
<constraint firstAttribute="trailing" secondItem="4B8-Xf-NDE" secondAttribute="trailing" id="tva-gl-jRX"/>
<constraint firstItem="4B8-Xf-NDE" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="yaV-1V-oEh"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
<resources>
<image name="LaunchScreen" width="480" height="480"/>
</resources>
</document>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,5 +1,15 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
@@ -21,7 +31,7 @@
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "AppIcon-40@3x.png",
"filename" : "AppIcon-60@2x.png",
"scale" : "3x"
},
{

View File

@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchScreen-480@1x.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchScreen-480@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

View File

@@ -22,6 +22,22 @@
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>Fabric</key>
<dict>
<key>APIKey</key>
<string>a8ae24a58302ba79da1d312138e941f6b86e3242</string>
<key>Kits</key>
<array>
<dict>
<key>KitInfo</key>
<dict/>
<key>KitName</key>
<string>Crashlytics</string>
</dict>
</array>
</dict>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
@@ -51,6 +67,12 @@
<string>jitsi.ttf</string>
<string>FontAwesome.ttf</string>
</array>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
<string>voip</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>

View File

@@ -5,6 +5,10 @@
{
"appID": "BQNXB4G3KQ.org.jitsi.JitsiMeet.ios",
"paths": [ "*" ]
},
{
"appID": "UPXU4CQZ5P.com.atlassian.JitsiMeet.ios",
"paths": [ "*" ]
}
]
}

View File

@@ -24,6 +24,8 @@
2602576C1D0A7703001E3363 /* jitsi.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2602576B1D0A7703001E3363 /* jitsi.ttf */; };
3847F11906B4479A9162628F /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
B30EF2311DC0ED7C00690F45 /* WebRTC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B30EF2301DC0ED7C00690F45 /* WebRTC.framework */; };
B30EF2331DC0EEA500690F45 /* WebRTC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B30EF2301DC0ED7C00690F45 /* WebRTC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
BF9643821C34FBB300B0BBDF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643811C34FBB300B0BBDF /* AVFoundation.framework */; };
BF9643841C34FBBB00B0BBDF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643831C34FBBB00B0BBDF /* AudioToolbox.framework */; };
BF9643861C34FBC100B0BBDF /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643851C34FBC100B0BBDF /* CoreGraphics.framework */; };
@@ -34,7 +36,6 @@
BF9643901C34FBEB00B0BBDF /* libc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF96438F1C34FBEB00B0BBDF /* libc.tbd */; };
BF9643921C34FBF100B0BBDF /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */; };
BF9643941C34FBF900B0BBDF /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643931C34FBF900B0BBDF /* libstdc++.tbd */; };
BFC745101CB829A700673F38 /* libWebRTC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BFC7450C1CB829A700673F38 /* libWebRTC.a */; };
BFC745141CB829B300673F38 /* libRCTWebRTC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BFC745131CB829A700673F38 /* libRCTWebRTC.a */; };
/* End PBXBuildFile section */
@@ -116,6 +117,55 @@
remoteGlobalIDString = 58B5119B1A9E6C1200147676;
remoteInfo = RCTText;
};
B3BA19D41DC6B37B00BCD481 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A283A1D9B042B00D4039D;
remoteInfo = "RCTImage-tvOS";
};
B3BA19D81DC6B37B00BCD481 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A28471D9B043800D4039D;
remoteInfo = "RCTLinking-tvOS";
};
B3BA19DC1DC6B37B00BCD481 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A28541D9B044C00D4039D;
remoteInfo = "RCTNetwork-tvOS";
};
B3BA19E01DC6B37B00BCD481 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A28611D9B046600D4039D;
remoteInfo = "RCTSettings-tvOS";
};
B3BA19E41DC6B37B00BCD481 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A287B1D9B048500D4039D;
remoteInfo = "RCTText-tvOS";
};
B3BA19EA1DC6B37B00BCD481 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A28881D9B049200D4039D;
remoteInfo = "RCTWebSocket-tvOS";
};
B3BA19EE1DC6B37B00BCD481 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 2D2A28131D9B038B00D4039D;
remoteInfo = "React-tvOS";
};
BFC745121CB829A700673F38 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */;
@@ -125,6 +175,20 @@
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
B30EF2341DC0EEA500690F45 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
B30EF2331DC0EEA500690F45 /* WebRTC.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = "<group>"; };
@@ -143,10 +207,11 @@
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = app/main.m; sourceTree = "<group>"; };
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
2602576B1D0A7703001E3363 /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../react/features/base/fontIcons/fonts/jitsi.ttf; sourceTree = "<group>"; };
2602576B1D0A7703001E3363 /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../android/app/src/main/assets/fonts/jitsi.ttf; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
B30EF2301DC0ED7C00690F45 /* WebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebRTC.framework; path = "../node_modules/react-native-webrtc/ios/WebRTC.framework"; sourceTree = "<group>"; };
B3B083EB1D4955FF0069CEE7 /* jitsi-meet-react.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "jitsi-meet-react.entitlements"; sourceTree = "<group>"; };
B96AF9B6FBC0453798399985 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = "<group>"; };
BF9643811C34FBB300B0BBDF /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
@@ -159,37 +224,6 @@
BF96438F1C34FBEB00B0BBDF /* libc.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libc.tbd; path = usr/lib/libc.tbd; sourceTree = SDKROOT; };
BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; };
BF9643931C34FBF900B0BBDF /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
BFC744EE1CB829A700673F38 /* RTCAudioSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCAudioSource.h; sourceTree = "<group>"; };
BFC744EF1CB829A700673F38 /* RTCAudioTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCAudioTrack.h; sourceTree = "<group>"; };
BFC744F01CB829A700673F38 /* RTCAVFoundationVideoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCAVFoundationVideoSource.h; sourceTree = "<group>"; };
BFC744F11CB829A700673F38 /* RTCDataChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDataChannel.h; sourceTree = "<group>"; };
BFC744F21CB829A700673F38 /* RTCEAGLVideoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCEAGLVideoView.h; sourceTree = "<group>"; };
BFC744F31CB829A700673F38 /* RTCFileLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCFileLogger.h; sourceTree = "<group>"; };
BFC744F41CB829A700673F38 /* RTCI420Frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCI420Frame.h; sourceTree = "<group>"; };
BFC744F51CB829A700673F38 /* RTCICECandidate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCICECandidate.h; sourceTree = "<group>"; };
BFC744F61CB829A700673F38 /* RTCICEServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCICEServer.h; sourceTree = "<group>"; };
BFC744F71CB829A700673F38 /* RTCLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCLogging.h; sourceTree = "<group>"; };
BFC744F81CB829A700673F38 /* RTCMediaConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCMediaConstraints.h; sourceTree = "<group>"; };
BFC744F91CB829A700673F38 /* RTCMediaSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCMediaSource.h; sourceTree = "<group>"; };
BFC744FA1CB829A700673F38 /* RTCMediaStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCMediaStream.h; sourceTree = "<group>"; };
BFC744FB1CB829A700673F38 /* RTCMediaStreamTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCMediaStreamTrack.h; sourceTree = "<group>"; };
BFC744FC1CB829A700673F38 /* RTCNSGLVideoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNSGLVideoView.h; sourceTree = "<group>"; };
BFC744FD1CB829A700673F38 /* RTCOpenGLVideoRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCOpenGLVideoRenderer.h; sourceTree = "<group>"; };
BFC744FE1CB829A700673F38 /* RTCPair.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPair.h; sourceTree = "<group>"; };
BFC744FF1CB829A700673F38 /* RTCPeerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPeerConnection.h; sourceTree = "<group>"; };
BFC745001CB829A700673F38 /* RTCPeerConnectionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPeerConnectionDelegate.h; sourceTree = "<group>"; };
BFC745011CB829A700673F38 /* RTCPeerConnectionFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPeerConnectionFactory.h; sourceTree = "<group>"; };
BFC745021CB829A700673F38 /* RTCPeerConnectionInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPeerConnectionInterface.h; sourceTree = "<group>"; };
BFC745031CB829A700673F38 /* RTCSessionDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCSessionDescription.h; sourceTree = "<group>"; };
BFC745041CB829A700673F38 /* RTCSessionDescriptionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCSessionDescriptionDelegate.h; sourceTree = "<group>"; };
BFC745051CB829A700673F38 /* RTCStatsDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCStatsDelegate.h; sourceTree = "<group>"; };
BFC745061CB829A700673F38 /* RTCStatsReport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCStatsReport.h; sourceTree = "<group>"; };
BFC745071CB829A700673F38 /* RTCTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCTypes.h; sourceTree = "<group>"; };
BFC745081CB829A700673F38 /* RTCVideoCapturer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCVideoCapturer.h; sourceTree = "<group>"; };
BFC745091CB829A700673F38 /* RTCVideoRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCVideoRenderer.h; sourceTree = "<group>"; };
BFC7450A1CB829A700673F38 /* RTCVideoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCVideoSource.h; sourceTree = "<group>"; };
BFC7450B1CB829A700673F38 /* RTCVideoTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCVideoTrack.h; sourceTree = "<group>"; };
BFC7450C1CB829A700673F38 /* libWebRTC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWebRTC.a; sourceTree = "<group>"; };
BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebRTC.xcodeproj; path = "../node_modules/react-native-webrtc/ios/RCTWebRTC.xcodeproj"; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -198,18 +232,17 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
BFC745141CB829B300673F38 /* libRCTWebRTC.a in Frameworks */,
BF9643941C34FBF900B0BBDF /* libstdc++.tbd in Frameworks */,
BF9643921C34FBF100B0BBDF /* libsqlite3.tbd in Frameworks */,
BF9643901C34FBEB00B0BBDF /* libc.tbd in Frameworks */,
BF96438E1C34FBE100B0BBDF /* VideoToolbox.framework in Frameworks */,
BF96438C1C34FBD700B0BBDF /* CoreVideo.framework in Frameworks */,
BF96438A1C34FBD100B0BBDF /* CoreAudio.framework in Frameworks */,
BF9643881C34FBC800B0BBDF /* GLKit.framework in Frameworks */,
BFC745101CB829A700673F38 /* libWebRTC.a in Frameworks */,
BF9643861C34FBC100B0BBDF /* CoreGraphics.framework in Frameworks */,
BF9643921C34FBF100B0BBDF /* libsqlite3.tbd in Frameworks */,
BF9643941C34FBF900B0BBDF /* libstdc++.tbd in Frameworks */,
BF9643841C34FBBB00B0BBDF /* AudioToolbox.framework in Frameworks */,
BF9643821C34FBB300B0BBDF /* AVFoundation.framework in Frameworks */,
BF96438A1C34FBD100B0BBDF /* CoreAudio.framework in Frameworks */,
BF9643861C34FBC100B0BBDF /* CoreGraphics.framework in Frameworks */,
BF96438C1C34FBD700B0BBDF /* CoreVideo.framework in Frameworks */,
BF9643881C34FBC800B0BBDF /* GLKit.framework in Frameworks */,
B30EF2311DC0ED7C00690F45 /* WebRTC.framework in Frameworks */,
BF96438E1C34FBE100B0BBDF /* VideoToolbox.framework in Frameworks */,
146834051AC3E58100842450 /* libReact.a in Frameworks */,
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
@@ -219,6 +252,7 @@
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
BFC745141CB829B300673F38 /* libRCTWebRTC.a in Frameworks */,
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
3847F11906B4479A9162628F /* libRNVectorIcons.a in Frameworks */,
);
@@ -247,6 +281,7 @@
isa = PBXGroup;
children = (
00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
B3BA19D51DC6B37B00BCD481 /* libRCTImage-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@@ -255,6 +290,7 @@
isa = PBXGroup;
children = (
00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
B3BA19DD1DC6B37B00BCD481 /* libRCTNetwork-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@@ -271,6 +307,7 @@
isa = PBXGroup;
children = (
139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
B3BA19E11DC6B37B00BCD481 /* libRCTSettings-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@@ -279,6 +316,7 @@
isa = PBXGroup;
children = (
139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
B3BA19EB1DC6B37B00BCD481 /* libRCTWebSocket-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@@ -286,12 +324,12 @@
13B07FAE1A68108700A75B9A /* app */ = {
isa = PBXGroup;
children = (
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
13B07FB01A68108700A75B9A /* AppDelegate.m */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
13B07FB71A68108700A75B9A /* main.m */,
);
name = app;
@@ -301,6 +339,7 @@
isa = PBXGroup;
children = (
146834041AC3E56700842450 /* libReact.a */,
B3BA19EF1DC6B37B00BCD481 /* libReact-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@@ -317,6 +356,7 @@
isa = PBXGroup;
children = (
B96AF9B6FBC0453798399985 /* FontAwesome.ttf */,
2602576B1D0A7703001E3363 /* jitsi.ttf */,
);
name = Resources;
sourceTree = "<group>";
@@ -325,6 +365,7 @@
isa = PBXGroup;
children = (
78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
B3BA19D91DC6B37B00BCD481 /* libRCTLinking-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@@ -332,9 +373,9 @@
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
BFC744EC1CB829A700673F38 /* libjingle_peerconnection */,
BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */,
146833FF1AC3E56700842450 /* React.xcodeproj */,
BF96438F1C34FBEB00B0BBDF /* libc.tbd */,
BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */,
BF9643931C34FBF900B0BBDF /* libstdc++.tbd */,
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
@@ -343,7 +384,9 @@
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */,
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
146833FF1AC3E56700842450 /* React.xcodeproj */,
22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */,
);
name = Libraries;
@@ -353,6 +396,7 @@
isa = PBXGroup;
children = (
832341B51AAA6A8300B99B32 /* libRCTText.a */,
B3BA19E51DC6B37B00BCD481 /* libRCTText-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@@ -360,19 +404,9 @@
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
B3B083EB1D4955FF0069CEE7 /* jitsi-meet-react.entitlements */,
2602576B1D0A7703001E3363 /* jitsi.ttf */,
BF9643931C34FBF900B0BBDF /* libstdc++.tbd */,
BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */,
BF96438F1C34FBEB00B0BBDF /* libc.tbd */,
BF96438D1C34FBE100B0BBDF /* VideoToolbox.framework */,
BF96438B1C34FBD700B0BBDF /* CoreVideo.framework */,
BF9643891C34FBD100B0BBDF /* CoreAudio.framework */,
BF9643871C34FBC800B0BBDF /* GLKit.framework */,
BF9643851C34FBC100B0BBDF /* CoreGraphics.framework */,
BF9643831C34FBBB00B0BBDF /* AudioToolbox.framework */,
BF9643811C34FBB300B0BBDF /* AVFoundation.framework */,
13B07FAE1A68108700A75B9A /* app */,
B3BA19B71DC6B02F00BCD481 /* Frameworks */,
B3B083EB1D4955FF0069CEE7 /* jitsi-meet-react.entitlements */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
83CBBA001A601CBA00E9B192 /* Products */,
6956B374CC3C453DB7B8E82D /* Resources */,
@@ -389,51 +423,19 @@
name = Products;
sourceTree = "<group>";
};
BFC744EC1CB829A700673F38 /* libjingle_peerconnection */ = {
B3BA19B71DC6B02F00BCD481 /* Frameworks */ = {
isa = PBXGroup;
children = (
BFC744ED1CB829A700673F38 /* Headers */,
BFC7450C1CB829A700673F38 /* libWebRTC.a */,
BF9643831C34FBBB00B0BBDF /* AudioToolbox.framework */,
BF9643811C34FBB300B0BBDF /* AVFoundation.framework */,
BF9643891C34FBD100B0BBDF /* CoreAudio.framework */,
BF9643851C34FBC100B0BBDF /* CoreGraphics.framework */,
BF96438B1C34FBD700B0BBDF /* CoreVideo.framework */,
BF9643871C34FBC800B0BBDF /* GLKit.framework */,
BF96438D1C34FBE100B0BBDF /* VideoToolbox.framework */,
B30EF2301DC0ED7C00690F45 /* WebRTC.framework */,
);
name = libjingle_peerconnection;
path = "../node_modules/react-native-webrtc/ios/libjingle_peerconnection";
sourceTree = "<group>";
};
BFC744ED1CB829A700673F38 /* Headers */ = {
isa = PBXGroup;
children = (
BFC744EE1CB829A700673F38 /* RTCAudioSource.h */,
BFC744EF1CB829A700673F38 /* RTCAudioTrack.h */,
BFC744F01CB829A700673F38 /* RTCAVFoundationVideoSource.h */,
BFC744F11CB829A700673F38 /* RTCDataChannel.h */,
BFC744F21CB829A700673F38 /* RTCEAGLVideoView.h */,
BFC744F31CB829A700673F38 /* RTCFileLogger.h */,
BFC744F41CB829A700673F38 /* RTCI420Frame.h */,
BFC744F51CB829A700673F38 /* RTCICECandidate.h */,
BFC744F61CB829A700673F38 /* RTCICEServer.h */,
BFC744F71CB829A700673F38 /* RTCLogging.h */,
BFC744F81CB829A700673F38 /* RTCMediaConstraints.h */,
BFC744F91CB829A700673F38 /* RTCMediaSource.h */,
BFC744FA1CB829A700673F38 /* RTCMediaStream.h */,
BFC744FB1CB829A700673F38 /* RTCMediaStreamTrack.h */,
BFC744FC1CB829A700673F38 /* RTCNSGLVideoView.h */,
BFC744FD1CB829A700673F38 /* RTCOpenGLVideoRenderer.h */,
BFC744FE1CB829A700673F38 /* RTCPair.h */,
BFC744FF1CB829A700673F38 /* RTCPeerConnection.h */,
BFC745001CB829A700673F38 /* RTCPeerConnectionDelegate.h */,
BFC745011CB829A700673F38 /* RTCPeerConnectionFactory.h */,
BFC745021CB829A700673F38 /* RTCPeerConnectionInterface.h */,
BFC745031CB829A700673F38 /* RTCSessionDescription.h */,
BFC745041CB829A700673F38 /* RTCSessionDescriptionDelegate.h */,
BFC745051CB829A700673F38 /* RTCStatsDelegate.h */,
BFC745061CB829A700673F38 /* RTCStatsReport.h */,
BFC745071CB829A700673F38 /* RTCTypes.h */,
BFC745081CB829A700673F38 /* RTCVideoCapturer.h */,
BFC745091CB829A700673F38 /* RTCVideoRenderer.h */,
BFC7450A1CB829A700673F38 /* RTCVideoSource.h */,
BFC7450B1CB829A700673F38 /* RTCVideoTrack.h */,
);
path = Headers;
name = Frameworks;
sourceTree = "<group>";
};
BFC7450E1CB829A700673F38 /* Products */ = {
@@ -455,6 +457,9 @@
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
B30EF2341DC0EEA500690F45 /* Embed Frameworks */,
B3DBBAC41DC6A3BE001DA4DD /* ShellScript */,
B35383AD1DDA0083008F406A /* ShellScript */,
);
buildRules = (
);
@@ -471,7 +476,7 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0730;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
13B07F861A680F5B00A75B9A = {
@@ -630,6 +635,55 @@
remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19D51DC6B37B00BCD481 /* libRCTImage-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRCTImage-tvOS.a";
remoteRef = B3BA19D41DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19D91DC6B37B00BCD481 /* libRCTLinking-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRCTLinking-tvOS.a";
remoteRef = B3BA19D81DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19DD1DC6B37B00BCD481 /* libRCTNetwork-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRCTNetwork-tvOS.a";
remoteRef = B3BA19DC1DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19E11DC6B37B00BCD481 /* libRCTSettings-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRCTSettings-tvOS.a";
remoteRef = B3BA19E01DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19E51DC6B37B00BCD481 /* libRCTText-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRCTText-tvOS.a";
remoteRef = B3BA19E41DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19EB1DC6B37B00BCD481 /* libRCTWebSocket-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libRCTWebSocket-tvOS.a";
remoteRef = B3BA19EA1DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
B3BA19EF1DC6B37B00BCD481 /* libReact-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libReact-tvOS.a";
remoteRef = B3BA19EE1DC6B37B00BCD481 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
BFC745131CB829A700673F38 /* libRCTWebRTC.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -668,6 +722,32 @@
shellPath = /bin/sh;
shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh";
};
B35383AD1DDA0083008F406A /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "APP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\n\n# This script loops through the frameworks embedded in the application and\n# removes unused architectures.\nfind \"$APP_PATH\" -name '*.framework' -type d | while read -r FRAMEWORK\ndo\nFRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\nFRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\necho \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\n\nEXTRACTED_ARCHS=()\n\nfor ARCH in $ARCHS\ndo\necho \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\nlipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\nEXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\ndone\n\necho \"Merging extracted architectures: ${ARCHS}\"\nlipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\nrm \"${EXTRACTED_ARCHS[@]}\"\n\necho \"Replacing original executable with thinned version\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\n\ndone";
};
B3DBBAC41DC6A3BE001DA4DD /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Fabric/run\" a8ae24a58302ba79da1d312138e941f6b86e3242 256ed316263eb534e26a1ad5dcc42ca9c179af5937dd864c3e44cfefa2e8b54c";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -700,10 +780,13 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "jitsi-meet-react.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = NO;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-webrtc/**",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
@@ -712,8 +795,12 @@
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
INFOPLIST_FILE = app/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-webrtc/**";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-webrtc/**",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -730,6 +817,11 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "jitsi-meet-react.entitlements";
CURRENT_PROJECT_VERSION = 1;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-webrtc/**",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
@@ -737,10 +829,13 @@
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS/**",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
ENABLE_BITCODE = NO;
INFOPLIST_FILE = app/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-webrtc/**";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-webrtc/**",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -791,7 +886,7 @@
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -832,7 +927,7 @@
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
);
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "0800"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -23,10 +23,12 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -40,13 +42,14 @@
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
@@ -62,10 +65,10 @@
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:jitsi-meet-react.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

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