Compare commits

..

513 Commits
1433 ... 1663

Author SHA1 Message Date
yanas
53e784094a Merge pull request #1308 from jitsi/ss_resize_remote
Fix for the size of remote desktop sharing videos
2017-02-08 15:31:06 -06:00
hristoterezov
0e92e48376 fix(ss): resize for remote videos 2017-02-08 14:58:42 -06:00
Lyubomir Marinov
4c9943ac38 Fix an image path on the mobile landing page 2017-02-08 12:41:51 -06:00
Дамян Минков
4bd0fd145d Merge pull request #1293 from jitsi/prosody_plugin_muc_all_owners
prosody plugin to make all users owners/moderators
2017-02-08 13:17:42 +02:00
Lyubomir Marinov
01ae82eb28 No Temasys alert on mobile Web 2017-02-07 21:54:08 -06:00
Lyubomir Marinov
e21eae0933 Prepare for webpack 2 2017-02-07 15:44:37 -06:00
Lyubomir Marinov
2f047c50dc Revert "No Temasys alert on mobile Web"
This reverts commit b09e86352f.
2017-02-07 15:21:34 -06:00
yanas
e397e1a80c Merge pull request #1303 from jitsi/no-temasys-alert-on-mobile
No Temasys alert on mobile (Web)
2017-02-07 15:11:09 -06:00
Lyubomir Marinov
b09e86352f No Temasys alert on mobile Web 2017-02-07 15:08:38 -06:00
Lyubomir Marinov
8687b69167 Consistency
Be consistent about formatting within 1 and the same file.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
6c5468d904 Simplify the source code
If half the file is written in ES6, it is easier to read if the rest of
the file is in ES6 as well. If ES6 is used, then const is better than
let. If source code is shorter yet as readable as the long version, then
prefer the short version.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
d6b0f8d4c5 Use functions, do not re-implement them
We have the functions reload and redirect which modify window.location.
Use them and do not directly modify window.location so that we have
fewer places of direct window.location modifications and it is easier to
refactor them.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
a8cd4ff12c 1, not 2 names for 1 and the same abstraction
window.location calls it reload so util/helpers shouldn't call it
redirect because UI/util/UIUtil has it is own redirect which is the
assign of window.location.
2017-02-07 08:29:40 -06:00
Lyubomir Marinov
8509efc8af Make the Web app aware of its context root 2017-02-07 08:27:23 -06:00
Saúl Ibarra Corretgé
23a0053dad doc: add section about embedding to the README 2017-02-06 17:41:19 -06:00
Saúl Ibarra Corretgé
5849980092 external_api: fix jsdoc 2017-02-06 17:41:19 -06:00
Saúl Ibarra Corretgé
e81fc2b254 doc: fix external API documentation
- use proper punctuation
- fix markdown syntax
- always use syntax highlighting
- document missing commands
- miscellaneous grammar fixes
2017-02-06 17:41:19 -06:00
Lyubomir Marinov
2ad869a036 Comply w/ coding style
- Use 1 name for 1 abstraction. Instead of useFullScreen and enabled use
  fullScreen.
- Comments are correct English sentences so no double spaces between
  senteces, no capitalization of the work On midsentence.
- Write as little source code as possible if readability is preserved.
- Utilize Facebook's Flow.
- The name of a private function must start with _ and the jsdoc should
  state that the function is private.
2017-02-06 15:32:03 -06:00
Saúl Ibarra Corretgé
7a8c84e990 [RN] Implement full screen mode while in a conference
The implementation varies across platforms, with the same goal: allow the app to
use the entire screen real state while in a conference.

On Android we use immersive mode, which  will hide the status and navigation bars.

https://developer.android.com/training/system-ui/immersive.html

On iOS the status bar is hidden, with a slide effect.
2017-02-06 13:51:17 -06:00
Lyubomir Marinov
0de01e93dd react-native 0.41.2 2017-02-06 12:24:38 -06:00
Lyubomir Marinov
6fa93e5b44 file-loader 0.10.0 2017-02-06 12:24:38 -06:00
Lyubomir Marinov
2144ec1e3f eslint 3.15.0 2017-02-06 12:24:38 -06:00
bgrozev
68d2f60ace Merge pull request #1276 from jitsi/respect-disable-rtx
fix: Respect the disableRtx config option.
2017-02-06 11:52:03 -06:00
George Politis
3d671ae71f docs: Documents the disableRtx config option. 2017-02-06 11:19:33 -06:00
Lyubomir Marinov
8ed47f9d99 [flow] Lint with Flow (in addition to JSHint and ESLint) 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
b50f858556 [flow] Expand the coverage of flow-monitored files 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
5de1a74429 [flow] Take advantage of flow-typed 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
2063ad467d flow-typed 2017-02-03 16:36:14 -06:00
Lyubomir Marinov
679acbae16 Use babel-eslint in the whole project 2017-02-03 16:36:14 -06:00
Aaron van Meerten
a5b706a99e Added a prosody plugin for making all users into muc owners in prosody
Included a patch to prosody-trunk which allows owners to kick each other
2017-02-03 11:41:08 -06:00
yanas
542e61357e Adds new combined camera and mic icon 2017-02-02 17:10:02 -06:00
Lyubomir Marinov
3743602c67 [RN] Fix the parsing of the domain out of a URL 2017-02-02 13:40:49 -06:00
Lyubomir Marinov
ee651840bf Fixes related to coding style 2017-02-02 10:54:24 -06:00
damencho
0765c60d77 Moves feedback button as a component.
When callstats is not configured hide the button.
2017-02-02 10:06:17 -06:00
Lyubomir Marinov
7fa17322a1 Consistency in naming and jsdocs 2017-02-02 09:46:09 -06:00
Lyubomir Marinov
cfa3047330 [flow] Type annotations 2017-02-02 09:45:34 -06:00
Lyubomir Marinov
9e033deb7b Remove unnecessary source code 2017-02-02 09:42:14 -06:00
Lyubomir Marinov
f6c914f6f0 [flow] A minimal demonstration of flow in action 2017-02-01 13:38:37 -06:00
Lyubomir Marinov
06ff02c2a5 [flow] Ignore packages in node_modules that cause errors and we do not want to fix 2017-02-01 13:38:37 -06:00
Lyubomir Marinov
63fd263890 flow 0.36.0
The first step towards enabling Facbook's flow in the project. The flow
configuration is pristine as generated by react-native upgrade.
2017-02-01 13:38:37 -06:00
Lyubomir Marinov
94f3d4b279 [RN] Expand domains supported by Universal Links 2017-01-31 22:47:47 -06:00
Lyubomir Marinov
fdc96044ad [RN] App-specific URL scheme 2017-01-31 22:47:47 -06:00
Lyubomir Marinov
91487ffc94 Fix a case of endless recursion 2017-01-31 22:47:47 -06:00
Saúl Ibarra Corretgé
7a57dcc08a doc: add documentation on how to build the mobile apps 2017-01-31 22:32:15 -06:00
Дамян Минков
913a54713d Adds testing repo to readme. 2017-01-31 21:42:45 -06:00
damencho
39a8681e8e Improves safe checks for missing stats. 2017-01-30 17:01:25 -06:00
George Politis
a7015b0d1a fix: Respect the disableRtx config option. 2017-01-30 16:20:23 +00:00
Lyubomir Marinov
5305f23332 Consistent naming of functions
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-28 20:15:10 -06:00
Lyubomir Marinov
acbf3adab7 Simplify: Remove react/features/base/react-native 2017-01-28 20:13:54 -06:00
Lyubomir Marinov
366b2f1374 Simplify: Remove react/features/base/navigator 2017-01-28 19:56:35 -06:00
Lyubomir Marinov
2189ab7ee6 Consistent naming of react-redux's mapStateToProps
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-28 17:34:57 -06:00
Lyubomir Marinov
349c04d8d1 Consistent naming of functions
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-28 17:28:13 -06:00
Lyubomir Marinov
c7c6249ad7 [RN] Fix room name case sensitivity
It turns out that it is not enough to give lib-jitsi-meet the room name
in lower case. BOSH also needs the room name in lower case.
2017-01-28 17:26:09 -06:00
Lyubomir Marinov
5319227a8f Fix jsdocs 2017-01-28 12:11:24 -06:00
Lyubomir Marinov
3aff812ee2 Consistent naming of Component props mapped from the Redux state
Until we make a decision on access modifier hints and adopt a respective
coding style, consistency is king.
2017-01-27 21:36:20 -06:00
Lyubomir Marinov
88eabf23f4 Remove obsolete UnsupportedMobileBrowser functionality
The desired behavior of the button 'Start a conference' / 'Join the
conversation' is to launch the mobile app if installed; otherwise, do
nothing i.e. continue to display UnsupportedMobileBrowser.

Anyway, we may change our minds about allowing the user to continue in a
supported mobile browser so preserve the source code that enables that
but give it more appropriate naming.
2017-01-27 21:29:09 -06:00
Любомир Маринов
a70beaf7b6 Merge pull request #1265 from jitsi/api
api/api.html -> examples/api.html && rm doc/api
2017-01-27 20:11:23 -06:00
Lyubomir Marinov
c91bffa73c Merge branch 'saghul-android-audiomode' 2017-01-26 23:48:42 -06:00
Lyubomir Marinov
ea163dbbba Merge branch 'deduplicate-index-js' 2017-01-26 23:48:09 -06:00
Lyubomir Marinov
18bc99d6b5 Split long methods into multiple shorter ones 2017-01-26 23:35:56 -06:00
Lyubomir Marinov
bab94a207d Remove unnecessary source code 2017-01-26 21:08:50 -06:00
Lyubomir Marinov
ef39baab47 Comply w/ coding style
- Maximum of 80 characters per line.
- Group first and then sort in alphabetical order.
- Fields should begin with a lowercase letter.
2017-01-26 21:07:35 -06:00
Saúl Ibarra Corretgé
2edaaac7bf [RN] Implement AudioMode module on Android
This module chooses the most appropriate audio default based on the specified
mode.
2017-01-26 19:18:10 -06:00
Saúl Ibarra Corretgé
113e50c074 [RN] Bump Andoroid minimum and target SDK versions
Use a minimum SDK version of 19, that is Anroid 4.4 (KitKat) and a target SDK of
23, that is, Android 6.0 (Marshmallow).
2017-01-26 19:18:10 -06:00
Дамян Минков
900a675864 Merge pull request #1269 from jitsi/border-radius-fix
Fixes border radius.
2017-01-26 17:55:01 -06:00
Lyubomir Marinov
49b3b49f3e Remove duplication
The files react/index.native.js and react/index.web.js ended up having
very similar source code related to initializing the Redux store. Remove
the duplication.

Additionally, I always wanted the App React Component to be consumed
without the need to provide a Redux store to it.
2017-01-26 17:24:11 -06:00
yanas
23935d3d39 Fixes border radius. 2017-01-26 17:04:29 -06:00
Дамян Минков
3fd33d0f50 Merge pull request #1262 from jitsi/ui-fixes
Ui fixes
2017-01-26 10:15:39 -06:00
hristoterezov
8c3317b8e9 doc(iframe_api): api/api.html -> examples/api.html && rm doc/api 2017-01-26 10:02:34 -06:00
Lyubomir Marinov
99a9fc054f eslint 3.14.1 2017-01-26 09:39:47 -06:00
Lyubomir Marinov
967dcfc3d2 react-native-keep-awake 2.0.2 2017-01-26 09:39:20 -06:00
Lyubomir Marinov
0051b3b79c Clean up obsolete file references 2017-01-26 07:58:56 -06:00
Lyubomir Marinov
cbcee201f0 Comply w/ coding style 2017-01-26 07:58:46 -06:00
Ilya Daynatovich
1fa4a53a48 Remove rule 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
6a0b92638c Introduce interceptComponent function 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
2e81b8493e Introduce unsupported browser page 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
57ba702dda Clean up routing logic 2017-01-26 07:27:31 -06:00
Lyubomir Marinov
62bafcaf63 Introduce Platform in React
React Native provides a Platform abstraction which React does not
provide.
2017-01-26 07:27:31 -06:00
Lyubomir Marinov
7de5c9c1d2 Comply w/ coding style 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
8248b14555 Integrate Mobile landing in the Redux app 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
23ef0c8d9d justify text on landing page 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
58a4f59fd8 Implement Landing component 2017-01-26 07:27:31 -06:00
Ilya Daynatovich
0c851934fb layout for mobile landing 2017-01-26 07:27:31 -06:00
Emil Ivov
8d58dbee38 Restores api.md to original location 2017-01-25 19:14:30 -06:00
yanas
cd5e84e4ef Fixes network problem message position 2017-01-25 16:54:51 -06:00
yanas
09ba14eb04 Fixes video thumbnail border and large video background color 2017-01-25 16:53:58 -06:00
Boris Grozev
b22f1965aa doc: Remove obsolete reference to browserify. 2017-01-25 15:48:32 -06:00
Samuel Liard
df6f920b44 Force jquery-ui version to fix pb with beta version we can get with npm
Use Maven in place of ant
Add --host parameter for jicofo
Add build for jitsi Meet

Revert "Force jquery-ui version to fix pb with beta version we can get with npm"

This reverts commit 35a8641e62.
2017-01-25 15:47:23 -06:00
Дамян Минков
f13b2462c8 Merge pull request #1257 from saghul/ds-options-cleanup
cleanup: Remove default Chrome extension ID
2017-01-23 17:04:59 -06:00
Paweł Domas
c0e80c14f8 Merge pull request #1192 from jitsi/remotecontrol
Implement remote control support
2017-01-23 17:00:11 -06:00
hristoterezov
2b1176df53 style(remotecontrol): getRequestedParticipant method comments 2017-01-23 16:06:51 -06:00
hristoterezov
05bfbf5620 fix(remotecontrol): Execute Reciever.enable only when the value is changed 2017-01-23 15:29:25 -06:00
hristoterezov
4af706bd83 style(keycode): Comment 2017-01-23 15:29:25 -06:00
hristoterezov
b62e4d5ee9 fix(remotecontrol): Log level 2017-01-23 15:29:25 -06:00
hristoterezov
bd98d661d3 ref(remotecontrol): Moves hangup logic to remote control module 2017-01-23 15:29:25 -06:00
hristoterezov
1f7c5529e9 fix(remotecontrol): Pin the controlled participant only on remote control permissions granted 2017-01-23 15:29:25 -06:00
hristoterezov
0453346cf4 ref(remotecontrol): Pass the largeVideoWrapper as parameter to remote control module 2017-01-23 15:29:25 -06:00
hristoterezov
15090243d0 fix(API): JS errors caused by remote control merge 2017-01-23 15:29:25 -06:00
hristoterezov
b22e3ee253 style(remotecontrol): Fix JSDoc for RemoteControlEvent 2017-01-23 15:29:25 -06:00
hristoterezov
e693554961 fix(remotecontrol): Logging 2017-01-23 15:29:25 -06:00
hristoterezov
0efca9a9a8 fix(remotecontrol): Fixing issues after peer review. 2017-01-23 15:29:25 -06:00
hristoterezov
5d22061c0a fix(remotecontrol): Handle on-stage participant changes 2017-01-23 15:29:25 -06:00
hristoterezov
84be7fd739 fix(remotecontrol): import of remote control 2017-01-23 15:29:25 -06:00
hristoterezov
5d269ad0aa fix(remotecontrol): Disable the keyboard shortcuts during remote control 2017-01-23 15:29:25 -06:00
hristoterezov
a4d5c41b3a feat(remotecontrol): UI for requesting permissions 2017-01-23 15:29:25 -06:00
hristoterezov
846fb9abb0 feat(remotecontrol): Implement requesting remote control permissions 2017-01-23 15:29:25 -06:00
hristoterezov
0f33e59e4d feat(remotecontrol): announce remotecontrol support 2017-01-23 15:29:25 -06:00
hristoterezov
896650d005 feat(remotecontrol): Implement basic remote control support 2017-01-23 15:29:25 -06:00
Saúl Ibarra Corretgé
6d6b5a7917 cleanup: Remove default Chrome extension ID
It makes for a bad first-time experience for users, since the desktop sharing
button will be visible, but it will never work.

Also get rid of the now deprecated `desktopSharingChromeMethod` option.
2017-01-23 15:21:28 -06:00
Любомир Маринов
db5010be9d Merge pull request #1261 from jitsi/clean-css-module-update
Stick to clean-css version 3.x.
2017-01-23 15:18:18 -06:00
damencho
be8860080c Fixes build.
Starting version 4.x clean-css is split into two packages and we should depend on clean-css-cli for versions 4 and above. Tested it and we have currently some problem with it like fonts and images got referenced under css folder. So sticking version to 3.x for now.
2017-01-23 14:35:26 -06:00
Lyubomir Marinov
42f124b0f6 Fix typo 2017-01-23 13:01:12 -06:00
Lyubomir Marinov
7249ababb7 Provide microphone and camera usage descriptions
iTunes Connect/TestFlight requires these now and is not satisfied with
empty values anymore.
2017-01-23 12:11:48 -06:00
Lyubomir Marinov
079be92468 Revert "[RN][iOS] Make universal builds"
This reverts commit b96ca538e4. While iPad
support is nice to have, we are not ready for a publish in App Store.
During the upload to iTunes Connect, a verification of the .ipa fails
because:

- app icons for iPad are missing:
  - 76x76 pixels in .png format for iOS versions >= 7.0,
  - 167x167 pixels in .png format for iOS versions supporting iPad Pro,
  - 152x152 pixels in .png format for iOS versions >= 7.0,
- orientations required for iPad Mutitasking are missing:
  - UIInterfaceOrientationPortraitUpsideDown.
2017-01-23 11:26:15 -06:00
Lyubomir Marinov
dda2a2feba Automatic Xcode project file fixes 2017-01-22 16:02:57 -06:00
Lyubomir Marinov
ae726cfdc0 react-native 0.40.0 2017-01-22 12:32:08 -06:00
Saúl Ibarra Corretgé
1a04e5a9af [RN] Use a translucent status bar on Android 2017-01-21 15:42:13 -06:00
Lyubomir Marinov
cac68dbaba [RN] Increment short app version from 1.1 to 1.2
Now that Apple have approved build 1.1.185 for release in the App Store,
the short app version needs to be incremented; otherwise, no new builds
can be uploaded to TestFlight and, respectively, for release in the App
Store.
2017-01-20 15:01:01 -06:00
Lyubomir Marinov
3c04634609 Simplify
Simplify the source code (with the idea that source code which does not
exist does not have to be maintained).

Additionally, apply modifications to have the source code comply with the coding
style.

Overall, prepare saghul:audio-mode for merge into jitsi:master.
2017-01-20 14:06:15 -06:00
Saúl Ibarra Corretgé
6c12681b9c [RN][iOS] Default to speaker for video conferences 2017-01-20 14:06:15 -06:00
Saúl Ibarra Corretgé
b1b5f3e6f0 Add CONFERENCE_WILL_JOIN action
It's fired before creating the conference with lib-jitsi-meet.
2017-01-20 14:06:15 -06:00
bbaldino
5baa167a08 Sdp overhaul (#1234)
* M1: device change now uses new flow.  fundamentally "works" but may be corner cases/side effects to other flows. haven't touched ffox yet

* M2: change toggle screenshare flows to use the new video replacement chain

* remove the old 'useVideoStream' and replace it with the new one

* use the new (and renamed back from the shim) 'dispose' method

* tweaks to work with the sdp overhaul changes in lib-jitsi-meet

* change the order in which we call dispose (to handle dispose being reverted back to how it is currently on master)

* move useAudioStream over to new flow

* restore useVideoStream doc

* handle rename JitsiConference::replaceStream -> JitsiConference::replaceTrack

* fix useAudioStream and useVideoStream to return a promise again
2017-01-19 12:46:10 -06:00
ibauersachs
343d17d19a Commit from translate.jitsi.org by user ibauersachs.: 99 of 298 strings translated (18 fuzzy). 2017-01-18 23:58:43 +00:00
ibauersachs
0370cc47fc Commit from translate.jitsi.org by user ibauersachs.: 140 of 298 strings translated (15 fuzzy). 2017-01-18 23:58:36 +00:00
ibauersachs
083fc955dc Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:58:30 +00:00
ibauersachs
a6e268f784 Commit from translate.jitsi.org by user ibauersachs.: 128 of 298 strings translated (14 fuzzy). 2017-01-18 23:58:23 +00:00
ibauersachs
7e0a9bc37c Commit from translate.jitsi.org by user ibauersachs.: 138 of 298 strings translated (14 fuzzy). 2017-01-18 23:58:16 +00:00
ibauersachs
f25bc818d7 Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2017-01-18 23:58:05 +00:00
ibauersachs
9beae22803 Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:57:58 +00:00
ibauersachs
920b0af269 Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2017-01-18 23:57:51 +00:00
ibauersachs
6c674bef2a Commit from translate.jitsi.org by user ibauersachs.: 129 of 298 strings translated (14 fuzzy). 2017-01-18 23:57:44 +00:00
ibauersachs
e74fbbb38b Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2017-01-18 23:57:29 +00:00
ibauersachs
fb3f916802 Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:57:21 +00:00
ibauersachs
c80d47d3dd Commit from translate.jitsi.org by user ibauersachs.: 192 of 298 strings translated (21 fuzzy). 2017-01-18 23:57:14 +00:00
ibauersachs
693ee1dcf8 Commit from translate.jitsi.org by user ibauersachs.: 237 of 298 strings translated (17 fuzzy). 2017-01-18 23:57:06 +00:00
Дамян Минков
640c0faff1 Merge pull request #1253 from jitsi/api_participant_count
Iframe API - participant count
2017-01-18 14:52:59 -06:00
hristoterezov
207ac47aa7 fix(iframe_api): s/getNumberOfParticipant/getNumberOfParticipants 2017-01-18 14:24:41 -06:00
hristoterezov
8844f83a59 feat(iframe_api): Add api.html to doc for example and testing purpose 2017-01-18 14:24:40 -06:00
hristoterezov
4a5a1cd5f4 fix(iframe_api): Remove enable/disable events 2017-01-18 14:24:21 -06:00
hristoterezov
09d63d38ab fix(iframe_api): prevents multiple execution of listeners per event 2017-01-18 13:24:30 -06:00
hristoterezov
6bf0f9b2ec feat(iframe_api): get number of participants 2017-01-18 13:20:32 -06:00
Lyubomir Marinov
f6fdd3ce70 Don't show watermarks in film strip-only mode even for guests 2017-01-17 21:54:17 -06:00
Lyubomir Marinov
d1f6679f2d [RN] Remove Crashlytics 2017-01-17 21:54:17 -06:00
Lyubomir Marinov
b8a6eb4768 Fix the checkbox to disable the Welcome page
Recently, we reimplemented the Welcome page in React. Unfortunately, we
broke the checkbox that enables/disables the Welcome page and it would
allow checking but wouldn't allow unchecking.
2017-01-17 16:20:43 -06:00
Lyubomir Marinov
6efad1348a Fix the display of watermarks in film strip-only mode
Recently, we reimplemented the watermarks in React. Unfortunately, we
didn't take into account film strip-only mode.

Additionally, we duplicated watermark-related source code on the Welcome
and Conference pages.
2017-01-17 16:20:13 -06:00
Lyubomir Marinov
eaed9db1e7 Name folders consistently 2017-01-17 08:53:23 -06:00
Lyubomir Marinov
4f8b7a934c Comply w/ coding style 2017-01-17 08:32:20 -06:00
Lyubomir Marinov
71c04936af Merge branch 'actions-rename' of https://github.com/saghul/jitsi-meet into saghul-actions-rename 2017-01-17 08:18:52 -06:00
Любомир Маринов
41da758946 Merge pull request #1242 from saghul/ipad
Enable universal builds
2017-01-16 19:56:29 -06:00
Saúl Ibarra Corretgé
acbfe5cb09 [RN] Keep device screen on while in a conference 2017-01-16 19:12:43 -06:00
Lyubomir Marinov
ba3d65c01f Fix d17cc9fa
A bug was discovered in d17cc9fa which would raise a failure to push
into the browser's history if a base href was defined. Fix the failure
by removing react-router. Anyway, the usage of react-router was
incorrect because the app must hit the server infrastructure when it
enters a room because the server will choose the very app version then.
2017-01-15 18:28:02 -06:00
Lyubomir Marinov
856732abab Preserve URLs 2017-01-15 17:46:34 -06:00
Lyubomir Marinov
5f21e4c5b6 Introduce Platform in React
React Native provides Platform.
2017-01-15 12:09:52 -06:00
Lyubomir Marinov
28b44cf67c Consistency 2017-01-15 12:09:02 -06:00
Дамян Минков
674b0e706c Merge pull request #1241 from jitsi/iframe_api_avatars
feat(iframeAPI): implement avatar change commands
2017-01-12 17:08:13 -06:00
Saúl Ibarra Corretgé
b96ca538e4 [RN][iOS] Make universal builds 2017-01-12 16:24:01 -06:00
Saúl Ibarra Corretgé
3266ace916 [RN][iOS] Set deployment target to 9.0
According to Apple iOS devices with versions < 9.0 are 6%.
https://developer.apple.com/support/app-store/
2017-01-12 16:20:03 -06:00
hristoterezov
f7ce8d028d feat(iframeAPI): implement avatar change commands 2017-01-12 15:53:17 -06:00
Дамян Минков
85e5b0fc31 Merge pull request #1240 from jitsi/ilmstriponly_ui
fix(filmstrip_only): Remove unrelated UI elements
2017-01-12 15:24:32 -06:00
hristoterezov
61f4b52a15 fix(filmstrip_only): Remove unrelated UI elements 2017-01-12 14:51:53 -06:00
Lyubomir Marinov
d17cc9fa86 Merge branch 'BeatC-BeatC-moving-conference-init-to-react-1' 2017-01-12 12:24:25 -06:00
Lyubomir Marinov
1f995cffe9 eslint 3.13.1, react 15.4.1, react-redux 5.0.2 2017-01-12 11:01:12 -06:00
Lyubomir Marinov
0936d54114 Merge branch 'master' into BeatC-BeatC-moving-conference-init-to-react-1 2017-01-12 10:37:36 -06:00
Lyubomir Marinov
0912dbf130 Remove duplication, simplify, comply with coding style 2017-01-12 10:37:01 -06:00
Дамян Минков
7dd566a591 Merge pull request #1238 from jitsi/filmstriponly_jserrors
fix(filmstrip_only): JS errors
2017-01-11 19:18:51 -06:00
hristoterezov
0f9bc766db fix(filmstrip_only): JS errors 2017-01-11 17:16:43 -06:00
Saúl Ibarra Corretgé
e71e6c5b79 Name Redux actions consistently
Redux actions which represent "commands" should be imperative, and those
representing events should use the past tense.
2017-01-11 13:11:11 -06:00
Lyubomir Marinov
4d5f82633b Merge branch 'master' into BeatC-BeatC-moving-conference-init-to-react-1 2017-01-10 13:07:19 -06:00
Lyubomir Marinov
2f01746c55 Remove duplication, simplify, comply with coding style 2017-01-10 13:06:18 -06:00
yanas
7ec5b34548 Merge pull request #1232 from jitsi/fix-adjust-layout
Fixes and adjustments of UI layout
2017-01-10 11:20:34 -06:00
yanas
1604fa6584 Fixes and adjustments of UI layout 2017-01-09 15:32:25 -06:00
Lyubomir Marinov
b67994235e Merge branch 'BeatC-moving-conference-init-to-react-1' of https://github.com/BeatC/jitsi-meet into BeatC-BeatC-moving-conference-init-to-react-1 2017-01-09 07:44:02 -06:00
Lyubomir Marinov
ee1358fae3 Merge branch 'saghul-no-welcome-autofocus' 2017-01-06 13:19:33 -06:00
Lyubomir Marinov
9fae5aa02f Merge branch 'no-welcome-autofocus' of https://github.com/saghul/jitsi-meet into saghul-no-welcome-autofocus 2017-01-06 13:19:12 -06:00
Lyubomir Marinov
a887beed3a [RN] Increment short app version from 1.0 to 1.1
Now that Apple have approved build 1.0.178 for release in the App Store,
the short app version needs to be incremented; otherwise, no new builds
can be uploaded to TestFlight and, respectively, for release in the App
Store.
2017-01-06 10:34:46 -06:00
Saúl Ibarra Corretgé
8a30d44042 [RN] Disable autofocus on the welcome screen
This prevents the keyboard from showing up right when the app opens.
2017-01-06 16:08:01 +01:00
Lyubomir Marinov
4fef8a3b79 [RN] Prevent unhandled JS errors from killing the process in Release 2017-01-05 15:06:41 -06:00
Ilya Daynatovich
ad9bdf4dd2 Fix url params stripping 2017-01-04 19:01:25 +02:00
hristoterezov
29001c3ab0 Merge pull request #1228 from jitsi/fix-menu-icon
Fix(RemoteVideo): Fixes remote video menu icon
2017-01-04 10:18:41 -06:00
yanas
a5387b054a Fix(RemoteVideo): Fixes remote video menu icon 2017-01-04 10:14:53 -06:00
Ilya Daynatovich
c2757469a5 Merge branch 'master' into BeatC-moving-conference-init-to-react-1 2017-01-04 17:53:13 +02:00
Ilya Daynatovich
ed1aa700d0 remove asterisk symbol from jsdoc 2017-01-04 17:47:27 +02:00
Ilya Daynatovich
58b5e1748f editions after rebase 2017-01-04 17:47:27 +02:00
Ilya Daynatovich
a99bbe67ab Clean up Conference component 2017-01-04 17:47:27 +02:00
Ilya Daynatovich
f53fb3d814 Introduced new actions and functions for app initialization 2017-01-04 17:46:47 +02:00
Ilya Daynatovich
e716c1738c Fix lint errs 2017-01-04 17:46:47 +02:00
Ilya Daynatovich
3190bfa058 Move redundant code from app.js 2017-01-04 17:45:52 +02:00
Ilya Daynatovich
c570b80d7b moved app initialization to react app 2017-01-04 17:45:52 +02:00
yanas
2f9887245a Merge pull request #1226 from jitsi/guests-watermark
Adds an option to show watermark only for guests.
2017-01-04 09:43:25 -06:00
damencho
6006333ccf Adds an option to show watermark only for guests. 2017-01-03 17:30:57 -06:00
Lyubomir Marinov
fd6c91715f Merge branch 'fix-mobile-toolbar-initial-timeout' 2017-01-03 15:27:22 -06:00
Lyubomir Marinov
a40b6a9df8 Merge branch 'master' into fix-mobile-toolbar-initial-timeout 2017-01-03 15:12:53 -06:00
yanas
d67b7c7f49 Fix(React/conference): Fix jsdocs 2017-01-03 15:09:52 -06:00
yanas
616ab0f635 Fix(mobile/conference): Move the initial call to the componentDidMount method 2017-01-03 15:06:47 -06:00
yanas
930e65da66 Fix(React/conference): Sets an initial toolbar view timeout 2017-01-03 14:53:52 -06:00
yanas
414a978b10 Merge pull request #1224 from jitsi/fix-close-page-redirect
Removes guest parameter when navigating to close page.
2017-01-03 14:37:54 -06:00
damencho
4ebefb17e9 Removes guest parameter when navigating to close page.
Using sessionStorage to save whether user is guest or not.
2017-01-03 14:15:32 -06:00
Дамян Минков
c46772015b Merge pull request #1217 from BeatC/fix-watermarks
Fixes issue with watermarks and interface configs.
2016-12-30 16:34:39 -06:00
Дамян Минков
677eef12dd Updates use of showJitsiWatermark. 2016-12-30 12:07:54 -06:00
hristoterezov
cd03b29ece Merge pull request #1219 from jitsi/guest-hint
Adds an option for guest only hint
2016-12-30 11:41:23 -06:00
damencho
63aa60f2d6 Adds an option for a hint message shown only to guests. 2016-12-30 10:59:21 -06:00
damencho
282defc54c Pass parameter to close page about current participant is it guest. 2016-12-30 10:58:21 -06:00
damencho
593de63d49 Adds utils to the close page and an id to the hint question div. 2016-12-30 10:19:58 -06:00
Ilya Daynatovich
5bb53ba036 Fix issue with watermarks 2016-12-30 13:34:03 +02:00
damencho
3c369a4c67 Fixes missing ssi for logging_config.js when meet served from jetty. 2016-12-29 11:18:39 -06:00
damencho
83aeb99b95 Commit from translate.jitsi.org by user damencho.: 202 of 298 strings translated (21 fuzzy). 2016-12-27 19:49:38 +00:00
ibauersachs
188d53ef94 Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2016-12-24 10:48:32 +00:00
ibauersachs
961cf7edbb Commit from translate.jitsi.org by user ibauersachs.: 298 of 298 strings translated (0 fuzzy). 2016-12-23 13:16:05 +00:00
damencho
2c5a5816c4 Adds some accessibilityLabels that can be used for testing. 2016-12-22 17:28:57 -06:00
yanas
96a6f2dfd6 Merge pull request #1212 from jitsi/react-native-ui-modifications-more
React native ui modifications
2016-12-22 14:41:43 -06:00
Дамян Минков
35be17cfc9 Merge pull request #1208 from jitsi/caps
Remove strophe-caps dependancy
2016-12-22 11:13:08 -05:00
yanas
8d90a7d091 Fix(react): Fixes black border on text input in welcome page 2016-12-21 18:09:30 -06:00
yanas
4a71c2655a Fix(react): Make in call buttons appear by default 2016-12-21 18:07:32 -06:00
yanas
043fd6e259 Fix(React): Modifies thumbnail icon positions and layout 2016-12-21 16:32:56 -06:00
yanas
7722e14117 Adjusts the size of secondary toolbar button 2016-12-21 15:00:24 -06:00
yanas
5e377d3694 Fix underlining on welcom text input on android 2016-12-21 15:00:24 -06:00
yanas
f512583973 fix(react-toolbars): Adjusts some styles and icons in mobile toolbars 2016-12-21 15:00:24 -06:00
yanas
5fce7f6ba2 Updates the react native font. 2016-12-21 15:00:24 -06:00
yanas
dfe1666530 feat(fonts): Adds a new icon to the font 2016-12-21 15:00:24 -06:00
hristoterezov
41f0069a22 fix(caps): remove strophe-caps dependancy 2016-12-19 14:58:18 -06:00
Lyubomir Marinov
9f332ffcec [iOS] Synthesize IPv6 addresses 2016-12-17 04:03:10 -06:00
Lyubomir Marinov
891bd7f346 react-redux 5.0.1, babel-loader 6.2.10, eslint 3.12.2, eslint-plugin-react-native 2.2.1 2016-12-15 21:01:44 -06:00
Lyubomir Marinov
4810249301 Simplify. Comply w/ coding style. 2016-12-15 21:00:06 -06:00
Ilya Daynatovich
984a6519fc Move welcome page logic from jquery to react 2016-12-15 07:55:43 -06:00
Ilya Daynatovich
986f13ef1a Made editions in PR 2016-12-15 07:54:17 -06:00
Ilya Daynatovich
83dd56d34c Move roomname generator to React 2016-12-14 23:59:02 -06:00
Paweł Domas
b646e8d213 Merge pull request #1197 from jitsi/reload_on_error
Reload when resource fails to load
2016-12-13 19:32:55 -06:00
yanas
2785e76e23 fix(index.html): minor variable optimisation 2016-12-13 18:43:45 -06:00
yanas
c5cacd7955 fix(index.html): UI adjustments 2016-12-13 18:19:49 -06:00
paweldomas
62532b5879 feat(index.html): add safeguards to the reload delay value
If the page reload value is not within specific range it will be
adjusted to a default of 10 seconds.
2016-12-13 13:57:11 -06:00
paweldomas
7e22f9c57b feat(index.html): hide the missing filename by default 2016-12-13 13:53:28 -06:00
paweldomas
d9017b2665 feat(index.html): update "failed to load the page" msg
Also adds a link to reload manually.
2016-12-13 07:33:27 -06:00
Lyubomir Marinov
4571a4c048 Simplify Redux reducer source code 2016-12-13 03:15:32 -06:00
Lyubomir Marinov
80685395ed [RN] Room lock 2016-12-13 03:15:32 -06:00
Lyubomir Marinov
38b9819b68 Fix/remove Redux state mutation 2016-12-13 03:15:32 -06:00
paweldomas
a4dcf5f8df feat(index.html): reload when resource fails to load
The page will be reloaded if any of the mandatory scripts/resources
fails to load. The reload will be delayed with exponential backoff
starting from 2 seconds. The retry attempt counter is passed as
'rCounter' query attribute.
2016-12-12 15:53:07 -06:00
Lyubomir Marinov
9a49a01713 [RN] Room lock button 2016-12-12 13:49:45 -06:00
hristoterezov
8c3fb54d3d Merge pull request #1194 from bgrozev/disable-suspend-video
config: Disable suspend video by default.
2016-12-12 13:07:00 -06:00
Boris Grozev
7707e384c5 config: Disable suspend video by default. 2016-12-12 10:37:36 -06:00
Lyubomir Marinov
a09b8ce56e React Native 0.39.2 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
7ecafb1e69 [RN] Join password-protected rooms 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
9f93ce86be [RN] Simplify the source code 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
a5773f1d0b [RN] Links to Send feedback and Privacy (policy) 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
d72813340e Fix the (visual) style of toggle camera facing mode 2016-12-11 22:21:51 -06:00
Lyubomir Marinov
daf56455a5 Use Symbol for Redux action types to prevent conflicts 2016-12-11 22:21:51 -06:00
Дамян Минков
f58d7fc3cc Adds download links to readme. 2016-12-09 17:45:02 -06:00
Illia Daynatovich
4584d89c43 Rewrite with ES6 2016-12-08 19:21:29 -06:00
Illia Daynatovich
1cc2b388a2 webpack-dev-server 2016-12-08 19:21:29 -06:00
Lyubomir Marinov
51a1a7ed22 [RN] Clarify, simplify the source code 2016-12-07 16:08:35 -06:00
Lyubomir Marinov
99c2b60a1d [RN] Catch Promise rejection 2016-12-07 16:06:16 -06:00
Lyubomir Marinov
de5cd53f85 [RN] Allow uppsercase letters in room names 2016-12-07 16:04:52 -06:00
Lyubomir Marinov
f027a8f74f [RN] Use fetch instead of XHR 2016-12-07 16:00:54 -06:00
damencho
7d81ec4d86 Simplifies dependencies, removes possible circular dependency. 2016-12-07 11:14:20 -06:00
hristoterezov
a6fed4da65 Merge pull request #1184 from jitsi/separate-disconnect-overlay
Separate disconnect overlay
2016-12-07 10:44:56 -06:00
yanas
ce42d3ab5d Fixes unnecessary parameter 2016-12-07 10:24:37 -06:00
Lyubomir Marinov
d939ae5fb2 Rename the package of the Android app 2016-12-06 17:23:39 -06:00
yanas
642fa8d6f8 Fixes some issues pointed out from hristoterezov 2016-12-06 17:05:32 -06:00
Lyubomir Marinov
8f02b9249e Clarify error message with details 2016-12-06 16:49:38 -06:00
Lyubomir Marinov
7487684301 React Native 0.39.0 2016-12-06 15:52:53 -06:00
Lyubomir Marinov
02e3f6b3a2 Reduce the complexity of the source code 2016-12-06 15:42:06 -06:00
Lyubomir Marinov
727df551e6 Merge branch 'android-version' 2016-12-06 14:26:50 -06:00
damencho
e5dc7058c1 Adds android version variable.
The variables in gradle.properties can be overridden on command line like: -Pversion=1.
2016-12-06 13:57:38 -06:00
yanas
c9488d5ee9 Separate disconnect overlay. 2016-12-05 23:38:30 -06:00
yanas
4720088039 Merge pull request #1182 from jitsi/reduce-app.bundle.min.js
Reduce the impact of aui, aui-experimental, and jQuery-Impromptu on t…
2016-12-05 18:00:17 -06:00
Lyubomir Marinov
96a18ab2d5 [RN] Change 'Privacy Policty' and 'Terms of Service' to 'Terms and Conditions' 2016-12-05 11:33:37 -06:00
Lyubomir Marinov
137aace970 Merge branch 'fix_ring_overlay' 2016-12-04 13:29:31 -06:00
Lyubomir Marinov
4a8eca2020 Reduce the impact of aui, aui-experimental, and jQuery-Impromptu on the size of the minimized app bundle 2016-12-03 19:26:19 -06:00
hristoterezov
23efa7827c fix(filmstrip): JS error when the ringoverlay is shown 2016-12-02 16:23:12 -06:00
hristoterezov
fd24595baf Merge pull request #1180 from gerfigna/patch-2
Update api.md
2016-12-02 11:56:39 -06:00
Germán Figna
2331982e33 Update api.md
Fix videoConferenceJoined and videoConferenceLeft event names
2016-12-02 17:55:19 +01:00
Lyubomir Marinov
683fc84a28 Webpack's loaders are devDependencies 2016-12-02 10:11:47 -06:00
Illia Daynatovich
a0f5e5c8f8 Consistent spacing, closing in index.html 2016-12-02 09:11:06 -06:00
bgrozev
c9af2b956c Updates the manual installation docs
Adds the --host argument to the jicofo command, as suggested by exs on irc.
2016-12-01 18:11:41 -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
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
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
Ilya Daynatovich
d72695ae0f Added app substitution 2016-11-01 11:30:01 +02: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
Maxim Voloshin
dc93940bbd Filmstrip is extended with "Hide" button 2016-10-31 19:59:45 +02:00
Ilya Daynatovich
544792b9cc Editions in colors 2016-10-31 19:21:15 +02: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
Ilya Daynatovich
647f577332 Rearrange overlay layout 2016-10-31 17:35:22 +02:00
hristoterezov
a65fca851c refactor(FilmStrip): calculateThumbnailSizeFromAvailable 2016-10-20 11:34:14 -05:00
375 changed files with 16390 additions and 7625 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

@@ -3,6 +3,7 @@ build/*
# Third-party source code which we (1) do not want to modify or (2) try to
# modify as little as possible.
flow-typed/*
libs/*
# ESLint will by default ignore its own configuration file. However, there does

View File

@@ -4,7 +4,10 @@ module.exports = {
'commonjs': true,
'es6': true
},
'extends': 'eslint:recommended',
'extends': [
'eslint:recommended',
'plugin:flowtype/recommended'
],
'globals': {
// The globals that (1) are accessed but not defined within many of our
// files, (2) are certainly defined, and (3) we would like to use
@@ -12,12 +15,16 @@ module.exports = {
// files.
'__filename': false
},
'parser': 'babel-eslint',
'parserOptions': {
'ecmaFeatures': {
'experimentalObjectRestSpread': true
},
'sourceType': 'module'
},
'plugins': [
'flowtype'
],
'rules': {
'new-cap': [
'error',

50
.flowconfig Normal file
View File

@@ -0,0 +1,50 @@
[ignore]
; We fork some components by platform
.*/*[.]android.js
; Ignore "BUCK" generated dirs
<PROJECT_ROOT>/\.buckd/
; Ignore unexpected extra "@providesModule"
.*/node_modules/.*/node_modules/fbjs/.*
; Ignore duplicate module providers
; For RN Apps installed via npm, "Libraries" folder is inside
; "node_modules/react-native" but in the source repo it is in the root
.*/Libraries/react-native/React.js
.*/Libraries/react-native/ReactNative.js
; Ignore packages in node_modules which we (i.e. the jitsi-meet project) have
; seen to cause errors and we have chosen not to fix.
.*/node_modules/babel-core/.*
.*/node_modules/bower/.*
.*/node_modules/jsonlint/.*
[include]
[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow
flow/
[options]
module.system=haste
experimental.strict_type_args=true
munge_underscores=true
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
suppress_type=$FlowIssue
suppress_type=$FlowFixMe
suppress_type=$FixMe
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-7]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-7]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
unsafe.enable_getters_and_setters=true
[version]
^0.37.0

1
.gitattributes vendored
View File

@@ -1,2 +1,3 @@
*.bundle.js -text -diff
*.pbxproj -text
lib-jitsi-meet.js -text -diff

20
.gitignore vendored
View File

@@ -4,7 +4,6 @@ deploy-local.sh
libs/
all.css
*css.map
unsupported_browser.css
.remote-sync.json
.sync-config.cson
@@ -36,21 +35,34 @@ DerivedData
*.xcuserstate
project.xcworkspace
# Android/IJ
# Android/IntelliJ
#
*.iml
build/
.idea
.gradle
local.properties
*.iml
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
#
buck-out/
\.buckd/
android/app/libs
android/keystores/debug.keystore
*.keystore
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use
# fastlane to re-generate the screenshots whenever they are needed. For more
# information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
#
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots

View File

@@ -1,6 +1,12 @@
# The following do not need to be checked because they do not represent JS
# source code.
build/
debian/
libs/
node_modules/
# The following are checked by ESLint which supersedes JSHint.
flow-typed/
react/
analytics.js
webpack.config.babel.js

View File

@@ -1,11 +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 href="/">here</a></p>
<p class="error_page__message">You can create new conversation <a class="link" href="/">here</a></p>
</div>
</body>
</html>

4
ConferenceEvents.js Normal file
View File

@@ -0,0 +1,4 @@
/**
* Notifies interested parties that hangup procedure will start.
*/
export const BEFORE_HANGUP = "conference.before_hangup";

View File

@@ -8,7 +8,6 @@ OUTPUT_DIR = .
STYLES_BUNDLE = css/all.bundle.css
STYLES_DESTINATION = css/all.css
STYLES_MAIN = css/main.scss
STYLES_UNSUPPORTED_BROWSER = css/unsupported_browser.scss
WEBPACK = ./node_modules/.bin/webpack
all: update-deps compile deploy clean
@@ -47,7 +46,6 @@ deploy-lib-jitsi-meet:
$(DEPLOY_DIR)
deploy-css:
$(NODE_SASS) css/unsupported_browser.scss css/unsupported_browser.css ; \
$(NODE_SASS) $(STYLES_MAIN) $(STYLES_BUNDLE) && \
$(CLEANCSS) $(STYLES_BUNDLE) > $(STYLES_DESTINATION) ; \
rm $(STYLES_BUNDLE)
@@ -59,6 +57,5 @@ source-package:
mkdir -p source_package/jitsi-meet/css && \
cp -r *.js *.html connection_optimization favicon.ico fonts images libs sounds LICENSE lang source_package/jitsi-meet && \
cp css/all.css source_package/jitsi-meet/css && \
cp css/unsupported_browser.css source_package/jitsi-meet/css && \
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
rm -rf source_package

View File

@@ -1,5 +1,5 @@
Jitsi Meet - Secure, Simple and Scalable Video Conferences
====
# Jitsi Meet - Secure, Simple and Scalable Video Conferences
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, scalable video conferences. You can see [Jitsi Meet in action](http://youtu.be/7vFUVClsNh0) here at the session #482 of the VoIP Users Conference.
You can also try it out yourself at https://meet.jit.si .
@@ -12,6 +12,13 @@ Installing Jitsi Meet is quite a simple experience. For Debian-based systems, we
For other systems, or if you wish to install all components manually, see the [detailed manual installation instructions](https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md).
## Download
You can download Debian/Ubuntu binaries:
* [stable](https://download.jitsi.org/stable/) ([instructions](https://jitsi.org/Main/InstallJitsiMeetDebianStableRepository))
* [testing](https://download.jitsi.org/testing/) ([instructions](https://jitsi.org/Main/InstallJitsiMeetDebianTestingRepository))
* [nightly](https://download.jitsi.org/unstable/) ([instructions](https://jitsi.org/Main/InstallJitsiMeetDebianNightlyRepository))
## Building the sources
Jitsi Meet uses [Browserify](http://browserify.org). If you want to make changes in the code you need to [install Browserify](http://browserify.org/#install). Browserify requires [nodejs](http://nodejs.org).
@@ -28,7 +35,7 @@ To build the Jitsi Meet application, just type
make
```
## Working with the library sources(lib-jitsi-meet).
## Working with the library sources (lib-jitsi-meet)
By default the library is build from its git repository sources. The default dependency path in package.json is :
```json
@@ -75,6 +82,14 @@ npm unlink lib-jitsi-meet
npm install
```
## Embedding in external applications
Jitsi Meet provides a very flexible way of embedding it in external applications by using the [Jitsi Meet API](doc/api.md).
## Mobile app
Jitsi Meet is also available as a React Native application for Android and iOS.
Instructions on how to build it can be found [here](doc/mobile.md).
## Discuss
Please use the [Jitsi dev mailing list](http://lists.jitsi.org/pipermail/dev/) to discuss feature requests before opening an issue on Github.

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

@@ -46,13 +46,13 @@ android_library(
android_build_config(
name = 'build_config',
package = 'org.jitsi.jitsi_meet_react',
package = 'org.jitsi.meet',
)
android_resource(
name = 'res',
res = 'src/main/res',
package = 'org.jitsi.jitsi_meet_react',
package = 'org.jitsi.meet',
)
android_binary(

View File

@@ -1,15 +1,4 @@
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
@@ -98,11 +87,11 @@ android {
buildToolsVersion '23.0.1'
defaultConfig {
applicationId 'org.jitsi.jitsi_meet_react'
applicationId 'org.jitsi.meet'
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName '1.0'
versionCode Integer.parseInt("${version}")
versionName "1.2.${version}"
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
@@ -149,18 +138,14 @@ if (project.hasProperty('JITSI_SIGNING')
apply from: project.property('JITSI_SIGNING');
}
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
compile project(':react-native-immersive')
compile project(':react-native-keep-awake')
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:+'
compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
transitive = true
}
compile 'com.facebook.react:react-native:+' // From node_modules
}
apply from: '../../node_modules/react-native-vector-icons/fonts.gradle'
@@ -168,6 +153,6 @@ 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) {
from configurations.compile
into 'libs'
from configurations.compile
into 'libs'
}

View File

@@ -1,11 +1,14 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.jitsi.jitsi_meet_react"
package="org.jitsi.meet"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- WebRTC -->
<!-- XXX: ACCESS_NETWORK_STATE is required by WebRTC. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
@@ -13,8 +16,8 @@
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="22" />
android:minSdkVersion="19"
android:targetSdkVersion="23" />
<application
android:allowBackup="true"
@@ -35,16 +38,21 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:host="beta.hipchat.me" android:scheme="https" />
<data android:host="beta.meet.jit.si" android:scheme="https" />
<data android:host="chaos.hipchat.me" android:scheme="https" />
<data android:host="enso.me" android:scheme="https" />
<data android:host="hipchat.me" android:scheme="https" />
<data android:host="meet.jit.si" android:scheme="https" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="org.jitsi.meet" />
</intent-filter>
</activity>
<activity
android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<meta-data
android:name="io.fabric.ApiKey"
android:value="a8ae24a58302ba79da1d312138e941f6b86e3242" />
</application>
</manifest>

View File

@@ -1,39 +0,0 @@
package org.jitsi.jitsi_meet_react;
import android.app.Application;
import android.util.Log;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.oblador.vectoricons.VectorIconsPackage;
import com.oney.WebRTCModule.WebRTCModulePackage;
import java.util.Arrays;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
protected boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new VectorIconsPackage(),
new WebRTCModulePackage()
);
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
}

View File

@@ -1,11 +1,8 @@
package org.jitsi.jitsi_meet_react;
package org.jitsi.meet;
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 {
/**
@@ -46,11 +43,4 @@ public class MainActivity extends ReactActivity {
protected String getMainComponentName() {
return "App";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
}
}

View File

@@ -0,0 +1,63 @@
package org.jitsi.meet;
import android.app.Application;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import java.util.Arrays;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
/**
* {@inheritDoc}
*/
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
/**
* {@inheritDoc}
*/
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new com.corbt.keepawake.KCKeepAwakePackage(),
new com.facebook.react.shell.MainReactPackage(),
new com.oblador.vectoricons.VectorIconsPackage(),
new com.oney.WebRTCModule.WebRTCModulePackage(),
new com.rnimmersive.RNImmersivePackage(),
new org.jitsi.meet.audiomode.AudioModePackage()
);
}
};
/**
* {@inheritDoc}
*/
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
/**
* {@inheritDoc}
*/
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
if (!getReactNativeHost()
.getReactInstanceManager()
.getDevSupportManager()
.getDevSupportEnabled()) {
// TODO Auto-generated method stub
}
}
}

View File

@@ -0,0 +1,322 @@
package org.jitsi.meet.audiomode;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import java.util.HashMap;
import java.util.Map;
/**
* Module implementing a simple API to select the appropriate audio device for a
* conference call.
*
* Audio calls should use <tt>AudioModeModule.AUDIO_CALL</tt>, which uses the
* builtin earpiece, wired headset or bluetooth headset. The builtin earpiece is
* the default audio device.
*
* Video calls should should use <tt>AudioModeModule.VIDEO_CALL</tt>, which uses
* the builtin speaker, earpiece, wired headset or bluetooth headset. The
* builtin speaker is the default audio device.
*
* Before a call has started and after it has ended the
* <tt>AudioModeModule.DEFAULT</tt> mode should be used.
*/
public class AudioModeModule extends ReactContextBaseJavaModule {
/**
* Constants representing the audio mode.
* - DEFAULT: Used before and after every call. It represents the default
* audio routing scheme.
* - AUDIO_CALL: Used for audio only calls. It will use the earpiece by
* default, unless a wired or Bluetooth headset is connected.
* - VIDEO_CALL: Used for video calls. It will use the speaker by default,
* unless a wired or Bluetooth headset is connected.
*/
private static final int DEFAULT = 0;
private static final int AUDIO_CALL = 1;
private static final int VIDEO_CALL = 2;
/**
*
*/
private static final String ACTION_HEADSET_PLUG
= (Build.VERSION.SDK_INT >= 21)
? AudioManager.ACTION_HEADSET_PLUG
: Intent.ACTION_HEADSET_PLUG;
/**
* React Native module name.
*/
private static final String MODULE_NAME = "AudioMode";
/**
* Tag used when logging messages.
*/
static final String TAG = MODULE_NAME;
/**
* {@link AudioManager} instance used to interact with the Android audio
* subsystem.
*/
private final AudioManager audioManager;
/**
* {@link BluetoothHeadsetMonitor} for detecting Bluetooth device changes in
* old (< M) Android versions.
*/
private BluetoothHeadsetMonitor bluetoothHeadsetMonitor;
/**
* {@link Handler} for running all operations on the main thread.
*/
private final Handler mainThreadHandler
= new Handler(Looper.getMainLooper());
/**
* {@link Runnable} for running update operation on the main thread.
*/
private final Runnable mainThreadRunner
= new Runnable() {
@Override
public void run() {
if (mode != -1) {
updateAudioRoute(mode);
}
}
};
/**
* Audio mode currently in use.
*/
private int mode = -1;
/**
* Initializes a new module instance. There shall be a single instance of
* this module throughout the lifetime of the application.
*
* @param reactContext the {@link ReactApplicationContext} where this module
* is created.
*/
public AudioModeModule(ReactApplicationContext reactContext) {
super(reactContext);
audioManager
= (AudioManager)
reactContext.getSystemService(Context.AUDIO_SERVICE);
// Setup runtime device change detection.
setupAudioRouteChangeDetection();
}
/**
* Gets a mapping with the constants this module is exporting.
*
* @return a {@link Map} mapping the constants to be exported with their
* values.
*/
@Override
public Map<String, Object> getConstants() {
Map<String, Object> constants = new HashMap<>();
constants.put("AUDIO_CALL", AUDIO_CALL);
constants.put("DEFAULT", DEFAULT);
constants.put("VIDEO_CALL", VIDEO_CALL);
return constants;
}
/**
* Gets the name for this module, to be used in the React Native bridge.
*
* @return a string with the module name.
*/
@Override
public String getName() {
return MODULE_NAME;
}
/**
* Helper method to trigger an audio route update when devices change. It
* makes sure the operation is performed on the main thread.
*/
void onAudioDeviceChange() {
mainThreadHandler.post(mainThreadRunner);
}
/**
* Helper method to set the output route to a Bluetooth device.
*
* @param enabled true if Bluetooth should use used, false otherwise.
*/
private void setBluetoothAudioRoute(boolean enabled) {
if (enabled) {
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
} else {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();
}
}
/**
* Public method to set the current audio mode.
*
* @param mode the desired audio mode.
* @param promise a {@link Promise} which will be resolved if the audio mode
* could be updated successfully, and it will be rejected otherwise.
*/
@ReactMethod
public void setMode(final int mode, final Promise promise) {
if (mode != DEFAULT && mode != AUDIO_CALL && mode != VIDEO_CALL) {
promise.reject("setMode", "Invalid audio mode " + mode);
return;
}
Runnable r = new Runnable() {
@Override
public void run() {
if (updateAudioRoute(mode)) {
AudioModeModule.this.mode = mode;
promise.resolve(null);
} else {
promise.reject(
"setMode",
"Failed to set the requested audio mode");
}
}
};
mainThreadHandler.post(r);
}
/**
* Setup the audio route change detection mechanism. We use the
* {@link android.media.AudioDeviceCallback} API on Android >= 23 only.
*/
private void setupAudioRouteChangeDetection() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setupAudioRouteChangeDetectionM();
} else {
setupAudioRouteChangeDetectionPreM();
}
}
/**
* Audio route change detection mechanism for Android API >= 23.
*/
@TargetApi(Build.VERSION_CODES.M)
private void setupAudioRouteChangeDetectionM() {
android.media.AudioDeviceCallback audioDeviceCallback =
new android.media.AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(
AudioDeviceInfo[] addedDevices) {
Log.d(TAG, "Audio devices added");
onAudioDeviceChange();
}
@Override
public void onAudioDevicesRemoved(
AudioDeviceInfo[] removedDevices) {
Log.d(TAG, "Audio devices removed");
onAudioDeviceChange();
}
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback, null);
}
/**
* Audio route change detection mechanism for Android API < 23.
*/
private void setupAudioRouteChangeDetectionPreM() {
Context context = getReactApplicationContext();
// Detect changes in wired headset connections.
IntentFilter wiredHeadSetFilter = new IntentFilter(ACTION_HEADSET_PLUG);
BroadcastReceiver wiredHeadsetReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Wired headset added / removed");
onAudioDeviceChange();
}
};
context.registerReceiver(wiredHeadsetReceiver, wiredHeadSetFilter);
// Detect Bluetooth device changes.
bluetoothHeadsetMonitor = new BluetoothHeadsetMonitor(this, context);
}
/**
* Updates the audio route for the given mode.
*
* @param mode the audio mode to be used when computing the audio route.
* @return true if the audio route was updated successfully, false
* otherwise.
*/
private boolean updateAudioRoute(int mode) {
Log.d(TAG, "Update audio route for mode: " + mode);
if (mode == DEFAULT) {
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.abandonAudioFocus(null);
audioManager.setSpeakerphoneOn(false);
audioManager.setMicrophoneMute(true);
setBluetoothAudioRoute(false);
return true;
}
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setMicrophoneMute(false);
if (audioManager.requestAudioFocus(
null,
AudioManager.STREAM_VOICE_CALL,
AudioManager.AUDIOFOCUS_GAIN)
== AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
Log.d(TAG, "Audio focus request failed");
return false;
}
boolean useSpeaker = (mode == VIDEO_CALL);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// On Android >= M we use the AudioDeviceCallback API, so turn on
// Bluetooth SCO from the start.
if (audioManager.isBluetoothScoAvailableOffCall()) {
audioManager.startBluetoothSco();
}
} else {
// On older Android versions we must set the Bluetooth route
// manually. Also disable the speaker in that case.
setBluetoothAudioRoute(
bluetoothHeadsetMonitor.isHeadsetAvailable());
if (bluetoothHeadsetMonitor.isHeadsetAvailable()) {
useSpeaker = false;
}
}
// XXX: isWiredHeadsetOn is not deprecated when used just for knowing if
// there is a wired headset connected, regardless of audio being routed
// to it.
audioManager.setSpeakerphoneOn(
useSpeaker
&& !(audioManager.isWiredHeadsetOn()
|| audioManager.isBluetoothScoOn()));
return true;
}
}

View File

@@ -0,0 +1,48 @@
package org.jitsi.meet.audiomode;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Implements {@link ReactPackage} for {@link AudioModeModule}.
*/
public class AudioModePackage implements ReactPackage {
/**
* {@inheritDoc}
*/
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
/**
* {@inheritDoc}
*
* @return List of native modules to be exposed by React Native.
*/
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new AudioModeModule(reactContext));
return modules;
}
/**
* {@inheritDoc}
*/
@Override
public List<ViewManager> createViewManagers(
ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}

View File

@@ -0,0 +1,189 @@
package org.jitsi.meet.audiomode;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
/**
* Helper class to detect and handle Bluetooth device changes. It monitors
* Bluetooth headsets being connected / disconnected and notifies the module
* about device changes when this occurs.
*/
public class BluetoothHeadsetMonitor {
/**
* {@link AudioModeModule} where this monitor reports.
*/
private final AudioModeModule audioModeModule;
/**
* The {@link Context} in which {@link #audioModeModule} executes.
*/
private final Context context;
/**
* Reference to a proxy object which allows us to query connected devices.
*/
private BluetoothHeadset headset;
/**
* Flag indicating if there are any Bluetooth headset devices currently
* available.
*/
private boolean headsetAvailable = false;
/**
* {@link Handler} for running all operations on the main thread.
*/
private final Handler mainThreadHandler
= new Handler(Looper.getMainLooper());
/**
* Helper for running Bluetooth operations on the main thread.
*/
private final Runnable updateDevicesRunnable
= new Runnable() {
@Override
public void run() {
headsetAvailable
= (headset != null)
&& !headset.getConnectedDevices().isEmpty();
audioModeModule.onAudioDeviceChange();
}
};
public BluetoothHeadsetMonitor(
AudioModeModule audioModeModule,
Context context) {
this.audioModeModule = audioModeModule;
this.context = context;
AudioManager audioManager
= (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (!audioManager.isBluetoothScoAvailableOffCall()) {
Log.w(AudioModeModule.TAG, "Bluetooth SCO is not available");
return;
}
if (getBluetoothHeadsetProfileProxy()) {
registerBluetoothReceiver();
// Initial detection.
updateDevices();
}
}
private boolean getBluetoothHeadsetProfileProxy() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null) {
Log.w(AudioModeModule.TAG, "Device doesn't support Bluetooth");
return false;
}
// XXX: The profile listener listens for system services of the given
// type being available to the application. That is, if our Bluetooth
// adapter has the "headset" profile.
BluetoothProfile.ServiceListener listener
= new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(
int profile,
BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
headset = (BluetoothHeadset) proxy;
updateDevices();
}
}
@Override
public void onServiceDisconnected(int profile) {
// The logic is the same as the logic of onServiceConnected.
onServiceConnected(profile, /* proxy */ null);
}
};
return
adapter.getProfileProxy(
context,
listener,
BluetoothProfile.HEADSET);
}
/**
* Returns the current headset availability.
*
* @return true if there is a Bluetooth headset connected, false otherwise.
*/
public boolean isHeadsetAvailable() {
return headsetAvailable;
}
private void onBluetoothReceiverReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
// XXX: This action will be fired when a Bluetooth headset is
// connected or disconnected to the system. This is not related to
// audio routing.
int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -99);
switch (state) {
case BluetoothHeadset.STATE_CONNECTED:
case BluetoothHeadset.STATE_DISCONNECTED:
Log.d(
AudioModeModule.TAG,
"BT headset connection state changed: " + state);
updateDevices();
break;
}
} else if (action.equals(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)) {
// XXX: This action will be fired when the connection established
// with a Bluetooth headset (called a SCO connection) changes state.
// When the SCO connection is active we route audio to it.
int state
= intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -99);
switch (state) {
case AudioManager.SCO_AUDIO_STATE_CONNECTED:
case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
Log.d(
AudioModeModule.TAG,
"BT SCO connection state changed: " + state);
updateDevices();
break;
}
}
}
private void registerBluetoothReceiver() {
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
onBluetoothReceiverReceive(context, intent);
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
context.registerReceiver(receiver, filter);
}
/**
* Detects if there are new devices connected / disconnected and fires the
* {@link AudioModeModule#onAudioDeviceChange()} callback.
*/
private void updateDevices() {
mainThreadHandler.post(updateDevicesRunnable);
}
}

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

View File

@@ -3,6 +3,7 @@
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>

View File

@@ -18,3 +18,4 @@
# org.gradle.parallel=true
android.useDeprecatedNdk=true
version=1

View File

@@ -1,6 +1,10 @@
rootProject.name = 'jitsi-meet-react'
include ':app'
include ':react-native-immersive'
project(':react-native-immersive').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-immersive/android')
include ':react-native-keep-awake'
project(':react-native-keep-awake').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keep-awake/android')
include ':react-native-vector-icons'
project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android')
include ':react-native-webrtc'

174
app.js
View File

@@ -1,4 +1,3 @@
/* global $, config, getRoomName */
/* application specific logic */
import "babel-polyfill";
@@ -7,7 +6,6 @@ import "jquery-contextmenu";
import "jquery-ui";
import "strophe";
import "strophe-disco";
import "strophe-caps";
import "jQuery-Impromptu";
import "autosize";
@@ -18,64 +16,13 @@ import 'aui-experimental-css';
window.toastr = require("toastr");
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";
/**
* Tries to push history state with the following parameters:
* 'VideoChat', `Room: ${roomName}`, URL. If fail, prints the error and returns
* it.
*/
function pushHistoryState(roomName, URL) {
try {
window.history.pushState(
'VideoChat', `Room: ${roomName}`, URL
);
} catch (e) {
console.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.
*/
function buildRoomName () {
let roomName = getRoomName();
if(!roomName) {
let word = RoomnameGenerator.generateRoomWithoutSeparator();
roomName = word.toLowerCase();
let historyURL = window.location.href + word;
//Trying to push state with current URL + roomName
pushHistoryState(word, historyURL);
}
return roomName;
}
import translation from "./modules/translation/translation";
import remoteControl from "./modules/remotecontrol/RemoteControl";
const APP = {
// Used by do_external_connect.js if we receive the attach data after
@@ -95,6 +42,17 @@ 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).
@@ -103,105 +61,15 @@ const APP = {
ConferenceUrl : null,
connection: null,
API,
init () {
this.keyboardshortcut =
require("./modules/keyboardshortcut/keyboardshortcut");
this.translation = require("./modules/translation/translation");
this.configFetch = require("./modules/config/HttpConfigFetch");
this.tokenData = getTokenData();
}
remoteControl
};
/**
* If JWT token data it will be used for local user settings
*/
function setTokenData() {
let localUser = APP.tokenData.caller;
if(localUser) {
APP.settings.setEmail((localUser.getEmail() || "").trim(), true);
APP.settings.setAvatarUrl((localUser.getAvatarUrl() || "").trim());
APP.settings.setDisplayName((localUser.getName() || "").trim(), true);
}
}
function init() {
setTokenData();
// Initialize the conference URL handler
APP.ConferenceUrl = new ConferenceUrl(window.location);
// Clean up the URL displayed by the browser
replaceHistoryState(APP.ConferenceUrl.getInviteUrl());
var isUIReady = APP.UI.start();
if (isUIReady) {
APP.conference.init({roomName: buildRoomName()}).then(function () {
APP.UI.initConference();
APP.UI.addListener(UIEvents.LANG_CHANGED, function (language) {
APP.translation.setLanguage(language);
APP.settings.setLanguage(language);
});
APP.keyboardshortcut.init();
}).catch(function (err) {
APP.UI.hideRingOverLay();
APP.API.notifyConferenceLeft(APP.conference.roomName);
console.error(err);
});
}
}
/**
* If we have an HTTP endpoint for getting config.json configured we're going to
* read it and override properties from config.js and interfaceConfig.js.
* If there is no endpoint we'll just continue with initialization.
* Keep in mind that if the endpoint has been configured and we fail to obtain
* the config for any reason then the conference won't start and error message
* will be displayed to the user.
*/
function obtainConfigAndInit() {
let roomName = APP.conference.roomName;
if (config.configLocation) {
APP.configFetch.obtainConfig(
config.configLocation, roomName,
// Get config result callback
function(success, error) {
if (success) {
var now = APP.connectionTimes["configuration.fetched"] =
window.performance.now();
console.log("(TIME) configuration fetched:\t", now);
init();
} else {
// Show obtain config error,
// pass the error object for report
APP.UI.messageHandler.openReportDialog(
null, "dialog.connectError", error);
}
});
} else {
require("./modules/config/BoshAddressChoice").chooseAddress(
config, roomName);
init();
}
}
$(document).ready(function () {
var now = APP.connectionTimes["document.ready"] = window.performance.now();
console.log("(TIME) document ready:\t", now);
URLProcessor.setConfigParametersFromUrl();
APP.init();
APP.translation.init(settings.getLanguage());
APP.API.init(APP.tokenData.externalAPISettings);
obtainConfigAndInit();
});
$(window).bind('beforeunload', function () {
APP.API.dispose();
});
// 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');
module.exports = APP;

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 id="hintQuestion">Did you know?</span>
<span class="hint-msg__holder" id="hintMessage"></span>
</p>
<div class="happy-software"></div>
</div>
</div>
</body>
</html>
</html>

59
close.js Normal file
View File

@@ -0,0 +1,59 @@
/* 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.innerHTML = 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);
// If there is a setting show a special message only for the guests
if (interfaceConfig.CLOSE_PAGE_GUEST_HINT) {
if ( window.sessionStorage.getItem('guest') === 'true' ) {
var element = document.getElementById('hintQuestion');
element.classList.add('hide');
insertTextMsg('hintMessage', interfaceConfig.CLOSE_PAGE_GUEST_HINT);
return;
}
}
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 id="hintQuestion">Did you know?</span>
<span class="hint-msg__holder" id="hintMessage"></span>
</p>
<div class="happy-software"></div>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -20,13 +20,13 @@ var config = { // eslint-disable-line no-unused-vars
//focusUserJid: 'focus@auth.jitsi-meet.example.com', // The real JID of focus participant - can be overridden here
//defaultSipNumber: '', // Default SIP number
// Desktop sharing method. Can be set to 'ext', 'webrtc' or false to disable.
desktopSharingChromeMethod: 'ext',
// The ID of the jidesha extension for Chrome.
desktopSharingChromeExtId: 'diibjkoicjeejcmhdnailmkgecihlobk',
desktopSharingChromeExtId: null,
// Whether desktop sharing should be disabled on Chrome.
desktopSharingChromeDisabled: true,
// 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',
@@ -76,5 +76,9 @@ var config = { // eslint-disable-line no-unused-vars
// If true - all users without token will be considered guests and all users
// with token will be considered non-guests. Only guests will be allowed to
// edit their profile.
enableUserRolesBasedOnToken: false
enableUserRolesBasedOnToken: false,
// Suspending video might cause problems with audio playback. Disabling until these are fixed.
disableSuspendVideo: true,
// disables or enables RTX (RFC 4588).
disableRtx: true
};

View File

@@ -1,4 +1,6 @@
/* 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';
@@ -84,7 +86,7 @@ function connect(id, password, roomName) {
function handleConnectionFailed(err) {
unsubscribe();
console.error("CONNECTION FAILED:", err);
logger.error("CONNECTION FAILED:", err);
reject(err);
}

View File

@@ -29,36 +29,6 @@ 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;
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 */
}
@include placeholder {
color: $placeHolderColor;
}
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;
@@ -75,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,
@@ -98,7 +84,6 @@ form {
}
.leftwatermark {
display: none;
left: $defaultToolbarSize;
margin-left: 10px;
background-image: url($defaultWatermarkLink);
@@ -106,13 +91,11 @@ form {
}
.rightwatermark {
display: none;
right: 15;
background-position: center right;
}
.poweredby {
display: none;
position: absolute;
left: 25;
bottom: 7;
@@ -132,38 +115,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
**/
@@ -185,19 +136,7 @@ form {
visibility: visible;
}
.link {
cursor: pointer;
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 {

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;
}

124
css/_filmstrip.scss Normal file
View File

@@ -0,0 +1,124 @@
%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;
/*The filmstrip should not be covered by the left toolbar*/
padding-left: $defaultToolbarSize + 5;
bottom: 0;
width:auto;
border: $thumbnailsBorder solid transparent;
z-index: 5;
transition: bottom 2s;
overflow: visible !important;
/*!!!Removes the gap between the local video container and the remote
videos.*/
font-size: 0pt;
&.hidden {
bottom: -196px;
}
.videocontainer {
display: none;
position: relative;
background-size: contain;
border: $thumbnailVideoBorder solid transparent;
border-radius: $borderRadius;
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 > .icon-menu {
display: none;
}
/**
* Hovered video thumbnail.
*/
&:hover {
cursor: hand;
border: $thumbnailVideoBorder solid $videoThumbnailHovered;
box-shadow: inset 0 0 3px $videoThumbnailHovered,
0 0 3px $videoThumbnailHovered;
.remotevideomenu > .icon-menu {
display: inline-block;
}
}
/* With TemasysWebRTC plugin <object/> element is used
instead of <video/> */
& > video,
& > object {
cursor: hand;
border-radius: $borderRadius;
object-fit: cover;
overflow: hidden;
}
}
}
}

View File

@@ -25,6 +25,9 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-mic-camera-combined:before {
content: "\e903";
}
.icon-feedback:before {
content: "\e91d";
}
@@ -34,15 +37,15 @@
.icon-avatar:before {
content: "\e901";
}
.icon-autorenew:before {
content: "\e903";
}
.icon-hangup:before {
content: "\e905";
}
.icon-chat:before {
content: "\e906";
}
.icon-download:before {
content: "\e902";
}
.icon-edit:before {
content: "\e907";
}
@@ -67,9 +70,6 @@
.icon-exit-full-screen:before {
content: "\e90c";
}
.icon-star:before {
content: "\e916";
}
.icon-star-full:before {
content: "\e90a";
}
@@ -106,6 +106,12 @@
.icon-settings:before {
content: "\e915";
}
.icon-star:before {
content: "\e916";
}
.icon-switch-camera:before {
content: "\e921";
}
.icon-share-desktop:before {
content: "\e917";
}
@@ -130,7 +136,6 @@
.icon-recEnable:before {
content: "\e614";
}
// 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(4px);
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

@@ -10,18 +10,17 @@
color: $popoverFontColor;
background-color: $popoverBg;
background-clip: padding-box;
border-radius: 3px;
border-radius: $borderRadius;
/*-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;
&__menu-padding {
height: 35px;
height: $popoverMenuPadding;
width: 100px;
position: absolute;
bottom: -35px;
bottom: -$popoverMenuPadding;
}
&__showmore {

View File

@@ -1,18 +1,18 @@
@charset "UTF-8";
/*!
* jQuery contextMenu - Plugin for simple contextMenu handling
*
* Version: v2.1.1
*
* Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF)
* Web: http://swisnl.github.io/jQuery-contextMenu/
*
* Copyright (c) 2011-2016 SWIS BV and contributors
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
* Date: 2016-02-28T09:53:18.890Z
/*!
* jQuery contextMenu - Plugin for simple contextMenu handling
*
* Version: v2.1.1
*
* Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF)
* Web: http://swisnl.github.io/jQuery-contextMenu/
*
* Copyright (c) 2011-2016 SWIS BV and contributors
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
* Date: 2016-02-28T09:53:18.890Z
*/
@font-face {
font-family: "context-menu-icons";
@@ -88,7 +88,7 @@
list-style-type: none;
background: #fff;
border: 1px solid #bebebe;
border-radius: 3px;
border-radius: $borderRadius;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
}
@@ -156,8 +156,8 @@
transform: translateY(-50%);
}
/**
* Inputs
/**
* Inputs
*/
.context-menu-item.context-menu-input {
padding: 5px 10px;

View File

@@ -63,7 +63,15 @@
top: 50%;
left: 50%;
position: absolute;
@include transform(translate(-50%, -50%))
@include transform(translate(-50%, -50%));
}
/**
* Defines the maximum width and height
**/
@mixin maxSize($value) {
max-width: $value;
max-height: $value;
}
@mixin transform($func) {
@@ -142,4 +150,12 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/**
* Creates a semi-transparent background with the given color and alpha
* (opacity) value.
*/
@mixin transparentBg($color, $alpha) {
background-color: rgba(red($color), green($color), blue($color), $alpha);
}

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

@@ -6,7 +6,6 @@
padding: 0;
margin: 2px 0;
bottom: 0;
width: 100px;
height: auto;
&:first-child {
@@ -66,4 +65,9 @@
span.remotevideomenu:hover ul.popupmenu, ul.popupmenu:hover {
display:block !important;
}
}
.remote-control-spinner {
top: 6px;
left: 2px;
}

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

@@ -16,30 +16,20 @@
* Labels inside the side panel.
*/
label {
color: $defaultColor;
color: $baseLight;
}
/**
* Form elements and blocks.
*/
input, select, a,
.sideToolbarBlock, .input-control, .button-control {
.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.
*/
@@ -70,20 +60,24 @@
box-sizing: border-box;
color: #FFF;
.input-control {
border: 0;
}
/**
* Titles and subtitles of inner containers.
*/
div.title, div.subTitle {
margin: 10px 0;
margin: 24px 0 11px;
}
/**
* Main title size.
*/
div.title {
color: $defaultColor !important;
font-size: 16px;
color: $toolbarTitleColor;
text-align: center;
font-size: $toolbarTitleFontSize;
}
/**

View File

@@ -7,7 +7,7 @@
*
* Author: John Papa and Hans Fjällemark
* Project: https://github.com/CodeSeven/toastr
*
*
* Last updated: October 13, 2016
*/
@@ -77,7 +77,7 @@
padding: $notificationPadding;
border: 1px solid lighten($notificationBackground, 10%);
@include border-radius($notificationBorderRadius);
@include border-radius($notificationBorderRadius);
@include box-shadow(1px, 1px, 2px, rgba(0,0,0,0.3));
@include opacity($notificationOpacity);
}
@@ -92,8 +92,9 @@
}
#toast-container.notification-bottom-right {
$videoOffset: 2 * ($thumbnailVideoMargin + $thumbnailsBorder) + $thumbnailVideoBorder;
bottom: 135px;
right: 13px;
right: $hideFilmstripButtonWidth + $videoOffset;
}
#toast-container * {
@@ -101,6 +102,6 @@
}
#toast-container .toast {
width: 200px;
width: $notificationWidth;
margin: 0 0 8px;
}

View File

@@ -4,6 +4,18 @@
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{
@@ -42,7 +54,6 @@
margin-right: auto;
width: auto;
border-radius: 3px;
.button:first-child {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
@@ -51,12 +62,6 @@
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
/**
* Splitter button in the toolbar.
*/
.splitter {
margin-left: $splitterToolbarButtonLeftMargin;
}
}
#extendedToolbar {
@@ -247,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 {
@@ -255,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; }
}

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
*/
@@ -12,9 +14,13 @@ $defaultToolbarSize: 50px;
// Video layout.
$thumbnailToolbarHeight: 22px;
$thumbnailIndicatorBorder: 0px;
$thumbnailIndicatorBorder: 2px;
$thumbnailIndicatorSize: $thumbnailToolbarHeight;
$thumbnailVideoMargin: 2px;
$thumbnailVideoMargin: 5px;
$thumbnailsBorder: 2px;
$thumbnailVideoBorder: 2px;
$hideFilmstripButtonWidth: 17px;
/**
* Color variables.
@@ -23,27 +29,28 @@ $defaultColor: #F1F1F1;
$defaultSideBarFontColor: #44A5FF;
$defaultSemiDarkColor: #ACACAC;
$defaultDarkColor: #2b3d5c;
$defaultBackground: #474747;
$tooltipBg: rgba(0,0,0, 0.7);
/**
* 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
* TODO: looks like we don't use it
*/
$inputSemiBackground: rgba(132, 132, 132, .8);
$inputLightBackground: #EBEBEB;
/*
/**
* Video layout
*/
$videoThumbnailHovered: rgba(22, 94, 204, .4);
@@ -70,7 +77,6 @@ $rateStarLabelColor: #333;
$rateStarDefault: #ccc;
$rateStarActivity: #165ecc;
$rateStarSize: 34px;
$feedbackCancelFontColor: #333;
/**
* Notifications
@@ -84,13 +90,16 @@ $notificationLinkColor: $notificationColor;
$notificationOpacity: 0.9;
$notificationPadding: 15px 20px;
$notificationBorderRadius: 4px;
$notificationWidth: 215px;
/**
* Misc.
*/
$borderRadius: 4px;
$defaultWatermarkLink: '../images/watermark.png';
$sidebarWidth: 200px;
$sidebarWidth: 220px;
$popoverMenuPadding: 13px;
$happySoftwareBackground: transparent;
/**
* Z-indexes. TODO: Replace this by a function.
@@ -113,13 +122,15 @@ $defaultDarkFontColor: #000;
/**
* Forms
*/
//dropdown
$selectFontColor: $defaultLightFontColor;
$selectBg: $defaultBackground;
$selectActiveBg: $defaultBackground;
$selectActiveItemBg: $defaultDarkColor;
//inputs
$inputControlEmColor: #f29424;
//buttons
$linkFontColor: #489afe;
$linkHoverFontColor: #287ade;
$linkHoverFontColor: #287ade;
/**
* Landing
*/
$primaryUnsupportedBrowserButtonBgColor: #17a0db;
$unsupportedBrowserButtonBgColor: #ff9a00;
$unsupportedBrowserTextColor: #4a4a4a;

View File

@@ -12,129 +12,115 @@
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();
background-color: black;
border-radius: $borderRadius;
width: 100%;
height: 100%;
}
/**
* The toolbar of the video thumbnail.
*/
.videocontainer__toolbar,
.videocontainer__toptoolbar {
position: absolute;
left: 0;
z-index: 3;
width: 100%;
box-sizing: border-box; // Includes the padding in the 100% width.
}
/**
* 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.
}
.videocontainer__toolbar {
bottom: 0;
padding: 0 5px 0 5px;
height: $thumbnailToolbarHeight;
}
&__toolbar {
bottom: 0;
padding: 0 5px 0 5px;
height: $thumbnailToolbarHeight;
}
.videocontainer__toptoolbar {
$toolbarPadding: 5px;
top: 0;
padding: $toolbarPadding;
padding-bottom: 0;
height: $thumbnailIndicatorSize + $toolbarPadding;
}
&__toptoolbar {
$toolbarPadding: 5px;
top: 0;
padding: $toolbarPadding;
padding-bottom: 0;
.videocontainer__hoverOverlay {
position: relative;
width: 100%;
height: 100%;
visibility: hidden;
background: rgba(0,0,0,.6);
z-index: 2;
}
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;
#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;
}
&:last-child {
margin-right: 0;
}
/**
* Hovered video thumbnail.
*/
#remoteVideos .videocontainer:hover {
cursor: hand;
border: 2px solid $videoThumbnailHovered;
box-shadow: inset 0 0 3px $videoThumbnailHovered,
0 0 3px $videoThumbnailHovered;
.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 {
background: rgba(0,0,0,.6);
border-radius: $borderRadius;
position: relative;
width: 100%;
height: 100%;
visibility: hidden;
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);
@@ -144,8 +130,8 @@
#localVideoWrapper>video,
#localVideoWrapper>object {
border-radius: $borderRadius !important;
cursor: hand;
border-radius:1px !important;
object-fit: cover;
}
@@ -227,6 +213,7 @@
.videocontainer .displayname {
pointer-events: none;
padding: 0 3px 0 3px;
}
.videocontainer .editdisplayname {
@@ -289,72 +276,6 @@
background: $connectionIndicatorBg;
}
.videocontainer__toptoolbar span.indicator {
position: relative;
font-size: 8pt;
text-align: center;
line-height: $thumbnailToolbarHeight;
display: none;
padding: 0;
margin-right: 5px;
float: left;
@include circle($thumbnailIndicatorSize);
box-sizing: border-box;
z-index: 3;
background: $dominantSpeakerBg;
color: $thumbnailPictogramColor;
border: $thumbnailIndicatorBorder solid $thumbnailPictogramColor;
.indicatoricon {
position: absolute;
top: 50%;
left: 0;
@include transform(translateY(-50%));
width: $thumbnailIndicatorSize - 2 * $thumbnailIndicatorBorder;
height: $thumbnailIndicatorSize - 2 * $thumbnailIndicatorBorder;
line-height: $thumbnailIndicatorSize - 2 * $thumbnailIndicatorBorder;
}
.connection {
position: relative;
margin: 0 auto;
width: 12px;
height: 8px;
&_empty
{
@include topLeft();
max-width: 12px;
width: 12px;
color: #8B8B8B;/*#FFFFFF*/
overflow: hidden;
}
&_lost
{
@include topLeft();
max-width: 12px;
width: 12px;
color: #8B8B8B;
overflow: visible;
}
&_full
{
@include topLeft();
max-width: 12px;
width: 12px;
color: #FFFFFF;/*#15A1ED*/
overflow: hidden;
}
}
.icon-connection,
.icon-connection-lost {
font-size: 6pt;
}
}
.remotevideomenu
{
display: inline-block;
@@ -471,8 +392,11 @@
}
.userAvatar {
@include circle(60px);
@include maxSize(60px);
@include absoluteAligning();
border-radius: 50%;
height: 50%;
width: auto;
}
.sharedVideoAvatar {
@@ -550,6 +474,7 @@
#localConnectionMessage {
display: none;
position: absolute;
left: 0;
width: 100%;
top:50%;
z-index: 2;

View File

@@ -50,7 +50,7 @@
float: left;
}
#domain_name
.domain-name
{
float: left;
height: 55px;
@@ -61,37 +61,51 @@
color: $defaultDarkColor;
}
#enter_room_field {
font-size: 15px;
border: none;
-webkit-appearance: none;
width: 228px;
height: 55px;
line-height: 55px;
font-weight: 500;
box-shadow: none;
float: left;
background-color: #FFFFFF;
position: relative;
z-index: 2;
}
.enter-room {
&__field {
font-size: 15px;
border: none;
-webkit-appearance: none;
width: 228px;
height: 55px;
line-height: 55px;
font-weight: 500;
box-shadow: none;
float: left;
background-color: #FFFFFF;
position: relative;
z-index: 2;
}
#enter_room_button {
width: 73px;
height: 45px;
background-color: #21B9FC;
moz-border-radius: 1px;
-webkit-border-radius: 1px;
color: #ffffff;
font-weight: 600;
border: none;
margin-top: 5px;
font-size: 19px;
padding-top: 6px;
outline: none;
float:left;
position: relative;
z-index: 2;
&__reload {
display: block;
width: 30px;
color: #acacac;
font-size: 1.9em;
line-height: 55px;
z-index: 3;
float: left;
cursor: pointer;
text-align: center;
}
&__button {
width: 73px;
height: 45px;
background-color: #21B9FC;
moz-border-radius: 1px;
-webkit-border-radius: 1px;
color: #ffffff;
font-weight: 600;
border: none;
margin-top: 5px;
font-size: 19px;
padding-top: 6px;
outline: none;
float:left;
position: relative;
z-index: 2;
}
}
#enter_room_container {
@@ -184,16 +198,3 @@
line-height: 22px;
font-weight: 200;
}
#reload_roomname
{
width: 30px;
color: #acacac;
font-size: 1.9em;
line-height: 55px;
z-index: 3;
float: left;
cursor: pointer;
text-align: center;
display: none;
}

View File

@@ -1,6 +1,6 @@
.select2-container.aui-select2-container {
background-color: transparent !important;
margin-top: 2px;
a.select2-choice {
height: 28px !important;
@@ -55,6 +55,7 @@
.select2-result-label{
font-size: 12px;
color: $selectFontColor !important;
line-height: 20px;
}
}

View File

@@ -82,4 +82,8 @@
color: $linkHoverFontColor;
}
}
&_center {
float: none !important;
}
}

View File

@@ -1,4 +1,4 @@
.input-control {
.form-control {
padding: 16px 0;
&:first-child {
@@ -19,17 +19,6 @@
font-weight: $labelFontWeight;
}
&__input {
&:last-child {
margin-bottom: inherit;
}
&::selection {
background-color: $defaultDarkSelectionColor;
}
}
&__em {
color: $inputControlEmColor;
}
@@ -41,6 +30,10 @@
span {
vertical-align: middle;
}
&_error {
color: $errorColor;
}
}
&__container {

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,13 @@
/* 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';
@@ -58,12 +56,18 @@
@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';
@import 'unsupported-browser/unsupported-desktop-browser';
@import 'unsupported-browser/unsupported-mobile-browser';
/* Modules END */

View File

@@ -2,7 +2,7 @@
visibility: visible;
height: auto;
h3 {
h1, h2, h3, h4, h5, h6 {
color: $auiDialogColor;
}
@@ -72,7 +72,7 @@
}
}
.input-control:not(:last-child) {
.form-control:not(:last-child) {
border-bottom: 1px solid $auiBorderColor;
}
}

View File

@@ -62,20 +62,18 @@
text-align: center;
padding: 10px 40px 20px 40px;
.input-control{
&__input {
background-color: $feedbackInputBg;
color: $feedbackInputTextColor;
.input-control {
background-color: $feedbackInputBg;
color: $feedbackInputTextColor;
&::-webkit-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $feedbackInputPlaceholderColor;
}
&:-ms-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
&::-webkit-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $feedbackInputPlaceholderColor;
}
&:-ms-input-placeholder {
color: $feedbackInputPlaceholderColor;
}
}

View File

@@ -1,30 +1,36 @@
.overlay_container {
top: 0;
left: 0;
width: 100%;
height: 100%;
position: fixed;
z-index: $overlayZ;
background: rgba(22, 185, 252, .9);
}
.overlay {
&__container,
&__container-light {
top: 0;
left: 0;
width: 100%;
height: 100%;
position: fixed;
z-index: $overlayZ;
background: $defaultBackground;
}
.overlay_content {
color: #fff;
text-align: center;
width: 400px;
height: 250px;
top: 50%;
left: 50%;
position: absolute;
margin-top: -125px;
margin-left: -200px;
}
&__container-light {
@include transparentBg($defaultBackground, 0.7);
}
.overlay_text_small {
display: block;
font-size: 18px;
}
&__content {
position: absolute;
margin: 0 auto;
height: 100%;
width: 56%;
left: 50%;
@include transform(translateX(-50%));
.overlay_icon {
font-size: 100px;
}
&_bottom {
position: absolute;
bottom: 0;
}
}
&__policy {
position: absolute;
bottom: 24px;
width: 100%;
}
}

View File

@@ -13,5 +13,4 @@
#reloadProgressBar {
width: 180px;
margin: 5px auto;
}
}

View File

@@ -1,3 +1,14 @@
/**
* Base
*/
$baseLight: #FFFFFF;
/**
* Controls
*/
$controlBackground: $baseLight;
$controlColor: #333333;
/**
* Buttons
*/
@@ -17,11 +28,16 @@ $buttonLinkColor: #0090e8;
$primaryButtonBackground: #3572b0;
$primaryButtonHoverBackground: #2a67a5;
$primaryButtonColor: #fff;
$primaryButtonColor: $baseLight;
$primaryButtonFontWeight: 400;
$buttonShadowColor: #192d4f;
/**
* Color variables
**/
$defaultBackground: #474747;
/**
* Connection indicator
**/
@@ -33,14 +49,20 @@ $uploadConnectionIconColor: #ffa800;
**/
$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;
@@ -50,8 +72,24 @@ $hintFontSize: em(13, 14);
$linkFontColor: #3572b0;
$linkHoverFontColor: darken(#3572b0, 10%);
$dropdownColor: #333;
$errorColor: #c61600;
// Feedback colors
$feedbackCancelFontColor: #333;
// Popover colors
$popoverBg: #000;
$popoverFontColor: #ffffff;
$popupMenuSelectedItemBackground: rgba(256, 256, 256, .2);
$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";

View File

@@ -0,0 +1,132 @@
.supported-browser {
color: #929391;
display: inline-block;
font-size: 20px;
margin: 1em 7px;
vertical-align: middle;
width: 138px;
&__button {
background-color: #62c82a;
border: 1px solid #3c8117;
border-radius: 10px;
color: #FFFFFF;
font-size: 12px;
height: 26px;
margin: 15px auto 0px auto;
padding-top: 13px;
text-align: center;
width: 115px;
}
&__link {
color: #087dba;
text-decoration: none;
&:hover {
text-decoration: none;
}
&:active {
text-decoration: none;
}
&:focus {
text-decoration: none;
}
}
&-list
{
margin: 0 auto;
}
&__logo {
margin: 20px auto 0px auto;
&_chrome {
background-image: url('../../images/chrome.png');
height: 78px;
width: 78px;
}
&_chromium {
background-image: url('../../images/chromium.png');
height: 78px;
width: 77px;
}
&_firefox {
background-image: url('../../images/firefox.png');
height: 80px;
width: 86px;
}
&_opera {
background-image: url('../../images/opera.png');
height: 78px;
width: 73px;
}
&_ie {
background-image: url('../../images/ie.png');
height: 78px;
width: 80px;
}
&_safari {
background-image: url('../../images/safari.png');
height: 79px;
width: 78px;
}
}
&__text
{
line-height: 1.2em;
&_small {
font-size: small;
}
}
&__tile {
background-color: #e8e8e8;
border: 1px solid #cfcfcf;
border-radius: 10px;
height: 163px;
margin-top: 5px;
width: 138px;
}
}
.unsupported-desktop-browser {
display: block;
height: 565px;
margin: auto;
overflow:hidden;
position: absolute;
text-align: center;
top: 0; left: 0; bottom: 0; right: 0;
width:500px;
&__page {
display:inline-block;
font-size: 28px;
padding-top: 25px;
vertical-align:middle;
}
&__title {
margin: 0 auto;
width: 20em;
}
&-wrapper {
background: #fff;
display: block;
height: 100%;
position: absolute;
width: 100%;
}
}

View File

@@ -0,0 +1,69 @@
.unsupported-mobile-browser {
background-color: #fff;
height: 100vh;
padding: 35px 0;
width: 100vw;
&__body {
color: $unsupportedBrowserTextColor;
margin: auto;
max-width: 40em;
text-align: center;
width: 75%;
a:active {
text-decoration: none;
}
}
&__text {
font-size: 1.8em;
line-height: em(29px, 21px);
margin-bottom: 0.65em;
&_small {
font-size: 1.5em;
margin-bottom: 1em;
margin-top: em(21, 18);
strong {
font-size: em(21, 18);
}
}
}
&__logo {
height: 108px;
width: 77px;
}
&__button {
border: 0;
height: 42px;
margin: 0 auto;
max-width: 300px;
width: 98%;
@include border-radius(8px);
background-color: $unsupportedBrowserButtonBgColor;
font-size: 1.5em;
font-weight: 300;
letter-spacing: 0.5px;
text-shadow: 0px 1px 2px $unsupportedBrowserTextColor;
// Disable standard button effects.
box-shadow: none;
outline: none;
&:active {
background-color: $unsupportedBrowserButtonBgColor;
}
&_primary {
background-color: $primaryUnsupportedBrowserButtonBgColor;
&:active {
background-color: $primaryUnsupportedBrowserButtonBgColor;
}
}
}
}

View File

@@ -1,138 +0,0 @@
@import 'variables';
body {
width:100%;
height:100%;
background-color: white;
color: #424242;
font-family: $baseFontFamily;
font-size: 28px;
margin:0;
padding:0;
}
#wrap{
display: block;
position: absolute;
width:500px;
height: 565px;
overflow:hidden;
text-align: center;
margin: auto;
top: 0; left: 0; bottom: 0; right: 0;
}
.firefox{
font-size: 11pt;
color: #c8c8c8;
width: 468px;
text-align: center;
margin: 30px auto 0px auto;
padding-left: 15px;
}
#text{
display:inline-block;
font-size: 28px;
/* width: 568px; */
vertical-align:middle;
padding-top: 25px;
}
a {
color: #087dba;
text-decoration:none;
}
.browser {
width: 138px;
height: 163px;
margin-top: 5px;
background-color: #e8e8e8;
border: 1px solid #cfcfcf;
border-radius: 10px;
}
.browser_wrapper
{
width: 138px;
/* height: 188px; */
vertical-align: middle;
color: #929391;
font-size: 20px;
float: left;
margin-left: 15px;
margin-top: 5px;
}
.browser_text
{
height: 2em;
}
.supported_browsers
{
margin: 0px auto 0px auto;
/* width: 660px; */
}
.clear
{
clear: both;
}
.button
{
background-color: #62c82a;
border: 1px solid #3c8117;
border-radius: 10px;
color: #FFFFFF;
font-size: 12px;
text-align: center;
width: 115px;
height: 26px;
padding-top: 13px;
margin: 15px auto 0px auto;
}
.logo
{
margin: 20px auto 0px auto;
}
#chrome_logo
{
width: 78px;
height: 78px;
background-image: url('../images/chrome.png');
}
#chromium_logo
{
width: 77px;
height: 78px;
background-image: url('../images/chromium.png');
}
#firefox_logo
{
width: 86px;
height: 80px;
background-image: url('../images/firefox.png');
}
#opera_logo
{
width: 73px;
height: 78px;
background-image: url('../images/opera.png');
}
#safari_logo
{
width: 78px;
height: 79px;
background-image: url('../images/safari.png');
}
#ie_logo
{
width: 80px;
height: 78px;
background-image: url('../images/ie.png');
}

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)

25
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,24 @@ 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
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
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,4 +1,4 @@
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,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/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
@@ -89,6 +127,7 @@ case "$1" in
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.resourceBase=/usr/share/jitsi-meet" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.alias./config.js=/etc/jitsi/meet/$JVB_HOSTNAME-config.js" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.alias./interface_config.js=/usr/share/jitsi-meet/interface_config.js" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.ResourceHandler.alias./logging_config.js=/usr/share/jitsi-meet/logging_config.js" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.RewriteHandler.regex=^/([a-zA-Z0-9]+)$" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.RewriteHandler.replacement=/" >> $JVB_CONFIG
echo "org.jitsi.videobridge.rest.jetty.SSIResourceHandler.paths=/" >> $JVB_CONFIG
@@ -112,34 +151,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 +172,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-config/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 +180,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-config/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.

1
debian/jitsi-meet-web.docs vendored Normal file
View File

@@ -0,0 +1 @@
README.md

View File

@@ -4,7 +4,6 @@
*.ico /usr/share/jitsi-meet/
libs /usr/share/jitsi-meet/
css/all.css /usr/share/jitsi-meet/css/
css/unsupported_browser.css /usr/share/jitsi-meet/css/
sounds /usr/share/jitsi-meet/
fonts /usr/share/jitsi-meet/
images /usr/share/jitsi-meet/

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

@@ -1,17 +1,17 @@
Jitsi Meet API
============
# Jitsi Meet API
You can use Jitsi Meet API to embed Jitsi Meet in to your application.
You can use the Jitsi Meet API to embed Jitsi Meet in to your application.
Installation
==========
## Installation
To embed Jitsi Meet in your application you need to add the Jitsi Meet API library:
To embed Jitsi Meet in your application you need to add Jitsi Meet API library
```javascript
<script src="https://meet.jit.si/external_api.js"></script>
```
The next step for embedding Jitsi Meet is to create the Jitsi Meet API object
The next step for embedding Jitsi Meet is to create the Jitsi Meet API object:
```javascript
<script>
var domain = "meet.jit.si";
@@ -21,161 +21,174 @@ The next step for embedding Jitsi Meet is to create the Jitsi Meet API object
var api = new JitsiMeetExternalAPI(domain, room, width, height);
</script>
```
You can paste that lines in your html code where you want to be placed the Jitsi Meet conference
or you can specify the parent HTML element for the Jitsi Meet conference in the JitsiMeetExternalAPI
constructor.
You can use the above lines to indicate where exactly you want the Jitsi Meet conference to be placed in your HTML code,
or you can specify the parent HTML element for the Jitsi Meet conference in the `JitsiMeetExternalAPI`
constructor:
```javascript
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement);
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement);
```
If you don't specify room the user will enter in new conference with random room name.
You can overwrite options set in config.js and interface_config.js. For example, to enable the film-strip-only interface mode and disable simulcast, you can use:
If you don't specify the room the user will enter in new conference with a random room name.
You can overwrite options set in [config.js]() and [interface_config.js](). For example, to enable the film-strip-only interface mode and disable simulcast, you can use:
```javascript
var configOverwrite = {enableSimulcast: false};
var interfaceConfigOverwrite = {filmStripOnly: true};
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement, true, configOverwrite, interfaceConfigOverwrite);
var configOverwrite = {disableSimulcast: true};
var interfaceConfigOverwrite = {filmStripOnly: true};
var api = new JitsiMeetExternalAPI(domain, room, width, height, htmlElement, configOverwrite, interfaceConfigOverwrite);
```
Controlling embedded Jitsi Meet Conference
=========
## Controlling the embedded Jitsi Meet Conference
You can control the embedded Jitsi Meet conference using the JitsiMeetExternalAPI object.
You can control the embedded Jitsi Meet conference using the `JitsiMeetExternalAPI` object by using `executeCommand`:
You can send command to Jitsi Meet conference using ```executeCommand```.
```
api.executeCommand(command, arguments)
```
The ```command``` parameter is String object with the name of the command.
The ```arguments``` parameter is array with the arguments required by the command.
If no arguments are required by the command this parameter can be omitted or you can pass empty array.
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']);
```
* **toggleAudio** - mutes / unmutes the audio for the local participant. No arguments are required.
```
api.executeCommand('toggleAudio', [])
```
* **toggleVideo** - mutes / unmutes the video for the local participant. No arguments are required.
```
api.executeCommand('toggleVideo', [])
```
* **toggleFilmStrip** - hides / shows the film strip. No arguments are required.
```
api.executeCommand('filmStrip', [])
```
* **toggleChat** - hides / shows the chat. No arguments are required.
```
api.executeCommand('toggleChat', [])
```
* **toggleContactList** - hides / shows the contact list. No arguments are required.
```
api.executeCommand('toggleContactList', [])
```javascript
api.executeCommand(command, ...arguments)
```
* **toggleShareScreen** - starts / stops the screen sharing. No arguments are required.
The `command` parameter is String object with the name of the command. The following commands are currently supported:
* **displayName** - Sets the display name of the local participant. This command requires one argument - the new display name to be set.
```javascript
api.executeCommand('displayName', 'New Nickname');
```
api.executeCommand('toggleShareScreen', [])
* **toggleAudio** - Mutes / unmutes the audio for the local participant. No arguments are required.
```javascript
api.executeCommand('toggleAudio')
```
* **toggleVideo** - Mutes / unmutes the video for the local participant. No arguments are required.
```javascript
api.executeCommand('toggleVideo')
```
* **toggleFilmStrip** - Hides / shows the film strip. No arguments are required.
```javascript
api.executeCommand('toggleFilmStrip')
```
* **toggleChat** - Hides / shows the chat. No arguments are required.
```javascript
api.executeCommand('toggleChat')
```
* **toggleContactList** - Hides / shows the contact list. No arguments are required.
```javascript
api.executeCommand('toggleContactList')
```
* **toggleShareScreen** - Starts / stops screen sharing. No arguments are required.
```javascript
api.executeCommand('toggleShareScreen')
```
* **hangup** - Hangups the call. No arguments are required.
```
api.executeCommand('hangup', [])
```javascript
api.executeCommand('hangup')
```
You can also execute multiple commands using the method ```executeCommands```.
* **email** - Changes the local email address. This command requires one argument - the new email address to be set.
```javascript
api.executeCommand('email', 'example@example.com')
```
* **avatarUrl** - Changes the local avatar URL. This command requires one argument - the new avatar URL to be set.
```javascript
api.executeCommand('avatarUrl', 'https://avatars0.githubusercontent.com/u/3671647')
```
You can also execute multiple commands using the `executeCommands` method:
```javascript
api.executeCommands(commands)
```
The ```commands``` parameter is object with keys the names of the commands and values the arguments for the
commands.
```
The `commands` parameter is an object with the names of the commands as keys and the arguments for the commands asvalues:
```javascript
api.executeCommands({displayName: ['nickname'], toggleAudio: []});
```
You can add event listeners to the embedded Jitsi Meet using ```addEventListener``` method.
```
You can add event listeners to the embedded Jitsi Meet using the `addEventListener` method.
```javascript
api.addEventListener(event, listener)
```
The ```event``` parameter is String object with the name of the event.
The ```listener``` paramenter is Function object with one argument that will be notified when the event occurs
with data related to the event.
Currently we support the following events:
The `event` parameter is a String object with the name of the event.
The `listener` parameter is a Function object with one argument that will be notified when the event occurs with data related to the event.
* **incomingMessage** - event notifications about incoming
messages. The listener will receive object with the following structure:
```
The following events are currently supported:
* **incomingMessage** - Event notifications about incoming
messages. The listener will receive an object with the following structure:
```javascript
{
"from": from,//JID of the user that sent the message
"nick": nick,//the nickname of the user that sent the message
"message": txt//the text of the message
"from": from, // JID of the user that sent the message
"nick": nick, // the nickname of the user that sent the message
"message": txt // the text of the message
}
```
* **outgoingMessage** - event notifications about outgoing
messages. The listener will receive object with the following structure:
```
* **outgoingMessage** - Event notifications about outgoing
messages. The listener will receive an object with the following structure:
```javascript
{
"message": txt//the text of the message
"message": txt // the text of the message
}
```
* **displayNameChanged** - event notifications about display name
change. The listener will receive object with the following structure:
```
changes. The listener will receive an object with the following structure:
```javascript
{
jid: jid,//the JID of the participant that changed his display name
displayname: displayName //the new display name
"jid": jid, // the JID of the participant that changed his display name
"displayname": displayName // the new display name
}
```
* **participantJoined** - event notifications about new participant.
The listener will receive object with the following structure:
```
* **participantJoined** - event notifications about new participants who join the room. The listener will receive an object with the following structure:
```javascript
{
jid: jid //the jid of the participant
"jid": jid // the JID of the participant
}
```
* **participantLeft** - event notifications about participant that left room.
The listener will receive object with the following structure:
```
* **participantLeft** - event notifications about participants that leave the room. The listener will receive an object with the following structure:
```javascript
{
jid: jid //the jid of the participant
"jid": jid // the JID of the participant
}
```
* **video-conference-joined** - event notifications fired when the local user has joined the video conference.
The listener will receive object with the following structure:
```
* **videoConferenceJoined** - event notifications fired when the local user has joined the video conference. The listener will receive an object with the following structure:
```javascript
{
roomName: room //the room name of the conference
"roomName": room // the room name of the conference
}
```
* **video-conference-left** - event notifications fired when the local user has left the video conference.
The listener will receive object with the following structure:
```
* **videoConferenceLeft** - event notifications fired when the local user has left the video conference. The listener will receive an object with the following structure:
```javascript
{
roomName: room //the room name of the conference
"roomName": room // the room name of the conference
}
```
* **readyToClose** - event notification fired when Jitsi Meet is ready to be closed (hangup operations are completed).
You can also add multiple event listeners by using ```addEventListeners```.
You can also add multiple event listeners by using `addEventListeners`.
This method requires one argument of type Object. The object argument must
have keys with the names of the events and values the listeners of the events.
have the names of the events as keys and the listeners of the events as values.
```
```javascript
function incomingMessageListener(object)
{
...
// ...
}
function outgoingMessageListener(object)
{
...
// ...
}
api.addEventListeners({
@@ -183,20 +196,28 @@ api.addEventListeners({
outgoingMessage: outgoingMessageListener})
```
If you want to remove a listener you can use ```removeEventListener``` method with argument the name of the event.
```
If you want to remove a listener you can use `removeEventListener` method with argument the name of the event.
```javascript
api.removeEventListener("incomingMessage");
```
If you want to remove more than one event you can use ```removeEventListeners``` method with argument
array with the names of the events.
```
If you want to remove more than one event you can use `removeEventListeners` method with an Array with the names of the events as an argument.
```javascript
api.removeEventListeners(["incomingMessage", "outgoingMessageListener"]);
```
You can remove the embedded Jitsi Meet Conference with the following code:
You can get the number of participants in the conference with the following API function:
```javascript
var numberOfParticipants = api.getNumberOfParticipants();
```
You can remove the embedded Jitsi Meet Conference with the following API function:
```javascript
api.dispose()
```
It is a good practice to remove the conference before the page is unloaded.
NOTE: It's a good practice to remove the conference before the page is unloaded.
[config.js]: https://github.com/jitsi/jitsi-meet/blob/master/config.js
[interface_config.js]: https://github.com/jitsi/jitsi-meet/blob/master/interface_config.js

View File

@@ -15,8 +15,8 @@ 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;

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>

22
doc/examples/api.html Normal file
View File

@@ -0,0 +1,22 @@
<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="utf-8">
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<script src="https://meet.jit.si/external_api.js"></script>
<script>
var domain = "meet.jit.si";
var room = "JitsiMeetAPIExample";
var width = 700;
var height = 180;
var htmlElement = undefined;
var configOverwrite = {};
var interfaceConfigOverwrite = {
filmStripOnly: true
};
var api = new JitsiMeetExternalAPI(domain, room, width, height,
htmlElement, configOverwrite, interfaceConfigOverwrite);
</script>
</body>
</html>

View File

@@ -131,9 +131,9 @@ Or autostart it by adding the line in `/etc/rc.local`:
## Install Jitsi Conference Focus (jicofo)
Install JDK and Ant if missing:
Install JDK and Maven if missing:
```
apt-get install default-jdk ant
apt-get install default-jdk maven
```
_NOTE: When installing on older Debian releases keep in mind that you need JDK >= 1.7._
@@ -145,12 +145,14 @@ git clone https://github.com/jitsi/jicofo.git
Build distribution package. Replace {os-name} with one of: 'lin', 'lin64', 'macosx', 'win', 'win64'.
```sh
cd jicofo
ant dist.{os-name}
mvn package -DskipTests -Dassembly.skipAssembly=false
```
Run jicofo:
```sh
cd dist/{os-name}'
./jicofo.sh --domain=jitsi.example.com --secret=YOURSECRET2 --user_domain=auth.jitsi.example.com --user_name=focus --user_password=YOURSECRET3
=======
unzip target/jicofo-{os-name}-1.0-SNAPSHOT.zip
cd jicofo-{os-name}-1.0-SNAPSHOT'
./jicofo.sh --host=localhost --domain=jitsi.example.com --secret=YOURSECRET2 --user_domain=auth.jitsi.example.com --user_name=focus --user_password=YOURSECRET3
```
## Deploy Jitsi Meet
@@ -159,6 +161,8 @@ Checkout and configure Jitsi Meet:
cd /srv
git clone https://github.com/jitsi/jitsi-meet.git
mv jitsi-meet/ jitsi.example.com
npm install
make
```
Edit host names in `/srv/jitsi.example.com/config.js` (see also the example config file):
@@ -167,11 +171,11 @@ var config = {
hosts: {
domain: 'jitsi.example.com',
muc: 'conference.jitsi.example.com',
bridge: 'jitsi-videobridge.jitsi.example.com'
bridge: 'jitsi-videobridge.jitsi.example.com',
focus: 'focus.jitsi.example.com'
},
useNicks: false,
bosh: '//jitsi.example.com/http-bind', // FIXME: use xep-0156 for that
desktopSharing: 'false' // Desktop sharing method. Can be set to 'ext', 'webrtc' or false to disable.
//chromeExtensionId: 'diibjkoicjeejcmhdnailmkgecihlobk', // Id of desktop streamer Chrome extension
//minChromeExtVersion: '0.1' // Required version of Chrome extension
};

94
doc/mobile.md Normal file
View File

@@ -0,0 +1,94 @@
# Jitsi Meet mobile apps
Jitsi Meet can also be built as a standalone mobile application for
iOS and Android. It uses the [React Native]() framework.
First make sure the [React Native dependencies]() are installed.
**NOTE**: This document assumes the app is being built on a macOS system.
**NOTE**: The app must be built for an actual device since the simulators don't
work properly with the native plugins we require.
## iOS
1. Install some extra dependencies
- Install ios-deploy globally (in case you want to use the React Native CLI
to deploy the app to the device)
```bash
npm install -g ios-deploy
```
2. Build the app
There are 2 ways to build the app: using the CLI or using Xcode.
Using the CLI:
```bash
react-native run-ios --device
```
When the app is launched from the CLI the output can be checked with the
following command:
```bash
react-native log-ios
```
Using Xcode
- Open **ios/jitsi-meet-react.xcworkspace** in Xcode. Make sure it's the
workspace file!
- Select your device from the top bar and hit the "play" button.
When the app is launched from Xcode the Debug console will show the output
logs the application creates.
3. Other remarks
It's likely you'll need to change the bundle ID for deploying to a device
because the default bundle ID points to the application signed by Atlassian.
This can be changed in the "General" tab. Under "Identity" set
"Bundle Identifier" to a different value, and adjust the "Team" in the
"Signing" section to match your own.
## Android
The [React Native dependencies]() page has very detailed information on how to
setup [Android Studio]() and the required components for getting the necessary
build environment. Make sure you follow it closely.
1. Building the app
The app can be built using the CLI utility as follows:
```bash
react-native run-android
```
It will be launched on the connected Android device.
## Debugging
The official documentation on [debugging]() is quite extensive, it is the
preferred method for debugging.
**NOTE**: When using Chrome Developer Tools for debugging the JavaScript code
is being interpreted by Chrome's V8 engine, instead of JSCore which
React Native uses. It's important to keep this in mind due to potential
differences in supported JavaScript features.
[Android Studio]: https://developer.android.com/studio/index.html
[debugging]: https://facebook.github.io/react-native/docs/debugging.html
[React Native]: https://facebook.github.io/react-native/
[React Native dependencies]: https://facebook.github.io/react-native/docs/getting-started.html#installing-dependencies

6
flow-typed/npm/flow-bin_v0.x.x.js vendored Normal file
View File

@@ -0,0 +1,6 @@
// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583
// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x
declare module "flow-bin" {
declare module.exports: string;
}

89
flow-typed/npm/react-redux_v5.x.x.js vendored Normal file
View File

@@ -0,0 +1,89 @@
// flow-typed signature: 0ed284c5a2e97a9e3c0e87af3dedc09d
// flow-typed version: bdf1e66252/react-redux_v5.x.x/flow_>=v0.30.x
import type { Dispatch, Store } from 'redux'
declare module 'react-redux' {
/*
S = State
A = Action
OP = OwnProps
SP = StateProps
DP = DispatchProps
*/
declare type MapStateToProps<S, OP: Object, SP: Object> = (state: S, ownProps: OP) => SP | MapStateToProps<S, OP, SP>;
declare type MapDispatchToProps<A, OP: Object, DP: Object> = ((dispatch: Dispatch<A>, ownProps: OP) => DP) | DP;
declare type MergeProps<SP, DP: Object, OP: Object, P: Object> = (stateProps: SP, dispatchProps: DP, ownProps: OP) => P;
declare type StatelessComponent<P> = (props: P) => ?React$Element<any>;
declare class ConnectedComponent<OP, P, Def, St> extends React$Component<void, OP, void> {
static WrappedComponent: Class<React$Component<Def, P, St>>;
getWrappedInstance(): React$Component<Def, P, St>;
static defaultProps: void;
props: OP;
state: void;
}
declare type ConnectedComponentClass<OP, P, Def, St> = Class<ConnectedComponent<OP, P, Def, St>>;
declare type Connector<OP, P> = {
(component: StatelessComponent<P>): ConnectedComponentClass<OP, P, void, void>;
<Def, St>(component: Class<React$Component<Def, P, St>>): ConnectedComponentClass<OP, P, Def, St>;
};
declare class Provider<S, A> extends React$Component<void, { store: Store<S, A>, children?: any }, void> { }
declare type ConnectOptions = {
pure?: boolean,
withRef?: boolean
};
declare type Null = null | void;
declare function connect<A, OP>(
...rest: Array<void> // <= workaround for https://github.com/facebook/flow/issues/2360
): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;
declare function connect<A, OP>(
mapStateToProps: Null,
mapDispatchToProps: Null,
mergeProps: Null,
options: ConnectOptions
): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;
declare function connect<S, A, OP, SP>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: Null,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<SP & { dispatch: Dispatch<A> } & OP>>;
declare function connect<A, OP, DP>(
mapStateToProps: Null,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<DP & OP>>;
declare function connect<S, A, OP, SP, DP>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<SP & DP & OP>>;
declare function connect<S, A, OP, SP, DP, P>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: MergeProps<SP, DP, OP, P>,
options?: ConnectOptions
): Connector<OP, P>;
}

56
flow-typed/npm/redux_v3.x.x.js vendored Normal file
View File

@@ -0,0 +1,56 @@
// flow-typed signature: ba132c96664f1a05288f3eb2272a3c35
// flow-typed version: c4bbd91cfc/redux_v3.x.x/flow_>=v0.33.x
declare module 'redux' {
/*
S = State
A = Action
*/
declare type Dispatch<A: { type: $Subtype<string> }> = (action: A) => A;
declare type MiddlewareAPI<S, A> = {
dispatch: Dispatch<A>;
getState(): S;
};
declare type Store<S, A> = {
// rewrite MiddlewareAPI members in order to get nicer error messages (intersections produce long messages)
dispatch: Dispatch<A>;
getState(): S;
subscribe(listener: () => void): () => void;
replaceReducer(nextReducer: Reducer<S, A>): void
};
declare type Reducer<S, A> = (state: S, action: A) => S;
declare type Middleware<S, A> =
(api: MiddlewareAPI<S, A>) =>
(next: Dispatch<A>) => Dispatch<A>;
declare type StoreCreator<S, A> = {
(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
(reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
};
declare type StoreEnhancer<S, A> = (next: StoreCreator<S, A>) => StoreCreator<S, A>;
declare function createStore<S, A>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
declare function createStore<S, A>(reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
declare function applyMiddleware<S, A>(...middlewares: Array<Middleware<S, A>>): StoreEnhancer<S, A>;
declare type ActionCreator<A, B> = (...args: Array<B>) => A;
declare type ActionCreators<K, A> = { [key: K]: ActionCreator<A, any> };
declare function bindActionCreators<A, C: ActionCreator<A, any>>(actionCreator: C, dispatch: Dispatch<A>): C;
declare function bindActionCreators<A, K, C: ActionCreators<K, A>>(actionCreators: C, dispatch: Dispatch<A>): C;
declare function combineReducers<O: Object, A>(reducers: O): Reducer<$ObjMap<O, <S>(r: Reducer<S, any>) => S>, A>;
declare function compose<S, A>(...fns: Array<StoreEnhancer<S, A>>): Function;
}

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