Browse Source

add sample

matrixbirds 5 years ago
parent
commit
7425f72944
69 changed files with 17349 additions and 0 deletions
  1. 4
    0
      android/build.gradle
  2. 3
    0
      samples/simpleDemo/.babelrc
  3. 6
    0
      samples/simpleDemo/.buckconfig
  4. 70
    0
      samples/simpleDemo/.flowconfig
  5. 1
    0
      samples/simpleDemo/.gitattributes
  6. 56
    0
      samples/simpleDemo/.gitignore
  7. 1
    0
      samples/simpleDemo/.watchmanconfig
  8. 131
    0
      samples/simpleDemo/App.js
  9. 31
    0
      samples/simpleDemo/README.md
  10. 33
    0
      samples/simpleDemo/README.zh.md
  11. 65
    0
      samples/simpleDemo/android/app/BUCK
  12. 151
    0
      samples/simpleDemo/android/app/build.gradle
  13. 17
    0
      samples/simpleDemo/android/app/proguard-rules.pro
  14. 26
    0
      samples/simpleDemo/android/app/src/main/AndroidManifest.xml
  15. 15
    0
      samples/simpleDemo/android/app/src/main/java/com/simpledemo/MainActivity.java
  16. 47
    0
      samples/simpleDemo/android/app/src/main/java/com/simpledemo/MainApplication.java
  17. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  18. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  19. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  20. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  21. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  22. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  23. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  24. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  25. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  26. BIN
      samples/simpleDemo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  27. 3
    0
      samples/simpleDemo/android/app/src/main/res/values/strings.xml
  28. 8
    0
      samples/simpleDemo/android/app/src/main/res/values/styles.xml
  29. 50
    0
      samples/simpleDemo/android/build.gradle
  30. 18
    0
      samples/simpleDemo/android/gradle.properties
  31. BIN
      samples/simpleDemo/android/gradle/wrapper/gradle-wrapper.jar
  32. 5
    0
      samples/simpleDemo/android/gradle/wrapper/gradle-wrapper.properties
  33. 172
    0
      samples/simpleDemo/android/gradlew
  34. 84
    0
      samples/simpleDemo/android/gradlew.bat
  35. 8
    0
      samples/simpleDemo/android/keystores/BUCK
  36. 4
    0
      samples/simpleDemo/android/keystores/debug.keystore.properties
  37. 5
    0
      samples/simpleDemo/android/settings.gradle
  38. 4
    0
      samples/simpleDemo/app.json
  39. BIN
      samples/simpleDemo/assets/btn_endcall.png
  40. BIN
      samples/simpleDemo/assets/btn_mute.png
  41. BIN
      samples/simpleDemo/assets/btn_speaker.png
  42. BIN
      samples/simpleDemo/assets/btn_switch_camera.png
  43. BIN
      samples/simpleDemo/assets/btn_video.png
  44. BIN
      samples/simpleDemo/assets/disable_camera.png
  45. BIN
      samples/simpleDemo/assets/disable_photoflash.png
  46. BIN
      samples/simpleDemo/assets/enable_camera.png
  47. BIN
      samples/simpleDemo/assets/enable_photoflash.png
  48. BIN
      samples/simpleDemo/assets/icon_muted.png
  49. BIN
      samples/simpleDemo/assets/icon_speaker.png
  50. 326
    0
      samples/simpleDemo/components/agora.js
  51. 7
    0
      samples/simpleDemo/index.js
  52. 54
    0
      samples/simpleDemo/ios/simpleDemo-tvOS/Info.plist
  53. 24
    0
      samples/simpleDemo/ios/simpleDemo-tvOSTests/Info.plist
  54. 1657
    0
      samples/simpleDemo/ios/simpleDemo.xcodeproj/project.pbxproj
  55. 129
    0
      samples/simpleDemo/ios/simpleDemo.xcodeproj/xcshareddata/xcschemes/simpleDemo-tvOS.xcscheme
  56. 129
    0
      samples/simpleDemo/ios/simpleDemo.xcodeproj/xcshareddata/xcschemes/simpleDemo.xcscheme
  57. 14
    0
      samples/simpleDemo/ios/simpleDemo/AppDelegate.h
  58. 39
    0
      samples/simpleDemo/ios/simpleDemo/AppDelegate.m
  59. 42
    0
      samples/simpleDemo/ios/simpleDemo/Base.lproj/LaunchScreen.xib
  60. 53
    0
      samples/simpleDemo/ios/simpleDemo/Images.xcassets/AppIcon.appiconset/Contents.json
  61. 6
    0
      samples/simpleDemo/ios/simpleDemo/Images.xcassets/Contents.json
  62. 65
    0
      samples/simpleDemo/ios/simpleDemo/Info.plist
  63. 16
    0
      samples/simpleDemo/ios/simpleDemo/main.m
  64. 24
    0
      samples/simpleDemo/ios/simpleDemoTests/Info.plist
  65. 68
    0
      samples/simpleDemo/ios/simpleDemoTests/simpleDemoTests.m
  66. 7704
    0
      samples/simpleDemo/package-lock.json
  67. 25
    0
      samples/simpleDemo/package.json
  68. 47
    0
      samples/simpleDemo/utils.js
  69. 5902
    0
      samples/simpleDemo/yarn.lock

+ 4
- 0
android/build.gradle View File

@@ -25,3 +25,7 @@ dependencies {
25 25
     implementation "com.facebook.react:react-native:+"
26 26
     implementation fileTree(dir: 'libs', include: ['*.jar'])
27 27
 }
28
+
29
+configurations.all {
30
+    exclude group: 'com.facebook.react', module: 'react-native'
31
+}

+ 3
- 0
samples/simpleDemo/.babelrc View File

@@ -0,0 +1,3 @@
1
+{
2
+  "presets": ["module:metro-react-native-babel-preset"]
3
+}

+ 6
- 0
samples/simpleDemo/.buckconfig View File

@@ -0,0 +1,6 @@
1
+
2
+[android]
3
+  target = Google Inc.:Google APIs:23
4
+
5
+[maven_repositories]
6
+  central = https://repo1.maven.org/maven2

+ 70
- 0
samples/simpleDemo/.flowconfig View File

@@ -0,0 +1,70 @@
1
+[ignore]
2
+; We fork some components by platform
3
+.*/*[.]android.js
4
+
5
+; Ignore "BUCK" generated dirs
6
+<PROJECT_ROOT>/\.buckd/
7
+
8
+; Ignore unexpected extra "@providesModule"
9
+.*/node_modules/.*/node_modules/fbjs/.*
10
+
11
+; Ignore duplicate module providers
12
+; For RN Apps installed via npm, "Libraries" folder is inside
13
+; "node_modules/react-native" but in the source repo it is in the root
14
+.*/Libraries/react-native/React.js
15
+
16
+; Ignore polyfills
17
+.*/Libraries/polyfills/.*
18
+
19
+; Ignore metro
20
+.*/node_modules/metro/.*
21
+
22
+[include]
23
+
24
+[libs]
25
+node_modules/react-native/Libraries/react-native/react-native-interface.js
26
+node_modules/react-native/flow/
27
+node_modules/react-native/flow-github/
28
+
29
+[options]
30
+emoji=true
31
+
32
+esproposal.optional_chaining=enable
33
+esproposal.nullish_coalescing=enable
34
+
35
+module.system=haste
36
+module.system.haste.use_name_reducers=true
37
+# get basename
38
+module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1'
39
+# strip .js or .js.flow suffix
40
+module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1'
41
+# strip .ios suffix
42
+module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1'
43
+module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1'
44
+module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1'
45
+module.system.haste.paths.blacklist=.*/__tests__/.*
46
+module.system.haste.paths.blacklist=.*/__mocks__/.*
47
+module.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/Animated/src/polyfills/.*
48
+module.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/Libraries/.*
49
+
50
+munge_underscores=true
51
+
52
+module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
53
+
54
+module.file_ext=.js
55
+module.file_ext=.jsx
56
+module.file_ext=.json
57
+module.file_ext=.native.js
58
+
59
+suppress_type=$FlowIssue
60
+suppress_type=$FlowFixMe
61
+suppress_type=$FlowFixMeProps
62
+suppress_type=$FlowFixMeState
63
+
64
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
65
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
66
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
67
+suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
68
+
69
+[version]
70
+^0.78.0

+ 1
- 0
samples/simpleDemo/.gitattributes View File

@@ -0,0 +1 @@
1
+*.pbxproj -text

+ 56
- 0
samples/simpleDemo/.gitignore View File

@@ -0,0 +1,56 @@
1
+# OSX
2
+#
3
+.DS_Store
4
+
5
+# Xcode
6
+#
7
+build/
8
+*.pbxuser
9
+!default.pbxuser
10
+*.mode1v3
11
+!default.mode1v3
12
+*.mode2v3
13
+!default.mode2v3
14
+*.perspectivev3
15
+!default.perspectivev3
16
+xcuserdata
17
+*.xccheckout
18
+*.moved-aside
19
+DerivedData
20
+*.hmap
21
+*.ipa
22
+*.xcuserstate
23
+project.xcworkspace
24
+
25
+# Android/IntelliJ
26
+#
27
+build/
28
+.idea
29
+.gradle
30
+local.properties
31
+*.iml
32
+
33
+# node.js
34
+#
35
+node_modules/
36
+npm-debug.log
37
+yarn-error.log
38
+
39
+# BUCK
40
+buck-out/
41
+\.buckd/
42
+*.keystore
43
+
44
+# fastlane
45
+#
46
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
47
+# screenshots whenever they are needed.
48
+# For more information about the recommended setup visit:
49
+# https://docs.fastlane.tools/best-practices/source-control/
50
+
51
+*/fastlane/report.xml
52
+*/fastlane/Preview.html
53
+*/fastlane/screenshots
54
+
55
+# Bundle artifact
56
+*.jsbundle

+ 1
- 0
samples/simpleDemo/.watchmanconfig View File

@@ -0,0 +1 @@
1
+{}

+ 131
- 0
samples/simpleDemo/App.js View File

@@ -0,0 +1,131 @@
1
+/**
2
+ * Sample React Native App
3
+ * https://github.com/facebook/react-native
4
+ *
5
+ * @format
6
+ * @flow
7
+ */
8
+
9
+import React, {Component} from 'react';
10
+import {
11
+  Platform, StyleSheet, Text, View, TouchableOpacity, TextInput
12
+} from 'react-native';
13
+import AgoraRTCView from './components/agora';
14
+
15
+const instructions = Platform.select({
16
+  ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
17
+  android:
18
+    'Double tap R on your keyboard to reload,\n' +
19
+    'Shake or press menu button for dev menu',
20
+});
21
+
22
+const styles = StyleSheet.create({
23
+  container: {
24
+    flex: 1,
25
+    justifyContent: 'center',
26
+    alignItems: 'center',
27
+    backgroundColor: '#F5FCFF',
28
+  },
29
+  welcome: {
30
+    fontSize: 20,
31
+    textAlign: 'center',
32
+    margin: 10,
33
+  },
34
+  instructions: {
35
+    textAlign: 'center',
36
+    color: '#333333',
37
+    marginBottom: 5,
38
+  },
39
+  button: {
40
+    height: 44,
41
+    paddingHorizontal:20,
42
+    backgroundColor:'#6A71DD',
43
+    borderRadius:10,
44
+    justifyContent:'center',
45
+    alignItems:'center',
46
+    marginTop: 10
47
+  }
48
+});
49
+
50
+type Props = {};
51
+export default class App extends Component<Props> {
52
+  constructor(props) {
53
+    super(props);
54
+    this.state = {
55
+      showLive: false,
56
+      error: undefined,
57
+      channelProfile: 1,
58
+      videoProfile: 40,
59
+      clientRole: 1,
60
+      swapWidthAndHeight: true
61
+    };
62
+  }
63
+
64
+  joinChannel = () => {
65
+    this.setState({
66
+      showLive: true
67
+    })
68
+  }
69
+
70
+  onCancel = (error) => {
71
+    console.log("[error]", error);
72
+    this.setState({
73
+      showLive: false,
74
+      error
75
+    })
76
+  }
77
+
78
+  render() {
79
+    if (this.state.showLive) {
80
+      return (<AgoraRTCView
81
+        onCancel={this.onCancel}
82
+        channelProfile={this.state.channelProfile}
83
+        videoProfile={this.state.videoProfile}
84
+        clientRole={this.state.clientRole}
85
+        swapWidthAndHeight={this.state.swapWidthAndHeight}
86
+      ></AgoraRTCView>);
87
+    }
88
+    return (
89
+      <View style={styles.container}>
90
+        {this.state.error && <Text>Error Message: {error}</Text>}
91
+        <TextInput
92
+          style={{height: 40}}
93
+          keyboardType='numeric'
94
+          placeholder="Enter channelProfile (numeric)"
95
+          onChangeText={(text) => {
96
+            let matched = text.match(/\d+/g) && text.match(/\d+/g)[0]
97
+            if (matched) {
98
+              this.setState({channelProfile: +matched})
99
+            }
100
+          }
101
+        } />
102
+        <TextInput
103
+          style={{height: 40}}
104
+          keyboardType='numeric'
105
+          placeholder="Enter videoProfile (numeric)"
106
+          onChangeText={(text) => {
107
+            let matched = text.match(/\d+/g) && text.match(/\d+/g)[0]
108
+            if (matched) {
109
+              this.setState({videoProfile: +matched})
110
+            }          }
111
+        } />
112
+        <TextInput
113
+          style={{height: 40}}
114
+          keyboardType='numeric'
115
+          placeholder="Enter clientRole (numeric)"
116
+          onChangeText={(text) => {
117
+            let matched = text.match(/\d+/g) && text.match(/\d+/g)[0]
118
+            if (matched) {
119
+              this.setState({clientRole: +matched})
120
+            }          }
121
+        } />
122
+        <TouchableOpacity
123
+          style={styles.button}
124
+          onPress={this.joinChannel}
125
+        >
126
+          <Text style={{color: "#fff"}}>join room</Text>
127
+        </TouchableOpacity>
128
+      </View>
129
+    );
130
+  }
131
+}

+ 31
- 0
samples/simpleDemo/README.md View File

@@ -0,0 +1,31 @@
1
+# Android Setup
2
+
3
+## Prerequisites
4
+  * You should installed and linked `react-native-agora`
5
+  * Android Studio
6
+  * Android SDK
7
+  * Reliable USB Cable
8
+  * Android Device
9
+
10
+## Build
11
+  ```bash
12
+  adb reverse tcp:8081 tcp:8081
13
+  adb reverse tcp:8097 tcp:8097
14
+  npm install
15
+  npm run android
16
+  ```
17
+
18
+
19
+# iOS Setup
20
+
21
+## Prerequisites
22
+  * You should installed and linked `react-native-agora`
23
+  * Xcode 10.0+
24
+  * iOS Device
25
+  * Reliable iOS Device Cable
26
+
27
+## Build
28
+  ```bash
29
+  npm install
30
+  npm run ios
31
+  ```

+ 33
- 0
samples/simpleDemo/README.zh.md View File

@@ -0,0 +1,33 @@
1
+# [中文版本](./README.zh.md)
2
+
3
+# 构建 Android APK
4
+
5
+## 依赖以下环境
6
+  * linked `react-native-agora`
7
+  * Android Studio
8
+  * Android SDK
9
+  * Reliable USB Cable
10
+  * Android Device
11
+
12
+## Build
13
+  ```bash
14
+  adb reverse tcp:8081 tcp:8081
15
+  adb reverse tcp:8097 tcp:8097
16
+  npm install
17
+  npm run android
18
+  ```
19
+
20
+
21
+# iOS Setup
22
+
23
+## Prerequisites
24
+  * You should installed and linked `react-native-agora`
25
+  * Xcode 10.0+
26
+  * iOS Device
27
+  * Reliable iOS Device Cable
28
+
29
+## Build
30
+  ```bash
31
+  npm install
32
+  npm run ios
33
+  ```

+ 65
- 0
samples/simpleDemo/android/app/BUCK View File

@@ -0,0 +1,65 @@
1
+# To learn about Buck see [Docs](https://buckbuild.com/).
2
+# To run your application with Buck:
3
+# - install Buck
4
+# - `npm start` - to start the packager
5
+# - `cd android`
6
+# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
7
+# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
8
+# - `buck install -r android/app` - compile, install and run application
9
+#
10
+
11
+lib_deps = []
12
+
13
+for jarfile in glob(['libs/*.jar']):
14
+  name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')]
15
+  lib_deps.append(':' + name)
16
+  prebuilt_jar(
17
+    name = name,
18
+    binary_jar = jarfile,
19
+  )
20
+
21
+for aarfile in glob(['libs/*.aar']):
22
+  name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')]
23
+  lib_deps.append(':' + name)
24
+  android_prebuilt_aar(
25
+    name = name,
26
+    aar = aarfile,
27
+  )
28
+
29
+android_library(
30
+    name = "all-libs",
31
+    exported_deps = lib_deps,
32
+)
33
+
34
+android_library(
35
+    name = "app-code",
36
+    srcs = glob([
37
+        "src/main/java/**/*.java",
38
+    ]),
39
+    deps = [
40
+        ":all-libs",
41
+        ":build_config",
42
+        ":res",
43
+    ],
44
+)
45
+
46
+android_build_config(
47
+    name = "build_config",
48
+    package = "com.simpledemo",
49
+)
50
+
51
+android_resource(
52
+    name = "res",
53
+    package = "com.simpledemo",
54
+    res = "src/main/res",
55
+)
56
+
57
+android_binary(
58
+    name = "app",
59
+    keystore = "//android/keystores:debug",
60
+    manifest = "src/main/AndroidManifest.xml",
61
+    package_type = "debug",
62
+    deps = [
63
+        ":app-code",
64
+    ],
65
+)

+ 151
- 0
samples/simpleDemo/android/app/build.gradle View File

@@ -0,0 +1,151 @@
1
+apply plugin: "com.android.application"
2
+
3
+import com.android.build.OutputFile
4
+
5
+/**
6
+ * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7
+ * and bundleReleaseJsAndAssets).
8
+ * These basically call `react-native bundle` with the correct arguments during the Android build
9
+ * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10
+ * bundle directly from the development server. Below you can see all the possible configurations
11
+ * and their defaults. If you decide to add a configuration block, make sure to add it before the
12
+ * `apply from: "../../node_modules/react-native/react.gradle"` line.
13
+ *
14
+ * project.ext.react = [
15
+ *   // the name of the generated asset file containing your JS bundle
16
+ *   bundleAssetName: "index.android.bundle",
17
+ *
18
+ *   // the entry file for bundle generation
19
+ *   entryFile: "index.android.js",
20
+ *
21
+ *   // whether to bundle JS and assets in debug mode
22
+ *   bundleInDebug: false,
23
+ *
24
+ *   // whether to bundle JS and assets in release mode
25
+ *   bundleInRelease: true,
26
+ *
27
+ *   // whether to bundle JS and assets in another build variant (if configured).
28
+ *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
29
+ *   // The configuration property can be in the following formats
30
+ *   //         'bundleIn${productFlavor}${buildType}'
31
+ *   //         'bundleIn${buildType}'
32
+ *   // bundleInFreeDebug: true,
33
+ *   // bundleInPaidRelease: true,
34
+ *   // bundleInBeta: true,
35
+ *
36
+ *   // whether to disable dev mode in custom build variants (by default only disabled in release)
37
+ *   // for example: to disable dev mode in the staging build type (if configured)
38
+ *   devDisabledInStaging: true,
39
+ *   // The configuration property can be in the following formats
40
+ *   //         'devDisabledIn${productFlavor}${buildType}'
41
+ *   //         'devDisabledIn${buildType}'
42
+ *
43
+ *   // the root of your project, i.e. where "package.json" lives
44
+ *   root: "../../",
45
+ *
46
+ *   // where to put the JS bundle asset in debug mode
47
+ *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
48
+ *
49
+ *   // where to put the JS bundle asset in release mode
50
+ *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
51
+ *
52
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
53
+ *   // require('./image.png')), in debug mode
54
+ *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
55
+ *
56
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
57
+ *   // require('./image.png')), in release mode
58
+ *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
59
+ *
60
+ *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
61
+ *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
62
+ *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
63
+ *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
64
+ *   // for example, you might want to remove it from here.
65
+ *   inputExcludes: ["android/**", "ios/**"],
66
+ *
67
+ *   // override which node gets called and with what additional arguments
68
+ *   nodeExecutableAndArgs: ["node"],
69
+ *
70
+ *   // supply additional arguments to the packager
71
+ *   extraPackagerArgs: []
72
+ * ]
73
+ */
74
+
75
+project.ext.react = [
76
+    entryFile: "index.js"
77
+]
78
+
79
+apply from: "../../node_modules/react-native/react.gradle"
80
+
81
+/**
82
+ * Set this to true to create two separate APKs instead of one:
83
+ *   - An APK that only works on ARM devices
84
+ *   - An APK that only works on x86 devices
85
+ * The advantage is the size of the APK is reduced by about 4MB.
86
+ * Upload all the APKs to the Play Store and people will download
87
+ * the correct one based on the CPU architecture of their device.
88
+ */
89
+def enableSeparateBuildPerCPUArchitecture = false
90
+
91
+/**
92
+ * Run Proguard to shrink the Java bytecode in release builds.
93
+ */
94
+def enableProguardInReleaseBuilds = false
95
+
96
+android {
97
+    compileSdkVersion rootProject.ext.compileSdkVersion
98
+    buildToolsVersion rootProject.ext.buildToolsVersion
99
+
100
+    defaultConfig {
101
+        applicationId "com.simpledemo"
102
+        minSdkVersion rootProject.ext.minSdkVersion
103
+        targetSdkVersion rootProject.ext.targetSdkVersion
104
+        versionCode 1
105
+        versionName "1.0"
106
+        ndk {
107
+            abiFilters "armeabi-v7a", "x86"
108
+        }
109
+    }
110
+    splits {
111
+        abi {
112
+            reset()
113
+            enable enableSeparateBuildPerCPUArchitecture
114
+            universalApk false  // If true, also generate a universal APK
115
+            include "armeabi-v7a", "x86"
116
+        }
117
+    }
118
+    buildTypes {
119
+        release {
120
+            minifyEnabled enableProguardInReleaseBuilds
121
+            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
122
+        }
123
+    }
124
+    // applicationVariants are e.g. debug, release
125
+    applicationVariants.all { variant ->
126
+        variant.outputs.each { output ->
127
+            // For each separate APK per architecture, set a unique version code as described here:
128
+            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
129
+            def versionCodes = ["armeabi-v7a":1, "x86":2]
130
+            def abi = output.getFilter(OutputFile.ABI)
131
+            if (abi != null) {  // null for the universal-debug, universal-release variants
132
+                output.versionCodeOverride =
133
+                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
134
+            }
135
+        }
136
+    }
137
+}
138
+
139
+dependencies {
140
+    compile project(':react-native-agora')
141
+    implementation fileTree(dir: "libs", include: ["*.jar"])
142
+    implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
143
+    implementation "com.facebook.react:react-native:+"  // From node_modules
144
+}
145
+
146
+// Run this once to be able to run the application with BUCK
147
+// puts all compile dependencies into folder libs for BUCK to use
148
+task copyDownloadableDepsToLibs(type: Copy) {
149
+    from configurations.compile
150
+    into 'libs'
151
+}

+ 17
- 0
samples/simpleDemo/android/app/proguard-rules.pro View File

@@ -0,0 +1,17 @@
1
+# Add project specific ProGuard rules here.
2
+# By default, the flags in this file are appended to flags specified
3
+# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
4
+# You can edit the include path and order by changing the proguardFiles
5
+# directive in build.gradle.
6
+#
7
+# For more details, see
8
+#   http://developer.android.com/guide/developing/tools/proguard.html
9
+
10
+# Add any project specific keep options here:
11
+
12
+# If your project uses WebView with JS, uncomment the following
13
+# and specify the fully qualified class name to the JavaScript interface
14
+# class:
15
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16
+#   public *;
17
+#}

+ 26
- 0
samples/simpleDemo/android/app/src/main/AndroidManifest.xml View File

@@ -0,0 +1,26 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+    package="com.simpledemo">
3
+
4
+    <uses-permission android:name="android.permission.INTERNET" />
5
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
6
+
7
+    <application
8
+      android:name=".MainApplication"
9
+      android:label="@string/app_name"
10
+      android:icon="@mipmap/ic_launcher"
11
+      android:allowBackup="true"
12
+      android:theme="@style/AppTheme">
13
+      <activity
14
+        android:name=".MainActivity"
15
+        android:label="@string/app_name"
16
+        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
17
+        android:windowSoftInputMode="adjustResize">
18
+        <intent-filter>
19
+            <action android:name="android.intent.action.MAIN" />
20
+            <category android:name="android.intent.category.LAUNCHER" />
21
+        </intent-filter>
22
+      </activity>
23
+      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
24
+    </application>
25
+
26
+</manifest>

+ 15
- 0
samples/simpleDemo/android/app/src/main/java/com/simpledemo/MainActivity.java View File

@@ -0,0 +1,15 @@
1
+package com.simpledemo;
2
+
3
+import com.facebook.react.ReactActivity;
4
+
5
+public class MainActivity extends ReactActivity {
6
+
7
+    /**
8
+     * Returns the name of the main component registered from JavaScript.
9
+     * This is used to schedule rendering of the component.
10
+     */
11
+    @Override
12
+    protected String getMainComponentName() {
13
+        return "simpleDemo";
14
+    }
15
+}

+ 47
- 0
samples/simpleDemo/android/app/src/main/java/com/simpledemo/MainApplication.java View File

@@ -0,0 +1,47 @@
1
+package com.simpledemo;
2
+
3
+import android.app.Application;
4
+
5
+import com.facebook.react.ReactApplication;
6
+import com.syan.agora.AgoraPackage;
7
+import com.facebook.react.ReactNativeHost;
8
+import com.facebook.react.ReactPackage;
9
+import com.facebook.react.shell.MainReactPackage;
10
+import com.facebook.soloader.SoLoader;
11
+
12
+import java.util.Arrays;
13
+import java.util.List;
14
+
15
+public class MainApplication extends Application implements ReactApplication {
16
+
17
+  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
18
+    @Override
19
+    public boolean getUseDeveloperSupport() {
20
+      return BuildConfig.DEBUG;
21
+    }
22
+
23
+    @Override
24
+    protected List<ReactPackage> getPackages() {
25
+      return Arrays.<ReactPackage>asList(
26
+          new MainReactPackage(),
27
+            new AgoraPackage()
28
+      );
29
+    }
30
+
31
+    @Override
32
+    protected String getJSMainModuleName() {
33
+      return "index";
34
+    }
35
+  };
36
+
37
+  @Override
38
+  public ReactNativeHost getReactNativeHost() {
39
+    return mReactNativeHost;
40
+  }
41
+
42
+  @Override
43
+  public void onCreate() {
44
+    super.onCreate();
45
+    SoLoader.init(this, /* native exopackage */ false);
46
+  }
47
+}

BIN
samples/simpleDemo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png View File


BIN
samples/simpleDemo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png View File


+ 3
- 0
samples/simpleDemo/android/app/src/main/res/values/strings.xml View File

@@ -0,0 +1,3 @@
1
+<resources>
2
+    <string name="app_name">simpleDemo</string>
3
+</resources>

+ 8
- 0
samples/simpleDemo/android/app/src/main/res/values/styles.xml View File

@@ -0,0 +1,8 @@
1
+<resources>
2
+
3
+    <!-- Base application theme. -->
4
+    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
5
+        <!-- Customize your theme here. -->
6
+    </style>
7
+
8
+</resources>

+ 50
- 0
samples/simpleDemo/android/build.gradle View File

@@ -0,0 +1,50 @@
1
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
2
+
3
+buildscript {
4
+    ext {
5
+        buildToolsVersion = "27.0.3"
6
+        minSdkVersion = 16
7
+        compileSdkVersion = 27
8
+        targetSdkVersion = 26
9
+        supportLibVersion = "27.1.1"
10
+    }
11
+    repositories {
12
+        google()
13
+        jcenter()
14
+    }
15
+    dependencies {
16
+        classpath 'com.android.tools.build:gradle:3.1.4'
17
+
18
+        // NOTE: Do not place your application dependencies here; they belong
19
+        // in the individual module build.gradle files
20
+    }
21
+}
22
+
23
+allprojects {
24
+    repositories {
25
+        mavenLocal()
26
+        google()
27
+        jcenter()
28
+        maven {
29
+            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
30
+            url "$rootDir/../node_modules/react-native/android"
31
+        }
32
+    }
33
+}
34
+
35
+
36
+task wrapper(type: Wrapper) {
37
+    gradleVersion = '4.4'
38
+    distributionUrl = distributionUrl.replace("bin", "all")
39
+}
40
+
41
+subprojects {
42
+    afterEvaluate {project ->
43
+        if (project.hasProperty("android")) {
44
+            android {
45
+                compileSdkVersion 27
46
+                buildToolsVersion "27.0.3"
47
+            }
48
+        }
49
+    }
50
+}

+ 18
- 0
samples/simpleDemo/android/gradle.properties View File

@@ -0,0 +1,18 @@
1
+# Project-wide Gradle settings.
2
+
3
+# IDE (e.g. Android Studio) users:
4
+# Gradle settings configured through the IDE *will override*
5
+# any settings specified in this file.
6
+
7
+# For more details on how to configure your build environment visit
8
+# http://www.gradle.org/docs/current/userguide/build_environment.html
9
+
10
+# Specifies the JVM arguments used for the daemon process.
11
+# The setting is particularly useful for tweaking memory settings.
12
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
13
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14
+
15
+# When configured, Gradle will run in incubating parallel mode.
16
+# This option should only be used with decoupled projects. More details, visit
17
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18
+# org.gradle.parallel=true

BIN
samples/simpleDemo/android/gradle/wrapper/gradle-wrapper.jar View File


+ 5
- 0
samples/simpleDemo/android/gradle/wrapper/gradle-wrapper.properties View File

@@ -0,0 +1,5 @@
1
+distributionBase=GRADLE_USER_HOME
2
+distributionPath=wrapper/dists
3
+zipStoreBase=GRADLE_USER_HOME
4
+zipStorePath=wrapper/dists
5
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

+ 172
- 0
samples/simpleDemo/android/gradlew View File

@@ -0,0 +1,172 @@
1
+#!/usr/bin/env sh
2
+
3
+##############################################################################
4
+##
5
+##  Gradle start up script for UN*X
6
+##
7
+##############################################################################
8
+
9
+# Attempt to set APP_HOME
10
+# Resolve links: $0 may be a link
11
+PRG="$0"
12
+# Need this for relative symlinks.
13
+while [ -h "$PRG" ] ; do
14
+    ls=`ls -ld "$PRG"`
15
+    link=`expr "$ls" : '.*-> \(.*\)$'`
16
+    if expr "$link" : '/.*' > /dev/null; then
17
+        PRG="$link"
18
+    else
19
+        PRG=`dirname "$PRG"`"/$link"
20
+    fi
21
+done
22
+SAVED="`pwd`"
23
+cd "`dirname \"$PRG\"`/" >/dev/null
24
+APP_HOME="`pwd -P`"
25
+cd "$SAVED" >/dev/null
26
+
27
+APP_NAME="Gradle"
28
+APP_BASE_NAME=`basename "$0"`
29
+
30
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31
+DEFAULT_JVM_OPTS=""
32
+
33
+# Use the maximum available, or set MAX_FD != -1 to use that value.
34
+MAX_FD="maximum"
35
+
36
+warn () {
37
+    echo "$*"
38
+}
39
+
40
+die () {
41
+    echo
42
+    echo "$*"
43
+    echo
44
+    exit 1
45
+}
46
+
47
+# OS specific support (must be 'true' or 'false').
48
+cygwin=false
49
+msys=false
50
+darwin=false
51
+nonstop=false
52
+case "`uname`" in
53
+  CYGWIN* )
54
+    cygwin=true
55
+    ;;
56
+  Darwin* )
57
+    darwin=true
58
+    ;;
59
+  MINGW* )
60
+    msys=true
61
+    ;;
62
+  NONSTOP* )
63
+    nonstop=true
64
+    ;;
65
+esac
66
+
67
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68
+
69
+# Determine the Java command to use to start the JVM.
70
+if [ -n "$JAVA_HOME" ] ; then
71
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72
+        # IBM's JDK on AIX uses strange locations for the executables
73
+        JAVACMD="$JAVA_HOME/jre/sh/java"
74
+    else
75
+        JAVACMD="$JAVA_HOME/bin/java"
76
+    fi
77
+    if [ ! -x "$JAVACMD" ] ; then
78
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79
+
80
+Please set the JAVA_HOME variable in your environment to match the
81
+location of your Java installation."
82
+    fi
83
+else
84
+    JAVACMD="java"
85
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86
+
87
+Please set the JAVA_HOME variable in your environment to match the
88
+location of your Java installation."
89
+fi
90
+
91
+# Increase the maximum file descriptors if we can.
92
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93
+    MAX_FD_LIMIT=`ulimit -H -n`
94
+    if [ $? -eq 0 ] ; then
95
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96
+            MAX_FD="$MAX_FD_LIMIT"
97
+        fi
98
+        ulimit -n $MAX_FD
99
+        if [ $? -ne 0 ] ; then
100
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
101
+        fi
102
+    else
103
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104
+    fi
105
+fi
106
+
107
+# For Darwin, add options to specify how the application appears in the dock
108
+if $darwin; then
109
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110
+fi
111
+
112
+# For Cygwin, switch paths to Windows format before running java
113
+if $cygwin ; then
114
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116
+    JAVACMD=`cygpath --unix "$JAVACMD"`
117
+
118
+    # We build the pattern for arguments to be converted via cygpath
119
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120
+    SEP=""
121
+    for dir in $ROOTDIRSRAW ; do
122
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
123
+        SEP="|"
124
+    done
125
+    OURCYGPATTERN="(^($ROOTDIRS))"
126
+    # Add a user-defined pattern to the cygpath arguments
127
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129
+    fi
130
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
131
+    i=0
132
+    for arg in "$@" ; do
133
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
135
+
136
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
137
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138
+        else
139
+            eval `echo args$i`="\"$arg\""
140
+        fi
141
+        i=$((i+1))
142
+    done
143
+    case $i in
144
+        (0) set -- ;;
145
+        (1) set -- "$args0" ;;
146
+        (2) set -- "$args0" "$args1" ;;
147
+        (3) set -- "$args0" "$args1" "$args2" ;;
148
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154
+    esac
155
+fi
156
+
157
+# Escape application args
158
+save () {
159
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160
+    echo " "
161
+}
162
+APP_ARGS=$(save "$@")
163
+
164
+# Collect all arguments for the java command, following the shell quoting and substitution rules
165
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166
+
167
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169
+  cd "$(dirname "$0")"
170
+fi
171
+
172
+exec "$JAVACMD" "$@"

+ 84
- 0
samples/simpleDemo/android/gradlew.bat View File

@@ -0,0 +1,84 @@
1
+@if "%DEBUG%" == "" @echo off
2
+@rem ##########################################################################
3
+@rem
4
+@rem  Gradle startup script for Windows
5
+@rem
6
+@rem ##########################################################################
7
+
8
+@rem Set local scope for the variables with windows NT shell
9
+if "%OS%"=="Windows_NT" setlocal
10
+
11
+set DIRNAME=%~dp0
12
+if "%DIRNAME%" == "" set DIRNAME=.
13
+set APP_BASE_NAME=%~n0
14
+set APP_HOME=%DIRNAME%
15
+
16
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17
+set DEFAULT_JVM_OPTS=
18
+
19
+@rem Find java.exe
20
+if defined JAVA_HOME goto findJavaFromJavaHome
21
+
22
+set JAVA_EXE=java.exe
23
+%JAVA_EXE% -version >NUL 2>&1
24
+if "%ERRORLEVEL%" == "0" goto init
25
+
26
+echo.
27
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28
+echo.
29
+echo Please set the JAVA_HOME variable in your environment to match the
30
+echo location of your Java installation.
31
+
32
+goto fail
33
+
34
+:findJavaFromJavaHome
35
+set JAVA_HOME=%JAVA_HOME:"=%
36
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37
+
38
+if exist "%JAVA_EXE%" goto init
39
+
40
+echo.
41
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42
+echo.
43
+echo Please set the JAVA_HOME variable in your environment to match the
44
+echo location of your Java installation.
45
+
46
+goto fail
47
+
48
+:init
49
+@rem Get command-line arguments, handling Windows variants
50
+
51
+if not "%OS%" == "Windows_NT" goto win9xME_args
52
+
53
+:win9xME_args
54
+@rem Slurp the command line arguments.
55
+set CMD_LINE_ARGS=
56
+set _SKIP=2
57
+
58
+:win9xME_args_slurp
59
+if "x%~1" == "x" goto execute
60
+
61
+set CMD_LINE_ARGS=%*
62
+
63
+:execute
64
+@rem Setup the command line
65
+
66
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67
+
68
+@rem Execute Gradle
69
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70
+
71
+:end
72
+@rem End local scope for the variables with windows NT shell
73
+if "%ERRORLEVEL%"=="0" goto mainEnd
74
+
75
+:fail
76
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77
+rem the _cmd.exe /c_ return code!
78
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79
+exit /b 1
80
+
81
+:mainEnd
82
+if "%OS%"=="Windows_NT" endlocal
83
+
84
+:omega

+ 8
- 0
samples/simpleDemo/android/keystores/BUCK View File

@@ -0,0 +1,8 @@
1
+keystore(
2
+    name = "debug",
3
+    properties = "debug.keystore.properties",
4
+    store = "debug.keystore",
5
+    visibility = [
6
+        "PUBLIC",
7
+    ],
8
+)

+ 4
- 0
samples/simpleDemo/android/keystores/debug.keystore.properties View File

@@ -0,0 +1,4 @@
1
+key.store=debug.keystore
2
+key.alias=androiddebugkey
3
+key.store.password=android
4
+key.alias.password=android

+ 5
- 0
samples/simpleDemo/android/settings.gradle View File

@@ -0,0 +1,5 @@
1
+rootProject.name = 'simpleDemo'
2
+include ':react-native-agora'
3
+project(':react-native-agora').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-agora/android')
4
+
5
+include ':app'

+ 4
- 0
samples/simpleDemo/app.json View File

@@ -0,0 +1,4 @@
1
+{
2
+  "name": "simpleDemo",
3
+  "displayName": "simpleDemo"
4
+}

BIN
samples/simpleDemo/assets/btn_endcall.png View File


BIN
samples/simpleDemo/assets/btn_mute.png View File


BIN
samples/simpleDemo/assets/btn_speaker.png View File


BIN
samples/simpleDemo/assets/btn_switch_camera.png View File


BIN
samples/simpleDemo/assets/btn_video.png View File


BIN
samples/simpleDemo/assets/disable_camera.png View File


BIN
samples/simpleDemo/assets/disable_photoflash.png View File


BIN
samples/simpleDemo/assets/enable_camera.png View File


BIN
samples/simpleDemo/assets/enable_photoflash.png View File


BIN
samples/simpleDemo/assets/icon_muted.png View File


BIN
samples/simpleDemo/assets/icon_speaker.png View File


+ 326
- 0
samples/simpleDemo/components/agora.js View File

@@ -0,0 +1,326 @@
1
+import React, {Component, PureComponent} from 'react';
2
+import {
3
+  StyleSheet, Text, View, TouchableOpacity,
4
+  Image, Dimensions, Modal
5
+} from 'react-native';
6
+
7
+import {RtcEngine, AgoraView} from 'react-native-agora';
8
+import {
9
+  APPID,
10
+} from '../utils';
11
+
12
+const BtnEndCall = () => require('../assets/btn_endcall.png');
13
+const BtnMute = () => require('../assets/btn_mute.png');
14
+const BtnSpeaker = () => require('../assets/btn_speaker.png');
15
+const BtnSwitchCamera = () => require('../assets/btn_switch_camera.png');
16
+const BtnVideo = () => require('../assets/btn_video.png');
17
+const EnableCamera = () => require('../assets/enable_camera.png');
18
+const DisableCamera = () => require('../assets/disable_camera.png');
19
+const EnablePhotoflash = () => require('../assets/enable_photoflash.png');
20
+const DisablePhotoflash = () => require('../assets/disable_photoflash.png');
21
+const IconMuted = () => require('../assets/icon_muted.png');
22
+const IconSpeaker = () =>require('../assets/icon_speaker.png');
23
+
24
+const {width} = Dimensions.get('window');
25
+
26
+const styles = StyleSheet.create({
27
+  container: {
28
+    flex: 1,
29
+    backgroundColor: '#F4F4F4'
30
+  },
31
+  absView: {
32
+    position: 'absolute',
33
+    top: 20,
34
+    left: 0,
35
+    right: 0,
36
+    bottom: 0,
37
+    justifyContent: 'space-between',
38
+  },
39
+  videoView: {
40
+    padding: 5,
41
+    flexWrap: 'wrap',
42
+    flexDirection: 'row',
43
+    zIndex: 100
44
+  },
45
+  localView: {
46
+    flex: 1
47
+  },
48
+  remoteView: {
49
+    width: (width - 40) / 3,
50
+    height: (width - 40) / 3,
51
+    margin: 5
52
+  },
53
+  bottomView: {
54
+    padding: 20,
55
+    flexDirection: 'row',
56
+    justifyContent: 'space-around'
57
+  }
58
+});
59
+
60
+class OperateButton extends PureComponent {
61
+  render() {
62
+    const {onPress, source, style, imgStyle = {width: 50, height: 50}} = this.props;
63
+    return (
64
+      <TouchableOpacity
65
+        style={style}
66
+        onPress={onPress}
67
+        activeOpacity={.7}
68
+      >
69
+        <Image
70
+          style={imgStyle}
71
+          source={source}
72
+        />
73
+      </TouchableOpacity>
74
+    )
75
+  }
76
+}
77
+
78
+type Props = {
79
+  channelProfile: Number,
80
+  videoProfile: Number,
81
+  clientRole: Number,
82
+  swapWidthAndHeight: Boolean,
83
+  onCancel: Function
84
+}
85
+
86
+export default class Agora extends Component<Props> {
87
+  state = {
88
+    peerIds: [],
89
+    joinSucceed: false,
90
+    isSpeak: true,
91
+    isMute: false,
92
+    isCameraTorch: false,
93
+    disableVideo: false,
94
+    hideButton: false,
95
+    visible: false,
96
+    selectedUid: undefined,
97
+  };
98
+
99
+  componentWillMount () {
100
+    const config = {
101
+      appid: APPID,
102
+      channelProfile: this.props.channelProfile,
103
+      videoProfile: this.props.videoProfile,
104
+      clientRole: this.props.clientRole,
105
+      swapWidthAndHeight: this.props.swapWidthAndHeight
106
+    }
107
+    console.log("[CONFIG]", config);
108
+    RtcEngine.init(config);
109
+  }
110
+
111
+  componentDidMount () {
112
+    RtcEngine.getSdkVersion((version) => {
113
+      console.log('[RtcEngine] getSdkVersion', version);
114
+    })
115
+
116
+    RtcEngine.joinChannel();
117
+    RtcEngine.enableAudioVolumeIndication(500, 3);
118
+    RtcEngine.eventEmitter({
119
+      onFirstRemoteVideoDecoded: (data) => {
120
+        console.log('[RtcEngine] onFirstRemoteVideoDecoded', data);
121
+        const {peerIds} = this.state;
122
+        if (peerIds.indexOf(data.uid) !== -1) {
123
+          this.setState({
124
+            peerIds: [...peerIds, data.uid]
125
+          })
126
+        }
127
+      },
128
+      onUserOffline: (data) => {
129
+        console.log('[RtcEngine] onUserOffline', data);
130
+        this.setState({
131
+            peerIds: this.state.peerIds.filter(uid => uid !== data.uid)
132
+        })
133
+      },
134
+      onJoinChannelSuccess: (data) => {
135
+        console.log('[RtcEngine] onJoinChannelSuccess', data);
136
+        // RtcEngine.setShowLocalVideo()
137
+        RtcEngine.startPreview();
138
+        this.setState({
139
+          joinSucceed: true
140
+        })
141
+      },
142
+      onAudioVolumeIndication: (data) => {
143
+        console.log('[RtcEngine] onAudioVolumeIndication', data);
144
+      },
145
+      onUserJoined: (data) => {
146
+        console.log('[RtcEngine] onUserJoined', data);
147
+      },
148
+      onError: (data) => {
149
+        console.log('[RtcEngine] onError', data);
150
+        if (data.error === 17) {
151
+          RtcEngine.leaveChannel();
152
+          RtcEngine.destroy();
153
+        }
154
+        this.props.onCancel(data.error);
155
+      }
156
+    })
157
+  }
158
+
159
+componentWillUnmount () {
160
+  RtcEngine.removeEmitter()
161
+}
162
+
163
+handleCancel = () => {
164
+  RtcEngine.leaveChannel();
165
+  RtcEngine.destroy();
166
+  this.props.onCancel();
167
+}
168
+
169
+switchCamera = () => {
170
+  RtcEngine.switchCamera();
171
+}
172
+
173
+toggleAllRemoteAudioStreams = () => {
174
+  this.setState({
175
+    isMute: !this.state.isMute
176
+  }, () => {
177
+    RtcEngine.muteAllRemoteAudioStreams(this.state.isMute);
178
+  })
179
+}
180
+
181
+toggleSpeakerPhone = () => {
182
+  this.setState({
183
+    isSpeak: !this.state.isSpeak
184
+  }, () => {
185
+    RtcEngine.setDefaultAudioRouteToSpeakerphone(this.state.isSpeak);
186
+  })
187
+}
188
+
189
+toggleCameraTorch = () => {
190
+  this.setState({
191
+    isCameraTorch: !this.state.isCameraTorch
192
+  }, () => {
193
+    RtcEngine.setCameraTorchOn(this.state.isCameraTorch)
194
+  })
195
+}
196
+
197
+toggleVideo = () => {
198
+  this.setState({
199
+    disableVideo: !this.state.videodisableVideo
200
+  }, () => {
201
+    this.state.disableVideo ? RtcEngine.enableVideo() : RtcEngine.disableVideo()
202
+  });
203
+}
204
+
205
+toggleHideButtons = () => {
206
+  this.setState({
207
+    hideButton: !this.state.hideButton
208
+  })
209
+}
210
+
211
+onPressVideo = (uid) => {
212
+  this.setState({
213
+    selectedUid: uid
214
+  }, () => {
215
+    this.setState({
216
+      visible: true
217
+    })
218
+  })
219
+}
220
+
221
+buttonsView = ({hideButton, isCameraTorch, disableVideo, isMute, isSpeaker}) => {
222
+  if (!hideButton) {
223
+  return (
224
+    <View>
225
+      <OperateButton
226
+        style={{alignSelf: 'center', marginBottom: -10}}
227
+        onPress={this.handleCancel}
228
+        imgStyle={{width: 60, height: 60}}
229
+        source={BtnEndCall()}
230
+    />
231
+    <View style={styles.bottomView}>
232
+      <OperateButton
233
+        onPress={this.toggleCameraTorch}
234
+        imgStyle={{width: 40, height: 40}}
235
+        source={isCameraTorch ? EnablePhotoflash() : DisablePhotoflash()}
236
+      />
237
+      <OperateButton
238
+        onPress={this.toggleVideo}
239
+        source={disableVideo ? EnableCamera() : DisableCamera()}
240
+      />
241
+    </View>
242
+    <View style={styles.bottomView}>
243
+      <OperateButton
244
+        onPress={this.toggleAllRemoteAudioStreams}
245
+        source={isMute ? IconMuted() : BtnMute()}
246
+      />
247
+      <OperateButton
248
+        onPress={this.switchCamera}
249
+        source={BtnSwitchCamera()}
250
+      />
251
+      <OperateButton
252
+        onPress={this.toggleSpeakerPhone}
253
+        source={!isSpeaker ? IconSpeaker() : BtnSpeaker()}
254
+      />
255
+    </View>
256
+    </View>)
257
+  }
258
+}
259
+
260
+agoraPeerViews = ({visible, peerIds}) => {
261
+  return (visible ? 
262
+  <View style={styles.videoView} /> :
263
+  <View style={styles.videoView}>{
264
+    peerIds.map((uid, key) => (
265
+    <TouchableOpacity
266
+      activeOpacity={1}
267
+      onPress={() => this.onPressVideo(uid)}
268
+      key={key}>
269
+    <AgoraView
270
+        style={styles.remoteView}
271
+        zOrderMediaOverlay={true}
272
+        remoteUid={uid}
273
+    />
274
+    </TouchableOpacity>
275
+    ))
276
+    }</View>)
277
+}
278
+
279
+modalView = ({visible}) => {
280
+  return (
281
+  <Modal
282
+    visible={visible}
283
+    presentationStyle={'fullScreen'}
284
+    animationType={'slide'}
285
+    onRequestClose={() => {}}
286
+    >
287
+    <TouchableOpacity
288
+      activeOpacity={1}
289
+      style={{flex: 1}}
290
+      onPress={() => this.setState({
291
+        visible: false
292
+    })} >
293
+      <AgoraView
294
+        style={{flex: 1}}
295
+        zOrderMediaOverlay={true}
296
+        remoteUid={this.state.selectedUid}
297
+      />
298
+    </TouchableOpacity>
299
+  </Modal>)
300
+}
301
+
302
+render () {
303
+  if (!this.state.joinSucceed) {
304
+    return (
305
+    <View style={{flex: 1, backgroundColor: '#fff', justifyContent: 'center', alignItems: 'center'}}>
306
+      <Text>Creating a video conference...</Text>
307
+    </View>
308
+    )
309
+  }
310
+
311
+  return (
312
+    <TouchableOpacity
313
+      activeOpacity={1}
314
+      onPress={this.toggleHideButtons}
315
+      style={styles.container}
316
+    >
317
+      <AgoraView style={styles.localView} showLocalVideo={true} />
318
+        <View style={styles.absView}>
319
+          {this.agoraPeerViews(this.state)}
320
+          {this.buttonsView(this.state)}
321
+        </View>
322
+      {this.modalView(this.state)}
323
+    </TouchableOpacity>
324
+    )
325
+  } 
326
+}

+ 7
- 0
samples/simpleDemo/index.js View File

@@ -0,0 +1,7 @@
1
+/** @format */
2
+
3
+import {AppRegistry} from 'react-native';
4
+import App from './App';
5
+import {name as appName} from './app.json';
6
+
7
+AppRegistry.registerComponent(appName, () => App);

+ 54
- 0
samples/simpleDemo/ios/simpleDemo-tvOS/Info.plist View File

@@ -0,0 +1,54 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>APPL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>UILaunchStoryboardName</key>
26
+	<string>LaunchScreen</string>
27
+	<key>UIRequiredDeviceCapabilities</key>
28
+	<array>
29
+		<string>armv7</string>
30
+	</array>
31
+	<key>UISupportedInterfaceOrientations</key>
32
+	<array>
33
+		<string>UIInterfaceOrientationPortrait</string>
34
+		<string>UIInterfaceOrientationLandscapeLeft</string>
35
+		<string>UIInterfaceOrientationLandscapeRight</string>
36
+	</array>
37
+	<key>UIViewControllerBasedStatusBarAppearance</key>
38
+	<false/>
39
+	<key>NSLocationWhenInUseUsageDescription</key>
40
+	<string></string>
41
+	<key>NSAppTransportSecurity</key>
42
+	<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
43
+	<dict>
44
+		<key>NSExceptionDomains</key>
45
+		<dict>
46
+			<key>localhost</key>
47
+			<dict>
48
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
49
+				<true/>
50
+			</dict>
51
+		</dict>
52
+	</dict>
53
+</dict>
54
+</plist>

+ 24
- 0
samples/simpleDemo/ios/simpleDemo-tvOSTests/Info.plist View File

@@ -0,0 +1,24 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>BNDL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+</dict>
24
+</plist>

+ 1657
- 0
samples/simpleDemo/ios/simpleDemo.xcodeproj/project.pbxproj
File diff suppressed because it is too large
View File


+ 129
- 0
samples/simpleDemo/ios/simpleDemo.xcodeproj/xcshareddata/xcschemes/simpleDemo-tvOS.xcscheme View File

@@ -0,0 +1,129 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "0940"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "NO"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "2D2A28121D9B038B00D4039D"
18
+               BuildableName = "libReact.a"
19
+               BlueprintName = "React-tvOS"
20
+               ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+         <BuildActionEntry
24
+            buildForTesting = "YES"
25
+            buildForRunning = "YES"
26
+            buildForProfiling = "YES"
27
+            buildForArchiving = "YES"
28
+            buildForAnalyzing = "YES">
29
+            <BuildableReference
30
+               BuildableIdentifier = "primary"
31
+               BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
32
+               BuildableName = "simpleDemo-tvOS.app"
33
+               BlueprintName = "simpleDemo-tvOS"
34
+               ReferencedContainer = "container:simpleDemo.xcodeproj">
35
+            </BuildableReference>
36
+         </BuildActionEntry>
37
+         <BuildActionEntry
38
+            buildForTesting = "YES"
39
+            buildForRunning = "YES"
40
+            buildForProfiling = "NO"
41
+            buildForArchiving = "NO"
42
+            buildForAnalyzing = "YES">
43
+            <BuildableReference
44
+               BuildableIdentifier = "primary"
45
+               BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7"
46
+               BuildableName = "simpleDemo-tvOSTests.xctest"
47
+               BlueprintName = "simpleDemo-tvOSTests"
48
+               ReferencedContainer = "container:simpleDemo.xcodeproj">
49
+            </BuildableReference>
50
+         </BuildActionEntry>
51
+      </BuildActionEntries>
52
+   </BuildAction>
53
+   <TestAction
54
+      buildConfiguration = "Debug"
55
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
56
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
57
+      shouldUseLaunchSchemeArgsEnv = "YES">
58
+      <Testables>
59
+         <TestableReference
60
+            skipped = "NO">
61
+            <BuildableReference
62
+               BuildableIdentifier = "primary"
63
+               BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7"
64
+               BuildableName = "simpleDemo-tvOSTests.xctest"
65
+               BlueprintName = "simpleDemo-tvOSTests"
66
+               ReferencedContainer = "container:simpleDemo.xcodeproj">
67
+            </BuildableReference>
68
+         </TestableReference>
69
+      </Testables>
70
+      <MacroExpansion>
71
+         <BuildableReference
72
+            BuildableIdentifier = "primary"
73
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
74
+            BuildableName = "simpleDemo-tvOS.app"
75
+            BlueprintName = "simpleDemo-tvOS"
76
+            ReferencedContainer = "container:simpleDemo.xcodeproj">
77
+         </BuildableReference>
78
+      </MacroExpansion>
79
+      <AdditionalOptions>
80
+      </AdditionalOptions>
81
+   </TestAction>
82
+   <LaunchAction
83
+      buildConfiguration = "Debug"
84
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
85
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
86
+      launchStyle = "0"
87
+      useCustomWorkingDirectory = "NO"
88
+      ignoresPersistentStateOnLaunch = "NO"
89
+      debugDocumentVersioning = "YES"
90
+      debugServiceExtension = "internal"
91
+      allowLocationSimulation = "YES">
92
+      <BuildableProductRunnable
93
+         runnableDebuggingMode = "0">
94
+         <BuildableReference
95
+            BuildableIdentifier = "primary"
96
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
97
+            BuildableName = "simpleDemo-tvOS.app"
98
+            BlueprintName = "simpleDemo-tvOS"
99
+            ReferencedContainer = "container:simpleDemo.xcodeproj">
100
+         </BuildableReference>
101
+      </BuildableProductRunnable>
102
+      <AdditionalOptions>
103
+      </AdditionalOptions>
104
+   </LaunchAction>
105
+   <ProfileAction
106
+      buildConfiguration = "Release"
107
+      shouldUseLaunchSchemeArgsEnv = "YES"
108
+      savedToolIdentifier = ""
109
+      useCustomWorkingDirectory = "NO"
110
+      debugDocumentVersioning = "YES">
111
+      <BuildableProductRunnable
112
+         runnableDebuggingMode = "0">
113
+         <BuildableReference
114
+            BuildableIdentifier = "primary"
115
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
116
+            BuildableName = "simpleDemo-tvOS.app"
117
+            BlueprintName = "simpleDemo-tvOS"
118
+            ReferencedContainer = "container:simpleDemo.xcodeproj">
119
+         </BuildableReference>
120
+      </BuildableProductRunnable>
121
+   </ProfileAction>
122
+   <AnalyzeAction
123
+      buildConfiguration = "Debug">
124
+   </AnalyzeAction>
125
+   <ArchiveAction
126
+      buildConfiguration = "Release"
127
+      revealArchiveInOrganizer = "YES">
128
+   </ArchiveAction>
129
+</Scheme>

+ 129
- 0
samples/simpleDemo/ios/simpleDemo.xcodeproj/xcshareddata/xcschemes/simpleDemo.xcscheme View File

@@ -0,0 +1,129 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "0940"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "NO"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "83CBBA2D1A601D0E00E9B192"
18
+               BuildableName = "libReact.a"
19
+               BlueprintName = "React"
20
+               ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+         <BuildActionEntry
24
+            buildForTesting = "YES"
25
+            buildForRunning = "YES"
26
+            buildForProfiling = "YES"
27
+            buildForArchiving = "YES"
28
+            buildForAnalyzing = "YES">
29
+            <BuildableReference
30
+               BuildableIdentifier = "primary"
31
+               BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
32
+               BuildableName = "simpleDemo.app"
33
+               BlueprintName = "simpleDemo"
34
+               ReferencedContainer = "container:simpleDemo.xcodeproj">
35
+            </BuildableReference>
36
+         </BuildActionEntry>
37
+         <BuildActionEntry
38
+            buildForTesting = "YES"
39
+            buildForRunning = "YES"
40
+            buildForProfiling = "NO"
41
+            buildForArchiving = "NO"
42
+            buildForAnalyzing = "YES">
43
+            <BuildableReference
44
+               BuildableIdentifier = "primary"
45
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
46
+               BuildableName = "simpleDemoTests.xctest"
47
+               BlueprintName = "simpleDemoTests"
48
+               ReferencedContainer = "container:simpleDemo.xcodeproj">
49
+            </BuildableReference>
50
+         </BuildActionEntry>
51
+      </BuildActionEntries>
52
+   </BuildAction>
53
+   <TestAction
54
+      buildConfiguration = "Debug"
55
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
56
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
57
+      shouldUseLaunchSchemeArgsEnv = "YES">
58
+      <Testables>
59
+         <TestableReference
60
+            skipped = "NO">
61
+            <BuildableReference
62
+               BuildableIdentifier = "primary"
63
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
64
+               BuildableName = "simpleDemoTests.xctest"
65
+               BlueprintName = "simpleDemoTests"
66
+               ReferencedContainer = "container:simpleDemo.xcodeproj">
67
+            </BuildableReference>
68
+         </TestableReference>
69
+      </Testables>
70
+      <MacroExpansion>
71
+         <BuildableReference
72
+            BuildableIdentifier = "primary"
73
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
74
+            BuildableName = "simpleDemo.app"
75
+            BlueprintName = "simpleDemo"
76
+            ReferencedContainer = "container:simpleDemo.xcodeproj">
77
+         </BuildableReference>
78
+      </MacroExpansion>
79
+      <AdditionalOptions>
80
+      </AdditionalOptions>
81
+   </TestAction>
82
+   <LaunchAction
83
+      buildConfiguration = "Debug"
84
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
85
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
86
+      launchStyle = "0"
87
+      useCustomWorkingDirectory = "NO"
88
+      ignoresPersistentStateOnLaunch = "NO"
89
+      debugDocumentVersioning = "YES"
90
+      debugServiceExtension = "internal"
91
+      allowLocationSimulation = "YES">
92
+      <BuildableProductRunnable
93
+         runnableDebuggingMode = "0">
94
+         <BuildableReference
95
+            BuildableIdentifier = "primary"
96
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
97
+            BuildableName = "simpleDemo.app"
98
+            BlueprintName = "simpleDemo"
99
+            ReferencedContainer = "container:simpleDemo.xcodeproj">
100
+         </BuildableReference>
101
+      </BuildableProductRunnable>
102
+      <AdditionalOptions>
103
+      </AdditionalOptions>
104
+   </LaunchAction>
105
+   <ProfileAction
106
+      buildConfiguration = "Release"
107
+      shouldUseLaunchSchemeArgsEnv = "YES"
108
+      savedToolIdentifier = ""
109
+      useCustomWorkingDirectory = "NO"
110
+      debugDocumentVersioning = "YES">
111
+      <BuildableProductRunnable
112
+         runnableDebuggingMode = "0">
113
+         <BuildableReference
114
+            BuildableIdentifier = "primary"
115
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
116
+            BuildableName = "simpleDemo.app"
117
+            BlueprintName = "simpleDemo"
118
+            ReferencedContainer = "container:simpleDemo.xcodeproj">
119
+         </BuildableReference>
120
+      </BuildableProductRunnable>
121
+   </ProfileAction>
122
+   <AnalyzeAction
123
+      buildConfiguration = "Debug">
124
+   </AnalyzeAction>
125
+   <ArchiveAction
126
+      buildConfiguration = "Release"
127
+      revealArchiveInOrganizer = "YES">
128
+   </ArchiveAction>
129
+</Scheme>

+ 14
- 0
samples/simpleDemo/ios/simpleDemo/AppDelegate.h View File

@@ -0,0 +1,14 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import <UIKit/UIKit.h>
9
+
10
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
11
+
12
+@property (nonatomic, strong) UIWindow *window;
13
+
14
+@end

+ 39
- 0
samples/simpleDemo/ios/simpleDemo/AppDelegate.m View File

@@ -0,0 +1,39 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import "AppDelegate.h"
9
+
10
+#import <React/RCTBundleURLProvider.h>
11
+#import <React/RCTRootView.h>
12
+
13
+@implementation AppDelegate
14
+
15
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
16
+{
17
+  NSURL *jsCodeLocation;
18
+
19
+  #ifdef DEBUG
20
+    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
21
+  #else
22
+    jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
23
+  #endif
24
+
25
+  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
26
+                                                      moduleName:@"simpleDemo"
27
+                                               initialProperties:nil
28
+                                                   launchOptions:launchOptions];
29
+  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
30
+
31
+  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
32
+  UIViewController *rootViewController = [UIViewController new];
33
+  rootViewController.view = rootView;
34
+  self.window.rootViewController = rootViewController;
35
+  [self.window makeKeyAndVisible];
36
+  return YES;
37
+}
38
+
39
+@end

+ 42
- 0
samples/simpleDemo/ios/simpleDemo/Base.lproj/LaunchScreen.xib View File

@@ -0,0 +1,42 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
3
+    <dependencies>
4
+        <deployment identifier="iOS"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
6
+        <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
7
+    </dependencies>
8
+    <objects>
9
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
10
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
11
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
12
+            <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
13
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
14
+            <subviews>
15
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
16
+                    <rect key="frame" x="20" y="439" width="441" height="21"/>
17
+                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
18
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
19
+                    <nil key="highlightedColor"/>
20
+                </label>
21
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="simpleDemo" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
22
+                    <rect key="frame" x="20" y="140" width="441" height="43"/>
23
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
24
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
25
+                    <nil key="highlightedColor"/>
26
+                </label>
27
+            </subviews>
28
+            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
29
+            <constraints>
30
+                <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
31
+                <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
32
+                <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
33
+                <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
34
+                <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
35
+                <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
36
+            </constraints>
37
+            <nil key="simulatedStatusBarMetrics"/>
38
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
39
+            <point key="canvasLocation" x="548" y="455"/>
40
+        </view>
41
+    </objects>
42
+</document>

+ 53
- 0
samples/simpleDemo/ios/simpleDemo/Images.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,53 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "iphone",
5
+      "size" : "20x20",
6
+      "scale" : "2x"
7
+    },
8
+    {
9
+      "idiom" : "iphone",
10
+      "size" : "20x20",
11
+      "scale" : "3x"
12
+    },
13
+    {
14
+      "idiom" : "iphone",
15
+      "size" : "29x29",
16
+      "scale" : "2x"
17
+    },
18
+    {
19
+      "idiom" : "iphone",
20
+      "size" : "29x29",
21
+      "scale" : "3x"
22
+    },
23
+    {
24
+      "idiom" : "iphone",
25
+      "size" : "40x40",
26
+      "scale" : "2x"
27
+    },
28
+    {
29
+      "idiom" : "iphone",
30
+      "size" : "40x40",
31
+      "scale" : "3x"
32
+    },
33
+    {
34
+      "idiom" : "iphone",
35
+      "size" : "60x60",
36
+      "scale" : "2x"
37
+    },
38
+    {
39
+      "idiom" : "iphone",
40
+      "size" : "60x60",
41
+      "scale" : "3x"
42
+    },
43
+    {
44
+      "idiom" : "ios-marketing",
45
+      "size" : "1024x1024",
46
+      "scale" : "1x"
47
+    }
48
+  ],
49
+  "info" : {
50
+    "version" : 1,
51
+    "author" : "xcode"
52
+  }
53
+}

+ 6
- 0
samples/simpleDemo/ios/simpleDemo/Images.xcassets/Contents.json View File

@@ -0,0 +1,6 @@
1
+{
2
+  "info" : {
3
+    "version" : 1,
4
+    "author" : "xcode"
5
+  }
6
+}

+ 65
- 0
samples/simpleDemo/ios/simpleDemo/Info.plist View File

@@ -0,0 +1,65 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleDisplayName</key>
8
+	<string>simpleDemo</string>
9
+	<key>CFBundleExecutable</key>
10
+	<string>$(EXECUTABLE_NAME)</string>
11
+	<key>CFBundleIdentifier</key>
12
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+	<key>CFBundleInfoDictionaryVersion</key>
14
+	<string>6.0</string>
15
+	<key>CFBundleName</key>
16
+	<string>$(PRODUCT_NAME)</string>
17
+	<key>CFBundlePackageType</key>
18
+	<string>APPL</string>
19
+	<key>CFBundleShortVersionString</key>
20
+	<string>1.0</string>
21
+	<key>CFBundleSignature</key>
22
+	<string>????</string>
23
+	<key>CFBundleVersion</key>
24
+	<string>1</string>
25
+	<key>LSRequiresIPhoneOS</key>
26
+	<true/>
27
+	<key>NSAppTransportSecurity</key>
28
+	<dict>
29
+		<key>NSAllowsArbitraryLoads</key>
30
+		<true/>
31
+		<key>NSExceptionDomains</key>
32
+		<dict>
33
+			<key>localhost</key>
34
+			<dict>
35
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
36
+				<true/>
37
+			</dict>
38
+		</dict>
39
+	</dict>
40
+	<key>NSCameraUsageDescription</key>
41
+	<string>use camera for agora video call</string>
42
+	<key>NSLocationWhenInUseUsageDescription</key>
43
+	<string></string>
44
+	<key>NSMicrophoneUsageDescription</key>
45
+	<string>use microphone for agora video call</string>
46
+	<key>UIBackgroundModes</key>
47
+	<array>
48
+		<string>audio</string>
49
+	</array>
50
+	<key>UILaunchStoryboardName</key>
51
+	<string>LaunchScreen</string>
52
+	<key>UIRequiredDeviceCapabilities</key>
53
+	<array>
54
+		<string>armv7</string>
55
+	</array>
56
+	<key>UISupportedInterfaceOrientations</key>
57
+	<array>
58
+		<string>UIInterfaceOrientationPortrait</string>
59
+		<string>UIInterfaceOrientationLandscapeLeft</string>
60
+		<string>UIInterfaceOrientationLandscapeRight</string>
61
+	</array>
62
+	<key>UIViewControllerBasedStatusBarAppearance</key>
63
+	<false/>
64
+</dict>
65
+</plist>

+ 16
- 0
samples/simpleDemo/ios/simpleDemo/main.m View File

@@ -0,0 +1,16 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import <UIKit/UIKit.h>
9
+
10
+#import "AppDelegate.h"
11
+
12
+int main(int argc, char * argv[]) {
13
+  @autoreleasepool {
14
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15
+  }
16
+}

+ 24
- 0
samples/simpleDemo/ios/simpleDemoTests/Info.plist View File

@@ -0,0 +1,24 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>BNDL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+</dict>
24
+</plist>

+ 68
- 0
samples/simpleDemo/ios/simpleDemoTests/simpleDemoTests.m View File

@@ -0,0 +1,68 @@
1
+/**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import <UIKit/UIKit.h>
9
+#import <XCTest/XCTest.h>
10
+
11
+#import <React/RCTLog.h>
12
+#import <React/RCTRootView.h>
13
+
14
+#define TIMEOUT_SECONDS 600
15
+#define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
16
+
17
+@interface simpleDemoTests : XCTestCase
18
+
19
+@end
20
+
21
+@implementation simpleDemoTests
22
+
23
+- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
24
+{
25
+  if (test(view)) {
26
+    return YES;
27
+  }
28
+  for (UIView *subview in [view subviews]) {
29
+    if ([self findSubviewInView:subview matching:test]) {
30
+      return YES;
31
+    }
32
+  }
33
+  return NO;
34
+}
35
+
36
+- (void)testRendersWelcomeScreen
37
+{
38
+  UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];
39
+  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
40
+  BOOL foundElement = NO;
41
+
42
+  __block NSString *redboxError = nil;
43
+  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
44
+    if (level >= RCTLogLevelError) {
45
+      redboxError = message;
46
+    }
47
+  });
48
+
49
+  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
50
+    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
51
+    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
52
+
53
+    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
54
+      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
55
+        return YES;
56
+      }
57
+      return NO;
58
+    }];
59
+  }
60
+
61
+  RCTSetLogFunction(RCTDefaultLogFunction);
62
+
63
+  XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
64
+  XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
65
+}
66
+
67
+
68
+@end

+ 7704
- 0
samples/simpleDemo/package-lock.json
File diff suppressed because it is too large
View File


+ 25
- 0
samples/simpleDemo/package.json View File

@@ -0,0 +1,25 @@
1
+{
2
+  "name": "simpleDemo",
3
+  "version": "0.0.1",
4
+  "private": true,
5
+  "scripts": {
6
+    "start": "node node_modules/react-native/local-cli/cli.js start",
7
+    "ios": "react-native run-ios && react-native log-ios",
8
+    "android": "react-native run-android && react-native log-android",
9
+    "test": "jest"
10
+  },
11
+  "dependencies": {
12
+    "react": "16.6.3",
13
+    "react-native": "0.57.8"
14
+  },
15
+  "devDependencies": {
16
+    "babel-jest": "23.6.0",
17
+    "jest": "23.6.0",
18
+    "metro-react-native-babel-preset": "0.51.1",
19
+    "react-native-agora": "^1.2.5",
20
+    "react-test-renderer": "16.6.3"
21
+  },
22
+  "jest": {
23
+    "preset": "react-native"
24
+  }
25
+}

+ 47
- 0
samples/simpleDemo/utils.js View File

@@ -0,0 +1,47 @@
1
+export const APPID = 'Your Agora APP_ID'; //'Your Agora APP_ID'
2
+export function handleError (code) {
3
+  let errObj = [
4
+    {
5
+      name: 'AGORA_IID_AUDIO_DEVICE_MANAGER',
6
+      code: 1,
7
+    },
8
+    {
9
+      name: 'AGORA_IID_VIDEO_DEVICE_MANAGER',
10
+      code: 2,
11
+    },
12
+    {
13
+      name: 'AGORA_IID_RTC_ENGINE_PARAMETER',
14
+      code: 3,
15
+    },
16
+    {
17
+      name: 'AGORA_IID_MEDIA_ENGINE',
18
+      code: 4,
19
+    },
20
+    {
21
+      name: 'WARN_INVALID_VIEW',
22
+      code: 8,
23
+    },
24
+    {
25
+      name: 'WARN_INIT_VIDEO',
26
+      code: 16,
27
+    },
28
+    {
29
+      name: 'WARN_PENDING',
30
+      code: 20,
31
+    },
32
+    {
33
+      name: 'ERR_JOIN_CHANNEL_REJECTED',
34
+      code: 17
35
+    },
36
+    {
37
+      name: 'ERR_START_CAMERA',
38
+      code: 1003
39
+    }
40
+  ];
41
+  
42
+  let found = errObj.find(e => e.code === code);
43
+  if (!found) {
44
+    throw new Error(`Code: ${code} isn't exists`);
45
+  }
46
+  return found;
47
+}

+ 5902
- 0
samples/simpleDemo/yarn.lock
File diff suppressed because it is too large
View File