Compare commits

...

50 Commits

Author SHA1 Message Date
Saúl Ibarra Corretgé
9148d1262d misc: s/Atlassian/8x8/ 2019-03-29 13:09:15 +01:00
Leonard Kim
3b911b0362 chore(deps): bump lib-jitsi-meet for permissions api fixes 2019-03-28 08:47:42 -05:00
Philip-Choi
7ae8ae5791 doc: update README 2019-03-28 09:46:03 +01:00
paweldomas
a386740103 fix(ConnectionService): history and audio focus on Samsung devices
On some Samsung devices the call done with the ConnectionService end up
in the native call history which we don't want. That's fixable by
marking the Connection as "external" just before the call is
disconnected.

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

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

The component gets the state itself from redux.

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

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

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

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

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

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

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

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

Note how the `type` field is defined as a subtype of string, which Symbol isn’t.
2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
75527e01dd deps: update lib-jitsi-meet 2019-03-21 14:47:55 +01:00
Saúl Ibarra Corretgé
b53a034aaf deps: update React Native to version 0.59
This new version comes with an updated JSC runtime, so we no longer need to
depend on the updated version ourselves.
2019-03-21 14:47:55 +01:00
paweldomas
4d1c0cf219 fix eslint error 2019-03-19 21:59:45 +01:00
virtuacoplenny
a667c9bff2 ref: js-utils for random and room name generator (#3975) 2019-03-19 10:35:36 -07:00
Damien Fetis
e652117571 Remove the boolean conversion of authLogin string to display the string value instead of 'true'. (#3995) 2019-03-19 08:55:14 -07:00
354 changed files with 3677 additions and 3031 deletions

View File

@@ -33,7 +33,6 @@
[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow/
node_modules/react-native/flow-github/
[options]
emoji=true
@@ -83,4 +82,4 @@ module.file_ext=.jsx
module.file_ext=.json
[version]
^0.78.0
^0.92.0

2
.gitignore vendored
View File

@@ -86,4 +86,6 @@ android/.settings/org.eclipse.buildship.core.prefs
# Secrets
android/app/dropbox.key
android/app/google-services.json
ios/app/dropbox.key
ios/app/GoogleService-Info.plist

View File

@@ -13,7 +13,7 @@ Found a bug and know how to fix it? Great! Please read on.
## Contributor License Agreement
While the Jitsi projects are released under the
[Apache License 2.0](https://github.com/jitsi/jitsi-meet/blob/master/LICENSE), the copyright
holder and principal creator is [Atlassian](https://www.atlassian.com/). To
holder and principal creator is [8x8](https://www.8x8.com/). To
ensure that we can continue making these projects available under an Open Source license,
we need you to sign our Apache-based contributor
license agreement as either a [corporation](https://jitsi.org/ccla) or an

View File

@@ -1,16 +1,16 @@
# Jitsi Meet - Secure, Simple and Scalable Video Conferences
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](#security) and scalable video conferences. You can see Jitsi Meet in action [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](#security) and scalable video conferences. Jitsi Meet in action can be seen at [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
The Jitsi Meet client runs in your browser, without the need for installing anything on your computer. You can also try it out yourself at https://meet.jit.si .
The Jitsi Meet client runs in your browser, without installing anything on your computer. You can try it out at https://meet.jit.si .
Jitsi Meet allows for very efficient collaboration. It allows users to stream their desktop or only some windows. It also supports shared document editing with Etherpad.
Jitsi Meet allows very efficient collaboration. Users can stream their desktop or only some windows. It also supports shared document editing with Etherpad.
## Installation
On the client side, no installation is necessary. You just point your browser to the URL of your deployment. This section is about installing the Jitsi Meet suite on your server and hosting your own conferencing service.
On the client side, no installation is necessary. You just point your browser to the URL of your deployment. This section is about installing a Jitsi Meet suite on your server and hosting your own conferencing service.
Installing Jitsi Meet is quite a simple experience. For Debian-based systems, we recommend following the [quick-install](https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md) document, which uses the package system. You can also see a demonstration of the process in [this tutorial video](https://jitsi.org/tutorial).
Installing Jitsi Meet is a simple experience. For Debian-based system, following the [quick-install](https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md) document, which uses the package system. You can also see a demonstration of the process in [this tutorial video](https://jitsi.org/tutorial).
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).
@@ -59,7 +59,7 @@ To work with local copy you must change the path to:
"lib-jitsi-meet": "file:///Users/name/local-lib-jitsi-meet-copy",
```
To make the project you must force it to take the sources as 'npm update' will not do it.
To make the project you must force it to take the sources as 'npm update':
```
npm install lib-jitsi-meet --force && make
```
@@ -84,8 +84,8 @@ cd ../jitsi-meet
npm link lib-jitsi-meet
```
So now after changes in local `lib-jitsi-meet` repository you can rebuild it with `npm run install` and your `jitsi-meet` repository will use that modified library.
Note: when using node version 4.x, the make file of jitsi-meet do npm update which will delete the link, no longer the case with version 6.x.
After changes in local `lib-jitsi-meet` repository, you can rebuild it with `npm run install` and your `jitsi-meet` repository will use that modified library.
Note: when using node version 4.x, the make file of jitsi-meet do npm update which will delete the link. It is no longer the case with version 6.x.
If you do not want to use local repository anymore you should run
```bash
@@ -100,7 +100,7 @@ Use it at the CLI, type
make dev
```
By default the backend deployment used is `beta.meet.jit.si`, you can point the Jitsi-Meet app at a different backend by using a proxy server. To do this set the WEBPACK_DEV_SERVER_PROXY_TARGET variable:
By default the backend deployment used is `beta.meet.jit.si`. You can point the Jitsi-Meet app at a different backend by using a proxy server. To do this, set the WEBPACK_DEV_SERVER_PROXY_TARGET variable:
```
export WEBPACK_DEV_SERVER_PROXY_TARGET=https://your-example-server.com
make dev
@@ -115,18 +115,16 @@ see our [guidelines for contributing](CONTRIBUTING.md).
## Embedding in external applications
Jitsi Meet provides a very flexible way of embedding it in external applications by using the [Jitsi Meet API](doc/api.md).
Jitsi Meet provides a very flexible way of embedding in external applications by using the [Jitsi Meet API](doc/api.md).
## Security
WebRTC today does not provide a way of conducting multiparty conversations with
end-to-end encryption. As a matter of fact, unless you consistently vocally
compare DTLS fingerprints with your peers, the same goes for one-to-one calls.
As a result when using a Jitsi Meet instance, your stream is encrypted on the
network but decrypted on the machine that hosts the bridge.
WebRTC does not provide a way of conducting multi-party conversations with end-to-end encryption.
Unless you consistently compare DTLS fingerprints with your peers vocally, the same goes for one-to-one calls.
As a result, your stream is encrypted on the network but decrypted on the machine that hosts the bridge when using Jitsi Meet.
The Jitsi Meet architecture allows you to deploy your own version, including
all server components, and in that case your security guarantees will be roughly
equivalent to these of a direct one-to-one WebRTC call. This is what's unique to
all server components. In that case, your security guarantees will be roughly
equivalent to a direct one-to-one WebRTC call. This is the uniqueness of
Jitsi Meet in terms of security.
The [meet.jit.si](https://meet.jit.si) service is maintained by the Jitsi team
@@ -138,4 +136,4 @@ Instructions on how to build it can be found [here](doc/mobile.md).
## Acknowledgements
Jitsi Meet started out as a sample conferencing application using Jitsi Videobridge. It was originally developed by then ESTOS' developer Philipp Hancke who then contributed it to the community where development continues with joint forces!
Jitsi Meet started out as a sample conferencing application using Jitsi Videobridge. It was originally developed by ESTOS' developer Philipp Hancke who then contributed it to the community where development continues with joint forces!

View File

@@ -33,19 +33,6 @@ dependencies {
}
```
Also, enable 32bit mode for react-native, since the react-native version we currently depend on only supports 32bit apps. (If you have a 64bit device, it will not run unless this setting it set).
```gradle
android {
...
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
...
```
### Build and use your own SDK artifacts/binaries
<details>
@@ -69,10 +56,6 @@ To copy React Native to your local Maven repository, you can simply copy part of
$ cp -r ../node_modules/react-native/android/com /tmp/repo/
In the same way, copy the JavaScriptCore dependency:
$ cp -r ../node_modules/jsc-android/dist/org /tmp/repo/
Alternatively, you can use the scripts located in the android/scripts directory to publish these dependencies to your Maven repo.
Third-party React Native _modules_, which Jitsi Meet SDK for Android depends on, are download by NPM in source code form. These need to be assembled into Maven artifacts, and then published to your local Maven repository. The SDK project facilitates this.

View File

@@ -8,6 +8,11 @@ if (googleServicesEnabled) {
apply plugin: 'io.fabric'
}
// Use the number of seconds/10 since Jan 1 2019 as the versionCode.
// This lets us upload a new build at most every 10 seconds for the
// next ~680 years.
// https://stackoverflow.com/a/38643838
def vcode = (int)(((new Date().getTime()/1000) - 1546297200) / 10)
android {
compileSdkVersion rootProject.ext.compileSdkVersion
@@ -15,24 +20,14 @@ android {
defaultConfig {
applicationId 'org.jitsi.meet'
versionCode Integer.parseInt(project.buildNumber)
versionCode vcode
versionName project.appVersion
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
packagingOptions {
// The project react-native does not provide 64-bit binaries at the
// time of this writing. Unfortunately, packaging any 64-bit
// binaries into the .apk will crash the app at runtime on 64-bit
// platforms.
exclude '/lib/mips64/**'
exclude '/lib/arm64-v8a/**'
exclude '/lib/x86_64/**'
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
@@ -114,7 +109,7 @@ gradle.projectsEvaluated {
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast {
output.getProcessManifestProvider().get().doLast {
def outputDir = manifestOutputDirectory.get().asFile
def manifestPath = new File(outputDir, 'AndroidManifest.xml')
def charset = 'UTF-8'
@@ -126,6 +121,41 @@ gradle.projectsEvaluated {
}
}
}
// Run React packager
android.applicationVariants.all { variant ->
def targetName = variant.name.capitalize()
def currentRunPackagerTask = tasks.create(
name: "run${targetName}ReactPackager",
type: Exec) {
group = "react"
description = "Run the React packager."
doFirst {
println "Starting the React packager..."
def androidRoot = file("${projectDir}/../")
// Set up the call to the script
workingDir androidRoot
// Run the packager
commandLine("scripts/run-packager.sh")
}
// Set up dev mode
def devEnabled = !targetName.toLowerCase().contains("release")
// Only enable for dev builds
enabled devEnabled
}
def packageTask = variant.packageApplicationProvider.get()
packageTask.dependsOn(currentRunPackagerTask)
}
}
if (googleServicesEnabled) {

View File

@@ -120,6 +120,7 @@ public class MainActivity extends JitsiMeetActivity {
&& canRequestOverlayPermission()) {
if (Settings.canDrawOverlays(this)) {
initialize();
return;
}
throw new RuntimeException("Overlay permission is required when running in Debug mode.");

View File

@@ -25,7 +25,6 @@ allprojects {
repositories {
google()
jcenter()
maven { url "$rootDir/../node_modules/jsc-android/dist" }
// React Native (JS, Obj-C sources, Android binaries) is installed from
// npm.
maven { url "$rootDir/../node_modules/react-native/android" }
@@ -42,12 +41,6 @@ allprojects {
def version = new JsonSlurper().parseText(file.text).version
details.useVersion version
}
if (details.requested.group == 'org.webkit'
&& details.requested.name == 'android-jsc') {
def file = new File("$rootDir/../node_modules/jsc-android/package.json")
def version = new JsonSlurper().parseText(file.text).version
details.useVersion "r${version.tokenize('.')[0]}"
}
}
}
}

2
android/fastlane/Appfile Normal file
View File

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

34
android/fastlane/Fastfile Normal file
View File

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

View File

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

View File

@@ -17,6 +17,5 @@
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
buildNumber=1
appVersion=19.1.0
sdkVersion=2.0.0

View File

@@ -1,17 +0,0 @@
#!/bin/bash
CWD=$(dirname $0)
MVN_REPO=$(realpath $1)
JSC_VERSION="r"$(jq -r '.dependencies."jsc-android"' ${CWD}/../../package.json | cut -d . -f 1)
pushd ${CWD}/../../node_modules/jsc-android/dist/org/webkit/android-jsc/${JSC_VERSION}
mvn \
deploy:deploy-file \
-Durl=file://${MVN_REPO} \
-Dfile=android-jsc-${JSC_VERSION}.aar \
-Dpackaging=aar \
-DgeneratePom=false \
-DpomFile=android-jsc-${JSC_VERSION}.pom
popd

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

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

View File

@@ -24,7 +24,6 @@ dependencies {
implementation "com.android.support:support-v4:${rootProject.ext.supportLibVersion}"
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
implementation 'org.webkit:android-jsc:+'
implementation 'com.amplitude:android-sdk:2.14.1'
implementation 'com.dropbox.core:dropbox-core-sdk:3.0.8'
api 'com.facebook.react:react-native:+'

View File

@@ -27,7 +27,14 @@
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<activity android:name=".JitsiMeetActivity"></activity>
<activity
android:name=".JitsiMeetActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:windowSoftInputMode="adjustResize">
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<service

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.jitsi.meet.sdk.analytics;
package org.jitsi.meet.sdk;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@@ -22,6 +22,7 @@ import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.amplitude.api.Amplitude;
import com.facebook.react.module.annotations.ReactModule;
import org.json.JSONException;
import org.json.JSONObject;
@@ -29,9 +30,12 @@ import org.json.JSONObject;
/**
* Implements the react-native module for the Amplitude integration.
*/
public class AmplitudeModule
@ReactModule(name = AmplitudeModule.NAME)
class AmplitudeModule
extends ReactContextBaseJavaModule {
public static final String NAME = "Amplitude";
public AmplitudeModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@@ -71,9 +75,8 @@ public class AmplitudeModule
*/
@ReactMethod
public void logEvent(String instanceName, String eventType, String eventPropsString) {
JSONObject eventProps = null;
try {
eventProps = new JSONObject(eventPropsString);
JSONObject eventProps = new JSONObject(eventPropsString);
Amplitude.getInstance(instanceName).logEvent(eventType, eventProps);
} catch (JSONException e) {
e.printStackTrace();
@@ -82,6 +85,6 @@ public class AmplitudeModule
@Override
public String getName() {
return "Amplitude";
return NAME;
}
}

View File

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

View File

@@ -23,13 +23,17 @@ import android.content.pm.PackageManager;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.module.annotations.ReactModule;
import java.util.HashMap;
import java.util.Map;
@ReactModule(name = AppInfoModule.NAME)
class AppInfoModule
extends ReactContextBaseJavaModule {
public static final String NAME = "AppInfo";
public AppInfoModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@@ -74,6 +78,6 @@ class AppInfoModule
@Override
public String getName() {
return "AppInfo";
return NAME;
}
}

View File

@@ -35,6 +35,7 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import java.util.HashMap;
import java.util.HashSet;
@@ -58,9 +59,12 @@ import java.util.concurrent.Executors;
* Before a call has started and after it has ended the
* {@code AudioModeModule.DEFAULT} mode should be used.
*/
@ReactModule(name = AudioModeModule.NAME)
class AudioModeModule extends ReactContextBaseJavaModule
implements AudioManager.OnAudioFocusChangeListener {
public static final String NAME = "AudioMode";
/**
* Constants representing the audio mode.
* - DEFAULT: Used before and after every call. It represents the default
@@ -89,16 +93,10 @@ class AudioModeModule extends ReactContextBaseJavaModule
*/
private static final int TYPE_USB_HEADSET = 22;
/**
* The name of {@code AudioModeModule} to be used in the React Native
* bridge.
*/
private static final String MODULE_NAME = "AudioMode";
/**
* The {@code Log} tag {@code AudioModeModule} is to log messages with.
*/
static final String TAG = MODULE_NAME;
static final String TAG = NAME;
/**
* Converts any of the "DEVICE_" constants into the corresponding
@@ -160,7 +158,7 @@ class AudioModeModule extends ReactContextBaseJavaModule
/**
* Whether or not the ConnectionService is used for selecting audio devices.
*/
private static boolean useConnectionService() {
static boolean useConnectionService() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
}
@@ -297,9 +295,9 @@ class AudioModeModule extends ReactContextBaseJavaModule
= (AudioManager)
reactContext.getSystemService(Context.AUDIO_SERVICE);
// Starting Oreo the ConnectionImpl from ConnectionService us used to
// Starting Oreo the ConnectionImpl from ConnectionService is used to
// detect the available devices.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
if (!useConnectionService()) {
// Setup runtime device change detection.
setupAudioRouteChangeDetection();
@@ -373,7 +371,7 @@ class AudioModeModule extends ReactContextBaseJavaModule
*/
@Override
public String getName() {
return MODULE_NAME;
return NAME;
}
/**

View File

@@ -81,6 +81,13 @@ public class ConnectionService extends android.telecom.ConnectionService {
return new ArrayList<>(connections.values());
}
/**
* @return {@code true} if running a Samsung device.
*/
static boolean isSamsungDevice() {
return android.os.Build.MANUFACTURER.toLowerCase().contains("samsung");
}
/**
* Registers a start call promise.
*
@@ -129,6 +136,14 @@ public class ConnectionService extends android.telecom.ConnectionService {
ConnectionImpl connection = connections.get(callUUID);
if (connection != null) {
if (isSamsungDevice()) {
// Required to release the audio focus correctly.
connection.setOnHold();
// Prevents from including in the native phone calls history
connection.setConnectionProperties(
Connection.PROPERTY_SELF_MANAGED
| Connection.PROPERTY_IS_EXTERNAL_CALL);
}
// Note that the connection is not removed from the list here, but
// in ConnectionImpl's state changed callback. It's a safer
// approach, because in case the app would crash on the JavaScript
@@ -189,8 +204,11 @@ public class ConnectionService extends android.telecom.ConnectionService {
connection.setConnectionProperties(Connection.PROPERTY_SELF_MANAGED);
connection.setAddress(
request.getAddress(),
TelecomManager.PRESENTATION_ALLOWED);
TelecomManager.PRESENTATION_UNKNOWN);
connection.setExtras(request.getExtras());
connection.setAudioModeIsVoip(true);
// NOTE there's a time gap between the placeCall and this callback when
// things could get out of sync, but they are put back in sync once
// the startCall Promise is resolved below. That's because on
@@ -426,7 +444,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
@Override
public String toString() {
return String.format(
"ConnectionImpl[adress=%s, uuid=%s]@%d",
"ConnectionImpl[address=%s, uuid=%s]@%d",
getAddress(), getCallUUID(), hashCode());
}
}

View File

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

View File

@@ -22,14 +22,18 @@ import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.module.annotations.ReactModule;
/**
* Module implementing an API for sending events from JavaScript to native code.
*/
@ReactModule(name = ExternalAPIModule.NAME)
class ExternalAPIModule
extends ReactContextBaseJavaModule {
private static final String TAG = ExternalAPIModule.class.getSimpleName();
public static final String NAME = "ExternalAPI";
private static final String TAG = NAME;
/**
* Initializes a new module instance. There shall be a single instance of
@@ -49,7 +53,7 @@ class ExternalAPIModule
*/
@Override
public String getName() {
return "ExternalAPI";
return NAME;
}
/**

View File

@@ -16,6 +16,7 @@
package org.jitsi.meet.sdk;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@@ -37,6 +38,25 @@ public class JitsiMeetActivity extends FragmentActivity
protected static final String TAG = JitsiMeetActivity.class.getSimpleName();
public static final String ACTION_JITSI_MEET_CONFERENCE = "org.jitsi.meet.CONFERENCE";
public static final String JITSI_MEET_CONFERENCE_OPTIONS = "JitsiMeetConferenceOptions";
// Helpers for starting the activity
//
public static void launch(Context context, JitsiMeetConferenceOptions options) {
Intent intent = new Intent(context, JitsiMeetActivity.class);
intent.setAction(ACTION_JITSI_MEET_CONFERENCE);
intent.putExtra(JITSI_MEET_CONFERENCE_OPTIONS, options);
context.startActivity(intent);
}
public static void launch(Context context, String url) {
JitsiMeetConferenceOptions options
= new JitsiMeetConferenceOptions.Builder().setRoom(url).build();
launch(context, options);
}
// Overrides
//
@@ -80,19 +100,17 @@ public class JitsiMeetActivity extends FragmentActivity
}
private @Nullable JitsiMeetConferenceOptions getConferenceOptions(Intent intent) {
Uri uri;
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(intent.getAction())
&& (uri = intent.getData()) != null) {
JitsiMeetConferenceOptions options
= new JitsiMeetConferenceOptions.Builder()
.setRoom(uri.toString())
.build();
return options;
if (Intent.ACTION_VIEW.equals(action)) {
Uri uri = intent.getData();
if (uri != null) {
return new JitsiMeetConferenceOptions.Builder().setRoom(uri.toString()).build();
}
} else if (ACTION_JITSI_MEET_CONFERENCE.equals(action)) {
return intent.getParcelableExtra(JITSI_MEET_CONFERENCE_OPTIONS);
}
// TODO: accept JitsiMeetConferenceOptions directly.
return null;
}
@@ -151,6 +169,11 @@ public class JitsiMeetActivity extends FragmentActivity
JitsiMeetActivityDelegate.requestPermissions(this, permissions, requestCode, listener);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
// JitsiMeetViewListener
//

View File

@@ -17,6 +17,8 @@
package org.jitsi.meet.sdk;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import java.net.URL;
@@ -29,7 +31,7 @@ import java.net.URL;
* The resulting {@link JitsiMeetConferenceOptions} object is immutable and represents how the
* conference will be joined.
*/
public class JitsiMeetConferenceOptions {
public class JitsiMeetConferenceOptions implements Parcelable {
/**
* Server where the conference should take place.
*/
@@ -197,6 +199,20 @@ public class JitsiMeetConferenceOptions {
private JitsiMeetConferenceOptions() {
}
private JitsiMeetConferenceOptions(Parcel in) {
room = in.readString();
token = in.readString();
colorScheme = in.readBundle();
byte tmpAudioMuted = in.readByte();
audioMuted = tmpAudioMuted == 0 ? null : tmpAudioMuted == 1;
byte tmpAudioOnly = in.readByte();
audioOnly = tmpAudioOnly == 0 ? null : tmpAudioOnly == 1;
byte tmpVideoMuted = in.readByte();
videoMuted = tmpVideoMuted == 0 ? null : tmpVideoMuted == 1;
byte tmpWelcomePageEnabled = in.readByte();
welcomePageEnabled = tmpWelcomePageEnabled == 0 ? null : tmpWelcomePageEnabled == 1;
}
Bundle asProps() {
Bundle props = new Bundle();
@@ -246,4 +262,35 @@ public class JitsiMeetConferenceOptions {
return props;
}
// Parcelable interface
//
public static final Creator<JitsiMeetConferenceOptions> CREATOR = new Creator<JitsiMeetConferenceOptions>() {
@Override
public JitsiMeetConferenceOptions createFromParcel(Parcel in) {
return new JitsiMeetConferenceOptions(in);
}
@Override
public JitsiMeetConferenceOptions[] newArray(int size) {
return new JitsiMeetConferenceOptions[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(room);
dest.writeString(token);
dest.writeBundle(colorScheme);
dest.writeByte((byte) (audioMuted == null ? 0 : audioMuted ? 1 : 2));
dest.writeByte((byte) (audioOnly == null ? 0 : audioOnly ? 1 : 2));
dest.writeByte((byte) (videoMuted == null ? 0 : videoMuted ? 1 : 2));
dest.writeByte((byte) (welcomePageEnabled == null ? 0 : welcomePageEnabled ? 1 : 2));
}
@Override
public int describeContents() {
return 0;
}
}

View File

@@ -81,15 +81,6 @@ public class JitsiMeetFragment extends Fragment {
JitsiMeetActivityDelegate.onHostDestroy(getActivity());
}
// https://developer.android.com/reference/android/support/v4/app/ActivityCompat.OnRequestPermissionsResultCallback
@Override
public void onRequestPermissionsResult(
final int requestCode,
final String[] permissions,
final int[] grantResults) {
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public void onResume() {
super.onResume();

View File

@@ -27,11 +27,15 @@ import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
@ReactModule(name = PictureInPictureModule.NAME)
class PictureInPictureModule
extends ReactContextBaseJavaModule {
private final static String TAG = "PictureInPicture";
public static final String NAME = "PictureInPicture";
private static final String TAG = NAME;
static boolean isPictureInPictureSupported() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
@@ -101,6 +105,6 @@ class PictureInPictureModule
@Override
public String getName() {
return TAG;
return NAME;
}
}

View File

@@ -24,6 +24,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.module.annotations.ReactModule;
/**
* Module implementing a simple API to enable a proximity sensor-controlled
@@ -31,14 +32,11 @@ import com.facebook.react.bridge.UiThreadUtil;
* object it will dim the screen and disable touch controls. The functionality
* is used with the conference audio-only mode.
*/
@ReactModule(name = ProximityModule.NAME)
class ProximityModule
extends ReactContextBaseJavaModule {
/**
* The name of {@code ProximityModule} to be used in the React Native
* bridge.
*/
private static final String MODULE_NAME = "Proximity";
public static final String NAME = "Proximity";
/**
* This type of wake lock (the one activated by the proximity sensor) has
@@ -74,7 +72,7 @@ class ProximityModule
wakeLock
= powerManager.newWakeLock(
PROXIMITY_SCREEN_OFF_WAKE_LOCK,
MODULE_NAME);
"jitsi:"+NAME);
} catch (Throwable ignored) {
wakeLock = null;
}
@@ -89,7 +87,7 @@ class ProximityModule
*/
@Override
public String getName() {
return MODULE_NAME;
return NAME;
}
/**

View File

@@ -18,6 +18,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.module.annotations.ReactModule;
/**
* The react-native side of Jitsi Meet's {@link ConnectionService}. Exposes
@@ -26,10 +27,13 @@ import com.facebook.react.bridge.ReadableMap;
* @author Pawel Domas
*/
@RequiresApi(api = Build.VERSION_CODES.O)
@ReactModule(name = RNConnectionService.NAME)
class RNConnectionService
extends ReactContextBaseJavaModule {
private final static String TAG = ConnectionService.TAG;
public static final String NAME = "ConnectionService";
private static final String TAG = ConnectionService.TAG;
/**
* Sets the audio route on all existing {@link android.telecom.Connection}s
@@ -146,7 +150,7 @@ class RNConnectionService
@Override
public String getName() {
return "ConnectionService";
return NAME;
}
/**

View File

@@ -1,5 +1,6 @@
/*
* Copyright @ 2017-present Atlassian Pty Ltd
* Copyright @ 2019-present 8x8, Inc.
* Copyright @ 2017-2018 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,6 +25,7 @@ import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.common.LifecycleState;
import com.facebook.react.devsupport.DevInternalSettings;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import java.util.ArrayList;
@@ -46,20 +48,19 @@ class ReactInstanceManagerHolder {
ReactApplicationContext reactContext) {
List<NativeModule> nativeModules
= new ArrayList<>(Arrays.<NativeModule>asList(
new AmplitudeModule(reactContext),
new AndroidSettingsModule(reactContext),
new AppInfoModule(reactContext),
new AudioModeModule(reactContext),
new DropboxModule(reactContext),
new ExternalAPIModule(reactContext),
new LocaleDetector(reactContext),
new PictureInPictureModule(reactContext),
new ProximityModule(reactContext),
new WiFiStatsModule(reactContext),
new org.jitsi.meet.sdk.analytics.AmplitudeModule(reactContext),
new org.jitsi.meet.sdk.dropbox.Dropbox(reactContext),
new org.jitsi.meet.sdk.net.NAT64AddrInfoModule(reactContext)));
if (android.os.Build.VERSION.SDK_INT
>= android.os.Build.VERSION_CODES.O) {
if (AudioModeModule.useConnectionService()) {
nativeModules.add(new RNConnectionService(reactContext));
}
@@ -155,5 +156,12 @@ class ReactInstanceManagerHolder {
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
// Disable delta updates on Android, they have caused trouble.
DevInternalSettings devSettings
= (DevInternalSettings)reactInstanceManager.getDevSupportManager().getDevSettings();
if (devSettings != null) {
devSettings.setBundleDeltasEnabled(false);
}
}
}

View File

@@ -25,6 +25,7 @@ import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
import org.json.JSONArray;
import org.json.JSONObject;
@@ -43,19 +44,16 @@ import java.util.concurrent.Executors;
* Gathers rssi, signal in percentage, timestamp and the addresses of the wifi
* device.
*/
@ReactModule(name = WiFiStatsModule.NAME)
class WiFiStatsModule
extends ReactContextBaseJavaModule {
/**
* The name of {@code WiFiStatsModule} to be used in the React Native
* bridge.
*/
private static final String MODULE_NAME = "WiFiStats";
public static final String NAME = "WiFiStats";
/**
* The {@code Log} tag {@code WiFiStatsModule} is to log messages with.
*/
static final String TAG = MODULE_NAME;
static final String TAG = NAME;
/**
* The scale used for the signal value. A level of the signal, given in the
@@ -87,7 +85,7 @@ class WiFiStatsModule
*/
@Override
public String getName() {
return MODULE_NAME;
return NAME;
}
/**

View File

@@ -21,6 +21,7 @@ import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
import java.net.UnknownHostException;
@@ -32,9 +33,12 @@ import java.net.UnknownHostException;
* [1]: https://tools.ietf.org/html/rfc6146
* [2]: https://tools.ietf.org/html/rfc6052
*/
@ReactModule(name = NAT64AddrInfoModule.NAME)
public class NAT64AddrInfoModule
extends ReactContextBaseJavaModule {
public final static String NAME = "NAT64AddrInfo";
/**
* The host for which the module wil try to resolve both IPv4 and IPv6
* addresses in order to figure out the NAT64 prefix.
@@ -46,15 +50,10 @@ public class NAT64AddrInfoModule
*/
private final static long INFO_LIFETIME = 60 * 1000;
/**
* The name of this module.
*/
private final static String MODULE_NAME = "NAT64AddrInfo";
/**
* The {@code Log} tag {@code NAT64AddrInfoModule} is to log messages with.
*/
private final static String TAG = MODULE_NAME;
private final static String TAG = NAME;
/**
* The {@link NAT64AddrInfo} instance which holds NAT64 prefix/suffix.
@@ -119,6 +118,6 @@ public class NAT64AddrInfoModule
@Override
public String getName() {
return MODULE_NAME;
return NAME;
}
}

View File

@@ -1,5 +1,5 @@
// flow-typed signature: d71d314ca25fc6c20610a3ba80af9df0
// flow-typed version: 9698a46399/jquery_v3.x.x/flow_>=v0.28.x
// flow-typed signature: f26fda66e3a551aef37d3b0f53058e6a
// flow-typed version: 44ad941b7a/jquery_v3.x.x/flow_>=v0.28.x
/* eslint-disable max-len, no-unused-vars, flowtype/no-weak-types */
@@ -364,6 +364,13 @@ declare class JQueryGenericPromise<T> {
failFilter?: (...reasons: any[]) => any,
progressFilter?: (...progression: any[]) => any
): JQueryPromise<void>;
/**
* Add handlers to be called when the Deferred object is rejected.
*
* @param failFilter An function that is called when the Deferred is rejected.
*/
catch(failFilter: (...reasons: any[]) => any): JQueryPromise<T>;
}
/**
@@ -822,7 +829,7 @@ declare class JQueryStatic {
*/
get(
url: string,
data?: Object | string,
data?: {} | string,
success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any,
dataType?: string
): JQueryXHR;
@@ -845,7 +852,7 @@ declare class JQueryStatic {
*/
getJSON(
url: string,
data?: Object | string,
data?: {} | string,
success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any
): JQueryXHR;
/**
@@ -886,7 +893,7 @@ declare class JQueryStatic {
*/
post(
url: string,
data?: Object | string,
data?: {} | string,
success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any,
dataType?: string
): JQueryXHR;
@@ -967,7 +974,7 @@ declare class JQueryStatic {
* @param html A string defining a single, standalone, HTML element (e.g. <div/> or <div></div>).
* @param attributes An object of attributes, events, and methods to call on the newly-created element.
*/
(html: string, attributes: Object): JQuery;
(html: string, attributes: {}): JQuery;
/**
* Relinquish jQuery's control of the $ variable.
@@ -1425,7 +1432,7 @@ declare class JQuery {
*/
load(
url: string,
data?: string | Object,
data?: string | {},
complete?: (
responseText: string,
textStatus: string,
@@ -1482,7 +1489,7 @@ declare class JQuery {
*
* @param attributes An object of attribute-value pairs to set.
*/
attr(attributes: Object): JQuery;
attr(attributes: {}): JQuery;
/**
* Get the value of an attribute for the first element in the set of matched elements.
*
@@ -1532,7 +1539,7 @@ declare class JQuery {
*
* @param properties An object of property-value pairs to set.
*/
prop(properties: Object): JQuery;
prop(properties: {}): JQuery;
/**
* Set one or more properties for the set of matched elements.
*
@@ -1598,7 +1605,7 @@ declare class JQuery {
/**
* Get the current value of the first element in the set of matched elements.
*/
val(_: void): any;
val(_: void): string | string[] | number;
/**
* Set the value of each element in the set of matched elements.
*
@@ -1634,7 +1641,7 @@ declare class JQuery {
*
* @param properties An object of property-value pairs to set.
*/
css(properties: Object): JQuery;
css(properties: {}): JQuery;
/**
* Get the value of style properties for the first element in the set of matched elements.
*
@@ -1847,7 +1854,7 @@ declare class JQuery {
* @param complete A function to call once the animation is complete.
*/
animate(
properties: Object,
properties: {},
duration?: string | number,
complete?: Function
): JQuery;
@@ -1860,7 +1867,7 @@ declare class JQuery {
* @param complete A function to call once the animation is complete.
*/
animate(
properties: Object,
properties: {},
duration?: string | number,
easing?: string,
complete?: Function
@@ -1871,7 +1878,7 @@ declare class JQuery {
* @param properties An object of CSS properties and values that the animation will move toward.
* @param options A map of additional options to pass to the method.
*/
animate(properties: Object, options: JQueryAnimationOptions): JQuery;
animate(properties: {}, options: JQueryAnimationOptions): JQuery;
/**
* Set a timer to delay execution of subsequent items in the queue.
@@ -2920,14 +2927,14 @@ declare class JQuery {
* @param eventType A string containing a JavaScript event type, such as click or submit.
* @param extraParameters Additional parameters to pass along to the event handler.
*/
trigger(eventType: string, extraParameters?: any[] | Object): JQuery;
trigger(eventType: string, extraParameters?: any[] | {}): JQuery;
/**
* Execute all handlers and behaviors attached to the matched elements for the given event type.
*
* @param event A jQuery.Event object.
* @param extraParameters Additional parameters to pass along to the event handler.
*/
trigger(event: JQueryEventObject, extraParameters?: any[] | Object): JQuery;
trigger(event: JQueryEventObject, extraParameters?: any[] | {}): JQuery;
/**
* Execute all handlers attached to an element for an event.

File diff suppressed because it is too large Load Diff

View File

@@ -1,329 +0,0 @@
// flow-typed signature: c30aa20539f52183d4d30dd36d8ab9c2
// flow-typed version: 886cf7c002/moment_v2.3.x/flow_>=v0.63.x
type moment$MomentOptions = {
y?: number | string,
year?: number | string,
years?: number | string,
M?: number | string,
month?: number | string,
months?: number | string,
d?: number | string,
day?: number | string,
days?: number | string,
date?: number | string,
h?: number | string,
hour?: number | string,
hours?: number | string,
m?: number | string,
minute?: number | string,
minutes?: number | string,
s?: number | string,
second?: number | string,
seconds?: number | string,
ms?: number | string,
millisecond?: number | string,
milliseconds?: number | string
};
type moment$MomentObject = {
years: number,
months: number,
date: number,
hours: number,
minutes: number,
seconds: number,
milliseconds: number
};
type moment$MomentCreationData = {
input: string,
format: string,
locale: Object,
isUTC: boolean,
strict: boolean
};
type moment$CalendarFormat = string | ((moment: moment$Moment) => string);
type moment$CalendarFormats = {
sameDay?: moment$CalendarFormat,
nextDay?: moment$CalendarFormat,
nextWeek?: moment$CalendarFormat,
lastDay?: moment$CalendarFormat,
lastWeek?: moment$CalendarFormat,
sameElse?: moment$CalendarFormat
};
declare class moment$LocaleData {
months(moment: moment$Moment): string,
monthsShort(moment: moment$Moment): string,
monthsParse(month: string): number,
weekdays(moment: moment$Moment): string,
weekdaysShort(moment: moment$Moment): string,
weekdaysMin(moment: moment$Moment): string,
weekdaysParse(weekDay: string): number,
longDateFormat(dateFormat: string): string,
isPM(date: string): boolean,
meridiem(hours: number, minutes: number, isLower: boolean): string,
calendar(
key:
| "sameDay"
| "nextDay"
| "lastDay"
| "nextWeek"
| "prevWeek"
| "sameElse",
moment: moment$Moment
): string,
relativeTime(
number: number,
withoutSuffix: boolean,
key: "s" | "m" | "mm" | "h" | "hh" | "d" | "dd" | "M" | "MM" | "y" | "yy",
isFuture: boolean
): string,
pastFuture(diff: any, relTime: string): string,
ordinal(number: number): string,
preparse(str: string): any,
postformat(str: string): any,
week(moment: moment$Moment): string,
invalidDate(): string,
firstDayOfWeek(): number,
firstDayOfYear(): number
}
declare class moment$MomentDuration {
humanize(suffix?: boolean): string,
milliseconds(): number,
asMilliseconds(): number,
seconds(): number,
asSeconds(): number,
minutes(): number,
asMinutes(): number,
hours(): number,
asHours(): number,
days(): number,
asDays(): number,
months(): number,
asMonths(): number,
years(): number,
asYears(): number,
add(value: number | moment$MomentDuration | Object, unit?: string): this,
subtract(value: number | moment$MomentDuration | Object, unit?: string): this,
as(unit: string): number,
get(unit: string): number,
toJSON(): string,
toISOString(): string,
isValid(): boolean
}
declare class moment$Moment {
static ISO_8601: string,
static (
string?: string,
format?: string | Array<string>,
strict?: boolean
): moment$Moment,
static (
string?: string,
format?: string | Array<string>,
locale?: string,
strict?: boolean
): moment$Moment,
static (
initDate: ?Object | number | Date | Array<number> | moment$Moment | string
): moment$Moment,
static unix(seconds: number): moment$Moment,
static utc(): moment$Moment,
static utc(number: number | Array<number>): moment$Moment,
static utc(
str: string,
str2?: string | Array<string>,
str3?: string
): moment$Moment,
static utc(moment: moment$Moment): moment$Moment,
static utc(date: Date): moment$Moment,
static parseZone(): moment$Moment,
static parseZone(rawDate: string): moment$Moment,
static parseZone(
rawDate: string,
format: string | Array<string>
): moment$Moment,
static parseZone(
rawDate: string,
format: string,
strict: boolean
): moment$Moment,
static parseZone(
rawDate: string,
format: string,
locale: string,
strict: boolean
): moment$Moment,
isValid(): boolean,
invalidAt(): 0 | 1 | 2 | 3 | 4 | 5 | 6,
creationData(): moment$MomentCreationData,
millisecond(number: number): this,
milliseconds(number: number): this,
millisecond(): number,
milliseconds(): number,
second(number: number): this,
seconds(number: number): this,
second(): number,
seconds(): number,
minute(number: number): this,
minutes(number: number): this,
minute(): number,
minutes(): number,
hour(number: number): this,
hours(number: number): this,
hour(): number,
hours(): number,
date(number: number): this,
dates(number: number): this,
date(): number,
dates(): number,
day(day: number | string): this,
days(day: number | string): this,
day(): number,
days(): number,
weekday(number: number): this,
weekday(): number,
isoWeekday(number: number): this,
isoWeekday(): number,
dayOfYear(number: number): this,
dayOfYear(): number,
week(number: number): this,
weeks(number: number): this,
week(): number,
weeks(): number,
isoWeek(number: number): this,
isoWeeks(number: number): this,
isoWeek(): number,
isoWeeks(): number,
month(number: number): this,
months(number: number): this,
month(): number,
months(): number,
quarter(number: number): this,
quarter(): number,
year(number: number): this,
years(number: number): this,
year(): number,
years(): number,
weekYear(number: number): this,
weekYear(): number,
isoWeekYear(number: number): this,
isoWeekYear(): number,
weeksInYear(): number,
isoWeeksInYear(): number,
get(string: string): number,
set(unit: string, value: number): this,
set(options: { [unit: string]: number }): this,
static max(...dates: Array<moment$Moment>): moment$Moment,
static max(dates: Array<moment$Moment>): moment$Moment,
static min(...dates: Array<moment$Moment>): moment$Moment,
static min(dates: Array<moment$Moment>): moment$Moment,
add(
value: number | moment$MomentDuration | moment$Moment | Object,
unit?: string
): this,
subtract(
value: number | moment$MomentDuration | moment$Moment | string | Object,
unit?: string
): this,
startOf(unit: string): this,
endOf(unit: string): this,
local(): this,
utc(): this,
utcOffset(
offset: number | string,
keepLocalTime?: boolean,
keepMinutes?: boolean
): this,
utcOffset(): number,
format(format?: string): string,
fromNow(removeSuffix?: boolean): string,
from(
value: moment$Moment | string | number | Date | Array<number>,
removePrefix?: boolean
): string,
toNow(removePrefix?: boolean): string,
to(
value: moment$Moment | string | number | Date | Array<number>,
removePrefix?: boolean
): string,
calendar(refTime?: any, formats?: moment$CalendarFormats): string,
diff(
date: moment$Moment | string | number | Date | Array<number>,
format?: string,
floating?: boolean
): number,
valueOf(): number,
unix(): number,
daysInMonth(): number,
toDate(): Date,
toArray(): Array<number>,
toJSON(): string,
toISOString(
keepOffset?: boolean
): string,
toObject(): moment$MomentObject,
isBefore(
date?: moment$Moment | string | number | Date | Array<number>,
units?: ?string
): boolean,
isSame(
date?: moment$Moment | string | number | Date | Array<number>,
units?: ?string
): boolean,
isAfter(
date?: moment$Moment | string | number | Date | Array<number>,
units?: ?string
): boolean,
isSameOrBefore(
date?: moment$Moment | string | number | Date | Array<number>,
units?: ?string
): boolean,
isSameOrAfter(
date?: moment$Moment | string | number | Date | Array<number>,
units?: ?string
): boolean,
isBetween(
fromDate: moment$Moment | string | number | Date | Array<number>,
toDate?: ?moment$Moment | string | number | Date | Array<number>,
granularity?: ?string,
inclusion?: ?string
): boolean,
isDST(): boolean,
isDSTShifted(): boolean,
isLeapYear(): boolean,
clone(): moment$Moment,
static isMoment(obj: any): boolean,
static isDate(obj: any): boolean,
static locale(locale: string, localeData?: Object): string,
static updateLocale(locale: string, localeData?: ?Object): void,
static locale(locales: Array<string>): string,
locale(locale: string, customization?: Object | null): moment$Moment,
locale(): string,
static months(): Array<string>,
static monthsShort(): Array<string>,
static weekdays(): Array<string>,
static weekdaysShort(): Array<string>,
static weekdaysMin(): Array<string>,
static months(): string,
static monthsShort(): string,
static weekdays(): string,
static weekdaysShort(): string,
static weekdaysMin(): string,
static localeData(key?: string): moment$LocaleData,
static duration(
value: number | Object | string,
unit?: string
): moment$MomentDuration,
static isDuration(obj: any): boolean,
static normalizeUnits(unit: string): string,
static invalid(object: any): moment$Moment
}
declare module "moment" {
declare module.exports: Class<moment$Moment>;
}

View File

@@ -1,192 +1,276 @@
// flow-typed signature: d4e793bc07ef1dc9906a244b12960f7b
// flow-typed version: cf33ff8762/react-redux_v5.x.x/flow_>=v0.63.0
// flow-typed signature: f06f00c3ad0cfedb90c0c6de04b219f3
// flow-typed version: 3a6d556e4b/react-redux_v5.x.x/flow_>=v0.89.x
import type { Dispatch, Store } from "redux";
/**
The order of type arguments for connect() is as follows:
declare module "react-redux" {
import type { ComponentType, ElementConfig } from 'react';
connect<Props, OwnProps, StateProps, DispatchProps, State, Dispatch>(…)
declare export class Provider<S, A> extends React$Component<{
store: Store<S, A>,
children?: any
}> {}
In Flow v0.89 only the first two are mandatory to specify. Other 4 can be repaced with the new awesome type placeholder:
declare export function createProvider(
storeKey?: string,
subKey?: string
): Provider<*, *>;
connect<Props, OwnProps, _, _, _, _>(…)
/*
But beware, in case of weird type errors somewhere in random places
just type everything and get to a green field and only then try to
remove the definitions you see bogus.
Decrypting the abbreviations:
WC = Component being wrapped
S = State
A = Action
D = Dispatch
OP = OwnProps
SP = StateProps
DP = DispatchProps
MP = Merge props
MDP = Map dispatch to props object
RSP = Returned state props
RDP = Returned dispatch props
RMP = Returned merge props
CP = Props for returned component
Com = React Component
*/
ST = Static properties of Com
EFO = Extra factory options (used only in connectAdvanced)
*/
declare type MapStateToProps<S: Object, SP: Object, RSP: Object> = (state: S, props: SP) => RSP;
declare module "react-redux" {
// ------------------------------------------------------------
// Typings for connect()
// ------------------------------------------------------------
declare type MapDispatchToProps<A, OP: Object, RDP: Object> = (dispatch: Dispatch<A>, ownProps: OP) => RDP;
declare type MergeProps<SP: Object, DP: Object, MP: Object, RMP: Object> = (
stateProps: SP,
dispatchProps: DP,
ownProps: MP
) => RMP;
declare type ConnectOptions<S: Object, OP: Object, RSP: Object, RMP: Object> = {|
declare export type Options<S, OP, SP, MP> = {|
pure?: boolean,
withRef?: boolean,
areStatesEqual?: (next: S, prev: S) => boolean,
areOwnPropsEqual?: (next: OP, prev: OP) => boolean,
areStatePropsEqual?: (next: RSP, prev: RSP) => boolean,
areMergedPropsEqual?: (next: RMP, prev: RMP) => boolean,
storeKey?: string
areStatePropsEqual?: (next: SP, prev: SP) => boolean,
areMergedPropsEqual?: (next: MP, prev: MP) => boolean,
storeKey?: string,
|};
declare type OmitDispatch<Component> = $Diff<Component, {dispatch: Dispatch<*>}>;
declare type MapStateToProps<-S, -OP, +SP> =
| ((state: S, ownProps: OP) => SP)
// If you want to use the factory function but get a strange error
// like "function is not an object" then just type the factory function
// like this:
// const factory: (State, OwnProps) => (State, OwnProps) => StateProps
// and provide the StateProps type to the SP type parameter.
| ((state: S, ownProps: OP) => (state: S, ownProps: OP) => SP);
declare export function connect<
Com: ComponentType<*>,
declare type Bind<D> = <A, R>((...A) => R) => (...A) => $Call<D, R>;
declare type MapDispatchToPropsFn<D, -OP, +DP> =
| ((dispatch: D, ownProps: OP) => DP)
// If you want to use the factory function but get a strange error
// like "function is not an object" then just type the factory function
// like this:
// const factory: (Dispatch, OwnProps) => (Dispatch, OwnProps) => DispatchProps
// and provide the DispatchProps type to the DP type parameter.
| ((dispatch: D, ownProps: OP) => (dispatch: D, ownProps: OP) => DP);
declare class ConnectedComponent<OP, +WC> extends React$Component<OP> {
static +WrappedComponent: WC;
getWrappedInstance(): React$ElementRef<WC>;
}
// The connection of the Wrapped Component and the Connected Component
// happens here in `MP: P`. It means that type wise MP belongs to P,
// so to say MP >= P.
declare type Connector<P, OP, MP: P> = <WC: React$ComponentType<P>>(
WC,
) => Class<ConnectedComponent<OP, WC>> & WC;
// No `mergeProps` argument
// Got error like inexact OwnProps is incompatible with exact object type?
// Just make the OP parameter for `connect()` an exact object.
declare type MergeOP<OP, D> = {| ...$Exact<OP>, dispatch: D |};
declare type MergeOPSP<OP, SP, D> = {| ...$Exact<OP>, ...SP, dispatch: D |};
declare type MergeOPDP<OP, DP> = {| ...$Exact<OP>, ...DP |};
declare type MergeOPSPDP<OP, SP, DP> = {| ...$Exact<OP>, ...SP, ...DP |};
declare export function connect<-P, -OP, -SP, -DP, -S, -D>(
mapStateToProps?: null | void,
mapDispatchToProps?: null | void,
mergeProps?: null | void,
options?: ?Options<S, OP, {||}, MergeOP<OP, D>>,
): Connector<P, OP, MergeOP<OP, D>>;
declare export function connect<-P, -OP, -SP, -DP, -S, -D>(
// If you get error here try adding return type to your mapStateToProps function
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps?: null | void,
mergeProps?: null | void,
options?: ?Options<S, OP, SP, MergeOPSP<OP, SP, D>>,
): Connector<P, OP, MergeOPSP<OP, SP, D>>;
// In this case DP is an object of functions which has been bound to dispatch
// by the given mapDispatchToProps function.
declare export function connect<-P, -OP, -SP, -DP, S, D>(
mapStateToProps: null | void,
mapDispatchToProps: MapDispatchToPropsFn<D, OP, DP>,
mergeProps?: null | void,
options?: ?Options<S, OP, {||}, MergeOPDP<OP, DP>>,
): Connector<P, OP, MergeOPDP<OP, DP>>;
// In this case DP is an object of action creators not yet bound to dispatch,
// this difference is not important in the vanila redux,
// but in case of usage with redux-thunk, the return type may differ.
declare export function connect<-P, -OP, -SP, -DP, S, D>(
mapStateToProps: null | void,
mapDispatchToProps: DP,
mergeProps?: null | void,
options?: ?Options<S, OP, {||}, MergeOPDP<OP, DP>>,
): Connector<P, OP, MergeOPDP<OP, $ObjMap<DP, Bind<D>>>>;
declare export function connect<-P, -OP, -SP, -DP, S, D>(
// If you get error here try adding return type to your mapStateToProps function
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToPropsFn<D, OP, DP>,
mergeProps?: null | void,
options?: ?Options<S, OP, SP, {| ...OP, ...SP, ...DP |}>,
): Connector<P, OP, {| ...OP, ...SP, ...DP |}>;
declare export function connect<-P, -OP, -SP, -DP, S, D>(
// If you get error here try adding return type to your mapStateToProps function
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: DP,
mergeProps?: null | void,
options?: ?Options<S, OP, SP, MergeOPSPDP<OP, SP, DP>>,
): Connector<P, OP, MergeOPSPDP<OP, SP, $ObjMap<DP, Bind<D>>>>;
// With `mergeProps` argument
declare type MergeProps<+P, -OP, -SP, -DP> = (
stateProps: SP,
dispatchProps: DP,
ownProps: OP,
) => P;
declare export function connect<-P, -OP, -SP: {||}, -DP: {||}, S, D>(
mapStateToProps: null | void,
mapDispatchToProps: null | void,
// If you get error here try adding return type to you mapStateToProps function
mergeProps: MergeProps<P, OP, {||}, {| dispatch: D |}>,
options?: ?Options<S, OP, {||}, P>,
): Connector<P, OP, P>;
declare export function connect<-P, -OP, -SP, -DP: {||}, S, D>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: null | void,
// If you get error here try adding return type to you mapStateToProps function
mergeProps: MergeProps<P, OP, SP, {| dispatch: D |}>,
options?: ?Options<S, OP, SP, P>,
): Connector<P, OP, P>;
// In this case DP is an object of functions which has been bound to dispatch
// by the given mapDispatchToProps function.
declare export function connect<-P, -OP, -SP: {||}, -DP, S, D>(
mapStateToProps: null | void,
mapDispatchToProps: MapDispatchToPropsFn<D, OP, DP>,
mergeProps: MergeProps<P, OP, {||}, DP>,
options?: ?Options<S, OP, {||}, P>,
): Connector<P, OP, P>;
// In this case DP is an object of action creators not yet bound to dispatch,
// this difference is not important in the vanila redux,
// but in case of usage with redux-thunk, the return type may differ.
declare export function connect<-P, -OP, -SP: {||}, -DP, S, D>(
mapStateToProps: null | void,
mapDispatchToProps: DP,
mergeProps: MergeProps<P, OP, {||}, $ObjMap<DP, Bind<D>>>,
options?: ?Options<S, OP, {||}, P>,
): Connector<P, OP, P>;
// In this case DP is an object of functions which has been bound to dispatch
// by the given mapDispatchToProps function.
declare export function connect<-P, -OP, -SP, -DP, S, D>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToPropsFn<D, OP, DP>,
mergeProps: MergeProps<P, OP, SP, DP>,
options?: ?Options<S, OP, SP, P>,
): Connector<P, OP, P>;
// In this case DP is an object of action creators not yet bound to dispatch,
// this difference is not important in the vanila redux,
// but in case of usage with redux-thunk, the return type may differ.
declare export function connect<-P, -OP, -SP, -DP, S, D>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: DP,
mergeProps: MergeProps<P, OP, SP, $ObjMap<DP, Bind<D>>>,
options?: ?Options<S, OP, SP, P>,
): Connector<P, OP, P>;
// ------------------------------------------------------------
// Typings for Provider
// ------------------------------------------------------------
declare export class Provider<Store> extends React$Component<{
store: Store,
children?: React$Node,
}> {}
declare export function createProvider(
storeKey?: string,
subKey?: string,
): Class<Provider<*>>;
// ------------------------------------------------------------
// Typings for connectAdvanced()
// ------------------------------------------------------------
declare type ConnectAdvancedOptions = {
getDisplayName?: (name: string) => string,
methodName?: string,
renderCountProp?: string,
shouldHandleStateChanges?: boolean,
storeKey?: string,
withRef?: boolean,
};
declare type SelectorFactoryOptions<Com> = {
getDisplayName: (name: string) => string,
methodName: string,
renderCountProp: ?string,
shouldHandleStateChanges: boolean,
storeKey: string,
withRef: boolean,
displayName: string,
wrappedComponentName: string,
WrappedComponent: Com,
};
declare type MapStateToPropsEx<S: Object, SP: Object, RSP: Object> = (
state: S,
props: SP,
) => RSP;
declare type SelectorFactory<
Com: React$ComponentType<*>,
Dispatch,
S: Object,
DP: Object,
RSP: Object,
CP: $Diff<OmitDispatch<ElementConfig<Com>>, RSP>
>(
mapStateToProps: MapStateToProps<S, DP, RSP>,
mapDispatchToProps?: null
): (component: Com) => ComponentType<CP & DP>;
declare export function connect<Com: ComponentType<*>>(
mapStateToProps?: null,
mapDispatchToProps?: null
): (component: Com) => ComponentType<OmitDispatch<ElementConfig<Com>>>;
declare export function connect<
Com: ComponentType<*>,
A,
S: Object,
DP: Object,
SP: Object,
RSP: Object,
RDP: Object,
CP: $Diff<$Diff<ElementConfig<Com>, RSP>, RDP>
>(
mapStateToProps: MapStateToProps<S, SP, RSP>,
mapDispatchToProps: MapDispatchToProps<A, DP, RDP>
): (component: Com) => ComponentType<CP & SP & DP>;
declare export function connect<
Com: ComponentType<*>,
A,
OP: Object,
DP: Object,
PR: Object,
CP: $Diff<ElementConfig<Com>, DP>
>(
mapStateToProps?: null,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>
): (Com) => ComponentType<CP & OP>;
EFO: Object,
CP: Object,
> = (
dispatch: Dispatch,
factoryOptions: SelectorFactoryOptions<Com> & EFO,
) => MapStateToPropsEx<S, OP, CP>;
declare export function connect<
Com: ComponentType<*>,
MDP: Object
>(
mapStateToProps?: null,
mapDispatchToProps: MDP
): (component: Com) => ComponentType<$Diff<ElementConfig<Com>, MDP>>;
declare export function connect<
Com: ComponentType<*>,
declare export function connectAdvanced<
Com: React$ComponentType<*>,
D,
S: Object,
SP: Object,
RSP: Object,
MDP: Object,
CP: $Diff<ElementConfig<Com>, RSP>
>(
mapStateToProps: MapStateToProps<S, SP, RSP>,
mapDispatchToPRops: MDP
): (component: Com) => ComponentType<$Diff<CP, MDP> & SP>;
declare export function connect<
Com: ComponentType<*>,
A,
S: Object,
DP: Object,
SP: Object,
RSP: Object,
RDP: Object,
MP: Object,
RMP: Object,
CP: $Diff<ElementConfig<Com>, RMP>
>(
mapStateToProps: MapStateToProps<S, SP, RSP>,
mapDispatchToProps: ?MapDispatchToProps<A, DP, RDP>,
mergeProps: MergeProps<RSP, RDP, MP, RMP>
): (component: Com) => ComponentType<CP & SP & DP & MP>;
declare export function connect<
Com: ComponentType<*>,
A,
S: Object,
DP: Object,
SP: Object,
RSP: Object,
RDP: Object,
MDP: Object,
MP: Object,
RMP: Object,
CP: $Diff<ElementConfig<Com>, RMP>
>(
mapStateToProps: MapStateToProps<S, SP, RSP>,
mapDispatchToProps: MDP,
mergeProps: MergeProps<RSP, RDP, MP, RMP>
): (component: Com) => ComponentType<CP & SP & DP & MP>;
declare export function connect<Com: ComponentType<*>,
A,
S: Object,
DP: Object,
SP: Object,
RSP: Object,
RDP: Object,
MP: Object,
RMP: Object
>(
mapStateToProps: ?MapStateToProps<S, SP, RSP>,
mapDispatchToProps: ?MapDispatchToProps<A, DP, RDP>,
mergeProps: ?MergeProps<RSP, RDP, MP, RMP>,
options: ConnectOptions<S, SP & DP & MP, RSP, RMP>
): (component: Com) => ComponentType<$Diff<ElementConfig<Com>, RMP> & SP & DP & MP>;
declare export function connect<Com: ComponentType<*>,
A,
S: Object,
DP: Object,
SP: Object,
RSP: Object,
RDP: Object,
MDP: Object,
MP: Object,
RMP: Object
>(
mapStateToProps: ?MapStateToProps<S, SP, RSP>,
mapDispatchToProps: ?MapDispatchToProps<A, DP, RDP>,
mergeProps: MDP,
options: ConnectOptions<S, SP & DP & MP, RSP, RMP>
): (component: Com) => ComponentType<$Diff<ElementConfig<Com>, RMP> & SP & DP & MP>;
OP: Object,
CP: Object,
EFO: Object,
ST: { [_: $Keys<Com>]: any },
>(
selectorFactory: SelectorFactory<Com, D, S, OP, EFO, CP>,
connectAdvancedOptions: ?(ConnectAdvancedOptions & EFO),
): (component: Com) => React$ComponentType<OP> & $Shape<ST>;
declare export default {
Provider: typeof Provider,
createProvider: typeof createProvider,
connect: typeof connect,
connectAdvanced: typeof connectAdvanced,
};
}

View File

@@ -1,3 +1,6 @@
// flow-typed signature: df80bdd535bfed9cf3223e077f3b4543
// flow-typed version: c4c8963c9c/redux_v4.x.x/flow_>=v0.55.x
declare module 'redux' {
/*

View File

@@ -193,7 +193,14 @@ var interfaceConfig = {
/**
* Specify the Android app package name.
*/
// ANDROID_APP_PACKAGE: 'org.jitsi.meet'
// ANDROID_APP_PACKAGE: 'org.jitsi.meet',
/**
* Override the behavior of some notifications to remain displayed until
* explicitly dismissed through a user action. The value is how long, in
* milliseconds, those notifications should remain displayed.
*/
// ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT: 15000,
};
/* eslint-enable no-unused-vars, no-var, max-len */

View File

@@ -5,10 +5,10 @@ workspace 'jitsi-meet'
target 'jitsi-meet' do
project 'app/app.xcodeproj'
pod 'Crashlytics'
pod 'Fabric'
pod 'Firebase/Core'
pod 'Firebase/DynamicLinks'
pod 'Crashlytics', '~> 3.12.0'
pod 'Fabric', '~> 1.9.0'
pod 'Firebase/Core', '~> 5.18.0'
pod 'Firebase/DynamicLinks', '~> 5.18.0'
end
target 'JitsiMeet' do
@@ -36,7 +36,7 @@ target 'JitsiMeet' do
:podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
pod 'Amplitude-iOS', '~> 4.0.4'
pod 'ObjectiveDropboxOfficial'
pod 'ObjectiveDropboxOfficial', '~> 3.9.4'
pod 'react-native-background-timer',
:path => '../node_modules/react-native-background-timer'

View File

@@ -7,41 +7,41 @@ PODS:
- Fabric (~> 1.9.0)
- DoubleConversion (1.1.6)
- Fabric (1.9.0)
- Firebase/Core (5.15.0):
- Firebase/Core (5.18.0):
- Firebase/CoreOnly
- FirebaseAnalytics (= 5.4.0)
- Firebase/CoreOnly (5.15.0):
- FirebaseCore (= 5.1.10)
- Firebase/DynamicLinks (5.15.0):
- FirebaseAnalytics (= 5.7.0)
- Firebase/CoreOnly (5.18.0):
- FirebaseCore (= 5.3.1)
- Firebase/DynamicLinks (5.18.0):
- Firebase/CoreOnly
- FirebaseDynamicLinks (= 3.3.0)
- FirebaseAnalytics (5.4.0):
- FirebaseCore (~> 5.1)
- FirebaseInstanceID (~> 3.3)
- GoogleAppMeasurement (= 5.4.0)
- FirebaseDynamicLinks (= 3.4.1)
- FirebaseAnalytics (5.7.0):
- FirebaseCore (~> 5.3)
- FirebaseInstanceID (~> 3.6)
- GoogleAppMeasurement (= 5.7.0)
- GoogleUtilities/AppDelegateSwizzler (~> 5.2)
- GoogleUtilities/MethodSwizzler (~> 5.2)
- GoogleUtilities/Network (~> 5.2)
- "GoogleUtilities/NSData+zlib (~> 5.2)"
- nanopb (~> 0.3)
- FirebaseAnalyticsInterop (1.1.0)
- FirebaseCore (5.1.10):
- FirebaseAnalyticsInterop (1.2.0)
- FirebaseCore (5.3.1):
- GoogleUtilities/Logger (~> 5.2)
- FirebaseDynamicLinks (3.3.0):
- FirebaseDynamicLinks (3.4.1):
- FirebaseAnalytics (~> 5.1)
- FirebaseAnalyticsInterop (~> 1.0)
- FirebaseCore (~> 5.1)
- FirebaseInstanceID (3.3.0):
- FirebaseCore (~> 5.1)
- GoogleUtilities/Environment (~> 5.3)
- GoogleUtilities/UserDefaults (~> 5.3)
- FirebaseCore (~> 5.2)
- FirebaseInstanceID (3.7.0):
- FirebaseCore (~> 5.2)
- GoogleUtilities/Environment (~> 5.2)
- GoogleUtilities/UserDefaults (~> 5.2)
- FLAnimatedImage (1.0.12)
- Folly (2016.10.31.00):
- Folly (2018.10.22.00):
- boost-for-react-native
- DoubleConversion
- glog
- glog (0.3.5)
- GoogleAppMeasurement (5.4.0):
- GoogleAppMeasurement (5.7.0):
- GoogleUtilities/AppDelegateSwizzler (~> 5.2)
- GoogleUtilities/MethodSwizzler (~> 5.2)
- GoogleUtilities/Network (~> 5.2)
@@ -59,23 +59,23 @@ PODS:
- GoogleToolboxForMac/Defines (= 2.2.0)
- "GoogleToolboxForMac/NSString+URLArguments (= 2.2.0)"
- "GoogleToolboxForMac/NSString+URLArguments (2.2.0)"
- GoogleUtilities/AppDelegateSwizzler (5.3.7):
- GoogleUtilities/AppDelegateSwizzler (5.4.1):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (5.3.7)
- GoogleUtilities/Logger (5.3.7):
- GoogleUtilities/Environment (5.4.1)
- GoogleUtilities/Logger (5.4.1):
- GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (5.3.7):
- GoogleUtilities/MethodSwizzler (5.4.1):
- GoogleUtilities/Logger
- GoogleUtilities/Network (5.3.7):
- GoogleUtilities/Network (5.4.1):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (5.3.7)"
- GoogleUtilities/Reachability (5.3.7):
- "GoogleUtilities/NSData+zlib (5.4.1)"
- GoogleUtilities/Reachability (5.4.1):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (5.3.7):
- GoogleUtilities/UserDefaults (5.4.1):
- GoogleUtilities/Logger
- GTMSessionFetcher/Core (1.2.1)
- nanopb (0.3.901):
@@ -84,8 +84,8 @@ PODS:
- nanopb/decode (0.3.901)
- nanopb/encode (0.3.901)
- ObjectiveDropboxOfficial (3.9.4)
- React (0.57.8):
- React/Core (= 0.57.8)
- React (0.59.2):
- React/Core (= 0.59.2)
- react-native-background-timer (2.1.1):
- React
- react-native-calendar-events (1.6.4):
@@ -97,44 +97,52 @@ PODS:
- SDWebImage/GIF
- react-native-keep-awake (4.0.0):
- React
- react-native-webrtc (1.67.1):
- react-native-webrtc (1.69.0):
- React
- React/Core (0.57.8):
- yoga (= 0.57.8.React)
- React/CxxBridge (0.57.8):
- Folly (= 2016.10.31.00)
- React/Core (0.59.2):
- yoga (= 0.59.2.React)
- React/CxxBridge (0.59.2):
- Folly (= 2018.10.22.00)
- React/Core
- React/cxxreact
- React/cxxreact (0.57.8):
- React/jsiexecutor
- React/cxxreact (0.59.2):
- boost-for-react-native (= 1.63.0)
- Folly (= 2016.10.31.00)
- React/jschelpers
- DoubleConversion
- Folly (= 2018.10.22.00)
- glog
- React/jsinspector
- React/DevSupport (0.57.8):
- React/DevSupport (0.59.2):
- React/Core
- React/RCTWebSocket
- React/fishhook (0.57.8)
- React/jschelpers (0.57.8):
- Folly (= 2016.10.31.00)
- React/PrivateDatabase
- React/jsinspector (0.57.8)
- React/PrivateDatabase (0.57.8)
- React/RCTActionSheet (0.57.8):
- React/fishhook (0.59.2)
- React/jsi (0.59.2):
- DoubleConversion
- Folly (= 2018.10.22.00)
- glog
- React/jsiexecutor (0.59.2):
- DoubleConversion
- Folly (= 2018.10.22.00)
- glog
- React/cxxreact
- React/jsi
- React/jsinspector (0.59.2)
- React/RCTActionSheet (0.59.2):
- React/Core
- React/RCTAnimation (0.57.8):
- React/RCTAnimation (0.59.2):
- React/Core
- React/RCTBlob (0.57.8):
- React/RCTBlob (0.59.2):
- React/Core
- React/RCTImage (0.57.8):
- React/RCTImage (0.59.2):
- React/Core
- React/RCTNetwork
- React/RCTLinkingIOS (0.57.8):
- React/RCTLinkingIOS (0.59.2):
- React/Core
- React/RCTNetwork (0.57.8):
- React/RCTNetwork (0.59.2):
- React/Core
- React/RCTText (0.57.8):
- React/RCTText (0.59.2):
- React/Core
- React/RCTWebSocket (0.57.8):
- React/RCTWebSocket (0.59.2):
- React/Core
- React/fishhook
- React/RCTBlob
@@ -148,23 +156,23 @@ PODS:
- React/Core
- RNVectorIcons (6.0.2):
- React
- SDWebImage/Core (4.4.3)
- SDWebImage/GIF (4.4.3):
- SDWebImage/Core (4.4.6)
- SDWebImage/GIF (4.4.6):
- FLAnimatedImage (~> 1.0)
- SDWebImage/Core
- yoga (0.57.8.React)
- yoga (0.59.2.React)
DEPENDENCIES:
- Amplitude-iOS (~> 4.0.4)
- BVLinearGradient (from `../node_modules/react-native-linear-gradient`)
- Crashlytics
- Crashlytics (~> 3.12.0)
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
- Fabric
- Firebase/Core
- Firebase/DynamicLinks
- Fabric (~> 1.9.0)
- Firebase/Core (~> 5.18.0)
- Firebase/DynamicLinks (~> 5.18.0)
- Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
- ObjectiveDropboxOfficial
- ObjectiveDropboxOfficial (~> 3.9.4)
- react-native-background-timer (from `../node_modules/react-native-background-timer`)
- react-native-calendar-events (from `../node_modules/react-native-calendar-events`)
- react-native-fast-image (from `../node_modules/react-native-fast-image`)
@@ -244,34 +252,34 @@ SPEC CHECKSUMS:
Crashlytics: 07fb167b1694128c1c9a5a5cc319b0e9c3ca0933
DoubleConversion: bb338842f62ab1d708ceb63ec3d999f0f3d98ecd
Fabric: f988e33c97f08930a413e08123064d2e5f68d655
Firebase: 8bb9268bff82374f2cbaaabb143e725743c316ae
FirebaseAnalytics: c06f9d70577d79074214700a71fd5d39de5550fb
FirebaseAnalyticsInterop: e5f21be9af6548372e2f0815834ff909bff395a2
FirebaseCore: 35747502d9e8c6ee217385ad04446c7c2aaf9c5c
FirebaseDynamicLinks: c713da5f75c324f38fb2d57164bbc1c461aa6739
FirebaseInstanceID: e2fa4cb35ef5558c200f7f0ad8a53e212215f93e
Firebase: 02f3281965c075426141a0ce1277e9de6649cab9
FirebaseAnalytics: 23851fe602c872130a2c5c55040b302120346cc2
FirebaseAnalyticsInterop: efbe45c8385ec626e29f9525e5ebd38520dfb6c1
FirebaseCore: 52f851b30e11360f1e67cf04b1edfebf0a47a2d3
FirebaseDynamicLinks: f209c3caccd82102caa0e91d393e3ccc593501fd
FirebaseInstanceID: bd6fc5a258884e206fd5c474ebe4f5b00e21770e
FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
Folly: c89ac2d5c6ab169cd7397ef27485c44f35f742c7
glog: e8acf0ebbf99759d3ff18c86c292a5898282dcde
GoogleAppMeasurement: 98b71f5e04142793729a5ef23e5b96651ff4b70f
Folly: de497beb10f102453a1afa9edbf8cf8a251890de
glog: aefd1eb5dda2ab95ba0938556f34b98e2da3a60d
GoogleAppMeasurement: 6cf307834da065863f9faf4c0de0a936d81dd832
GoogleSignIn: 7ff245e1a7b26d379099d3243a562f5747e23d39
GoogleToolboxForMac: ff31605b7d66400dcec09bed5861689aebadda4d
GoogleUtilities: 111a012f4c3a29c9e7c954c082fafd6ee3c999c0
GoogleUtilities: 1e25823cbf46540b4284f6ef8e17b3a68ee12bbc
GTMSessionFetcher: 32aeca0aa144acea523e1c8e053089dec2cb98ca
nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48
ObjectiveDropboxOfficial: a5afefc83f6467c42c45f2253f583f2ad1ffc701
React: adbac0757ce35e92fbd447ab98c810209d27d9b0
React: 9d063e2f356c8cd2f54dd550d4507740037cbabe
react-native-background-timer: 0d34748e53a972507c66963490c775321a88f6f2
react-native-calendar-events: ee9573e355711ac679e071be70789542431f4ce3
react-native-fast-image: 47487b71169aea34868e7b38bf870b6b3f2157c5
react-native-keep-awake: eba3137546b10003361b37c761f6c429b59814ae
react-native-webrtc: 7152e789c1efefb695fe1166bd9432eff2afd8ac
react-native-webrtc: a14197fefe96ab462dc098b79c428fc5a7f68216
RNGoogleSignin: 361174d9a3090d295b06257162b560d8efc8a6ed
RNSound: 53d2fc9c6589bd68daba530262b7560393def3ac
RNVectorIcons: d819334932bcda3332deb3d2c8ea4d069e0b98f9
SDWebImage: c5594f1a19c48d526d321e548902b56b479cd508
yoga: 74cdf036c30820443b25ade59916236b1e95ee93
SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8
yoga: 3768a3026ade0fb46a68f3a31a917cf86bc34fc4
PODFILE CHECKSUM: b300161e95d65c24b91368803afb8873f4b873cc
PODFILE CHECKSUM: 4a11c3d66127a9845d4a5b2c7fad49f58a9c7a89
COCOAPODS: 1.6.1

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>API_KEY</key>
<string>correct_api_key</string>
<key>TRACKING_ID</key>
<string>correct_tracking_id</string>
<key>CLIENT_ID</key>
<string>correct_client_id</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.google.correct-reversed-client-id</string>
<key>GOOGLE_APP_ID</key>
<string>1:123:ios:123abc</string>
<key>GCM_SENDER_ID</key>
<string>correct_gcm_sender_id</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.google.FirebaseSDKTests</string>
<key>PROJECT_ID</key>
<string>abc-xyz-123</string>
<key>DATABASE_URL</key>
<string>https://abc-xyz-123.firebaseio.com</string>
<key>STORAGE_BUCKET</key>
<string>project-id-123.storage.firebase.com</string>
</dict>
</plist>

View File

@@ -18,7 +18,6 @@
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
695AF3ED6F686F9C5EE40F9A /* libPods-jitsi-meet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 489E8EFE2C720D10F5961AEF /* libPods-jitsi-meet.a */; };
DE4C455E21DE1E4300EA0709 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = DE4C455D21DE1E4300EA0709 /* GoogleService-Info.plist */; };
DE4C456121DE1E4E00EA0709 /* FIRUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = DE4C455F21DE1E4E00EA0709 /* FIRUtilities.m */; };
/* End PBXBuildFile section */
@@ -55,7 +54,6 @@
4670A512A688E2DC34528282 /* Pods-jitsi-meet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-jitsi-meet.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-jitsi-meet/Pods-jitsi-meet.debug.xcconfig"; sourceTree = "<group>"; };
489E8EFE2C720D10F5961AEF /* libPods-jitsi-meet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-jitsi-meet.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B3B083EB1D4955FF0069CEE7 /* app.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = app.entitlements; sourceTree = "<group>"; };
DE4C455D21DE1E4300EA0709 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; };
DE4C455F21DE1E4E00EA0709 /* FIRUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRUtilities.m; sourceTree = "<group>"; };
DE4C456021DE1E4E00EA0709 /* FIRUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRUtilities.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -91,7 +89,6 @@
13B07FB01A68108700A75B9A /* AppDelegate.m */,
DE4C456021DE1E4E00EA0709 /* FIRUtilities.h */,
DE4C455F21DE1E4E00EA0709 /* FIRUtilities.m */,
DE4C455D21DE1E4300EA0709 /* GoogleService-Info.plist */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
@@ -149,6 +146,7 @@
0B26BE701EC5BC3C00EEFB41 /* Embed Frameworks */,
B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */,
0BB7DA181EC9E695007AAE98 /* Adjust ATS */,
DEF4813D224925A2002AD03A /* Copy Google Plist file */,
DEC2069321CBBD6900072F03 /* Setup Fabric */,
DE11877A21EE09640078D059 /* Setup Google reverse URL handler */,
DE4F6D6E22005C0400DE699E /* Setup Dropbox */,
@@ -173,6 +171,7 @@
TargetAttributes = {
13B07F861A680F5B00A75B9A = {
DevelopmentTeam = FC967L3QRG;
ProvisioningStyle = Automatic;
SystemCapabilities = {
com.apple.SafariKeychain = {
enabled = 1;
@@ -208,7 +207,6 @@
buildActionMask = 2147483647;
files = (
0B412F211EDEE95300B1A0A6 /* Main.storyboard in Resources */,
DE4C455E21DE1E4300EA0709 /* GoogleService-Info.plist in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
);
@@ -297,7 +295,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nREVERSED_CLIENT_ID=$(/usr/libexec/PlistBuddy -c \"Print :REVERSED_CLIENT_ID:\" $PROJECT_DIR/GoogleService-Info.plist)\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleURLTypes:1:CFBundleURLSchemes:0 $REVERSED_CLIENT_ID\" $INFO_PLIST\n";
shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nGOOGLE_PLIST=\"$PROJECT_DIR/GoogleService-Info.plist\"\n\nif [[ -f $GOOGLE_PLIST ]]; then\n REVERSED_CLIENT_ID=$(/usr/libexec/PlistBuddy -c \"Print :REVERSED_CLIENT_ID:\" $GOOGLE_PLIST)\n /usr/libexec/PlistBuddy -c \"Set :CFBundleURLTypes:1:CFBundleURLSchemes:0 $REVERSED_CLIENT_ID\" $INFO_PLIST\nfi\n";
};
DE4F6D6E22005C0400DE699E /* Setup Dropbox */ = {
isa = PBXShellScriptBuildPhase;
@@ -335,6 +333,24 @@
shellPath = /bin/sh;
shellScript = "${PODS_ROOT}/Fabric/run\n";
};
DEF4813D224925A2002AD03A /* Copy Google Plist file */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Copy Google Plist file";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "GOOGLE_PLIST_NAME=\"GoogleService-Info.plist\"\nGOOGLE_PLIST=\"$PROJECT_DIR/$GOOGLE_PLIST_NAME\"\nBUILD_APP_DIR=\"$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app\"\n\nif [[ -f $GOOGLE_PLIST ]]; then\n cp $GOOGLE_PLIST \"$BUILD_APP_DIR/$GOOGLE_PLIST_NAME\"\nfi\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -370,6 +386,8 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDebug;
CODE_SIGN_ENTITLEMENTS = app.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = FC967L3QRG;
@@ -393,6 +411,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet;
PRODUCT_NAME = "jitsi-meet";
PROVISIONING_PROFILE_SPECIFIER = "";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
@@ -404,6 +423,8 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIconRelease;
CODE_SIGN_ENTITLEMENTS = app.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = FC967L3QRG;
ENABLE_BITCODE = NO;
@@ -426,6 +447,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.meet;
PRODUCT_NAME = "jitsi-meet";
PROVISIONING_PROFILE_SPECIFIER = "";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;

View File

@@ -21,8 +21,6 @@ NSString *const kGoogleServiceInfoFileName = @"GoogleService-Info";
// Plist file type.
NSString *const kGoogleServiceInfoFileType = @"plist";
NSString *const kGoogleAppIDPlistKey = @"GOOGLE_APP_ID";
// Dummy plist GOOGLE_APP_ID
NSString *const kDummyGoogleAppID = @"1:123:ios:123abc";
@implementation FIRUtilities
@@ -59,9 +57,6 @@ NSString *const kDummyGoogleAppID = @"1:123:ios:123abc";
if (!googleAppID.length) {
return NO;
}
if ([googleAppID isEqualToString:kDummyGoogleAppID]) {
return NO;
}
return YES;
}

View File

@@ -1,8 +1,14 @@
ENV["FASTLANE_SKIP_UPDATE_CHECK"] = "1"
opt_out_usage
default_platform(:ios)
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
lane :deploy do
# Make sure we are on a clean tree
ensure_git_status_clean
# Set the app identifier
update_app_identifier(
xcodeproj: "app/app.xcodeproj",
@@ -24,5 +30,6 @@ platform :ios do
# Cleanup
clean_build_artifacts
reset_git_repo(skip_clean: true)
end
end

View File

@@ -16,9 +16,9 @@ or alternatively using `brew cask install fastlane`
# Available Actions
## iOS
### ios beta
### ios deploy
```
fastlane ios beta
fastlane ios deploy
```
Push a new beta build to TestFlight

View File

@@ -373,7 +373,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [[ \"$CONFIGURATION\" == *Debug* && ! \"$PLATFORM_NAME\" == *simulator ]]; then\n IP=$(ipconfig getifaddr en0)\n if [ -z \"$IP\" ]; then\n IP=$(ifconfig | grep 'inet ' | grep -v ' 127.' | cut -d\\ -f2 | awk 'NR==1{print $1}')\n fi\n DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH\n echo \"$IP\" > \"$DEST/ip.txt\"\n exit 0\nfi\nexport NODE_BINARY=node\n../../node_modules/react-native/scripts/react-native-xcode.sh\n";
shellScript = "export NODE_BINARY=node\n../../node_modules/react-native/scripts/react-native-xcode.sh\n";
};
26796D8589142D80C8AFDA51 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;

View File

@@ -43,16 +43,25 @@ static NSURL *serverRootWithHost(NSString *host) {
}
- (BOOL)isPackagerRunning:(NSString *)host {
NSURL *url
= [serverRootWithHost(host) URLByAppendingPathComponent:@"status"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response;
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:NULL];
NSString *status = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSURL *url = [serverRootWithHost(host) URLByAppendingPathComponent:@"status"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
__block NSURLResponse *response;
__block NSData *data;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[[session dataTaskWithRequest:request
completionHandler:^(NSData *d,
NSURLResponse *res,
__unused NSError *err) {
data = d;
response = res;
dispatch_semaphore_signal(semaphore);
}] resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSString *status = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return [status isEqualToString:@"packager-status:running"];
}
@@ -97,7 +106,7 @@ static NSURL *serverRootWithHost(NSString *host) {
NSString *host = [self guessPackagerHost];
if (host != nil) {
NSString *path = @"/index.ios.bundle";
NSString *path = @"/index.bundle";
NSString *query = @"platform=ios&dev=true&minify=false";
NSURLComponents *components
= [NSURLComponents componentsWithURL:serverRootWithHost(host)

View File

@@ -458,9 +458,9 @@
},
"me": "me",
"notify": {
"connectedOneMember": "__name__ connected",
"connectedThreePlusMembers": "__name__ and __count__ others connected",
"connectedTwoMembers": "__first__ and __second__ connected",
"connectedOneMember": "__name__ joined the meeting",
"connectedThreePlusMembers": "__name__ and __count__ others joined the meeting",
"connectedTwoMembers": "__first__ and __second__ joined the meeting",
"disconnected": "disconnected",
"focus": "Conference focus",
"focusFail": "__component__ not available - retry in __ms__ sec",

19
metro.config.js Normal file
View File

@@ -0,0 +1,19 @@
/* eslint-disable */
/**
* Metro configuration for React Native
* https://github.com/facebook/react-native
*
* @format
*/
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
};

View File

@@ -14,10 +14,7 @@ import VideoLayout from './videolayout/VideoLayout';
import Filmstrip from './videolayout/Filmstrip';
import { JitsiTrackErrors } from '../../react/features/base/lib-jitsi-meet';
import {
getLocalParticipant,
showParticipantJoinedNotification
} from '../../react/features/base/participants';
import { getLocalParticipant } from '../../react/features/base/participants';
import { toggleChat } from '../../react/features/chat';
import { openDisplayNamePrompt } from '../../react/features/display-name';
import { setEtherpadHasInitialzied } from '../../react/features/etherpad';
@@ -380,8 +377,6 @@ UI.addUser = function(user) {
if (status) {
// FIXME: move updateUserStatus in participantPresenceChanged action
UI.updateUserStatus(user, status);
} else {
APP.store.dispatch(showParticipantJoinedNotification(displayName));
}
// set initial display name

View File

@@ -19,7 +19,7 @@ export default function SharedVideoThumb(participant, videoType, VideoLayout) {
this.bindHoverHandler();
SmallVideo.call(this, VideoLayout);
this.isVideoMuted = true;
this.setDisplayName(participant.name);
this.updateDisplayName();
this.container.onclick = this._onContainerClick;
this.container.ondblclick = this._onContainerDoubleClick;
@@ -65,9 +65,11 @@ SharedVideoThumb.prototype.createContainer = function(spanId) {
};
/**
* Sets the display name for the thumb.
* Triggers re-rendering of the display name using current instance state.
*
* @returns {void}
*/
SharedVideoThumb.prototype.setDisplayName = function(displayName) {
SharedVideoThumb.prototype.updateDisplayName = function() {
if (!this.container) {
logger.warn(`Unable to set displayName - ${this.videoSpanId
} does not exist`);
@@ -75,8 +77,7 @@ SharedVideoThumb.prototype.setDisplayName = function(displayName) {
return;
}
this.updateDisplayName({
displayName: displayName || '',
this._renderDisplayName({
elementID: `${this.videoSpanId}_name`,
participantID: this.id
});

View File

@@ -50,7 +50,7 @@ function LocalVideo(VideoLayout, emitter, streamEndedCallback) {
SmallVideo.call(this, VideoLayout);
// Set default display name.
this.setDisplayName();
this.updateDisplayName();
// Initialize the avatar display with an avatar url selected from the redux
// state. Redux stores the local user with a hardcoded participant id of
@@ -87,9 +87,11 @@ LocalVideo.prototype.createContainer = function() {
};
/**
* Sets the display name for the given video span id.
* Triggers re-rendering of the display name using current instance state.
*
* @returns {void}
*/
LocalVideo.prototype.setDisplayName = function(displayName) {
LocalVideo.prototype.updateDisplayName = function() {
if (!this.container) {
logger.warn(
`Unable to set displayName - ${this.videoSpanId
@@ -98,9 +100,8 @@ LocalVideo.prototype.setDisplayName = function(displayName) {
return;
}
this.updateDisplayName({
this._renderDisplayName({
allowEditing: APP.store.getState()['features/base/jwt'].isGuest,
displayName,
displayNameSuffix: interfaceConfig.DEFAULT_LOCAL_DISPLAY_NAME,
elementID: 'localDisplayName',
participantID: this.id

View File

@@ -53,7 +53,7 @@ function RemoteVideo(user, VideoLayout, emitter) {
? 'left bottom' : 'top center';
this.addRemoteVideoContainer();
this.updateIndicators();
this.setDisplayName();
this.updateDisplayName();
this.bindHoverHandler();
this.flipX = false;
this.isLocal = false;
@@ -519,11 +519,11 @@ RemoteVideo.prototype.addRemoteStreamElement = function(stream) {
};
/**
* Sets the display name for the given video span id.
* Triggers re-rendering of the display name using current instance state.
*
* @param displayName the display name to set
* @returns {void}
*/
RemoteVideo.prototype.setDisplayName = function(displayName) {
RemoteVideo.prototype.updateDisplayName = function() {
if (!this.container) {
logger.warn(`Unable to set displayName - ${this.videoSpanId
} does not exist`);
@@ -531,8 +531,7 @@ RemoteVideo.prototype.setDisplayName = function(displayName) {
return;
}
this.updateDisplayName({
displayName: displayName || interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME,
this._renderDisplayName({
elementID: `${this.videoSpanId}_name`,
participantID: this.id
});

View File

@@ -439,9 +439,11 @@ SmallVideo.prototype.$displayName = function() {
* Creates or updates the participant's display name that is shown over the
* video preview.
*
* @param {Object} props - The React {@code Component} props to pass into the
* {@code DisplayName} component.
* @returns {void}
*/
SmallVideo.prototype.updateDisplayName = function(props) {
SmallVideo.prototype._renderDisplayName = function(props) {
const displayNameContainer
= this.container.querySelector('.displayNameContainer');

View File

@@ -659,15 +659,15 @@ const VideoLayout = {
/**
* Display name changed.
*/
onDisplayNameChanged(id, displayName, status) {
onDisplayNameChanged(id) {
if (id === 'localVideoContainer'
|| APP.conference.isLocalId(id)) {
localVideoThumbnail.setDisplayName(displayName);
localVideoThumbnail.updateDisplayName();
} else {
const remoteVideo = remoteVideos[id];
if (remoteVideo) {
remoteVideo.setDisplayName(displayName, status);
remoteVideo.updateDisplayName();
}
}
},

1037
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -48,25 +48,24 @@
"jquery-contextmenu": "2.4.5",
"jquery-i18next": "1.2.0",
"js-md5": "0.6.1",
"js-utils": "github:jitsi/js-utils#446497893023aa8dec403e0e4e35a22cae6bc87d",
"jsc-android": "224109.1.0",
"js-utils": "github:jitsi/js-utils#73a67a7a60d52f8e895f50939c8fcbd1f20fe7b5",
"jsrsasign": "8.0.12",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#74f48e168eec4c05fd8600812cc00e6e34e9ab90",
"lib-jitsi-meet": "github:jitsi/lib-jitsi-meet#83af6e78a82466153e93d4a467e1459c9c97d5ee",
"libflacjs": "github:mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
"lodash": "4.17.11",
"moment": "2.19.4",
"moment-duration-format": "2.2.2",
"postis": "2.2.0",
"react": "16.6.3",
"react-dom": "16.6.3",
"react": "16.8.3",
"react-dom": "16.8.3",
"react-emoji-render": "0.4.6",
"react-i18next": "7.13.0",
"react-linkify": "0.2.2",
"react-native": "0.57.8",
"react-native": "0.59.2",
"react-native-background-timer": "2.1.1",
"react-native-calendar-events": "1.6.4",
"react-native-callstats": "3.57.1",
"react-native-callstats": "3.58.2",
"react-native-fast-image": "5.1.1",
"react-native-gifted-chat": "0.6.0",
"react-native-google-signin": "1.0.2",
@@ -76,7 +75,7 @@
"react-native-sound": "github:jitsi/react-native-sound#e4260ed7f641eeb0377d76eac7987aba72e1cf08",
"react-native-swipeout": "2.3.6",
"react-native-vector-icons": "6.0.2",
"react-native-webrtc": "github:jitsi/react-native-webrtc#c1be0cb1c6e8a83dfd406e478082a5ff205a97ec",
"react-native-webrtc": "github:jitsi/react-native-webrtc#032ee5c90e2c5ff27ab2f952217104772fcbd155",
"react-redux": "5.0.7",
"react-transition-group": "2.4.0",
"redux": "4.0.0",
@@ -100,14 +99,14 @@
"clean-css": "3.4.25",
"css-loader": "0.28.7",
"eslint": "5.6.1",
"eslint-config-jitsi": "github:jitsi/eslint-config-jitsi#7474f6668515eb5852f1273dc5a50b940a550d3f",
"eslint-config-jitsi": "github:jitsi/eslint-config-jitsi#1.0.0",
"eslint-plugin-flowtype": "2.50.3",
"eslint-plugin-import": "2.14.0",
"eslint-plugin-jsdoc": "3.8.0",
"eslint-plugin-react": "7.11.1",
"eslint-plugin-react-native": "3.3.0",
"expose-loader": "0.7.5",
"flow-bin": "0.78.0",
"flow-bin": "0.92.0",
"imports-loader": "0.7.1",
"metro-react-native-babel-preset": "0.49.2",
"node-sass": "4.10.0",

View File

@@ -31,7 +31,7 @@ declare var APP: Object;
* @returns {Function}
*/
export function appNavigate(uri: ?string) {
return (dispatch: Dispatch<*>, getState: Function) =>
return (dispatch: Dispatch<any>, getState: Function) =>
_appNavigateToOptionalLocation(dispatch, getState, parseURIString(uri));
}
@@ -50,7 +50,7 @@ export function appNavigate(uri: ?string) {
* @returns {Promise<void>}
*/
function _appNavigateToMandatoryLocation(
dispatch: Dispatch<*>, getState: Function,
dispatch: Dispatch<any>, getState: Function,
newLocation: Object
): Promise<void> {
const { room } = newLocation;
@@ -111,7 +111,7 @@ function _appNavigateToMandatoryLocation(
* @returns {void}
*/
function _appNavigateToOptionalLocation(
dispatch: Dispatch<*>, getState: Function,
dispatch: Dispatch<any>, getState: Function,
location: Object) {
// If the specified location (URI) does not identify a host, use the app's
// default.
@@ -150,7 +150,7 @@ function _appNavigateToOptionalLocation(
* @returns {Promise<Object>}
*/
function _loadConfig(
dispatch: Dispatch<*>,
dispatch: Dispatch<any>,
getState: Function,
{ contextRoot, host, protocol, room }) {
// XXX As the mobile/React Native app does not employ config on the
@@ -211,7 +211,7 @@ function _loadConfig(
* @returns {Function}
*/
export function redirectWithStoredParams(pathname: string) {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const { locationURL } = getState()['features/base/connection'];
const newLocationURL = new URL(locationURL.href);
@@ -248,7 +248,7 @@ export function reloadNow() {
* @returns {Function}
*/
export function reloadWithStoredParams() {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const { locationURL } = getState()['features/base/connection'];
const windowLocation = window.location;
const oldSearchString = windowLocation.search;

View File

@@ -1,5 +1,6 @@
// @flow
import { generateRoomWithoutSeparator } from 'js-utils/random';
import type { Component } from 'react';
import { isRoomValid } from '../base/conference';
@@ -12,13 +13,10 @@ import { UnsupportedDesktopBrowser } from '../unsupported-browser';
import {
BlankPage,
WelcomePage,
generateRoomWithoutSeparator,
isWelcomePageAppEnabled,
isWelcomePageUserEnabled
} from '../welcome';
declare var interfaceConfig: Object;
/**
* Object describing application route.
*

View File

@@ -6,7 +6,7 @@
* type: CANCEL_LOGIN
* }
*/
export const CANCEL_LOGIN = Symbol('CANCEL_LOGIN');
export const CANCEL_LOGIN = 'CANCEL_LOGIN';
/**
* The type of (redux) action which signals that the cyclic operation of waiting
@@ -16,7 +16,7 @@ export const CANCEL_LOGIN = Symbol('CANCEL_LOGIN');
* type: STOP_WAIT_FOR_OWNER
* }
*/
export const STOP_WAIT_FOR_OWNER = Symbol('STOP_WAIT_FOR_OWNER');
export const STOP_WAIT_FOR_OWNER = 'STOP_WAIT_FOR_OWNER';
/**
* The type of (redux) action which informs that the authentication and role
@@ -33,7 +33,7 @@ export const STOP_WAIT_FOR_OWNER = Symbol('STOP_WAIT_FOR_OWNER');
* thenableWithCancel: Object
* }
*/
export const UPGRADE_ROLE_FINISHED = Symbol('UPGRADE_ROLE_FINISHED');
export const UPGRADE_ROLE_FINISHED = 'UPGRADE_ROLE_FINISHED';
/**
* The type of (redux) action which signals that the process of authenticating
@@ -44,7 +44,7 @@ export const UPGRADE_ROLE_FINISHED = Symbol('UPGRADE_ROLE_FINISHED');
* thenableWithCancel: Object
* }
*/
export const UPGRADE_ROLE_STARTED = Symbol('UPGRADE_ROLE_STARTED');
export const UPGRADE_ROLE_STARTED = 'UPGRADE_ROLE_STARTED';
/**
* The type of (redux) action that sets delayed handler which will check if
@@ -57,4 +57,4 @@ export const UPGRADE_ROLE_STARTED = Symbol('UPGRADE_ROLE_STARTED');
* timeoutMs: number
* }
*/
export const WAIT_FOR_OWNER = Symbol('WAIT_FOR_OWNER');
export const WAIT_FOR_OWNER = 'WAIT_FOR_OWNER';

View File

@@ -1,5 +1,7 @@
// @flow
import type { Dispatch } from 'redux';
import { appNavigate } from '../app';
import { checkIfCanJoin, conferenceLeft } from '../base/conference';
import { connectionFailed } from '../base/connection';
@@ -33,7 +35,7 @@ export function authenticateAndUpgradeRole(
id: string,
password: string,
conference: Object) {
return (dispatch: Dispatch, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const { password: roomPassword }
= getState()['features/base/conference'];
const process
@@ -73,7 +75,7 @@ export function authenticateAndUpgradeRole(
* }}
*/
export function cancelLogin() {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
dispatch({ type: CANCEL_LOGIN });
// XXX The error associated with CONNECTION_FAILED was marked as
@@ -100,7 +102,7 @@ export function cancelLogin() {
* @returns {Function}
*/
export function cancelWaitForOwner() {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
dispatch(stopWaitForOwner());
// XXX The error associated with CONFERENCE_FAILED was marked as
@@ -228,7 +230,7 @@ function _upgradeRoleStarted(thenableWithCancel) {
* @returns {Function}
*/
export function waitForOwner() {
return (dispatch: Dispatch) =>
return (dispatch: Dispatch<any>) =>
dispatch({
type: WAIT_FOR_OWNER,
handler: () => dispatch(checkIfCanJoin()),

View File

@@ -3,6 +3,7 @@
import React, { Component } from 'react';
import { Text, TextInput, View } from 'react-native';
import { connect as reduxConnect } from 'react-redux';
import type { Dispatch } from 'redux';
import { connect, toJid } from '../../base/connection';
import {
@@ -59,7 +60,7 @@ type Props = {
/**
* Redux store dispatch method.
*/
dispatch: Dispatch<*>,
dispatch: Dispatch<any>,
/**
* Invoked to obtain translated strings.

View File

@@ -1,10 +1,11 @@
// @flow
import React, { Component } from 'react';
import { connect } from 'react-redux';
import type { Dispatch } from 'redux';
import { ConfirmDialog } from '../../base/dialog';
import { translate } from '../../base/i18n';
import { connect } from '../../base/redux';
import { cancelWaitForOwner, _openLoginDialog } from '../actions';
@@ -21,7 +22,7 @@ type Props = {
/**
* Redux store dispatch function.
*/
dispatch: Dispatch<*>,
dispatch: Dispatch<any>,
/**
* Invoked to obtain translated strings.

View File

@@ -1,5 +1,7 @@
// @flow
import type { Dispatch } from 'redux';
import { appNavigate } from '../app';
import {
CONFERENCE_FAILED,
@@ -160,7 +162,7 @@ function _clearExistingWaitForOwnerTimeout(
* @param {Object} store - The redux store.
* @returns {void}
*/
function _hideLoginDialog({ dispatch }: { dispatch: Dispatch<*> }) {
function _hideLoginDialog({ dispatch }: { dispatch: Dispatch<any> }) {
dispatch(hideDialog(LoginDialog));
}

View File

@@ -7,7 +7,7 @@
* app: App
* }
*/
export const APP_WILL_MOUNT = Symbol('APP_WILL_MOUNT');
export const APP_WILL_MOUNT = 'APP_WILL_MOUNT';
/**
* The type of (redux) action which signals that a specific App will unmount (in
@@ -18,4 +18,4 @@ export const APP_WILL_MOUNT = Symbol('APP_WILL_MOUNT');
* app: App
* }
*/
export const APP_WILL_UNMOUNT = Symbol('APP_WILL_UNMOUNT');
export const APP_WILL_UNMOUNT = 'APP_WILL_UNMOUNT';

View File

@@ -1,5 +1,7 @@
// @flow
import type { Dispatch } from 'redux';
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from './actionTypes';
declare var APP;
@@ -14,7 +16,7 @@ declare var APP;
* }}
*/
export function appWillMount(app: Object) {
return (dispatch: Dispatch<*>) => {
return (dispatch: Dispatch<any>) => {
dispatch({
type: APP_WILL_MOUNT,
app

View File

@@ -55,8 +55,6 @@ export default class BaseApp extends Component<*, State> {
this.state = {
route: {},
// $FlowFixMe
store: undefined
};
}

View File

@@ -122,8 +122,11 @@ class ColorSchemeRegistry {
} else if (typeof styleValue === 'function') {
// The value is a function, which indicates that it's a
// dynamic, schemed color we need to resolve.
// $FlowExpectedError
const value = styleValue();
schemedStyle[styleName]
= this._getColor(stateful, componentName, styleValue());
= this._getColor(stateful, componentName, value);
}
}

View File

@@ -8,4 +8,4 @@
* colorScheme: Object
* }
*/
export const SET_COLOR_SCHEME = Symbol('SET_COLOR_SCHEME');
export const SET_COLOR_SCHEME = 'SET_COLOR_SCHEME';

View File

@@ -8,7 +8,7 @@
* authLogin: string
* }
*/
export const AUTH_STATUS_CHANGED = Symbol('AUTH_STATUS_CHANGED');
export const AUTH_STATUS_CHANGED = 'AUTH_STATUS_CHANGED';
/**
* The type of (redux) action which signals that a specific conference failed.
@@ -19,7 +19,7 @@ export const AUTH_STATUS_CHANGED = Symbol('AUTH_STATUS_CHANGED');
* error: Error
* }
*/
export const CONFERENCE_FAILED = Symbol('CONFERENCE_FAILED');
export const CONFERENCE_FAILED = 'CONFERENCE_FAILED';
/**
* The type of (redux) action which signals that a specific conference was
@@ -30,7 +30,7 @@ export const CONFERENCE_FAILED = Symbol('CONFERENCE_FAILED');
* conference: JitsiConference
* }
*/
export const CONFERENCE_JOINED = Symbol('CONFERENCE_JOINED');
export const CONFERENCE_JOINED = 'CONFERENCE_JOINED';
/**
* The type of (redux) action which signals that a specific conference was left.
@@ -40,7 +40,7 @@ export const CONFERENCE_JOINED = Symbol('CONFERENCE_JOINED');
* conference: JitsiConference
* }
*/
export const CONFERENCE_LEFT = Symbol('CONFERENCE_LEFT');
export const CONFERENCE_LEFT = 'CONFERENCE_LEFT';
/**
* The type of (redux) action, which indicates conference subject changes.
@@ -50,7 +50,7 @@ export const CONFERENCE_LEFT = Symbol('CONFERENCE_LEFT');
* subject: string
* }
*/
export const CONFERENCE_SUBJECT_CHANGED = Symbol('CONFERENCE_SUBJECT_CHANGED');
export const CONFERENCE_SUBJECT_CHANGED = 'CONFERENCE_SUBJECT_CHANGED';
/**
* The type of (redux) action which signals that a specific conference will be
@@ -61,7 +61,7 @@ export const CONFERENCE_SUBJECT_CHANGED = Symbol('CONFERENCE_SUBJECT_CHANGED');
* conference: JitsiConference
* }
*/
export const CONFERENCE_WILL_JOIN = Symbol('CONFERENCE_WILL_JOIN');
export const CONFERENCE_WILL_JOIN = 'CONFERENCE_WILL_JOIN';
/**
* The type of (redux) action which signals that a specific conference will be
@@ -72,7 +72,7 @@ export const CONFERENCE_WILL_JOIN = Symbol('CONFERENCE_WILL_JOIN');
* conference: JitsiConference
* }
*/
export const CONFERENCE_WILL_LEAVE = Symbol('CONFERENCE_WILL_LEAVE');
export const CONFERENCE_WILL_LEAVE = 'CONFERENCE_WILL_LEAVE';
/**
* The type of (redux) action which signals that the data channel with the
@@ -82,7 +82,7 @@ export const CONFERENCE_WILL_LEAVE = Symbol('CONFERENCE_WILL_LEAVE');
* type: DATA_CHANNEL_OPENED
* }
*/
export const DATA_CHANNEL_OPENED = Symbol('DATA_CHANNEL_OPENED');
export const DATA_CHANNEL_OPENED = 'DATA_CHANNEL_OPENED';
/**
* The type of action which signals that the user has been kicked out from
@@ -93,7 +93,7 @@ export const DATA_CHANNEL_OPENED = Symbol('DATA_CHANNEL_OPENED');
* conference: JitsiConference
* }
*/
export const KICKED_OUT = Symbol('KICKED_OUT');
export const KICKED_OUT = 'KICKED_OUT';
/**
* The type of (redux) action which signals that the lock state of a specific
@@ -105,7 +105,7 @@ export const KICKED_OUT = Symbol('KICKED_OUT');
* locked: boolean
* }
*/
export const LOCK_STATE_CHANGED = Symbol('LOCK_STATE_CHANGED');
export const LOCK_STATE_CHANGED = 'LOCK_STATE_CHANGED';
/**
* The type of (redux) action which sets the peer2peer flag for the current
@@ -116,7 +116,7 @@ export const LOCK_STATE_CHANGED = Symbol('LOCK_STATE_CHANGED');
* p2p: boolean
* }
*/
export const P2P_STATUS_CHANGED = Symbol('P2P_STATUS_CHANGED');
export const P2P_STATUS_CHANGED = 'P2P_STATUS_CHANGED';
/**
* The type of (redux) action which sets the audio-only flag for the current
@@ -127,7 +127,7 @@ export const P2P_STATUS_CHANGED = Symbol('P2P_STATUS_CHANGED');
* audioOnly: boolean
* }
*/
export const SET_AUDIO_ONLY = Symbol('SET_AUDIO_ONLY');
export const SET_AUDIO_ONLY = 'SET_AUDIO_ONLY';
/**
* The type of (redux) action which sets the desktop sharing enabled flag for
@@ -139,7 +139,7 @@ export const SET_AUDIO_ONLY = Symbol('SET_AUDIO_ONLY');
* }
*/
export const SET_DESKTOP_SHARING_ENABLED
= Symbol('SET_DESKTOP_SHARING_ENABLED');
= 'SET_DESKTOP_SHARING_ENABLED';
/**
* The type of (redux) action which updates the current known status of the
@@ -150,7 +150,7 @@ export const SET_DESKTOP_SHARING_ENABLED
* enabled: boolean
* }
*/
export const SET_FOLLOW_ME = Symbol('SET_FOLLOW_ME');
export const SET_FOLLOW_ME = 'SET_FOLLOW_ME';
/**
* The type of (redux) action which sets the video channel's lastN (value).
@@ -160,7 +160,7 @@ export const SET_FOLLOW_ME = Symbol('SET_FOLLOW_ME');
* lastN: number
* }
*/
export const SET_LASTN = Symbol('SET_LASTN');
export const SET_LASTN = 'SET_LASTN';
/**
* The type of (redux) action which sets the maximum video height that should be
@@ -173,7 +173,7 @@ export const SET_LASTN = Symbol('SET_LASTN');
* }
*/
export const SET_MAX_RECEIVER_VIDEO_QUALITY
= Symbol('SET_MAX_RECEIVER_VIDEO_QUALITY');
= 'SET_MAX_RECEIVER_VIDEO_QUALITY';
/**
* The type of (redux) action which sets the password to join or lock a specific
@@ -186,7 +186,7 @@ export const SET_MAX_RECEIVER_VIDEO_QUALITY
* password: string
* }
*/
export const SET_PASSWORD = Symbol('SET_PASSWORD');
export const SET_PASSWORD = 'SET_PASSWORD';
/**
* The type of (redux) action which signals that setting a password on a
@@ -197,7 +197,7 @@ export const SET_PASSWORD = Symbol('SET_PASSWORD');
* error: string
* }
*/
export const SET_PASSWORD_FAILED = Symbol('SET_PASSWORD_FAILED');
export const SET_PASSWORD_FAILED = 'SET_PASSWORD_FAILED';
/**
* The type of (redux) action which signals for pending subject changes.
@@ -207,7 +207,7 @@ export const SET_PASSWORD_FAILED = Symbol('SET_PASSWORD_FAILED');
* subject: string
* }
*/
export const SET_PENDING_SUBJECT_CHANGE = Symbol('SET_PENDING_SUBJECT_CHANGE');
export const SET_PENDING_SUBJECT_CHANGE = 'SET_PENDING_SUBJECT_CHANGE';
/**
* The type of (redux) action which sets the preferred maximum video height that
@@ -219,7 +219,7 @@ export const SET_PENDING_SUBJECT_CHANGE = Symbol('SET_PENDING_SUBJECT_CHANGE');
* }
*/
export const SET_PREFERRED_RECEIVER_VIDEO_QUALITY
= Symbol('SET_PREFERRED_RECEIVER_VIDEO_QUALITY');
= 'SET_PREFERRED_RECEIVER_VIDEO_QUALITY';
/**
* The type of (redux) action which sets the name of the room of the
@@ -230,7 +230,7 @@ export const SET_PREFERRED_RECEIVER_VIDEO_QUALITY
* room: string
* }
*/
export const SET_ROOM = Symbol('SET_ROOM');
export const SET_ROOM = 'SET_ROOM';
/**
* The type of (redux) action, which indicates if a SIP gateway is enabled on
@@ -241,7 +241,7 @@ export const SET_ROOM = Symbol('SET_ROOM');
* isSIPGatewayEnabled: boolean
* }
*/
export const SET_SIP_GATEWAY_ENABLED = Symbol('SET_SIP_GATEWAY_ENABLED');
export const SET_SIP_GATEWAY_ENABLED = 'SET_SIP_GATEWAY_ENABLED';
/**
* The type of (redux) action which updates the current known status of the
@@ -253,4 +253,4 @@ export const SET_SIP_GATEWAY_ENABLED = Symbol('SET_SIP_GATEWAY_ENABLED');
* startVideoMutedPolicy: boolean
* }
*/
export const SET_START_MUTED_POLICY = Symbol('SET_START_MUTED_POLICY');
export const SET_START_MUTED_POLICY = 'SET_START_MUTED_POLICY';

View File

@@ -299,7 +299,7 @@ export function conferenceSubjectChanged(subject: string) {
* @returns {Function}
*/
function _conferenceWillJoin(conference: Object) {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const localTracks
= getLocalTracks(getState()['features/base/tracks'])
.map(t => t.jitsiTrack);
@@ -565,7 +565,7 @@ export function setFollowMe(enabled: boolean) {
* @returns {Function}
*/
export function setLastN(lastN: ?number) {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
if (typeof lastN === 'undefined') {
const config = getState()['features/base/config'];
@@ -618,7 +618,7 @@ export function setPassword(
conference: Object,
method: Function,
password: string) {
return (dispatch: Dispatch<*>, getState: Function): ?Promise<void> => {
return (dispatch: Dispatch<any>, getState: Function): ?Promise<void> => {
switch (method) {
case conference.join: {
let state = getState()['features/base/conference'];
@@ -721,7 +721,7 @@ export function setRoom(room: ?string) {
*/
export function setStartMutedPolicy(
startAudioMuted: boolean, startVideoMuted: boolean) {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const conference = getCurrentConference(getState());
conference && conference.setStartMutedPolicy({
@@ -740,7 +740,7 @@ export function setStartMutedPolicy(
* @returns {Function}
*/
export function toggleAudioOnly() {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const { audioOnly } = getState()['features/base/conference'];
return dispatch(setAudioOnly(!audioOnly, true));
@@ -754,7 +754,7 @@ export function toggleAudioOnly() {
* @returns {void}
*/
export function setSubject(subject: string = '') {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const { conference } = getState()['features/base/conference'];
if (conference) {

View File

@@ -43,6 +43,7 @@ import {
import {
_addLocalTracksToConference,
forEachConference,
getCurrentConference,
_handleParticipantError,
_removeLocalTracksFromConference
} from './functions';
@@ -620,13 +621,10 @@ function _setRoom({ dispatch, getState }, next, action) {
* @returns {Promise}
*/
function _syncConferenceLocalTracksWithState({ getState }, action) {
const state = getState()['features/base/conference'];
const { conference } = state;
const conference = getCurrentConference(getState);
let promise;
// XXX The conference may already be in the process of being left, that's
// why we should not add/remove local tracks to such conference.
if (conference && conference !== state.leaving) {
if (conference) {
const track = action.track.jitsiTrack;
if (action.type === TRACK_ADDED) {

View File

@@ -7,7 +7,7 @@
* locationURL: URL
* }
*/
export const CONFIG_WILL_LOAD = Symbol('CONFIG_WILL_LOAD');
export const CONFIG_WILL_LOAD = 'CONFIG_WILL_LOAD';
/**
* The redux action which signals that a configuration (commonly known in Jitsi
@@ -19,7 +19,7 @@ export const CONFIG_WILL_LOAD = Symbol('CONFIG_WILL_LOAD');
* locationURL: URL
* }
*/
export const LOAD_CONFIG_ERROR = Symbol('LOAD_CONFIG_ERROR');
export const LOAD_CONFIG_ERROR = 'LOAD_CONFIG_ERROR';
/**
* The redux action which sets the configuration represented by the feature
@@ -32,4 +32,4 @@ export const LOAD_CONFIG_ERROR = Symbol('LOAD_CONFIG_ERROR');
* config: Object
* }
*/
export const SET_CONFIG = Symbol('SET_CONFIG');
export const SET_CONFIG = 'SET_CONFIG';

View File

@@ -59,7 +59,7 @@ export function loadConfigError(error: Error, locationURL: URL) {
* @returns {Function}
*/
export function setConfig(config: Object = {}) {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const { locationURL } = getState()['features/base/connection'];
// Now that the loading of the config was successful override the values
@@ -99,7 +99,7 @@ export function setConfig(config: Object = {}) {
* @returns {Function}
*/
export function storeConfig(baseURL: string, config: Object) {
return (dispatch: Dispatch<*>) => {
return (dispatch: Dispatch<any>) => {
// Try to store the configuration in localStorage. If the deployment
// specified 'getroom' as a function, for example, it does not make
// sense to and it will not be stored.

View File

@@ -7,7 +7,7 @@
* message: string
* }
*/
export const CONNECTION_DISCONNECTED = Symbol('CONNECTION_DISCONNECTED');
export const CONNECTION_DISCONNECTED = 'CONNECTION_DISCONNECTED';
/**
* The type of (redux) action which signals that a connection was successfully
@@ -19,7 +19,7 @@ export const CONNECTION_DISCONNECTED = Symbol('CONNECTION_DISCONNECTED');
* timeEstablished: number,
* }
*/
export const CONNECTION_ESTABLISHED = Symbol('CONNECTION_ESTABLISHED');
export const CONNECTION_ESTABLISHED = 'CONNECTION_ESTABLISHED';
/**
* The type of (redux) action which signals that a connection failed.
@@ -30,7 +30,7 @@ export const CONNECTION_ESTABLISHED = Symbol('CONNECTION_ESTABLISHED');
* error: Object | string
* }
*/
export const CONNECTION_FAILED = Symbol('CONNECTION_FAILED');
export const CONNECTION_FAILED = 'CONNECTION_FAILED';
/**
* The type of (redux) action which signals that a connection will connect.
@@ -40,7 +40,7 @@ export const CONNECTION_FAILED = Symbol('CONNECTION_FAILED');
* connection: JitsiConnection
* }
*/
export const CONNECTION_WILL_CONNECT = Symbol('CONNECTION_WILL_CONNECT');
export const CONNECTION_WILL_CONNECT = 'CONNECTION_WILL_CONNECT';
/**
* The type of (redux) action which sets the location URL of the application,
@@ -51,4 +51,4 @@ export const CONNECTION_WILL_CONNECT = Symbol('CONNECTION_WILL_CONNECT');
* locationURL: ?URL
* }
*/
export const SET_LOCATION_URL = Symbol('SET_LOCATION_URL');
export const SET_LOCATION_URL = 'SET_LOCATION_URL';

View File

@@ -76,7 +76,7 @@ export type ConnectionFailedError = {
* @returns {Function}
*/
export function connect(id: ?string, password: ?string) {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const state = getState();
const options = _constructOptions(state);
const { issuer, jwt } = state['features/base/jwt'];
@@ -322,7 +322,7 @@ function _constructOptions(state) {
* @returns {Function}
*/
export function disconnect() {
return (dispatch: Dispatch<*>, getState: Function): Promise<void> => {
return (dispatch: Dispatch<any>, getState: Function): Promise<void> => {
const state = getState();
// The conference we have already joined or are joining.

View File

@@ -19,7 +19,7 @@ export {
* @returns {Promise<JitsiConnection>}
*/
export function connect() {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
// XXX Lib-jitsi-meet does not accept uppercase letters.
const room = getState()['features/base/conference'].room.toLowerCase();

View File

@@ -7,7 +7,7 @@
* deviceId: string,
* }
*/
export const SET_AUDIO_INPUT_DEVICE = Symbol('SET_AUDIO_INPUT_DEVICE');
export const SET_AUDIO_INPUT_DEVICE = 'SET_AUDIO_INPUT_DEVICE';
/**
* The type of Redux action which signals that the currently used video
@@ -18,7 +18,7 @@ export const SET_AUDIO_INPUT_DEVICE = Symbol('SET_AUDIO_INPUT_DEVICE');
* deviceId: string,
* }
*/
export const SET_VIDEO_INPUT_DEVICE = Symbol('SET_VIDEO_INPUT_DEVICE');
export const SET_VIDEO_INPUT_DEVICE = 'SET_VIDEO_INPUT_DEVICE';
/**
* The type of Redux action which signals that the list of known available
@@ -29,4 +29,4 @@ export const SET_VIDEO_INPUT_DEVICE = Symbol('SET_VIDEO_INPUT_DEVICE');
* devices: Array<MediaDeviceInfo>,
* }
*/
export const UPDATE_DEVICE_LIST = Symbol('UPDATE_DEVICE_LIST');
export const UPDATE_DEVICE_LIST = 'UPDATE_DEVICE_LIST';

View File

@@ -5,7 +5,7 @@
* type: HIDE_DIALOG
* }
*/
export const HIDE_DIALOG = Symbol('HIDE_DIALOG');
export const HIDE_DIALOG = 'HIDE_DIALOG';
/**
* The type of Redux action which begins a request to open a dialog.
@@ -17,4 +17,4 @@ export const HIDE_DIALOG = Symbol('HIDE_DIALOG');
* }
*
*/
export const OPEN_DIALOG = Symbol('OPEN_DIALOG');
export const OPEN_DIALOG = 'OPEN_DIALOG';

View File

@@ -1,4 +1,6 @@
/* @flow */
// @flow
import type { Dispatch } from 'redux';
import { HIDE_DIALOG, OPEN_DIALOG } from './actionTypes';
import { isDialogOpen } from './functions';
@@ -53,7 +55,7 @@ export function openDialog(component: Object, componentProps: ?Object) {
* @returns {Function}
*/
export function toggleDialog(component: Object, componentProps: ?Object) {
return (dispatch: Dispatch, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
if (isDialogOpen(getState, component)) {
dispatch(hideDialog(component));
} else {

View File

@@ -1,6 +1,7 @@
// @flow
import { Component } from 'react';
import type { Dispatch } from 'redux';
import { hideDialog } from '../actions';
import type { DialogProps } from '../constants';
@@ -8,13 +9,12 @@ import type { DialogProps } from '../constants';
/**
* The type of the React {@code Component} props of {@link AbstractDialog}.
*/
export type Props = {
...DialogProps,
export type Props = DialogProps & {
/**
* Used to show/hide the dialog on cancel.
*/
dispatch: Dispatch<*>
dispatch: Dispatch<any>
};
/**

View File

@@ -16,8 +16,7 @@ import AbstractDialog, {
} from '../AbstractDialog';
import { brandedDialog as styles } from './styles';
export type Props = {
...AbstractProps,
export type Props = AbstractProps & {
/**
* The color-schemed stylesheet of the feature.

View File

@@ -10,8 +10,7 @@ import {
brandedDialog
} from './styles';
type Props = {
...BaseProps,
type Props = BaseProps & {
/**
* The color-schemed stylesheet of the feature.
@@ -83,7 +82,7 @@ class BaseSubmitDialog<P: Props, S: *> extends BaseDialog<P, S> {
_onCancel: () => void;
_onSubmit: ?string => boolean;
_onSubmit: () => boolean;
_renderHTML: string => Object | string

View File

@@ -2,10 +2,10 @@
import React, { Component, type Node } from 'react';
import { TouchableWithoutFeedback, View } from 'react-native';
import { connect } from 'react-redux';
import { ColorSchemeRegistry } from '../../../color-scheme';
import { Modal } from '../../../react';
import { connect } from '../../../redux';
import { StyleType } from '../../../styles';
import { bottomSheetStyles as styles } from './styles';

View File

@@ -2,9 +2,9 @@
import React from 'react';
import { Text, TouchableOpacity } from 'react-native';
import { connect } from 'react-redux';
import { translate } from '../../../i18n';
import { connect } from '../../../redux';
import { StyleType } from '../../../styles';
import { _abstractMapStateToProps } from '../../functions';
@@ -13,8 +13,7 @@ import { type Props as BaseProps } from './BaseDialog';
import BaseSubmitDialog from './BaseSubmitDialog';
import { brandedDialog } from './styles';
type Props = {
...BaseProps,
type Props = BaseProps & {
/**
* The color-schemed stylesheet of the feature.

View File

@@ -1,6 +1,6 @@
// @flow
import { connect } from 'react-redux';
import { connect } from '../../../redux';
import { _abstractMapStateToProps } from '../../functions';

View File

@@ -1,17 +1,14 @@
// @flow
import { connect } from 'react-redux';
import { translate } from '../../../i18n';
import { connect } from '../../../redux';
import { _abstractMapStateToProps } from '../../functions';
import { type Props as BaseProps } from './BaseDialog';
import BaseSubmitDialog from './BaseSubmitDialog';
type Props = {
...BaseProps,
type Props = BaseProps & {
t: Function
}

View File

@@ -1,4 +1,4 @@
import { connect } from 'react-redux';
import { connect } from '../../../redux';
import AbstractDialogContainer, {
abstractMapStateToProps

View File

@@ -2,9 +2,9 @@
import React from 'react';
import { View, Text, TextInput, TouchableOpacity } from 'react-native';
import { connect } from 'react-redux';
import { translate } from '../../../i18n';
import { connect } from '../../../redux';
import { StyleType } from '../../../styles';
import { _abstractMapStateToProps } from '../../functions';
@@ -18,8 +18,7 @@ import {
inputDialog as styles
} from './styles';
type Props = {
...BaseProps,
type Props = BaseProps & {
/**
* The color-schemed stylesheet of the feature.

View File

@@ -1,7 +1,8 @@
// @flow
import React from 'react';
import { connect } from 'react-redux';
import { connect } from '../../../redux';
import AbstractDialog from '../AbstractDialog';
import type { Props as AbstractDialogProps, State } from '../AbstractDialog';
@@ -10,8 +11,7 @@ import StatelessDialog from './StatelessDialog';
/**
* The type of the React {@code Component} props of {@link Dialog}.
*/
type Props = {
...AbstractDialogProps,
type Props = AbstractDialogProps & {
/**
* Whether the dialog is modal. This means clicking on the blanket will
@@ -44,7 +44,7 @@ class Dialog extends AbstractDialog<Props, State> {
* @param {Object} props - The read-only properties with which the new
* instance is to be initialized.
*/
constructor(props) {
constructor(props: Props) {
super(props);
// Bind event handlers so they are only bound once per instance.
@@ -65,6 +65,7 @@ class Dialog extends AbstractDialog<Props, State> {
onSubmit: this._onSubmit
};
// $FlowExpectedError
delete props.dispatch;
return <StatelessDialog { ...props } />;

View File

@@ -1,6 +1,7 @@
import { ModalTransition } from '@atlaskit/modal-dialog';
import React from 'react';
import { connect } from 'react-redux';
import { connect } from '../../../redux';
import AbstractDialogContainer, {
abstractMapStateToProps

View File

@@ -5,27 +5,27 @@ export type DialogProps = {
/**
* Whether cancel button is disabled. Enabled by default.
*/
cancelDisabled: boolean,
cancelDisabled: ?boolean,
/**
* Optional i18n key to change the cancel button title.
*/
cancelKey: string,
cancelKey: ?string,
/**
* The React {@code Component} children which represents the dialog's body.
*/
children: React$Node,
children: ?React$Node,
/**
* Is ok button enabled/disabled. Enabled by default.
*/
okDisabled: boolean,
okDisabled: ?boolean,
/**
* Optional i18n key to change the ok button title.
*/
okKey: string,
okKey: ?string,
/**
* The handler for onCancel event.
@@ -47,14 +47,14 @@ export type DialogProps = {
/**
* Key to use for showing a title.
*/
titleKey: string,
titleKey: ?string,
/**
* The string to use as a title instead of {@code titleKey}. If a truthy
* value is specified, it takes precedence over {@code titleKey} i.e.
* the latter is unused.
*/
titleString: string
titleString: ?string
};
/**

View File

@@ -63,13 +63,10 @@ export function getLocalizedDurationFormatter(duration: number) {
// showing the hour and we want to include the hour if the conference is
// more than an hour long
// $FlowFixMe
if (moment.duration(duration).format('h') !== '0') {
// $FlowFixMe
return moment.duration(duration).format('h:mm:ss');
}
// $FlowFixMe
return moment.duration(duration).format('mm:ss', { trim: false });
}
@@ -97,8 +94,6 @@ function _getSupportedLocale() {
// FIXME The flow-type definition of moment is v2.3 while our
// package.json states v2.19 so maybe locales on moment was
// introduced in between?
//
// $FlowFixMe
= moment.locales().find(lang => currentLocaleRegexp.exec(lang));
}
}

View File

@@ -7,4 +7,4 @@
* jwt: string
* }
*/
export const SET_JWT = Symbol('SET_JWT');
export const SET_JWT = 'SET_JWT';

View File

@@ -9,4 +9,4 @@
* knownDomains: Array<string>
* }
*/
export const ADD_KNOWN_DOMAINS = Symbol('ADD_KNOWN_DOMAINS');
export const ADD_KNOWN_DOMAINS = 'ADD_KNOWN_DOMAINS';

View File

@@ -5,7 +5,7 @@
* type: LIB_DID_DISPOSE
* }
*/
export const LIB_DID_DISPOSE = Symbol('LIB_DID_DISPOSE');
export const LIB_DID_DISPOSE = 'LIB_DID_DISPOSE';
/**
* The type of Redux action which signals that {@link JitsiMeetJS.init()} was
@@ -15,7 +15,7 @@ export const LIB_DID_DISPOSE = Symbol('LIB_DID_DISPOSE');
* type: LIB_DID_INIT
* }
*/
export const LIB_DID_INIT = Symbol('LIB_DID_INIT');
export const LIB_DID_INIT = 'LIB_DID_INIT';
/**
* Action to signal that lib-jitsi-meet initialized failed with error.
@@ -25,7 +25,7 @@ export const LIB_DID_INIT = Symbol('LIB_DID_INIT');
* error: Error
* }
*/
export const LIB_INIT_ERROR = Symbol('LIB_INIT_ERROR');
export const LIB_INIT_ERROR = 'LIB_INIT_ERROR';
/**
* The type of Redux action which signals that {@link JitsiMeetJS} will be
@@ -35,7 +35,7 @@ export const LIB_INIT_ERROR = Symbol('LIB_INIT_ERROR');
* type: LIB_WILL_DISPOSE
* }
*/
export const LIB_WILL_DISPOSE = Symbol('LIB_WILL_DISPOSE');
export const LIB_WILL_DISPOSE = 'LIB_WILL_DISPOSE';
/**
* The type of Redux action which signals that {@link JitsiMeetJS.init()} will
@@ -45,4 +45,4 @@ export const LIB_WILL_DISPOSE = Symbol('LIB_WILL_DISPOSE');
* type: LIB_WILL_INIT
* }
*/
export const LIB_WILL_INIT = Symbol('LIB_WILL_INIT');
export const LIB_WILL_INIT = 'LIB_WILL_INIT';

View File

@@ -20,7 +20,7 @@ declare var APP: Object;
* @returns {Function}
*/
export function disposeLib() {
return (dispatch: Dispatch<*>) => {
return (dispatch: Dispatch<any>) => {
dispatch({ type: LIB_WILL_DISPOSE });
// TODO Currently, lib-jitsi-meet doesn't have the functionality to
@@ -36,7 +36,7 @@ export function disposeLib() {
* @returns {Function}
*/
export function initLib() {
return (dispatch: Dispatch<*>, getState: Function): void => {
return (dispatch: Dispatch<any>, getState: Function): void => {
const config = getState()['features/base/config'];
if (!config) {

View File

@@ -7,7 +7,7 @@
* logCollector: Logger.LogCollector
* }
*/
export const SET_LOG_COLLECTOR = Symbol('SET_LOG_COLLECTOR');
export const SET_LOG_COLLECTOR = 'SET_LOG_COLLECTOR';
/**
* The type of redux action which sets the configuration of the feature
@@ -18,4 +18,4 @@ export const SET_LOG_COLLECTOR = Symbol('SET_LOG_COLLECTOR');
* config: Object
* }
*/
export const SET_LOGGING_CONFIG = Symbol('SET_LOGGING_CONFIG');
export const SET_LOGGING_CONFIG = 'SET_LOGGING_CONFIG';

View File

@@ -6,7 +6,7 @@
* muted: boolean
* }
*/
export const SET_AUDIO_MUTED = Symbol('SET_AUDIO_MUTED');
export const SET_AUDIO_MUTED = 'SET_AUDIO_MUTED';
/**
* The type of (redux) action to adjust the availability of the local audio.
@@ -16,7 +16,7 @@ export const SET_AUDIO_MUTED = Symbol('SET_AUDIO_MUTED');
* muted: boolean
* }
*/
export const SET_AUDIO_AVAILABLE = Symbol('SET_AUDIO_AVAILABLE');
export const SET_AUDIO_AVAILABLE = 'SET_AUDIO_AVAILABLE';
/**
* The type of (redux) action to set the facing mode of the local video camera
@@ -27,7 +27,7 @@ export const SET_AUDIO_AVAILABLE = Symbol('SET_AUDIO_AVAILABLE');
* cameraFacingMode: CAMERA_FACING_MODE
* }
*/
export const SET_CAMERA_FACING_MODE = Symbol('SET_CAMERA_FACING_MODE');
export const SET_CAMERA_FACING_MODE = 'SET_CAMERA_FACING_MODE';
/**
* The type of (redux) action to adjust the availability of the local video.
@@ -37,7 +37,7 @@ export const SET_CAMERA_FACING_MODE = Symbol('SET_CAMERA_FACING_MODE');
* available: boolean
* }
*/
export const SET_VIDEO_AVAILABLE = Symbol('SET_VIDEO_AVAILABLE');
export const SET_VIDEO_AVAILABLE = 'SET_VIDEO_AVAILABLE';
/**
* The type of (redux) action to set the muted state of the local video.
@@ -47,7 +47,7 @@ export const SET_VIDEO_AVAILABLE = Symbol('SET_VIDEO_AVAILABLE');
* muted: boolean
* }
*/
export const SET_VIDEO_MUTED = Symbol('SET_VIDEO_MUTED');
export const SET_VIDEO_MUTED = 'SET_VIDEO_MUTED';
/**
* The type of (redux) action to store the last video {@link Transform} applied
@@ -59,7 +59,7 @@ export const SET_VIDEO_MUTED = Symbol('SET_VIDEO_MUTED');
* transform: Transform
* }
*/
export const STORE_VIDEO_TRANSFORM = Symbol('STORE_VIDEO_TRANSFORM');
export const STORE_VIDEO_TRANSFORM = 'STORE_VIDEO_TRANSFORM';
/**
* The type of (redux) action to toggle the local video camera facing mode. In
@@ -71,4 +71,4 @@ export const STORE_VIDEO_TRANSFORM = Symbol('STORE_VIDEO_TRANSFORM');
* type: TOGGLE_CAMERA_FACING_MODE
* }
*/
export const TOGGLE_CAMERA_FACING_MODE = Symbol('TOGGLE_CAMERA_FACING_MODE');
export const TOGGLE_CAMERA_FACING_MODE = 'TOGGLE_CAMERA_FACING_MODE';

View File

@@ -99,7 +99,7 @@ export function setVideoMuted(
muted: boolean,
authority: number = VIDEO_MUTISM_AUTHORITY.USER,
ensureTrack: boolean = false) {
return (dispatch: Dispatch<*>, getState: Function) => {
return (dispatch: Dispatch<any>, getState: Function) => {
const oldValue = getState()['features/base/media'].video.muted;
// eslint-disable-next-line no-bitwise

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