Browse Source

fix conflicts

matrixbirds 5 years ago
parent
commit
ae87df642a
63 changed files with 15181 additions and 12364 deletions
  1. 3
    0
      .gitattributes
  2. 13
    0
      .gitignore
  3. 26
    0
      .npmignore
  4. 53
    6
      android/build.gradle
  5. BIN
      android/gradle/wrapper/gradle-wrapper.jar
  6. 5
    0
      android/gradle/wrapper/gradle-wrapper.properties
  7. 172
    0
      android/gradlew
  8. 84
    0
      android/gradlew.bat
  9. BIN
      android/libs/agora-rtc-sdk.jar
  10. 109
    30
      android/src/main/java/com/syan/agora/AgoraManager.java
  11. 2143
    223
      android/src/main/java/com/syan/agora/AgoraModule.java
  12. 298
    0
      android/src/main/java/com/syan/agora/ConvertUtils.java
  13. 19
    0
      android/src/main/java/com/syan/agora/ReactNativeAgoraException.java
  14. BIN
      android/src/main/jniLibs/arm64-v8a/libagora-crypto.so
  15. BIN
      android/src/main/jniLibs/arm64-v8a/libagora-rtc-sdk-jni.so
  16. BIN
      android/src/main/jniLibs/armeabi-v7a/libagora-crypto.so
  17. BIN
      android/src/main/jniLibs/armeabi-v7a/libagora-rtc-sdk-jni.so
  18. 0
    181
      android/src/main/jniLibs/include/IAgoraMediaEngine.h
  19. 0
    2255
      android/src/main/jniLibs/include/IAgoraRtcEngine.h
  20. BIN
      android/src/main/jniLibs/x86/libagora-crypto.so
  21. BIN
      android/src/main/jniLibs/x86/libagora-rtc-sdk-jni.so
  22. 71
    7
      ios/RCTAgora.xcodeproj/project.pbxproj
  23. 8
    0
      ios/RCTAgora.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  24. 70
    0
      ios/RCTAgora/AgoraConst.h
  25. 11
    13
      ios/RCTAgora/AgoraConst.m
  26. 2
    2
      ios/RCTAgora/RCTAgora.h
  27. 2005
    307
      ios/RCTAgora/RCTAgora.m
  28. 20
    20
      ios/RCTAgora/RCTAgoraVideoView.m
  29. 1
    2
      ios/RCTAgora/RCTAgoraViewManager.h
  30. 1
    1
      ios/RCTAgora/RCTAgoraViewManager.m
  31. 1
    2
      ios/RCTAgora/libs/AgoraRtcCryptoLoader.framework/Headers/AgoraRtcCryptoLoader.h
  32. 53
    7
      package.json
  33. 99
    0
      react-native-agora.podspec
  34. 1
    1
      samples/simpleDemo/.flowconfig
  35. 60
    0
      samples/simpleDemo/.gitignore
  36. 25
    17
      samples/simpleDemo/App.js
  37. 4
    14
      samples/simpleDemo/android/app/BUCK
  38. 13
    6
      samples/simpleDemo/android/app/build.gradle
  39. 19
    0
      samples/simpleDemo/android/app/build_defs.bzl
  40. 3
    1
      samples/simpleDemo/android/app/src/main/AndroidManifest.xml
  41. 6
    17
      samples/simpleDemo/android/build.gradle
  42. 1
    1
      samples/simpleDemo/android/gradle/wrapper/gradle-wrapper.properties
  43. 3
    0
      samples/simpleDemo/babel.config.js
  44. 58
    20
      samples/simpleDemo/components/agora.js
  45. 42
    0
      samples/simpleDemo/ios/Podfile
  46. 41
    0
      samples/simpleDemo/ios/Podfile.lock
  47. 289
    183
      samples/simpleDemo/ios/simpleDemo.xcodeproj/project.pbxproj
  48. 1
    1
      samples/simpleDemo/ios/simpleDemo.xcodeproj/xcshareddata/xcschemes/simpleDemo-tvOS.xcscheme
  49. 1
    1
      samples/simpleDemo/ios/simpleDemo.xcodeproj/xcshareddata/xcschemes/simpleDemo.xcscheme
  50. 1
    1
      samples/simpleDemo/ios/simpleDemo/AppDelegate.h
  51. 3
    7
      samples/simpleDemo/ios/simpleDemo/AppDelegate.m
  52. 4
    4
      samples/simpleDemo/ios/simpleDemo/Info.plist
  53. 1
    1
      samples/simpleDemo/ios/simpleDemo/main.m
  54. 1
    1
      samples/simpleDemo/ios/simpleDemoTests/simpleDemoTests.m
  55. 0
    7704
      samples/simpleDemo/package-lock.json
  56. 3
    3
      samples/simpleDemo/package.json
  57. 2194
    1325
      samples/simpleDemo/yarn.lock
  58. 27
    0
      src/AgoraView.native.tsx
  59. 295
    0
      src/RtcEngine.native.ts
  60. 2
    0
      src/index.ts
  61. 289
    0
      src/types.d.ts
  62. 23
    0
      tsconfig.json
  63. 6504
    0
      yarn.lock

+ 3
- 0
.gitattributes View File

@@ -0,0 +1,3 @@
1
+*.psd filter=lfs diff=lfs merge=lfs -text
2
+*.framework filter=lfs diff=lfs merge=lfs -text
3
+*.so filter=lfs diff=lfs merge=lfs -text

+ 13
- 0
.gitignore View File

@@ -58,3 +58,16 @@ android/src/main/res/drawable/
58 58
 .project
59 59
 .settings
60 60
 .classpath
61
+.jest/
62
+xcuserdata
63
+*.pbxproj
64
+lib
65
+*.xcworkspace
66
+*.zip
67
+.byebug_history
68
+Untitled*
69
+Pods
70
+**/*~
71
+xcuserdata*
72
+**/*/xcuserdata*
73
+.vscode

+ 26
- 0
.npmignore View File

@@ -0,0 +1,26 @@
1
+*.*~
2
+**/*.*~
3
+*.md
4
+*.MD
5
+.DS_Store
6
+tsconfig.json
7
+samples
8
+__tests__
9
+docs
10
+.*.swp
11
+._*
12
+.DS_Store
13
+.git
14
+.hg
15
+.npmrc
16
+.lock-wscript
17
+.svn
18
+.wafpickle-*
19
+config.gypi
20
+CVS
21
+npm-debug.log
22
+node_modules
23
+ios/Pods
24
+ios/Podfile*
25
+xcuserdata*
26
+**/*/xcuserdata*

+ 53
- 6
android/build.gradle View File

@@ -1,12 +1,36 @@
1 1
 apply plugin: 'com.android.library'
2 2
 
3
+allprojects {
4
+    gradle.projectsEvaluated {
5
+        tasks.withType(JavaCompile) {
6
+            options.encoding = 'utf-8'
7
+            options.compilerArgs << "-Xlint:deprecation"
8
+        }
9
+    }
10
+}
11
+
12
+buildscript {
13
+    repositories {
14
+        google()
15
+        jcenter()
16
+    }
17
+    dependencies {
18
+        classpath 'com.android.tools.build:gradle:3.1.2'
19
+    }
20
+}
21
+
22
+def DEFAULT_COMPILE_SDK_VERSION = 27
23
+def DEFAULT_BUILD_TOOLS_VERSION = "27.0.3"
24
+def DEFAULT_TARGET_SDK_VERSION = 27
25
+def DEFAULT_ANDROID_SUPPORT_VERSION = "27.1.0"
26
+
3 27
 android {
4
-    compileSdkVersion 23
5
-    buildToolsVersion "23.0.1"
28
+    compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION
29
+    buildToolsVersion rootProject.hasProperty('buildToolsVersion') ? rootProject.buildToolsVersion : DEFAULT_BUILD_TOOLS_VERSION
6 30
 
7 31
     defaultConfig {
8 32
         minSdkVersion 16
9
-        targetSdkVersion 22
33
+        targetSdkVersion rootProject.hasProperty('targetSdkVersion') ? rootProject.targetSdkVersion : DEFAULT_TARGET_SDK_VERSION
10 34
         versionCode 1
11 35
         versionName "1.0"
12 36
 
@@ -19,13 +43,36 @@ android {
19 43
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
20 44
         }
21 45
     }
46
+
47
+    splits {
48
+        abi {
49
+            enable true
50
+
51
+            reset()
52
+
53
+            include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
54
+            // Specify that we do not want an additional universal SDK
55
+            universalApk false
56
+        }
57
+    }
22 58
 }
23 59
 
24 60
 dependencies {
61
+    def androidSupportVersion = rootProject.hasProperty("androidSupportVersion")  ? rootProject.androidSupportVersion : DEFAULT_ANDROID_SUPPORT_VERSION
62
+    // from internet
63
+    implementation "com.android.support:appcompat-v7:$androidSupportVersion"
64
+    implementation "io.agora.rtc:full-sdk:2.3.3"
65
+    // from node_modules
25 66
     implementation "com.facebook.react:react-native:+"
26
-    implementation fileTree(dir: 'libs', include: ['*.jar'])
27 67
 }
28 68
 
29
-configurations.all {
30
-    exclude group: 'com.facebook.react', module: 'react-native'
69
+repositories {
70
+    mavenCentral()
71
+    mavenLocal()
72
+    maven {
73
+        url "$rootDir/../node_modules/react-native/android"
74
+    }
75
+    jcenter()
76
+    google()
31 77
 }
78
+

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


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

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

+ 172
- 0
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
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

BIN
android/libs/agora-rtc-sdk.jar View File


+ 109
- 30
android/src/main/java/com/syan/agora/AgoraManager.java View File

@@ -1,18 +1,25 @@
1 1
 package com.syan.agora;
2 2
 
3 3
 import android.content.Context;
4
+import android.support.v7.widget.LinearLayoutCompat;
4 5
 import android.util.Log;
5 6
 import android.util.SparseArray;
6 7
 import android.view.SurfaceView;
7 8
 
8 9
 import com.facebook.react.bridge.ReadableMap;
10
+import com.facebook.react.bridge.WritableMap;
9 11
 
10 12
 import java.util.ArrayList;
11 13
 import java.util.List;
14
+import java.util.Map;
12 15
 
13 16
 import io.agora.rtc.IRtcEngineEventHandler;
14 17
 import io.agora.rtc.RtcEngine;
15 18
 import io.agora.rtc.video.VideoCanvas;
19
+import io.agora.rtc.video.VideoEncoderConfiguration;
20
+
21
+import static io.agora.rtc.video.VideoEncoderConfiguration.*;
22
+
16 23
 
17 24
 /**
18 25
  * Created by Leon on 2017/4/9.
@@ -45,31 +52,77 @@ public class AgoraManager {
45 52
         return sAgoraManager;
46 53
     }
47 54
 
55
+    private FRAME_RATE getVideoEncoderEnum (int val) {
56
+        FRAME_RATE type = FRAME_RATE.FRAME_RATE_FPS_1;
57
+        switch (val) {
58
+            case 1:
59
+                type = FRAME_RATE.FRAME_RATE_FPS_1;
60
+            case 7:
61
+                type = FRAME_RATE.FRAME_RATE_FPS_7;
62
+            case 10:
63
+                type = FRAME_RATE.FRAME_RATE_FPS_10;
64
+            case 15:
65
+                type = FRAME_RATE.FRAME_RATE_FPS_15;
66
+            case 24:
67
+                type = FRAME_RATE.FRAME_RATE_FPS_24;
68
+            case 30:
69
+                type = FRAME_RATE.FRAME_RATE_FPS_30;
70
+        }
71
+        return type;
72
+    }
73
+
74
+    private ORIENTATION_MODE getOrientationModeEnum (int val) {
75
+        ORIENTATION_MODE type = ORIENTATION_MODE.ORIENTATION_MODE_ADAPTIVE;
76
+        switch (val) {
77
+            case 0:
78
+                type = ORIENTATION_MODE.ORIENTATION_MODE_ADAPTIVE;
79
+            case 1:
80
+                type = ORIENTATION_MODE.ORIENTATION_MODE_FIXED_LANDSCAPE;
81
+            case 2:
82
+                type = ORIENTATION_MODE.ORIENTATION_MODE_FIXED_PORTRAIT;
83
+        }
84
+        return type;
85
+    }
86
+
48 87
     /**
49
-     * 初始化RtcEngine
88
+     * initialize rtc engine
50 89
      */
51
-    public void init(Context context, IRtcEngineEventHandler mRtcEventHandler, ReadableMap options) {
90
+    public int init(Context context, IRtcEngineEventHandler mRtcEventHandler, ReadableMap options) {
52 91
         this.context = context;
53 92
 
54
-        //创建RtcEngine对象,mRtcEventHandler为RtcEngine的回调
93
+        //create rtcEngine instance and setup rtcEngine eventHandler
55 94
         try {
56 95
             mRtcEngine = RtcEngine.create(context, options.getString("appid"), mRtcEventHandler);
57
-
96
+            if (options.hasKey("secret") && null != options.getString("secret")) {
97
+                mRtcEngine.setEncryptionSecret(options.getString("secret"));
98
+                if (options.hasKey("secretMode") && null != options.getString("secretMode")) {
99
+                    mRtcEngine.setEncryptionMode(options.getString("secretMode"));
100
+                }
101
+            }
58 102
         } catch (Exception e) {
59
-            throw new RuntimeException("NEED TO check rtc sdk init fatal error\n" + Log.getStackTraceString(e));
103
+            throw new RuntimeException("create rtc engine failed\n" + Log.getStackTraceString(e));
60 104
         }
61
-        //开启视频功能
105
+        mRtcEngine.enableDualStreamMode(true);
106
+        mRtcEngine.setChannelProfile(options.getInt("channelProfile"));
62 107
         mRtcEngine.enableVideo();
63
-        mRtcEngine.setVideoProfile(options.getInt("videoProfile"), options.getBoolean("swapWidthAndHeight")); //视频配置,
64
-        mRtcEngine.enableWebSdkInteroperability(true);  //设置和web通信
65
-        mRtcEngine.setChannelProfile(options.getInt("channelProfile")); //设置模式
66
-        mRtcEngine.setClientRole(options.getInt("clientRole"), null); //设置角色
108
+        ReadableMap config = options.getMap("videoEncoderConfig");
109
+        VideoEncoderConfiguration encoderConfig = new VideoEncoderConfiguration(
110
+            config.getInt("width"),
111
+            config.getInt("height"),
112
+            getVideoEncoderEnum(config.getInt("frameRate")),
113
+            config.getInt("bitrate"),
114
+            getOrientationModeEnum(config.getInt("orientationMode"))
115
+        );
116
+        mRtcEngine.setVideoEncoderConfiguration(encoderConfig);
117
+        mRtcEngine.setAudioProfile(options.getInt("audioProfile"), options.getInt("audioScenario"));
118
+        mRtcEngine.setClientRole(options.getInt("clientRole"));
119
+        return mRtcEngine.enableWebSdkInteroperability(true);
67 120
     }
68 121
 
69 122
     /**
70 123
      * 设置本地视频,即前置摄像头预览
71 124
      */
72
-    public AgoraManager setupLocalVideo() {
125
+    public int setupLocalVideo() {
73 126
         //创建一个SurfaceView用作视频预览
74 127
         SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
75 128
         //将SurfaceView保存起来在SparseArray中,后续会将其加入界面。key为视频的用户id,这里是本地视频, 默认id是0
@@ -78,36 +131,62 @@ public class AgoraManager {
78 131
 
79 132
         //设置本地视频,渲染模式选择VideoCanvas.RENDER_MODE_HIDDEN,如果选其他模式会出现视频不会填充满整个SurfaceView的情况,
80 133
         //具体渲染模式参考官方文档https://docs.agora.io/cn/user_guide/API/android_api.html#set-local-video-view-setuplocalvideo
81
-        mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, mLocalUid));
82
-        return this;//返回AgoraManager以作链式调用
134
+        return mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, mLocalUid));
83 135
     }
84 136
 
85
-    public AgoraManager setupRemoteVideo(int uid) {
137
+    public int setupRemoteVideo(int uid) {
86 138
 
87 139
         SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
88 140
         mSurfaceViews.put(uid, surfaceView);
89
-        mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, uid));
90
-        return this;
141
+        return mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, uid));
91 142
     }
92 143
 
93
-    public AgoraManager joinChannel(String channel, int uid) {
94
-        mRtcEngine.joinChannel(null, channel, null, uid);
95
-        return this;
144
+    public int setEnableSpeakerphone(boolean enabled) {
145
+        return mRtcEngine.setEnableSpeakerphone(enabled);
96 146
     }
97 147
 
98
-    public AgoraManager joinChannelWithToken(String token, String channel, int uid) {
99
-        mRtcEngine.joinChannel(token, channel, null, uid);
100
-        return this;
148
+    public int setDefaultAudioRouteToSpeakerphone(boolean enabled) {
149
+        return mRtcEngine.setDefaultAudioRoutetoSpeakerphone(enabled);
101 150
     }
102 151
 
103
-    public AgoraManager enableLastmileTest() {
104
-        mRtcEngine.enableLastmileTest();
105
-        return this;
152
+    public int renewToken(String token) {
153
+        return mRtcEngine.renewToken(token);
154
+    }
155
+
156
+    public int setClientRole(int role) {
157
+        return mRtcEngine.setClientRole(role);
158
+    }
159
+
160
+    public int enableWebSdkInteroperability(boolean enabled) {
161
+        return mRtcEngine.enableWebSdkInteroperability(enabled);
162
+    }
163
+
164
+    public int getConnectionState() {
165
+        return mRtcEngine.getConnectionState();
166
+    }
167
+    public int joinChannel(ReadableMap options) {
168
+        String token = options.hasKey("token") ? options.getString("token") : null;
169
+        String channelName = options.hasKey("channelName") ? options.getString("channelName") : null;
170
+        String optionalInfo = options.hasKey("optionalInfo") ? options.getString("optionalInfo") : null;
171
+        int uid = options.hasKey("uid") ? options.getInt("uid") : 0;
172
+        this.mLocalUid = uid;
173
+        return mRtcEngine.joinChannel(token, channelName, optionalInfo, uid);
174
+    }
175
+
176
+//    public int joinChannelWithToken(ReadableMap options) {
177
+//        String token = options.getString("token");
178
+//        String channel = options.getString("channel");
179
+//        String optionalInfo = options.getString("optionalInfo");
180
+//        int uid = options.getInt("uid");
181
+//        return mRtcEngine.joinChannel(token, channel, optionalInfo, uid);
182
+//    }
183
+
184
+    public int enableLastmileTest() {
185
+        return mRtcEngine.enableLastmileTest();
106 186
     }
107 187
 
108
-    public AgoraManager disableLastmileTest() {
109
-        mRtcEngine.disableLastmileTest();
110
-        return this;
188
+    public int disableLastmileTest() {
189
+        return mRtcEngine.disableLastmileTest();
111 190
     }
112 191
 
113 192
     public void startPreview() {
@@ -118,8 +197,8 @@ public class AgoraManager {
118 197
         mRtcEngine.stopPreview();
119 198
     }
120 199
 
121
-    public void leaveChannel() {
122
-        mRtcEngine.leaveChannel();
200
+    public int leaveChannel() {
201
+        return mRtcEngine.leaveChannel();
123 202
     }
124 203
 
125 204
     public void removeSurfaceView(int uid) {

+ 2143
- 223
android/src/main/java/com/syan/agora/AgoraModule.java
File diff suppressed because it is too large
View File


+ 298
- 0
android/src/main/java/com/syan/agora/ConvertUtils.java View File

@@ -0,0 +1,298 @@
1
+package com.syan.agora;
2
+
3
+import android.support.annotation.Nullable;
4
+
5
+import com.facebook.react.bridge.Arguments;
6
+import com.facebook.react.bridge.ReadableArray;
7
+import com.facebook.react.bridge.ReadableMap;
8
+import com.facebook.react.bridge.ReadableMapKeySetIterator;
9
+import com.facebook.react.bridge.ReadableType;
10
+import com.facebook.react.bridge.WritableArray;
11
+import com.facebook.react.bridge.WritableMap;
12
+import com.facebook.react.bridge.WritableNativeArray;
13
+import com.facebook.react.bridge.WritableNativeMap;
14
+
15
+import org.json.JSONArray;
16
+import org.json.JSONException;
17
+import org.json.JSONObject;
18
+
19
+import java.util.ArrayList;
20
+import java.util.HashMap;
21
+import java.util.Iterator;
22
+import java.util.List;
23
+import java.util.Map;
24
+
25
+public class ConvertUtils {
26
+    public static Map<String, Object> readableMapToMap(final @Nullable ReadableMap readableMap) {
27
+        if (readableMap == null) {
28
+            return new HashMap<>();
29
+        }
30
+
31
+        final ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
32
+        if (!iterator.hasNextKey()) {
33
+            return new HashMap<>();
34
+        }
35
+
36
+        final Map<String, Object> result = new HashMap<>();
37
+        while (iterator.hasNextKey()) {
38
+            final String key = iterator.nextKey();
39
+            result.put(key, toObject(readableMap, key));
40
+        }
41
+
42
+        return result;
43
+    }
44
+
45
+    public static Object toObject(@Nullable ReadableMap readableMap, String key) {
46
+        if (readableMap == null) {
47
+            return null;
48
+        }
49
+
50
+        Object result;
51
+
52
+        final ReadableType readableType = readableMap.getType(key);
53
+        switch (readableType) {
54
+            case Null:
55
+                result = key;
56
+                break;
57
+            case Boolean:
58
+                result = readableMap.getBoolean(key);
59
+                break;
60
+            case Number:
61
+                // Can be int or double.
62
+                double tmp = readableMap.getDouble(key);
63
+                if (tmp == (int) tmp) {
64
+                    result = (int) tmp;
65
+                } else {
66
+                    result = tmp;
67
+                }
68
+                break;
69
+            case String:
70
+                result = readableMap.getString(key);
71
+                break;
72
+            case Map:
73
+                result = readableMapToMap(readableMap.getMap(key));
74
+                break;
75
+            case Array:
76
+                result = readableArrayToList(readableMap.getArray(key));
77
+                break;
78
+            default:
79
+                throw new IllegalArgumentException("Could not convert object with key: " + key + ".");
80
+        }
81
+
82
+        return result;
83
+    }
84
+
85
+    /**
86
+     * toList converts a {@link ReadableArray} into an ArrayList.
87
+     *
88
+     * @param readableArray The ReadableArray to be conveted.
89
+     * @return An ArrayList containing the data that was in the ReadableArray.
90
+     */
91
+    public static List<Object> readableArrayToList(final @Nullable ReadableArray readableArray) {
92
+        if (readableArray == null) {
93
+            return null;
94
+        }
95
+
96
+        List<Object> result = new ArrayList<>(readableArray.size());
97
+        for (int index = 0; index < readableArray.size(); index++) {
98
+            final ReadableType readableType = readableArray.getType(index);
99
+            switch (readableType) {
100
+                case Null:
101
+                    result.add(String.valueOf(index));
102
+                    break;
103
+                case Boolean:
104
+                    result.add(readableArray.getBoolean(index));
105
+                    break;
106
+                case Number:
107
+                    // Can be int or double.
108
+                    double tmp = readableArray.getDouble(index);
109
+                    if (tmp == (int) tmp) {
110
+                        result.add((int) tmp);
111
+                    } else {
112
+                        result.add(tmp);
113
+                    }
114
+                    break;
115
+                case String:
116
+                    result.add(readableArray.getString(index));
117
+                    break;
118
+                case Map:
119
+                    result.add(readableMapToMap(readableArray.getMap(index)));
120
+                    break;
121
+                case Array:
122
+                    result = readableArrayToList(readableArray.getArray(index));
123
+                    break;
124
+                default:
125
+                    throw new IllegalArgumentException("Could not convert object with index: " + index + ".");
126
+            }
127
+        }
128
+
129
+        return result;
130
+    }
131
+
132
+    /**
133
+     * better
134
+     *
135
+     * @param jsonArray
136
+     * @return
137
+     * @throws JSONException
138
+     */
139
+    public static WritableArray jsonToReact(final JSONArray jsonArray) throws JSONException {
140
+        final WritableArray writableArray = Arguments.createArray();
141
+        for (int i = 0; i < jsonArray.length(); i++) {
142
+            final Object value = jsonArray.get(i);
143
+            if (value instanceof Float || value instanceof Double) {
144
+                writableArray.pushDouble(jsonArray.getDouble(i));
145
+            } else if (value instanceof Number) {
146
+                writableArray.pushInt(jsonArray.getInt(i));
147
+            } else if (value instanceof String) {
148
+                writableArray.pushString(jsonArray.getString(i));
149
+            } else if (value instanceof Boolean) {
150
+                writableArray.pushBoolean(jsonArray.getBoolean(i));
151
+            } else if (value instanceof JSONObject) {
152
+                writableArray.pushMap(jsonToReact(jsonArray.getJSONObject(i)));
153
+            } else if (value instanceof JSONArray) {
154
+                writableArray.pushArray(jsonToReact(jsonArray.getJSONArray(i)));
155
+            } else if (value == JSONObject.NULL) {
156
+                writableArray.pushNull();
157
+            }
158
+        }
159
+        return writableArray;
160
+    }
161
+
162
+    /**
163
+     * better
164
+     *
165
+     * @param jsonObject
166
+     * @return
167
+     * @throws JSONException
168
+     */
169
+    public static WritableMap jsonToReact(final JSONObject jsonObject) throws JSONException {
170
+        final WritableMap writableMap = Arguments.createMap();
171
+        final Iterator iterator = jsonObject.keys();
172
+        while (iterator.hasNext()) {
173
+            final String key = (String) iterator.next();
174
+            final Object value = jsonObject.get(key);
175
+            if (value instanceof Float || value instanceof Double) {
176
+                writableMap.putDouble(key, jsonObject.getDouble(key));
177
+            } else if (value instanceof Number) {
178
+                writableMap.putInt(key, jsonObject.getInt(key));
179
+            } else if (value instanceof String) {
180
+                writableMap.putString(key, jsonObject.getString(key));
181
+            } else if (value instanceof JSONObject) {
182
+                writableMap.putMap(key, jsonToReact(jsonObject.getJSONObject(key)));
183
+            } else if (value instanceof JSONArray) {
184
+                writableMap.putArray(key, jsonToReact(jsonObject.getJSONArray(key)));
185
+            } else if (value instanceof Boolean) {
186
+                writableMap.putBoolean(key, jsonObject.getBoolean(key));
187
+            } else if (value == JSONObject.NULL) {
188
+                writableMap.putNull(key);
189
+            }
190
+        }
191
+        return writableMap;
192
+    }
193
+
194
+    public static WritableMap convertJsonToMap(JSONObject jsonObject) throws JSONException {
195
+        WritableMap map = new WritableNativeMap();
196
+
197
+        Iterator<String> iterator = jsonObject.keys();
198
+        while (iterator.hasNext()) {
199
+            String key = iterator.next();
200
+            Object value = jsonObject.get(key);
201
+            if (value instanceof JSONObject) {
202
+                map.putMap(key, convertJsonToMap((JSONObject) value));
203
+            } else if (value instanceof JSONArray) {
204
+                map.putArray(key, convertJsonToArray((JSONArray) value));
205
+            } else if (value instanceof Boolean) {
206
+                map.putBoolean(key, (Boolean) value);
207
+            } else if (value instanceof Integer) {
208
+                map.putInt(key, (Integer) value);
209
+            } else if (value instanceof Double) {
210
+                map.putDouble(key, (Double) value);
211
+            } else if (value instanceof String) {
212
+                map.putString(key, (String) value);
213
+            } else {
214
+                map.putString(key, value.toString());
215
+            }
216
+        }
217
+        return map;
218
+    }
219
+
220
+    public static WritableArray convertJsonToArray(JSONArray jsonArray) throws JSONException {
221
+        WritableArray array = new WritableNativeArray();
222
+
223
+        for (int i = 0; i < jsonArray.length(); i++) {
224
+            Object value = jsonArray.get(i);
225
+            if (value instanceof JSONObject) {
226
+                array.pushMap(convertJsonToMap((JSONObject) value));
227
+            } else if (value instanceof JSONArray) {
228
+                array.pushArray(convertJsonToArray((JSONArray) value));
229
+            } else if (value instanceof Boolean) {
230
+                array.pushBoolean((Boolean) value);
231
+            } else if (value instanceof Integer) {
232
+                array.pushInt((Integer) value);
233
+            } else if (value instanceof Double) {
234
+                array.pushDouble((Double) value);
235
+            } else if (value instanceof String) {
236
+                array.pushString((String) value);
237
+            } else {
238
+                array.pushString(value.toString());
239
+            }
240
+        }
241
+        return array;
242
+    }
243
+
244
+    public static JSONObject convertMapToJson(ReadableMap readableMap) throws JSONException {
245
+        JSONObject object = new JSONObject();
246
+        ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
247
+        while (iterator.hasNextKey()) {
248
+            String key = iterator.nextKey();
249
+            switch (readableMap.getType(key)) {
250
+                case Null:
251
+                    object.put(key, JSONObject.NULL);
252
+                    break;
253
+                case Boolean:
254
+                    object.put(key, readableMap.getBoolean(key));
255
+                    break;
256
+                case Number:
257
+                    object.put(key, readableMap.getDouble(key));
258
+                    break;
259
+                case String:
260
+                    object.put(key, readableMap.getString(key));
261
+                    break;
262
+                case Map:
263
+                    object.put(key, convertMapToJson(readableMap.getMap(key)));
264
+                    break;
265
+                case Array:
266
+                    object.put(key, convertArrayToJson(readableMap.getArray(key)));
267
+                    break;
268
+            }
269
+        }
270
+        return object;
271
+    }
272
+
273
+    public static JSONArray convertArrayToJson(ReadableArray readableArray) throws JSONException {
274
+        JSONArray array = new JSONArray();
275
+        for (int i = 0; i < readableArray.size(); i++) {
276
+            switch (readableArray.getType(i)) {
277
+                case Null:
278
+                    break;
279
+                case Boolean:
280
+                    array.put(readableArray.getBoolean(i));
281
+                    break;
282
+                case Number:
283
+                    array.put(readableArray.getDouble(i));
284
+                    break;
285
+                case String:
286
+                    array.put(readableArray.getString(i));
287
+                    break;
288
+                case Map:
289
+                    array.put(convertMapToJson(readableArray.getMap(i)));
290
+                    break;
291
+                case Array:
292
+                    array.put(convertArrayToJson(readableArray.getArray(i)));
293
+                    break;
294
+            }
295
+        }
296
+        return array;
297
+    }
298
+}

+ 19
- 0
android/src/main/java/com/syan/agora/ReactNativeAgoraException.java View File

@@ -0,0 +1,19 @@
1
+package com.syan.agora;
2
+
3
+
4
+import com.facebook.react.bridge.WritableMap;
5
+
6
+public class ReactNativeAgoraException extends Exception {
7
+
8
+    private int code;
9
+
10
+    public ReactNativeAgoraException(String message, final int code) {
11
+        super(message);
12
+        this.code = code;
13
+    }
14
+
15
+    public int getCode() {
16
+        return this.code;
17
+    }
18
+
19
+}

BIN
android/src/main/jniLibs/arm64-v8a/libagora-crypto.so View File


BIN
android/src/main/jniLibs/arm64-v8a/libagora-rtc-sdk-jni.so View File


BIN
android/src/main/jniLibs/armeabi-v7a/libagora-crypto.so View File


BIN
android/src/main/jniLibs/armeabi-v7a/libagora-rtc-sdk-jni.so View File


+ 0
- 181
android/src/main/jniLibs/include/IAgoraMediaEngine.h View File

@@ -1,181 +0,0 @@
1
-#ifndef AGORA_MEDIA_ENGINE_H
2
-#define AGORA_MEDIA_ENGINE_H
3
-#if defined _WIN32 || defined __CYGWIN__
4
-typedef __int64 int64_t;
5
-typedef unsigned __int64 uint64_t;
6
-#else
7
-#include <stdint.h>
8
-#endif
9
-
10
-namespace agora
11
-{
12
-namespace media
13
-{
14
-
15
-enum MEDIA_SOURCE_TYPE {
16
-    AUDIO_PLAYOUT_SOURCE = 0,
17
-    AUDIO_RECORDING_SOURCE = 1,
18
-};
19
-
20
-class IAudioFrameObserver
21
-{
22
-public:
23
-  enum AUDIO_FRAME_TYPE {
24
-    FRAME_TYPE_PCM16 = 0,  //PCM 16bit little endian
25
-  };
26
-  struct AudioFrame {
27
-    AUDIO_FRAME_TYPE type;
28
-    int samples;  //number of samples in this frame
29
-    int bytesPerSample;  //number of bytes per sample: 2 for PCM16
30
-    int channels;  //number of channels (data are interleaved if stereo)
31
-    int samplesPerSec;  //sampling rate
32
-    void* buffer;  //data buffer
33
-    int64_t renderTimeMs;
34
-  };
35
-public:
36
-  virtual bool onRecordAudioFrame(AudioFrame& audioFrame) = 0;
37
-  virtual bool onPlaybackAudioFrame(AudioFrame& audioFrame) = 0;
38
-  virtual bool onMixedAudioFrame(AudioFrame& audioFrame) = 0;
39
-  virtual bool onPlaybackAudioFrameBeforeMixing(unsigned int uid, AudioFrame& audioFrame) = 0;
40
-};
41
-
42
-class IVideoFrameObserver
43
-{
44
-public:
45
-  enum VIDEO_FRAME_TYPE {
46
-    FRAME_TYPE_YUV420 = 0,  //YUV 420 format
47
-  };
48
-  struct VideoFrame {
49
-    VIDEO_FRAME_TYPE type;
50
-    int width;  //width of video frame
51
-    int height;  //height of video frame
52
-    int yStride;  //stride of Y data buffer
53
-    int uStride;  //stride of U data buffer
54
-    int vStride;  //stride of V data buffer
55
-    void* yBuffer;  //Y data buffer
56
-    void* uBuffer;  //U data buffer
57
-    void* vBuffer;  //V data buffer
58
-    int rotation; // rotation of this frame (0, 90, 180, 270)
59
-    int64_t renderTimeMs;
60
-  };
61
-public:
62
-  virtual bool onCaptureVideoFrame(VideoFrame& videoFrame) = 0;
63
-  virtual bool onRenderVideoFrame(unsigned int uid, VideoFrame& videoFrame) = 0;
64
-};
65
-
66
-class IVideoFrame
67
-{
68
-public:
69
-  enum PLANE_TYPE {
70
-    Y_PLANE = 0,
71
-    U_PLANE = 1,
72
-    V_PLANE = 2,
73
-    NUM_OF_PLANES = 3
74
-  };
75
-  enum VIDEO_TYPE {
76
-    VIDEO_TYPE_UNKNOWN = 0,
77
-    VIDEO_TYPE_I420 = 1,
78
-    VIDEO_TYPE_IYUV = 2,
79
-    VIDEO_TYPE_RGB24 = 3,
80
-    VIDEO_TYPE_ABGR = 4,
81
-    VIDEO_TYPE_ARGB = 5,
82
-    VIDEO_TYPE_ARGB4444 = 6,
83
-    VIDEO_TYPE_RGB565 = 7,
84
-    VIDEO_TYPE_ARGB1555 = 8,
85
-    VIDEO_TYPE_YUY2 = 9,
86
-    VIDEO_TYPE_YV12 = 10,
87
-    VIDEO_TYPE_UYVY = 11,
88
-    VIDEO_TYPE_MJPG = 12,
89
-    VIDEO_TYPE_NV21 = 13,
90
-    VIDEO_TYPE_NV12 = 14,
91
-    VIDEO_TYPE_BGRA = 15,
92
-    VIDEO_TYPE_RGBA = 16,
93
-  };
94
-  virtual void release() = 0;
95
-  virtual const unsigned char* buffer(PLANE_TYPE type) const = 0;
96
-
97
-  // Copy frame: If required size is bigger than allocated one, new buffers of
98
-  // adequate size will be allocated.
99
-  // Return value: 0 on success ,-1 on error.
100
-  virtual int copyFrame(IVideoFrame** dest_frame) const = 0;
101
-
102
-  // Convert frame
103
-  // Input:
104
-  //   - src_frame        : Reference to a source frame.
105
-  //   - dst_video_type   : Type of output video.
106
-  //   - dst_sample_size  : Required only for the parsing of MJPG.
107
-  //   - dst_frame        : Pointer to a destination frame.
108
-  // Return value: 0 if OK, < 0 otherwise.
109
-  // It is assumed that source and destination have equal height.
110
-  virtual int convertFrame(VIDEO_TYPE dst_video_type, int dst_sample_size, unsigned char* dst_frame) const = 0;
111
-
112
-  // Get allocated size per plane.
113
-  virtual int allocated_size(PLANE_TYPE type) const = 0;
114
-
115
-  // Get allocated stride per plane.
116
-  virtual int stride(PLANE_TYPE type) const = 0;
117
-
118
-  // Get frame width.
119
-  virtual int width() const = 0;
120
-
121
-  // Get frame height.
122
-  virtual int height() const = 0;
123
-
124
-  // Get frame timestamp (90kHz).
125
-  virtual unsigned int timestamp() const = 0;
126
-
127
-  // Get render time in milliseconds.
128
-  virtual int64_t render_time_ms() const = 0;
129
-
130
-  // Return true if underlying plane buffers are of zero size, false if not.
131
-  virtual bool IsZeroSize() const = 0;
132
-};
133
-
134
-class IExternalVideoRenderCallback
135
-{
136
-public:
137
-  virtual void onViewSizeChanged(int width, int height) = 0;
138
-  virtual void onViewDestroyed() = 0;
139
-};
140
-
141
-struct ExternalVideoRenerContext
142
-{
143
-  IExternalVideoRenderCallback* renderCallback;
144
-  void* view;
145
-  int renderMode;
146
-  int zOrder;
147
-  float left;
148
-  float top;
149
-  float right;
150
-  float bottom;
151
-};
152
-
153
-class IExternalVideoRender
154
-{
155
-public:
156
-  virtual void release() = 0;
157
-  virtual int initialize() = 0;
158
-  virtual int deliverFrame(const IVideoFrame& videoFrame, int rotation, bool mirrored) = 0;
159
-};
160
-
161
-class IExternalVideoRenderFactory
162
-{
163
-public:
164
-  virtual IExternalVideoRender* createRenderInstance(const ExternalVideoRenerContext& context) = 0;
165
-};
166
-
167
-class IMediaEngine
168
-{
169
-public:
170
-  virtual void release() = 0;
171
-  virtual int registerAudioFrameObserver(IAudioFrameObserver* observer) = 0;
172
-  virtual int registerVideoFrameObserver(IVideoFrameObserver* observer) = 0;
173
-  virtual int registerVideoRenderFactory(IExternalVideoRenderFactory* factory) = 0;
174
-  virtual int pushAudioFrame(MEDIA_SOURCE_TYPE type, IAudioFrameObserver::AudioFrame *frame, bool wrap = false){ return -1; }
175
-};
176
-
177
-} //media
178
-
179
-} //agora
180
-
181
-#endif //AGORA_MEDIA_ENGINE_H

+ 0
- 2255
android/src/main/jniLibs/include/IAgoraRtcEngine.h
File diff suppressed because it is too large
View File


BIN
android/src/main/jniLibs/x86/libagora-crypto.so View File


BIN
android/src/main/jniLibs/x86/libagora-rtc-sdk-jni.so View File


+ 71
- 7
ios/RCTAgora.xcodeproj/project.pbxproj View File

@@ -7,6 +7,9 @@
7 7
 	objects = {
8 8
 
9 9
 /* Begin PBXBuildFile section */
10
+		085CF7D72204A7B7002075D5 /* AgoraRtcCryptoLoader.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 085CF7D52204A7B7002075D5 /* AgoraRtcCryptoLoader.framework */; };
11
+		085CF7D82204A7B7002075D5 /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 085CF7D62204A7B7002075D5 /* libcrypto.a */; };
12
+		08B28CF72211239F00E57CEB /* AgoraRtcEngineKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08B28CF62211239F00E57CEB /* AgoraRtcEngineKit.framework */; };
10 13
 		23AF28211EEFECD800D771AB /* RCTAgora.m in Sources */ = {isa = PBXBuildFile; fileRef = 23AF28201EEFECD800D771AB /* RCTAgora.m */; };
11 14
 		23AF28221EEFECD800D771AB /* RCTAgora.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 23AF281F1EEFECD800D771AB /* RCTAgora.h */; };
12 15
 		23C20DD11F0A6ED80095F60C /* AgoraConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 23C20DCC1F0A6ED80095F60C /* AgoraConst.m */; };
@@ -28,7 +31,9 @@
28 31
 /* End PBXCopyFilesBuildPhase section */
29 32
 
30 33
 /* Begin PBXFileReference section */
31
-		23ACF47C1EF0CF9500801BC7 /* libs */ = {isa = PBXFileReference; lastKnownFileType = folder; path = libs; sourceTree = "<group>"; };
34
+		085CF7D52204A7B7002075D5 /* AgoraRtcCryptoLoader.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AgoraRtcCryptoLoader.framework; sourceTree = "<group>"; };
35
+		085CF7D62204A7B7002075D5 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libcrypto.a; sourceTree = "<group>"; };
36
+		08B28CF62211239F00E57CEB /* AgoraRtcEngineKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcEngineKit.framework; path = ../samples/simpleDemo/ios/Pods/AgoraRtcEngine_iOS/AgoraRtcEngineKit.framework; sourceTree = "<group>"; };
32 37
 		23AF281C1EEFECD800D771AB /* libRCTAgora.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTAgora.a; sourceTree = BUILT_PRODUCTS_DIR; };
33 38
 		23AF281F1EEFECD800D771AB /* RCTAgora.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAgora.h; sourceTree = "<group>"; };
34 39
 		23AF28201EEFECD800D771AB /* RCTAgora.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAgora.m; sourceTree = "<group>"; };
@@ -45,17 +50,38 @@
45 50
 			isa = PBXFrameworksBuildPhase;
46 51
 			buildActionMask = 2147483647;
47 52
 			files = (
53
+				08B28CF72211239F00E57CEB /* AgoraRtcEngineKit.framework in Frameworks */,
54
+				085CF7D82204A7B7002075D5 /* libcrypto.a in Frameworks */,
55
+				085CF7D72204A7B7002075D5 /* AgoraRtcCryptoLoader.framework in Frameworks */,
48 56
 			);
49 57
 			runOnlyForDeploymentPostprocessing = 0;
50 58
 		};
51 59
 /* End PBXFrameworksBuildPhase section */
52 60
 
53 61
 /* Begin PBXGroup section */
62
+		085CF7D42204A787002075D5 /* libs */ = {
63
+			isa = PBXGroup;
64
+			children = (
65
+				085CF7D52204A7B7002075D5 /* AgoraRtcCryptoLoader.framework */,
66
+				085CF7D62204A7B7002075D5 /* libcrypto.a */,
67
+			);
68
+			path = libs;
69
+			sourceTree = "<group>";
70
+		};
71
+		08B28CF52211239F00E57CEB /* Frameworks */ = {
72
+			isa = PBXGroup;
73
+			children = (
74
+				08B28CF62211239F00E57CEB /* AgoraRtcEngineKit.framework */,
75
+			);
76
+			name = Frameworks;
77
+			sourceTree = "<group>";
78
+		};
54 79
 		23AF28131EEFECD800D771AB = {
55 80
 			isa = PBXGroup;
56 81
 			children = (
57 82
 				23AF281E1EEFECD800D771AB /* RCTAgora */,
58 83
 				23AF281D1EEFECD800D771AB /* Products */,
84
+				08B28CF52211239F00E57CEB /* Frameworks */,
59 85
 			);
60 86
 			sourceTree = "<group>";
61 87
 		};
@@ -70,7 +96,7 @@
70 96
 		23AF281E1EEFECD800D771AB /* RCTAgora */ = {
71 97
 			isa = PBXGroup;
72 98
 			children = (
73
-				23ACF47C1EF0CF9500801BC7 /* libs */,
99
+				085CF7D42204A787002075D5 /* libs */,
74 100
 				23C20DCB1F0A6ED80095F60C /* AgoraConst.h */,
75 101
 				23C20DCC1F0A6ED80095F60C /* AgoraConst.m */,
76 102
 				23C20DCD1F0A6ED80095F60C /* RCTAgoraVideoView.h */,
@@ -109,7 +135,7 @@
109 135
 		23AF28141EEFECD800D771AB /* Project object */ = {
110 136
 			isa = PBXProject;
111 137
 			attributes = {
112
-				LastUpgradeCheck = 0830;
138
+				LastUpgradeCheck = 1010;
113 139
 				ORGANIZATIONNAME = Syan;
114 140
 				TargetAttributes = {
115 141
 					23AF281B1EEFECD800D771AB = {
@@ -161,15 +187,23 @@
161 187
 				CLANG_CXX_LIBRARY = "libc++";
162 188
 				CLANG_ENABLE_MODULES = YES;
163 189
 				CLANG_ENABLE_OBJC_ARC = YES;
190
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
164 191
 				CLANG_WARN_BOOL_CONVERSION = YES;
192
+				CLANG_WARN_COMMA = YES;
165 193
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
194
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
166 195
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
167 196
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
168 197
 				CLANG_WARN_EMPTY_BODY = YES;
169 198
 				CLANG_WARN_ENUM_CONVERSION = YES;
170 199
 				CLANG_WARN_INFINITE_RECURSION = YES;
171 200
 				CLANG_WARN_INT_CONVERSION = YES;
201
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
202
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
203
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
172 204
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
205
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
206
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
173 207
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
174 208
 				CLANG_WARN_UNREACHABLE_CODE = YES;
175 209
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -210,15 +244,23 @@
210 244
 				CLANG_CXX_LIBRARY = "libc++";
211 245
 				CLANG_ENABLE_MODULES = YES;
212 246
 				CLANG_ENABLE_OBJC_ARC = YES;
247
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
213 248
 				CLANG_WARN_BOOL_CONVERSION = YES;
249
+				CLANG_WARN_COMMA = YES;
214 250
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
251
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
215 252
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
216 253
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
217 254
 				CLANG_WARN_EMPTY_BODY = YES;
218 255
 				CLANG_WARN_ENUM_CONVERSION = YES;
219 256
 				CLANG_WARN_INFINITE_RECURSION = YES;
220 257
 				CLANG_WARN_INT_CONVERSION = YES;
258
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
259
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
260
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
221 261
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
262
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
263
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
222 264
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
223 265
 				CLANG_WARN_UNREACHABLE_CODE = YES;
224 266
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -248,12 +290,23 @@
248 290
 			buildSettings = {
249 291
 				DEVELOPMENT_TEAM = 342K4Q49RK;
250 292
 				ENABLE_BITCODE = YES;
251
-				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/RCTAgora/libs\"";
293
+				FRAMEWORK_SEARCH_PATHS = (
294
+					"$(inherited)",
295
+					"$(SRCROOT)/../../../ios/Pods/**",
296
+					"$(PROJECT_DIR)/RCTAgora/libs/**",
297
+				);
252 298
 				HEADER_SEARCH_PATHS = (
299
+					"$(inherited)",
253 300
 					"\"$(SRCROOT)/../../react-native/React\"/**",
254 301
 					"\"$(SRCROOT)/../../react-native/Libraries\"/**",
302
+					"$(SRCROOT)/../../../ios/Pods/**",
303
+				);
304
+				LIBRARY_SEARCH_PATHS = (
305
+					"$(inherited)",
306
+					"$(PROJECT_DIR)",
307
+					"$(SRCROOT)/../../../ios/Pods/**",
308
+					"$(PROJECT_DIR)/RCTAgora/libs/**",
255 309
 				);
256
-				LIBRARY_SEARCH_PATHS = "$(inherited)";
257 310
 				OTHER_LDFLAGS = "-ObjC";
258 311
 				PRODUCT_NAME = "$(TARGET_NAME)";
259 312
 				SKIP_INSTALL = YES;
@@ -265,12 +318,23 @@
265 318
 			buildSettings = {
266 319
 				DEVELOPMENT_TEAM = 342K4Q49RK;
267 320
 				ENABLE_BITCODE = YES;
268
-				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/RCTAgora/libs\"";
321
+				FRAMEWORK_SEARCH_PATHS = (
322
+					"$(inherited)",
323
+					"$(SRCROOT)/../../../ios/Pods/**",
324
+					"$(PROJECT_DIR)/RCTAgora/libs/**",
325
+				);
269 326
 				HEADER_SEARCH_PATHS = (
327
+					"$(inherited)",
270 328
 					"\"$(SRCROOT)/../../react-native/React\"/**",
271 329
 					"\"$(SRCROOT)/../../react-native/Libraries\"/**",
330
+					"$(SRCROOT)/../../../ios/Pods/**",
331
+				);
332
+				LIBRARY_SEARCH_PATHS = (
333
+					"$(inherited)",
334
+					"$(PROJECT_DIR)",
335
+					"$(SRCROOT)/../../../ios/Pods/**",
336
+					"$(PROJECT_DIR)/RCTAgora/libs/**",
272 337
 				);
273
-				LIBRARY_SEARCH_PATHS = "$(inherited)";
274 338
 				OTHER_LDFLAGS = "-ObjC";
275 339
 				PRODUCT_NAME = "$(TARGET_NAME)";
276 340
 				SKIP_INSTALL = YES;

+ 8
- 0
ios/RCTAgora.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist View File

@@ -0,0 +1,8 @@
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>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 70
- 0
ios/RCTAgora/AgoraConst.h View File

@@ -8,6 +8,76 @@
8 8
 
9 9
 #import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
10 10
 
11
+static NSString *RCTAgoraErrorDomain = @"RCTAgoraErrorDomain";
12
+
13
+static NSString *DidOccurWarning = @"onWarning";
14
+static NSString *DidOccurError = @"onError";
15
+static NSString *DidApiCallExecute = @"onApiCallExecute";
16
+static NSString *DidJoinChannel = @"onJoinChannelSuccess";
17
+static NSString *DidRejoinChannel = @"onRejoinChannelSuccess";
18
+static NSString *DidLeaveChannel = @"onLeaveChannel";
19
+static NSString *DidClientRoleChanged = @"onClientRoleChanged";
20
+static NSString *DidJoinedOfUid = @"onUserJoined";
21
+static NSString *DidOfflineOfUid = @"onUserOffline";
22
+static NSString *ConnectionChangedToState = @"onConnectionStateChanged";
23
+static NSString *ConnectionDidLost = @"onConnectionLost";
24
+static NSString *TokenPrivilegeWillExpire = @"onTokenPrivilegeWillExpire";
25
+static NSString *RequestToken = @"onRequestToken";
26
+
27
+static NSString *DidMicrophoneEnabled = @"onMicrophoneEnabled";
28
+static NSString *ReportAudioVolumeIndicationOfSpeakers = @"onAudioVolumeIndication";
29
+static NSString *ActiveSpeaker = @"onActiveSpeaker";
30
+static NSString *FirstLocalAudioFrame = @"onFirstLocalAudioFrame";
31
+static NSString *FirstRemoteAudioFrameOfUid = @"onFirstRemoteAudioFrame";
32
+static NSString *VideoDidStop = @"onVideoStopped";
33
+static NSString *FirstLocalVideoFrameWithSize = @"onFirstLocalVideoFrame";
34
+static NSString *FirstRemoteVideoDecodedOfUid = @"onFirstRemoteVideoDecoded";
35
+static NSString *FirstRemoteVideoFrameOfUid = @"onFirstRemoteVideoFrame";
36
+static NSString *DidAudioMuted = @"onUserMuteAudio";
37
+static NSString *DidVideoMuted = @"onUserMuteVideo";
38
+static NSString *DidVideoEnabled = @"onUserEnableVideo";
39
+static NSString *DidLocalVideoEnabled = @"onUserEnableLocalVideo";
40
+static NSString *VideoSizeChangedOfUid = @"onVideoSizeChanged";
41
+static NSString *RemoteVideoStateChangedOfUid = @"onRemoteVideoStateChanged";
42
+static NSString *DidLocalPublishFallbackToAudioOnly = @"onLocalPublishFallbackToAudioOnly";
43
+static NSString *DidRemoteSubscribeFallbackToAudioOnly = @"onRemoteSubscribeFallbackToAudioOnly";
44
+
45
+static NSString *DeviceTypeStateChanged = @"onDeviceTypeStateChanged";
46
+static NSString *DidAudioRouteChanged = @"onAudioRouteChanged";
47
+static NSString *CameraDidReady = @"onCameraReady";
48
+static NSString *CameraFocusDidChangedToRect = @"onCameraFocusAreaChanged";
49
+static NSString *CameraExposureDidChangedToRect = @"onCameraExposureAreaChanged";
50
+
51
+static NSString *ReportRtcStats = @"onRtcStats";
52
+static NSString *LastmileQuality = @"onLastmileQuality";
53
+static NSString *NetworkQuality = @"onNetworkQuality";
54
+static NSString *LocalVideoStats = @"onLocalVideoStats";
55
+static NSString *RemoteVideoStats = @"onRemoteVideoStats";
56
+static NSString *RemoteAudioStats = @"onRemoteAudioStats";
57
+static NSString *AudioTransportStatsOfUid = @"AudioTransportStatsOfUid";
58
+static NSString *VideoTransportStatsOfUid = @"VideoTransportStatsOfUid";
59
+
60
+static NSString *LocalAudioMixingDidFinish = @"onLocalAudioMixingFinish";
61
+static NSString *RemoteAudioMixingDidStart = @"onRemoteAudioMixingStart";
62
+static NSString *RemoteAudioMixingDidFinish = @"onRemoteAudioMixingFinish";
63
+static NSString *DidAudioEffectFinish = @"onAudioEffectFinish";
64
+
65
+static NSString *StreamPublished = @"onStreamPublished";
66
+static NSString *StreamUnpublish = @"onStreamUnpublish";
67
+static NSString *TranscodingUpdated = @"onTranscodingUpdate";
68
+
69
+static NSString *StreamInjectedStatus = @"onStreamInjectedStatus";
70
+
71
+static NSString *ReceiveStreamMessage = @"onReceiveStreamMessage";
72
+static NSString *DidOccurStreamMessageError = @"onOccurStreamMessageError";
73
+
74
+static NSString *MediaEngineDidLoaded = @"onMediaEngineLoaded";
75
+static NSString *MediaEngineDidStartCall = @"onMediaEngineStartCall";
76
+
77
+static NSString *ConnectionDidInterrupted = @"onConnectionInterrupted";
78
+static NSString *ConnectionDidBanned = @"onConnectionBanned";
79
+static NSString *AudioQualityOfUid = @"onAudioQuality";
80
+
11 81
 @interface AgoraConst : NSObject
12 82
 
13 83
 @property (nonatomic, copy) NSString *appid;

+ 11
- 13
ios/RCTAgora/AgoraConst.m View File

@@ -12,25 +12,23 @@
12 12
 
13 13
 static AgoraConst *_person;
14 14
 + (instancetype)allocWithZone:(struct _NSZone *)zone{
15
-    static dispatch_once_t predicate;
16
-    dispatch_once(&predicate, ^{
17
-        _person = [super allocWithZone:zone];
18
-    });
19
-    return _person;
15
+  static dispatch_once_t predicate;
16
+  dispatch_once(&predicate, ^{
17
+    _person = [super allocWithZone:zone];
18
+  });
19
+  return _person;
20 20
 }
21 21
 
22 22
 + (instancetype)share {
23
-    static dispatch_once_t onceToken;
24
-    dispatch_once(&onceToken, ^{
25
-        _person = [[self alloc]init];
26
-    });
27
-    return _person;
23
+  static dispatch_once_t onceToken;
24
+  dispatch_once(&onceToken, ^{
25
+    _person = [[self alloc]init];
26
+  });
27
+  return _person;
28 28
 }
29 29
 
30 30
 - (id)copyWithZone:(NSZone *)zone {
31
-    return _person;
31
+  return _person;
32 32
 }
33 33
 
34
-
35
-
36 34
 @end

+ 2
- 2
ios/RCTAgora/RCTAgora.h View File

@@ -9,8 +9,8 @@
9 9
 #import <Foundation/Foundation.h>
10 10
 #import <UIKit/UIKit.h>
11 11
 #import <React/RCTBridgeModule.h>
12
-#import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
12
+#import <React/RCTEventEmitter.h>
13 13
 
14
-@interface RCTAgora : NSObject<RCTBridgeModule, AgoraRtcEngineDelegate>
14
+@interface RCTAgora : RCTEventEmitter<RCTBridgeModule>
15 15
 
16 16
 @end

+ 2005
- 307
ios/RCTAgora/RCTAgora.m
File diff suppressed because it is too large
View File


+ 20
- 20
ios/RCTAgora/RCTAgoraVideoView.m View File

@@ -11,32 +11,32 @@
11 11
 @implementation RCTAgoraVideoView
12 12
 
13 13
 - (instancetype)init{
14
-    
15
-    if (self == [super init]) {
16
-        _rtcEngine = [AgoraConst share].rtcEngine;
17
-    }
18
-    
19
-    return self;
14
+  
15
+  if (self == [super init]) {
16
+    _rtcEngine = [AgoraConst share].rtcEngine;
17
+  }
18
+  
19
+  return self;
20 20
 }
21 21
 
22 22
 - (void)setShowLocalVideo:(BOOL)showLocalVideo {
23
-    if (showLocalVideo) {
24
-        AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
25
-        canvas.uid = [AgoraConst share].localUid;
26
-        canvas.view = self;
27
-        canvas.renderMode = AgoraRtc_Render_Hidden;
28
-        [_rtcEngine setupLocalVideo:canvas];
29
-    }
23
+  if (showLocalVideo) {
24
+    AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
25
+    canvas.uid = [AgoraConst share].localUid;
26
+    canvas.view = self;
27
+    canvas.renderMode = AgoraVideoRenderModeHidden;
28
+    [_rtcEngine setupLocalVideo:canvas];
29
+  }
30 30
 }
31 31
 
32 32
 -(void)setRemoteUid:(NSInteger)remoteUid {
33
-    if (remoteUid > 0) {
34
-        AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
35
-        canvas.uid = remoteUid;
36
-        canvas.view = self;
37
-        canvas.renderMode = AgoraRtc_Render_Hidden;
38
-        [_rtcEngine setupRemoteVideo:canvas];
39
-    }
33
+  if (remoteUid > 0) {
34
+    AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
35
+    canvas.uid = remoteUid;
36
+    canvas.view = self;
37
+    canvas.renderMode = AgoraVideoRenderModeHidden;
38
+    [_rtcEngine setupRemoteVideo:canvas];
39
+  }
40 40
 }
41 41
 
42 42
 @end

+ 1
- 2
ios/RCTAgora/RCTAgoraViewManager.h View File

@@ -6,8 +6,7 @@
6 6
 //  Copyright © 2017年 Syan. All rights reserved.
7 7
 //
8 8
 
9
-#import "RCTViewManager.h"
10
-
9
+#import <React/RCTViewManager.h>
11 10
 
12 11
 @interface RCTAgoraViewManager : RCTViewManager
13 12
 

+ 1
- 1
ios/RCTAgora/RCTAgoraViewManager.m View File

@@ -17,7 +17,7 @@ RCT_EXPORT_VIEW_PROPERTY(showLocalVideo, BOOL)
17 17
 RCT_EXPORT_VIEW_PROPERTY(remoteUid, NSInteger)
18 18
 
19 19
 - (UIView *)view {
20
-    return [RCTAgoraVideoView new];
20
+  return [RCTAgoraVideoView new];
21 21
 }
22 22
 
23 23
 

+ 1
- 2
ios/RCTAgora/libs/AgoraRtcCryptoLoader.framework/Headers/AgoraRtcCryptoLoader.h View File

@@ -2,8 +2,7 @@
2 2
 //  AgoraRtcCryptoLoader.h
3 3
 //  AgoraRtcCryptoLoader
4 4
 //
5
-//  Created by junhao wang on 1/5/17.
6
-//  Copyright © 2017 Agora. All rights reserved.
5
+//  Copyright © 2018 Agora. All rights reserved.
7 6
 //
8 7
 
9 8
 #import <Foundation/Foundation.h>

+ 53
- 7
package.json View File

@@ -1,15 +1,18 @@
1 1
 {
2 2
   "name": "react-native-agora",
3
-  "version": "1.2.5",
3
+  "version": "2.3.3",
4 4
   "description": "声网Agora",
5
-  "main": "index.js",
5
+  "summary": "agora native sdk for react-native",
6
+  "main": "lib/index.js",
6 7
   "scripts": {
7 8
     "pu": "npm publish",
8
-    "test": "echo \"Error: no test specified\" && exit 1"
9
+    "test": "echo \"Error: no test specified\" && exit 1",
10
+    "lint": "tslint",
11
+    "build": "tsc"
9 12
   },
10 13
   "repository": {
11 14
     "type": "git",
12
-    "url": "git+https://github.com/DBshaoYan/react-native-agora.git"
15
+    "url": "https://github.com/syanbo/react-native-agora.git"
13 16
   },
14 17
   "keywords": [
15 18
     "agora",
@@ -21,10 +24,53 @@
21 24
     "video",
22 25
     "react-native-video"
23 26
   ],
24
-  "author": "",
27
+  "author": "syanbo",
28
+  "authors": [
29
+    "https://github.com/syanbo/react-native-agora/graphs/contributors"
30
+  ],
25 31
   "license": "MIT",
26 32
   "bugs": {
27
-    "url": "https://github.com/DBshaoYan/react-native-agora/issues"
33
+    "url": "https://github.com/syanbo/react-native-agora/issues"
34
+  },
35
+  "homepage": "https://github.com/syanbo/react-native-agora#readme",
36
+  "peerDependencies": {
37
+    "react": ">=16.7.0",
38
+    "react-native": ">=0.58.3"
39
+  },
40
+  "devDependencies": {
41
+    "@types/jest": "^23.3.13",
42
+    "@types/react": "^16.7.20",
43
+    "@types/react-native": "^0.57.31",
44
+    "@types/react-test-renderer": "^16.0.3",
45
+    "react": "16.7.0",
46
+    "react-native": "0.58.3",
47
+    "react-native-typescript-transformer": "^1.2.11",
48
+    "ts-jest": "^23.10.5",
49
+    "tslint": "^5.12.1",
50
+    "typescript": "^3.2.4"
51
+  },
52
+  "types": [
53
+    "./types.d.ts"
54
+  ],
55
+  "jest": {
56
+    "preset": "react-native",
57
+    "moduleFileExtensions": [
58
+      "ts",
59
+      "tsx",
60
+      "js"
61
+    ],
62
+    "transform": {
63
+      "^.+\\.(js)$": "<rootDir>/node_modules/babel-jest",
64
+      "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
65
+    },
66
+    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
67
+    "testPathIgnorePatterns": [
68
+      "\\.snap$",
69
+      "<rootDir>/node_modules/"
70
+    ],
71
+    "cacheDirectory": ".jest/cache"
28 72
   },
29
-  "homepage": "https://github.com/DBshaoYan/react-native-agora#readme"
73
+  "dependencies": {
74
+    "tslib": "^1.9.3"
75
+  }
30 76
 }

+ 99
- 0
react-native-agora.podspec View File

@@ -0,0 +1,99 @@
1
+#
2
+#  Be sure to run `pod spec lint react-native-agora.podspec' to ensure this is a
3
+#  valid spec and to remove all comments including this before submitting the spec.
4
+#
5
+#  To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
6
+#  To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
7
+#
8
+require 'json'
9
+
10
+package = JSON.parse File.read File.join __dir__, "package.json"
11
+Pod::Spec.new do |s|
12
+  s.name         = package["name"]
13
+  s.version      = package["version"]
14
+  s.summary      = package["summary"]
15
+  s.description  = package["description"]
16
+
17
+  s.homepage     = package["homepage"]
18
+  s.license      = package["license"]
19
+  s.authors      = package["authors"]
20
+
21
+  # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
22
+  #
23
+  #  If this Pod runs only on iOS or OS X, then specify the platform and
24
+  #  the deployment target. You can optionally include the target after the platform.
25
+  #
26
+
27
+  s.platform     = :ios
28
+  # s.platform     = :ios, "5.0"
29
+
30
+  #  When using multiple platforms
31
+  # s.ios.deployment_target = "5.0"
32
+  # s.osx.deployment_target = "10.7"
33
+  # s.watchos.deployment_target = "2.0"
34
+  # s.tvos.deployment_target = "9.0"
35
+
36
+
37
+  # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
38
+  #
39
+  #  Specify the location from where the source should be retrieved.
40
+  #  Supports git, hg, bzr, svn and HTTP.
41
+  #
42
+
43
+  #s.source       = { :http => "file:///./ios" }
44
+  s.source        = { :git => package["repository"]["url"] }
45
+  #s.source        = { :git => package["repository"]["url"] , :tag => "#{s.version}" }
46
+
47
+  s.source_files  = "RCTAgora", "RCTAgora/**/*.{h,m}"
48
+  # s.public_header_files = "Classes/**/*.h"
49
+
50
+
51
+  # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
52
+  #
53
+  #  A list of resources included with the Pod. These are copied into the
54
+  #  target bundle with a build phase script. Anything else will be cleaned.
55
+  #  You can preserve files from being cleaned, please don't preserve
56
+  #  non-essential files like tests, examples and documentation.
57
+  #
58
+
59
+  # s.resource  = "icon.png"
60
+  # s.resources = "Resources/*.png"
61
+
62
+  # s.preserve_paths = "FilesToSave", "MoreFilesToSave"
63
+
64
+
65
+  # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
66
+  #
67
+  #  Link your library with frameworks, or libraries. Libraries do not include
68
+  #  the lib prefix of their name.
69
+  #
70
+
71
+  # s.framework  = "SomeFramework"
72
+  # s.frameworks = "SomeFramework", "AnotherFramework"
73
+
74
+  # s.library   = "iconv"
75
+  # s.libraries = "iconv", "xml2"
76
+
77
+
78
+  # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
79
+  #
80
+  #  If your library depends on compiler flags you can set them in the xcconfig hash
81
+  #  where they will only apply to your library. If you depend on other Podspecs
82
+  #  you can include multiple dependencies to ensure it works.
83
+
84
+  # s.requires_arc = true
85
+  s.subspec 'AgoraRtcCryptoLoader' do |sp|
86
+    sp.source_files = './ios/RCTAgora/libs/AgoraRtcCryptoLoader.framework/**/*.{c,h,m,mm,S,cpp}'
87
+    sp.vendored_libraries = 'libcrypto.a'
88
+  end
89
+
90
+  s.xcconfig = {
91
+    "HEADER_SEARCH_PATHS" => [
92
+      "$(SDKROOT)../../node_modules/react-native/React",
93
+      "$(SDKROOT)../../ios/Pods"
94
+    ]
95
+  }
96
+  s.dependency "AgoraRtcEngine_iOS", "2.3.3"
97
+  s.dependency 'React'
98
+
99
+end

+ 1
- 1
samples/simpleDemo/.flowconfig View File

@@ -67,4 +67,4 @@ suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
67 67
 suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
68 68
 
69 69
 [version]
70
-^0.78.0
70
+^0.86.0

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

@@ -54,3 +54,63 @@ buck-out/
54 54
 
55 55
 # Bundle artifact
56 56
 *.jsbundle
57
+Pods
58
+**/*~
59
+# OSX
60
+#
61
+.DS_Store
62
+
63
+# Xcode
64
+#
65
+build/
66
+*.pbxuser
67
+!default.pbxuser
68
+*.mode1v3
69
+!default.mode1v3
70
+*.mode2v3
71
+!default.mode2v3
72
+*.perspectivev3
73
+!default.perspectivev3
74
+xcuserdata
75
+*.xccheckout
76
+*.moved-aside
77
+DerivedData
78
+*.hmap
79
+*.ipa
80
+*.xcuserstate
81
+project.xcworkspace
82
+
83
+# Android/IntelliJ
84
+#
85
+build/
86
+.idea
87
+.gradle
88
+local.properties
89
+*.iml
90
+
91
+# node.js
92
+#
93
+node_modules/
94
+npm-debug.log
95
+yarn-error.log
96
+
97
+# BUCK
98
+buck-out/
99
+\.buckd/
100
+*.keystore
101
+
102
+# fastlane
103
+#
104
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
105
+# screenshots whenever they are needed.
106
+# For more information about the recommended setup visit:
107
+# https://docs.fastlane.tools/best-practices/source-control/
108
+
109
+*/fastlane/report.xml
110
+*/fastlane/Preview.html
111
+*/fastlane/screenshots
112
+
113
+# Bundle artifact
114
+*.jsbundle
115
+Pods
116
+**/*~

+ 25
- 17
samples/simpleDemo/App.js View File

@@ -8,17 +8,10 @@
8 8
 
9 9
 import React, {Component} from 'react';
10 10
 import {
11
-  Platform, StyleSheet, Text, View, TouchableOpacity, TextInput
11
+  StyleSheet, Text, View, TouchableOpacity, TextInput
12 12
 } from 'react-native';
13 13
 import AgoraRTCView from './components/agora';
14 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 15
 const styles = StyleSheet.create({
23 16
   container: {
24 17
     flex: 1,
@@ -57,8 +50,9 @@ export default class App extends Component<Props> {
57 50
       channelProfile: 1,
58 51
       videoProfile: 40,
59 52
       clientRole: 1,
53
+      uid: 0,
60 54
       swapWidthAndHeight: true,
61
-      channelName: 'defaultChannel'
55
+      channelName: null
62 56
     };
63 57
   }
64 58
 
@@ -69,27 +63,27 @@ export default class App extends Component<Props> {
69 63
   }
70 64
 
71 65
   onCancel = (error) => {
72
-    console.log("[error]", error);
73 66
     this.setState({
74 67
       showLive: false,
75
-      error
68
+      error: JSON.stringify(error)
76 69
     })
77 70
   }
78 71
 
79 72
   render() {
80 73
     if (this.state.showLive) {
74
+      console.log('channelName', this.state.channelName);
81 75
       return (<AgoraRTCView
82
-        onCancel={this.onCancel}
83 76
         channelProfile={this.state.channelProfile}
77
+        channelName={this.state.channelName}
84 78
         videoProfile={this.state.videoProfile}
85 79
         clientRole={this.state.clientRole}
86
-        swapWidthAndHeight={this.state.swapWidthAndHeight}
87
-        channelName={this.state.channelName}
80
+        uid={this.state.uid}
81
+        onCancel={this.onCancel}
88 82
       ></AgoraRTCView>);
89 83
     }
90 84
     return (
91 85
       <View style={styles.container}>
92
-        {this.state.error && <Text>Error Message: {error}</Text>}
86
+        {this.state.error ? <Text>Error Message: {this.state.error}</Text> : null}
93 87
         <TextInput
94 88
           style={{height: 40}}
95 89
           keyboardType='numeric'
@@ -119,12 +113,26 @@ export default class App extends Component<Props> {
119 113
             let matched = text.match(/\d+/g) && text.match(/\d+/g)[0]
120 114
             if (matched) {
121 115
               this.setState({clientRole: +matched})
122
-            }          }
116
+            }
117
+          }
123 118
         } />
124 119
         <TextInput
125 120
           style={{height: 40}}
126 121
           placeholder="Enter channelName"
127
-          onChnageText={(text) => this.setState({channelName: text})}
122
+          onChangeText={
123
+            (text) => {
124
+              this.setState({channelName: text}) 
125
+            }
126
+          }
127
+        />
128
+        <TextInput
129
+          style={{height: 40}}
130
+          placeholder="Enter uid"
131
+          onChangeText={
132
+            (uid) => {
133
+              this.setState({uid: +uid}) 
134
+            }
135
+          }
128 136
         />
129 137
         <TouchableOpacity
130 138
           style={styles.button}

+ 4
- 14
samples/simpleDemo/android/app/BUCK View File

@@ -8,23 +8,13 @@
8 8
 # - `buck install -r android/app` - compile, install and run application
9 9
 #
10 10
 
11
+load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
12
+
11 13
 lib_deps = []
12 14
 
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
-  )
15
+create_aar_targets(glob(["libs/*.aar"]))
20 16
 
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
-  )
17
+create_jar_targets(glob(["libs/*.jar"]))
28 18
 
29 19
 android_library(
30 20
     name = "all-libs",

+ 13
- 6
samples/simpleDemo/android/app/build.gradle View File

@@ -103,16 +103,13 @@ android {
103 103
         targetSdkVersion rootProject.ext.targetSdkVersion
104 104
         versionCode 1
105 105
         versionName "1.0"
106
-        ndk {
107
-            abiFilters "armeabi-v7a", "x86"
108
-        }
109 106
     }
110 107
     splits {
111 108
         abi {
112 109
             reset()
113 110
             enable enableSeparateBuildPerCPUArchitecture
114 111
             universalApk false  // If true, also generate a universal APK
115
-            include "armeabi-v7a", "x86"
112
+            include "armeabi-v7a", "x86", "arm64-v8a"
116 113
         }
117 114
     }
118 115
     buildTypes {
@@ -126,7 +123,7 @@ android {
126 123
         variant.outputs.each { output ->
127 124
             // For each separate APK per architecture, set a unique version code as described here:
128 125
             // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
129
-            def versionCodes = ["armeabi-v7a":1, "x86":2]
126
+            def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3]
130 127
             def abi = output.getFilter(OutputFile.ABI)
131 128
             if (abi != null) {  // null for the universal-debug, universal-release variants
132 129
                 output.versionCodeOverride =
@@ -137,12 +134,22 @@ android {
137 134
 }
138 135
 
139 136
 dependencies {
140
-    compile project(':react-native-agora')
137
+    implementation project(':react-native-agora')
141 138
     implementation fileTree(dir: "libs", include: ["*.jar"])
142 139
     implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
143 140
     implementation "com.facebook.react:react-native:+"  // From node_modules
144 141
 }
145 142
 
143
+repositories {
144
+    mavenCentral()
145
+    mavenLocal()
146
+    maven {
147
+        url "$rootDir/../node_modules/react-native/android"
148
+    }
149
+    jcenter()
150
+    google()
151
+}
152
+
146 153
 // Run this once to be able to run the application with BUCK
147 154
 // puts all compile dependencies into folder libs for BUCK to use
148 155
 task copyDownloadableDepsToLibs(type: Copy) {

+ 19
- 0
samples/simpleDemo/android/app/build_defs.bzl View File

@@ -0,0 +1,19 @@
1
+"""Helper definitions to glob .aar and .jar targets"""
2
+
3
+def create_aar_targets(aarfiles):
4
+    for aarfile in aarfiles:
5
+        name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
6
+        lib_deps.append(":" + name)
7
+        android_prebuilt_aar(
8
+            name = name,
9
+            aar = aarfile,
10
+        )
11
+
12
+def create_jar_targets(jarfiles):
13
+    for jarfile in jarfiles:
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
+        )

+ 3
- 1
samples/simpleDemo/android/app/src/main/AndroidManifest.xml View File

@@ -8,8 +8,10 @@
8 8
       android:name=".MainApplication"
9 9
       android:label="@string/app_name"
10 10
       android:icon="@mipmap/ic_launcher"
11
+      android:roundIcon="@mipmap/ic_launcher_round"
11 12
       android:allowBackup="true"
12
-      android:theme="@style/AppTheme">
13
+      android:theme="@style/AppTheme"
14
+      >
13 15
       <activity
14 16
         android:name=".MainActivity"
15 17
         android:label="@string/app_name"

+ 6
- 17
samples/simpleDemo/android/build.gradle View File

@@ -2,18 +2,18 @@
2 2
 
3 3
 buildscript {
4 4
     ext {
5
-        buildToolsVersion = "27.0.3"
5
+        buildToolsVersion = "28.0.2"
6 6
         minSdkVersion = 16
7
-        compileSdkVersion = 27
8
-        targetSdkVersion = 26
9
-        supportLibVersion = "27.1.1"
7
+        compileSdkVersion = 28
8
+        targetSdkVersion = 27
9
+        supportLibVersion = "28.0.0"
10 10
     }
11 11
     repositories {
12 12
         google()
13 13
         jcenter()
14 14
     }
15 15
     dependencies {
16
-        classpath 'com.android.tools.build:gradle:3.1.4'
16
+        classpath 'com.android.tools.build:gradle:3.2.1'
17 17
 
18 18
         // NOTE: Do not place your application dependencies here; they belong
19 19
         // in the individual module build.gradle files
@@ -34,17 +34,6 @@ allprojects {
34 34
 
35 35
 
36 36
 task wrapper(type: Wrapper) {
37
-    gradleVersion = '4.4'
37
+    gradleVersion = '4.7'
38 38
     distributionUrl = distributionUrl.replace("bin", "all")
39 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
-}

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

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

+ 3
- 0
samples/simpleDemo/babel.config.js View File

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

+ 58
- 20
samples/simpleDemo/components/agora.js View File

@@ -1,7 +1,7 @@
1 1
 import React, {Component, PureComponent} from 'react';
2 2
 import {
3 3
   StyleSheet, Text, View, TouchableOpacity,
4
-  Image, Dimensions, Modal, Platform
4
+  Image, Dimensions, Modal, Platform, NativeModules
5 5
 } from 'react-native';
6 6
 
7 7
 import {RtcEngine, AgoraView} from 'react-native-agora';
@@ -10,6 +10,20 @@ import {
10 10
   isIphoneX, isIphoneXR
11 11
 } from '../utils';
12 12
 
13
+const {Agora} = NativeModules;
14
+
15
+if (!Agora) {
16
+  throw new Error("Agora load failed in react-native, please check ur compiler environments");
17
+}
18
+
19
+const {
20
+  FPS30,
21
+  FixedLandscape,
22
+  Host,
23
+  AudioProfileDefault,
24
+  AudioScenarioDefault,
25
+} = Agora;
26
+
13 27
 const BtnEndCall = () => require('../assets/btn_endcall.png');
14 28
 const BtnMute = () => require('../assets/btn_mute.png');
15 29
 const BtnSpeaker = () => require('../assets/btn_speaker.png');
@@ -86,11 +100,11 @@ type Props = {
86 100
   channelName: String,
87 101
   videoProfile: Number,
88 102
   clientRole: Number,
89
-  swapWidthAndHeight: Boolean,
90
-  onCancel: Function
103
+  onCancel: Function,
104
+  uid: Number,
91 105
 }
92 106
 
93
-export default class Agora extends Component<Props> {
107
+export default class AgoraComponent extends Component<Props> {
94 108
   state = {
95 109
     peerIds: [],
96 110
     joinSucceed: false,
@@ -109,9 +123,19 @@ export default class Agora extends Component<Props> {
109 123
       channelProfile: this.props.channelProfile,
110 124
       videoProfile: this.props.videoProfile,
111 125
       clientRole: this.props.clientRole,
112
-      swapWidthAndHeight: this.props.swapWidthAndHeight
126
+      videoEncoderConfig: {
127
+        width: 360,
128
+        height: 480,
129
+        bitrate: 1,
130
+        frameRate: FPS30,
131
+        orientationMode: FixedLandscape,
132
+      },
133
+      clientRole: Host,
134
+      audioProfile: AudioProfileDefault,
135
+      audioScenario: AudioScenarioDefault
113 136
     }
114
-    console.log("[CONFIG]", config);
137
+    console.log("[CONFIG]", JSON.stringify(config));
138
+    console.log("[CONFIG.encoderConfig", config.videoEncoderConfig);
115 139
     RtcEngine.init(config);
116 140
   }
117 141
 
@@ -121,12 +145,21 @@ export default class Agora extends Component<Props> {
121 145
     })
122 146
 
123 147
     console.log('[joinChannel] ' + this.props.channelName);
124
-    RtcEngine.joinChannel(this.props.channelName);
148
+    RtcEngine.joinChannel(this.props.channelName, this.props.uid);
125 149
     RtcEngine.enableAudioVolumeIndication(500, 3);
126 150
     RtcEngine.eventEmitter({
127 151
       onFirstRemoteVideoDecoded: (data) => {
128 152
         console.log('[RtcEngine] onFirstRemoteVideoDecoded', data);
129 153
       },
154
+      onUserJoined: (data) => {
155
+        console.log('[RtcEngine] onUserJoined', data);
156
+        const {peerIds} = this.state;
157
+        if (peerIds.indexOf(data.uid) === -1) {
158
+          this.setState({
159
+            peerIds: [...peerIds, data.uid]
160
+          })
161
+        }
162
+      },
130 163
       onUserOffline: (data) => {
131 164
         console.log('[RtcEngine] onUserOffline', data);
132 165
         this.setState({
@@ -135,37 +168,40 @@ export default class Agora extends Component<Props> {
135 168
       },
136 169
       onJoinChannelSuccess: (data) => {
137 170
         console.log('[RtcEngine] onJoinChannelSuccess', data);
138
-        // RtcEngine.setShowLocalVideo()
139 171
         RtcEngine.startPreview();
140 172
         this.setState({
141 173
           joinSucceed: true
142 174
         })
143
-      },
144
-      onAudioVolumeIndication: (data) => {
145
-        console.log('[RtcEngine] onAudioVolumeIndication', data);
146
-      },
147
-      onUserJoined: (data) => {
148
-        console.log('[RtcEngine] onUserJoined', data);
149 175
         const {peerIds} = this.state;
150
-        if (peerIds.indexOf(data.uid) !== -1) {
176
+        if (peerIds.indexOf(data.uid) === -1) {
151 177
           this.setState({
152 178
             peerIds: [...peerIds, data.uid]
153 179
           })
154 180
         }
155 181
       },
182
+      onAudioVolumeIndication: (data) => {
183
+        console.log('[RtcEngine] onAudioVolumeIndication', data);
184
+      },
185
+      onClientRoleChanged: (data) => {
186
+        console.log("[RtcEngine] onClientRoleChanged", data);
187
+      },
156 188
       onError: (data) => {
157 189
         console.log('[RtcEngine] onError', data);
158 190
         if (data.error === 17) {
159
-          RtcEngine.leaveChannel();
160
-          RtcEngine.destroy();
191
+          RtcEngine.leaveChannel().then(_ => {
192
+            RtcEngine.destroy();
193
+            this.props.onCancel(data);
194
+          });
161 195
         }
162
-        this.props.onCancel(data.error);
163 196
       }
164 197
     })
165 198
   }
166 199
 
167 200
   componentWillUnmount () {
168
-    RtcEngine.removeEmitter()
201
+    if (this.state.joinSucceed) {
202
+      RtcEngine.leaveChannel();
203
+      RtcEngine.destroy();
204
+    }
169 205
   }
170 206
 
171 207
   handleCancel = () => {
@@ -198,7 +234,9 @@ export default class Agora extends Component<Props> {
198 234
     this.setState({
199 235
       isCameraTorch: !this.state.isCameraTorch
200 236
     }, () => {
201
-      RtcEngine.setCameraTorchOn(this.state.isCameraTorch)
237
+      RtcEngine.setCameraTorchOn(this.state.isCameraTorch).then(val => {
238
+        console.log("setCameraTorch", val);
239
+      })
202 240
     })
203 241
   }
204 242
 

+ 42
- 0
samples/simpleDemo/ios/Podfile View File

@@ -0,0 +1,42 @@
1
+# Uncomment the next line to define a global platform for your project
2
+platform :ios, '9.0'
3
+react_native_path = "../node_modules/react-native"
4
+project "simpleDemo.xcodeproj"
5
+
6
+target 'simpleDemo' do
7
+  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
8
+  # use_frameworks!
9
+
10
+  # Pods for simpleDemo
11
+
12
+  #target 'simpleDemo-tvOSTests' do
13
+  #  inherit! :search_paths
14
+  #  # Pods for testing
15
+  #end
16
+  pod "react-native-agora", path: "../../../"
17
+  pod 'yoga', path: '../node_modules/react-native/ReactCommon/yoga/Yoga.podspec'
18
+  pod 'React', path: '../node_modules/react-native'
19
+  #pod "React", path: react_native_path
20
+  #%w(DoubleConversion Folly glog).each do |lib_name|
21
+  #  pod lib_name, podspec: "#{react_native_path}/third-party-podspecs/#{lib_name}.podspec"
22
+  #end
23
+
24
+  target 'simpleDemoTests' do
25
+    inherit! :search_paths
26
+    # Pods for testing
27
+  end
28
+
29
+end
30
+
31
+target 'simpleDemo-tvOS' do
32
+  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
33
+  # use_frameworks!
34
+
35
+  # Pods for simpleDemo-tvOS
36
+
37
+  target 'simpleDemo-tvOSTests' do
38
+    inherit! :search_paths
39
+    # Pods for testing
40
+  end
41
+
42
+end

+ 41
- 0
samples/simpleDemo/ios/Podfile.lock View File

@@ -0,0 +1,41 @@
1
+PODS:
2
+  - AgoraRtcEngine_iOS (2.3.3)
3
+  - React (0.58.3):
4
+    - React/Core (= 0.58.3)
5
+  - react-native-agora (2.3.3):
6
+    - AgoraRtcEngine_iOS (= 2.3.3)
7
+    - React
8
+    - react-native-agora/AgoraRtcCryptoLoader (= 2.3.3)
9
+  - react-native-agora/AgoraRtcCryptoLoader (2.3.3):
10
+    - AgoraRtcEngine_iOS (= 2.3.3)
11
+    - React
12
+  - React/Core (0.58.3):
13
+    - yoga (= 0.58.3.React)
14
+  - yoga (0.58.3.React)
15
+
16
+DEPENDENCIES:
17
+  - React (from `../node_modules/react-native`)
18
+  - react-native-agora (from `../../../`)
19
+  - yoga (from `../node_modules/react-native/ReactCommon/yoga/Yoga.podspec`)
20
+
21
+SPEC REPOS:
22
+  https://github.com/cocoapods/specs.git:
23
+    - AgoraRtcEngine_iOS
24
+
25
+EXTERNAL SOURCES:
26
+  React:
27
+    :path: "../node_modules/react-native"
28
+  react-native-agora:
29
+    :path: "../../../"
30
+  yoga:
31
+    :path: "../node_modules/react-native/ReactCommon/yoga/Yoga.podspec"
32
+
33
+SPEC CHECKSUMS:
34
+  AgoraRtcEngine_iOS: 8ad4b58dafed2cec5df03fa1f0ddbdad2c9ff958
35
+  React: 9b873b38b92ed8012d7cdf3b965477095ed364c4
36
+  react-native-agora: ad538661771e745fac8920412002e0e90903bbc8
37
+  yoga: 0885622311729a02c2bc02dca97167787a51488b
38
+
39
+PODFILE CHECKSUM: 20565f1fb8643e49a8e76b33da6bb4e2d188134a
40
+
41
+COCOAPODS: 1.5.3

+ 289
- 183
samples/simpleDemo/ios/simpleDemo.xcodeproj/project.pbxproj View File

@@ -13,17 +13,15 @@
13 13
 		00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
14 14
 		00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
15 15
 		00E356F31AD99517003FC87E /* simpleDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* simpleDemoTests.m */; };
16
-		083336BA21E5C1FB007059A4 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336B921E5C1FB007059A4 /* libresolv.tbd */; };
17
-		083336BC21E5C202007059A4 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336BB21E5C202007059A4 /* libc++.tbd */; };
18
-		083336BE21E5C207007059A4 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336BD21E5C207007059A4 /* AVFoundation.framework */; };
19
-		083336C021E5C20C007059A4 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336BF21E5C20C007059A4 /* AudioToolbox.framework */; };
20
-		083336C221E5C211007059A4 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336C121E5C211007059A4 /* VideoToolbox.framework */; };
21
-		083336C421E5C216007059A4 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336C321E5C216007059A4 /* CoreMotion.framework */; };
22
-		083336C621E5C21D007059A4 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336C521E5C21C007059A4 /* CoreMedia.framework */; };
23
-		083336C821E5C222007059A4 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336C721E5C222007059A4 /* CoreTelephony.framework */; };
24
-		083336CC21E5C246007059A4 /* AgoraRtcCryptoLoader.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336C921E5C246007059A4 /* AgoraRtcCryptoLoader.framework */; };
25
-		083336CD21E5C246007059A4 /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336CA21E5C246007059A4 /* libcrypto.a */; };
26
-		083336CE21E5C246007059A4 /* AgoraRtcEngineKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 083336CB21E5C246007059A4 /* AgoraRtcEngineKit.framework */; };
16
+		0842E3912206D315003875AC /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E36A2206D315003875AC /* libc++.tbd */; };
17
+		0842E3932206D31B003875AC /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E3922206D31B003875AC /* libresolv.tbd */; };
18
+		0842E3952206D320003875AC /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E3942206D320003875AC /* AVFoundation.framework */; };
19
+		0842E3982206D32B003875AC /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E3962206D32B003875AC /* VideoToolbox.framework */; };
20
+		0842E3992206D32B003875AC /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E3972206D32B003875AC /* AudioToolbox.framework */; };
21
+		0842E39C2206D332003875AC /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E39A2206D331003875AC /* CoreMedia.framework */; };
22
+		0842E39D2206D332003875AC /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E39B2206D332003875AC /* CoreMotion.framework */; };
23
+		0842E39F2206D338003875AC /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0842E39E2206D338003875AC /* CoreTelephony.framework */; };
24
+		08BFF1BD22147B2200E0E165 /* libRCTAgora.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 08BFF1BC2214766F00E0E165 /* libRCTAgora.a */; };
27 25
 		11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
28 26
 		133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
29 27
 		139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
@@ -47,9 +45,13 @@
47 45
 		2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };
48 46
 		2DCD954D1E0B4F2C00145EB5 /* simpleDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* simpleDemoTests.m */; };
49 47
 		2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };
48
+		5A931A3C341570AA3E833874 /* libPods-simpleDemo-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC7045B20B3EC883C32AF1B5 /* libPods-simpleDemo-tvOSTests.a */; };
49
+		75EFD1DDB6D7C688791C27A6 /* libPods-simpleDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F5A5A3495E0D2D4CBC2035A /* libPods-simpleDemo.a */; };
50
+		813AD4D43E8DEAAF0478F6EF /* libPods-simpleDemo-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 30E47B51FD9B743E449A9302 /* libPods-simpleDemo-tvOS.a */; };
50 51
 		832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
51 52
 		ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
52
-		FE3240808F774A3B8D6D68B2 /* libRCTAgora.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 579173BBF9FA4C0B85E6C677 /* libRCTAgora.a */; };
53
+		ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };
54
+		EEEC06144F8951761B114A63 /* libPods-simpleDemoTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB22B2D50EC2E4896C4F10E2 /* libPods-simpleDemoTests.a */; };
53 55
 /* End PBXBuildFile section */
54 56
 
55 57
 /* Begin PBXContainerItemProxy section */
@@ -95,9 +97,37 @@
95 97
 			remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
96 98
 			remoteInfo = simpleDemo;
97 99
 		};
98
-		083336B721E5C177007059A4 /* PBXContainerItemProxy */ = {
100
+		0842E3362206D244003875AC /* PBXContainerItemProxy */ = {
99 101
 			isa = PBXContainerItemProxy;
100
-			containerPortal = 040C0180048A4B0B9127DD27 /* RCTAgora.xcodeproj */;
102
+			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
103
+			proxyType = 2;
104
+			remoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8;
105
+			remoteInfo = jsi;
106
+		};
107
+		0842E3382206D244003875AC /* PBXContainerItemProxy */ = {
108
+			isa = PBXContainerItemProxy;
109
+			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
110
+			proxyType = 2;
111
+			remoteGlobalIDString = EDEBC73B214B45A300DD5AC8;
112
+			remoteInfo = jsiexecutor;
113
+		};
114
+		0842E33A2206D244003875AC /* PBXContainerItemProxy */ = {
115
+			isa = PBXContainerItemProxy;
116
+			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
117
+			proxyType = 2;
118
+			remoteGlobalIDString = ED296FB6214C9A0900B7C4FE;
119
+			remoteInfo = "jsi-tvOS";
120
+		};
121
+		0842E33C2206D244003875AC /* PBXContainerItemProxy */ = {
122
+			isa = PBXContainerItemProxy;
123
+			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
124
+			proxyType = 2;
125
+			remoteGlobalIDString = ED296FEE214C9CF800B7C4FE;
126
+			remoteInfo = "jsiexecutor-tvOS";
127
+		};
128
+		08BFF1BB2214766F00E0E165 /* PBXContainerItemProxy */ = {
129
+			isa = PBXContainerItemProxy;
130
+			containerPortal = 08BFF1B72214766F00E0E165 /* RCTAgora.xcodeproj */;
101 131
 			proxyType = 2;
102 132
 			remoteGlobalIDString = 23AF281C1EEFECD800D771AB;
103 133
 			remoteInfo = RCTAgora;
@@ -193,20 +223,6 @@
193 223
 			remoteGlobalIDString = 3D383D621EBD27B9005632C8;
194 224
 			remoteInfo = "double-conversion-tvOS";
195 225
 		};
196
-		2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */ = {
197
-			isa = PBXContainerItemProxy;
198
-			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
199
-			proxyType = 2;
200
-			remoteGlobalIDString = 9936F3131F5F2E4B0010BF04;
201
-			remoteInfo = privatedata;
202
-		};
203
-		2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */ = {
204
-			isa = PBXContainerItemProxy;
205
-			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
206
-			proxyType = 2;
207
-			remoteGlobalIDString = 9936F32F1F5F2E5B0010BF04;
208
-			remoteInfo = "privatedata-tvOS";
209
-		};
210 226
 		3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {
211 227
 			isa = PBXContainerItemProxy;
212 228
 			containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
@@ -284,20 +300,6 @@
284 300
 			remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;
285 301
 			remoteInfo = "cxxreact-tvOS";
286 302
 		};
287
-		3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
288
-			isa = PBXContainerItemProxy;
289
-			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
290
-			proxyType = 2;
291
-			remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4;
292
-			remoteInfo = jschelpers;
293
-		};
294
-		3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
295
-			isa = PBXContainerItemProxy;
296
-			containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
297
-			proxyType = 2;
298
-			remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4;
299
-			remoteInfo = "jschelpers-tvOS";
300
-		};
301 303
 		5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
302 304
 			isa = PBXContainerItemProxy;
303 305
 			containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
@@ -345,18 +347,18 @@
345 347
 		00E356EE1AD99517003FC87E /* simpleDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = simpleDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
346 348
 		00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
347 349
 		00E356F21AD99517003FC87E /* simpleDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = simpleDemoTests.m; sourceTree = "<group>"; };
348
-		040C0180048A4B0B9127DD27 /* RCTAgora.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTAgora.xcodeproj; path = "../node_modules/react-native-agora/ios/RCTAgora.xcodeproj"; sourceTree = "<group>"; };
349
-		083336B921E5C1FB007059A4 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
350
-		083336BB21E5C202007059A4 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
351
-		083336BD21E5C207007059A4 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
352
-		083336BF21E5C20C007059A4 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
353
-		083336C121E5C211007059A4 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; };
354
-		083336C321E5C216007059A4 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
355
-		083336C521E5C21C007059A4 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
356
-		083336C721E5C222007059A4 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
357
-		083336C921E5C246007059A4 /* AgoraRtcCryptoLoader.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcCryptoLoader.framework; path = "../node_modules/react-native-agora/ios/RCTAgora/libs/AgoraRtcCryptoLoader.framework"; sourceTree = "<group>"; };
358
-		083336CA21E5C246007059A4 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = "../node_modules/react-native-agora/ios/RCTAgora/libs/libcrypto.a"; sourceTree = "<group>"; };
359
-		083336CB21E5C246007059A4 /* AgoraRtcEngineKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcEngineKit.framework; path = "../node_modules/react-native-agora/ios/RCTAgora/libs/AgoraRtcEngineKit.framework"; sourceTree = "<group>"; };
350
+		0842E36A2206D315003875AC /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
351
+		0842E3922206D31B003875AC /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
352
+		0842E3942206D320003875AC /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
353
+		0842E3962206D32B003875AC /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; };
354
+		0842E3972206D32B003875AC /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
355
+		0842E39A2206D331003875AC /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
356
+		0842E39B2206D332003875AC /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
357
+		0842E39E2206D338003875AC /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
358
+		0842E3A02206D34C003875AC /* AgoraRtcEngineKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcEngineKit.framework; path = Pods/AgoraRtcEngine_iOS/AgoraRtcEngineKit.framework; sourceTree = "<group>"; };
359
+		0842E3A22206D360003875AC /* AgoraRtcCryptoLoader.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AgoraRtcCryptoLoader.framework; path = "../node_modules/react-native-agora/ios/RCTAgora/libs/AgoraRtcCryptoLoader.framework"; sourceTree = "<group>"; };
360
+		0842E3A32206D360003875AC /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = "../node_modules/react-native-agora/ios/RCTAgora/libs/libcrypto.a"; sourceTree = "<group>"; };
361
+		08BFF1B72214766F00E0E165 /* RCTAgora.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAgora.xcodeproj; path = "../node_modules/react-native-agora/ios/RCTAgora.xcodeproj"; sourceTree = "<group>"; };
360 362
 		139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
361 363
 		139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
362 364
 		13B07F961A680F5B00A75B9A /* simpleDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = simpleDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -370,11 +372,23 @@
370 372
 		2D02E47B1E0B4A5D006451C7 /* simpleDemo-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "simpleDemo-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
371 373
 		2D02E4901E0B4A5D006451C7 /* simpleDemo-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "simpleDemo-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
372 374
 		2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };
373
-		579173BBF9FA4C0B85E6C677 /* libRCTAgora.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTAgora.a; sourceTree = "<group>"; };
375
+		30E47B51FD9B743E449A9302 /* libPods-simpleDemo-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-simpleDemo-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
376
+		3D4E3D78CA5AFF0A0DE8400B /* Pods-simpleDemo-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemo-tvOSTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemo-tvOSTests/Pods-simpleDemo-tvOSTests.release.xcconfig"; sourceTree = "<group>"; };
377
+		3F5A5A3495E0D2D4CBC2035A /* libPods-simpleDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-simpleDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; };
378
+		4F8422FC389657ECAE764F35 /* Pods-simpleDemo-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemo-tvOSTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemo-tvOSTests/Pods-simpleDemo-tvOSTests.debug.xcconfig"; sourceTree = "<group>"; };
374 379
 		5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
375 380
 		78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
381
+		7C8CC895F34C3FFE167217AB /* Pods-simpleDemoTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemoTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemoTests/Pods-simpleDemoTests.debug.xcconfig"; sourceTree = "<group>"; };
376 382
 		832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
383
+		8C75CEB377545FED40C4F135 /* Pods-simpleDemoTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemoTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemoTests/Pods-simpleDemoTests.release.xcconfig"; sourceTree = "<group>"; };
384
+		A6331DF634CD310F84C3B9D0 /* Pods-simpleDemo-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemo-tvOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemo-tvOS/Pods-simpleDemo-tvOS.release.xcconfig"; sourceTree = "<group>"; };
385
+		A8E3B1381976DA57BA54DF1C /* Pods-simpleDemo-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemo-tvOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemo-tvOS/Pods-simpleDemo-tvOS.debug.xcconfig"; sourceTree = "<group>"; };
377 386
 		ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = "<group>"; };
387
+		B76CA498082B698840FFCDE0 /* Pods-simpleDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemo/Pods-simpleDemo.release.xcconfig"; sourceTree = "<group>"; };
388
+		B8AF77DEAE35976FF56DAC57 /* Pods-simpleDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-simpleDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-simpleDemo/Pods-simpleDemo.debug.xcconfig"; sourceTree = "<group>"; };
389
+		BC7045B20B3EC883C32AF1B5 /* libPods-simpleDemo-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-simpleDemo-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
390
+		EB22B2D50EC2E4896C4F10E2 /* libPods-simpleDemoTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-simpleDemoTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
391
+		ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
378 392
 /* End PBXFileReference section */
379 393
 
380 394
 /* Begin PBXFrameworksBuildPhase section */
@@ -383,6 +397,7 @@
383 397
 			buildActionMask = 2147483647;
384 398
 			files = (
385 399
 				140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,
400
+				EEEC06144F8951761B114A63 /* libPods-simpleDemoTests.a in Frameworks */,
386 401
 			);
387 402
 			runOnlyForDeploymentPostprocessing = 0;
388 403
 		};
@@ -390,17 +405,16 @@
390 405
 			isa = PBXFrameworksBuildPhase;
391 406
 			buildActionMask = 2147483647;
392 407
 			files = (
393
-				083336CC21E5C246007059A4 /* AgoraRtcCryptoLoader.framework in Frameworks */,
394
-				083336CD21E5C246007059A4 /* libcrypto.a in Frameworks */,
395
-				083336CE21E5C246007059A4 /* AgoraRtcEngineKit.framework in Frameworks */,
396
-				083336C821E5C222007059A4 /* CoreTelephony.framework in Frameworks */,
397
-				083336C621E5C21D007059A4 /* CoreMedia.framework in Frameworks */,
398
-				083336C421E5C216007059A4 /* CoreMotion.framework in Frameworks */,
399
-				083336C221E5C211007059A4 /* VideoToolbox.framework in Frameworks */,
400
-				083336C021E5C20C007059A4 /* AudioToolbox.framework in Frameworks */,
401
-				083336BE21E5C207007059A4 /* AVFoundation.framework in Frameworks */,
402
-				083336BC21E5C202007059A4 /* libc++.tbd in Frameworks */,
403
-				083336BA21E5C1FB007059A4 /* libresolv.tbd in Frameworks */,
408
+				08BFF1BD22147B2200E0E165 /* libRCTAgora.a in Frameworks */,
409
+				0842E39F2206D338003875AC /* CoreTelephony.framework in Frameworks */,
410
+				0842E39C2206D332003875AC /* CoreMedia.framework in Frameworks */,
411
+				0842E39D2206D332003875AC /* CoreMotion.framework in Frameworks */,
412
+				0842E3982206D32B003875AC /* VideoToolbox.framework in Frameworks */,
413
+				0842E3992206D32B003875AC /* AudioToolbox.framework in Frameworks */,
414
+				0842E3952206D320003875AC /* AVFoundation.framework in Frameworks */,
415
+				0842E3932206D31B003875AC /* libresolv.tbd in Frameworks */,
416
+				0842E3912206D315003875AC /* libc++.tbd in Frameworks */,
417
+				ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */,
404 418
 				ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,
405 419
 				11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,
406 420
 				146834051AC3E58100842450 /* libReact.a in Frameworks */,
@@ -413,7 +427,7 @@
413 427
 				832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
414 428
 				00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
415 429
 				139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
416
-				FE3240808F774A3B8D6D68B2 /* libRCTAgora.a in Frameworks */,
430
+				75EFD1DDB6D7C688791C27A6 /* libPods-simpleDemo.a in Frameworks */,
417 431
 			);
418 432
 			runOnlyForDeploymentPostprocessing = 0;
419 433
 		};
@@ -429,6 +443,7 @@
429 443
 				2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,
430 444
 				2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,
431 445
 				2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,
446
+				813AD4D43E8DEAAF0478F6EF /* libPods-simpleDemo-tvOS.a in Frameworks */,
432 447
 			);
433 448
 			runOnlyForDeploymentPostprocessing = 0;
434 449
 		};
@@ -437,6 +452,7 @@
437 452
 			buildActionMask = 2147483647;
438 453
 			files = (
439 454
 				2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */,
455
+				5A931A3C341570AA3E833874 /* libPods-simpleDemo-tvOSTests.a in Frameworks */,
440 456
 			);
441 457
 			runOnlyForDeploymentPostprocessing = 0;
442 458
 		};
@@ -502,18 +518,17 @@
502 518
 			name = "Supporting Files";
503 519
 			sourceTree = "<group>";
504 520
 		};
505
-		0833368E21E5C173007059A4 /* Recovered References */ = {
521
+		0842E3102206D244003875AC /* Recovered References */ = {
506 522
 			isa = PBXGroup;
507 523
 			children = (
508
-				579173BBF9FA4C0B85E6C677 /* libRCTAgora.a */,
509 524
 			);
510 525
 			name = "Recovered References";
511 526
 			sourceTree = "<group>";
512 527
 		};
513
-		083336B421E5C176007059A4 /* Products */ = {
528
+		08BFF1B82214766F00E0E165 /* Products */ = {
514 529
 			isa = PBXGroup;
515 530
 			children = (
516
-				083336B821E5C177007059A4 /* libRCTAgora.a */,
531
+				08BFF1BC2214766F00E0E165 /* libRCTAgora.a */,
517 532
 			);
518 533
 			name = Products;
519 534
 			sourceTree = "<group>";
@@ -561,35 +576,55 @@
561 576
 				3DAD3EA71DF850E9000B6D8A /* libyoga.a */,
562 577
 				3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,
563 578
 				3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,
564
-				3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */,
565
-				3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */,
566 579
 				2DF0FFDF2056DD460020B375 /* libjsinspector.a */,
567 580
 				2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,
568 581
 				2DF0FFE32056DD460020B375 /* libthird-party.a */,
569 582
 				2DF0FFE52056DD460020B375 /* libthird-party.a */,
570 583
 				2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,
571 584
 				2DF0FFE92056DD460020B375 /* libdouble-conversion.a */,
572
-				2DF0FFEB2056DD460020B375 /* libprivatedata.a */,
573
-				2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */,
585
+				0842E3372206D244003875AC /* libjsi.a */,
586
+				0842E3392206D244003875AC /* libjsiexecutor.a */,
587
+				0842E33B2206D244003875AC /* libjsi-tvOS.a */,
588
+				0842E33D2206D244003875AC /* libjsiexecutor-tvOS.a */,
574 589
 			);
575 590
 			name = Products;
576 591
 			sourceTree = "<group>";
577 592
 		};
593
+		1FE1E6BD58AC46ED69A01571 /* Pods */ = {
594
+			isa = PBXGroup;
595
+			children = (
596
+				B8AF77DEAE35976FF56DAC57 /* Pods-simpleDemo.debug.xcconfig */,
597
+				B76CA498082B698840FFCDE0 /* Pods-simpleDemo.release.xcconfig */,
598
+				A8E3B1381976DA57BA54DF1C /* Pods-simpleDemo-tvOS.debug.xcconfig */,
599
+				A6331DF634CD310F84C3B9D0 /* Pods-simpleDemo-tvOS.release.xcconfig */,
600
+				4F8422FC389657ECAE764F35 /* Pods-simpleDemo-tvOSTests.debug.xcconfig */,
601
+				3D4E3D78CA5AFF0A0DE8400B /* Pods-simpleDemo-tvOSTests.release.xcconfig */,
602
+				7C8CC895F34C3FFE167217AB /* Pods-simpleDemoTests.debug.xcconfig */,
603
+				8C75CEB377545FED40C4F135 /* Pods-simpleDemoTests.release.xcconfig */,
604
+			);
605
+			name = Pods;
606
+			sourceTree = "<group>";
607
+		};
578 608
 		2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
579 609
 			isa = PBXGroup;
580 610
 			children = (
581
-				083336C921E5C246007059A4 /* AgoraRtcCryptoLoader.framework */,
582
-				083336CB21E5C246007059A4 /* AgoraRtcEngineKit.framework */,
583
-				083336CA21E5C246007059A4 /* libcrypto.a */,
584
-				083336C721E5C222007059A4 /* CoreTelephony.framework */,
585
-				083336C521E5C21C007059A4 /* CoreMedia.framework */,
586
-				083336C321E5C216007059A4 /* CoreMotion.framework */,
587
-				083336C121E5C211007059A4 /* VideoToolbox.framework */,
588
-				083336BF21E5C20C007059A4 /* AudioToolbox.framework */,
589
-				083336BD21E5C207007059A4 /* AVFoundation.framework */,
590
-				083336BB21E5C202007059A4 /* libc++.tbd */,
591
-				083336B921E5C1FB007059A4 /* libresolv.tbd */,
611
+				0842E3A22206D360003875AC /* AgoraRtcCryptoLoader.framework */,
612
+				0842E3A32206D360003875AC /* libcrypto.a */,
613
+				0842E3A02206D34C003875AC /* AgoraRtcEngineKit.framework */,
614
+				0842E39E2206D338003875AC /* CoreTelephony.framework */,
615
+				0842E39A2206D331003875AC /* CoreMedia.framework */,
616
+				0842E39B2206D332003875AC /* CoreMotion.framework */,
617
+				0842E3972206D32B003875AC /* AudioToolbox.framework */,
618
+				0842E3962206D32B003875AC /* VideoToolbox.framework */,
619
+				0842E3942206D320003875AC /* AVFoundation.framework */,
620
+				0842E3922206D31B003875AC /* libresolv.tbd */,
621
+				0842E36A2206D315003875AC /* libc++.tbd */,
622
+				ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
592 623
 				2D16E6891FA4F8E400B85C8A /* libReact.a */,
624
+				3F5A5A3495E0D2D4CBC2035A /* libPods-simpleDemo.a */,
625
+				30E47B51FD9B743E449A9302 /* libPods-simpleDemo-tvOS.a */,
626
+				BC7045B20B3EC883C32AF1B5 /* libPods-simpleDemo-tvOSTests.a */,
627
+				EB22B2D50EC2E4896C4F10E2 /* libPods-simpleDemoTests.a */,
593 628
 			);
594 629
 			name = Frameworks;
595 630
 			sourceTree = "<group>";
@@ -615,6 +650,7 @@
615 650
 		832341AE1AAA6A7D00B99B32 /* Libraries */ = {
616 651
 			isa = PBXGroup;
617 652
 			children = (
653
+				08BFF1B72214766F00E0E165 /* RCTAgora.xcodeproj */,
618 654
 				5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,
619 655
 				146833FF1AC3E56700842450 /* React.xcodeproj */,
620 656
 				00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
@@ -627,7 +663,6 @@
627 663
 				832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
628 664
 				00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
629 665
 				139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
630
-				040C0180048A4B0B9127DD27 /* RCTAgora.xcodeproj */,
631 666
 			);
632 667
 			name = Libraries;
633 668
 			sourceTree = "<group>";
@@ -649,7 +684,8 @@
649 684
 				00E356EF1AD99517003FC87E /* simpleDemoTests */,
650 685
 				83CBBA001A601CBA00E9B192 /* Products */,
651 686
 				2D16E6871FA4F8E400B85C8A /* Frameworks */,
652
-				0833368E21E5C173007059A4 /* Recovered References */,
687
+				0842E3102206D244003875AC /* Recovered References */,
688
+				1FE1E6BD58AC46ED69A01571 /* Pods */,
653 689
 			);
654 690
 			indentWidth = 2;
655 691
 			sourceTree = "<group>";
@@ -683,6 +719,7 @@
683 719
 			isa = PBXNativeTarget;
684 720
 			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "simpleDemoTests" */;
685 721
 			buildPhases = (
722
+				2D951AF5F54A943305AF47CE /* [CP] Check Pods Manifest.lock */,
686 723
 				00E356EA1AD99517003FC87E /* Sources */,
687 724
 				00E356EB1AD99517003FC87E /* Frameworks */,
688 725
 				00E356EC1AD99517003FC87E /* Resources */,
@@ -701,6 +738,7 @@
701 738
 			isa = PBXNativeTarget;
702 739
 			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "simpleDemo" */;
703 740
 			buildPhases = (
741
+				0C0449DF546B8196AD640260 /* [CP] Check Pods Manifest.lock */,
704 742
 				13B07F871A680F5B00A75B9A /* Sources */,
705 743
 				13B07F8C1A680F5B00A75B9A /* Frameworks */,
706 744
 				13B07F8E1A680F5B00A75B9A /* Resources */,
@@ -719,6 +757,7 @@
719 757
 			isa = PBXNativeTarget;
720 758
 			buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "simpleDemo-tvOS" */;
721 759
 			buildPhases = (
760
+				6A62784F9CCD9039899ABD4F /* [CP] Check Pods Manifest.lock */,
722 761
 				2D02E4771E0B4A5D006451C7 /* Sources */,
723 762
 				2D02E4781E0B4A5D006451C7 /* Frameworks */,
724 763
 				2D02E4791E0B4A5D006451C7 /* Resources */,
@@ -737,6 +776,7 @@
737 776
 			isa = PBXNativeTarget;
738 777
 			buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "simpleDemo-tvOSTests" */;
739 778
 			buildPhases = (
779
+				08F266698EF8951602DE8B81 /* [CP] Check Pods Manifest.lock */,
740 780
 				2D02E48C1E0B4A5D006451C7 /* Sources */,
741 781
 				2D02E48D1E0B4A5D006451C7 /* Frameworks */,
742 782
 				2D02E48E1E0B4A5D006451C7 /* Resources */,
@@ -801,8 +841,8 @@
801 841
 					ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
802 842
 				},
803 843
 				{
804
-					ProductGroup = 083336B421E5C176007059A4 /* Products */;
805
-					ProjectRef = 040C0180048A4B0B9127DD27 /* RCTAgora.xcodeproj */;
844
+					ProductGroup = 08BFF1B82214766F00E0E165 /* Products */;
845
+					ProjectRef = 08BFF1B72214766F00E0E165 /* RCTAgora.xcodeproj */;
806 846
 				},
807 847
 				{
808 848
 					ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;
@@ -895,11 +935,39 @@
895 935
 			remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
896 936
 			sourceTree = BUILT_PRODUCTS_DIR;
897 937
 		};
898
-		083336B821E5C177007059A4 /* libRCTAgora.a */ = {
938
+		0842E3372206D244003875AC /* libjsi.a */ = {
939
+			isa = PBXReferenceProxy;
940
+			fileType = archive.ar;
941
+			path = libjsi.a;
942
+			remoteRef = 0842E3362206D244003875AC /* PBXContainerItemProxy */;
943
+			sourceTree = BUILT_PRODUCTS_DIR;
944
+		};
945
+		0842E3392206D244003875AC /* libjsiexecutor.a */ = {
946
+			isa = PBXReferenceProxy;
947
+			fileType = archive.ar;
948
+			path = libjsiexecutor.a;
949
+			remoteRef = 0842E3382206D244003875AC /* PBXContainerItemProxy */;
950
+			sourceTree = BUILT_PRODUCTS_DIR;
951
+		};
952
+		0842E33B2206D244003875AC /* libjsi-tvOS.a */ = {
953
+			isa = PBXReferenceProxy;
954
+			fileType = archive.ar;
955
+			path = "libjsi-tvOS.a";
956
+			remoteRef = 0842E33A2206D244003875AC /* PBXContainerItemProxy */;
957
+			sourceTree = BUILT_PRODUCTS_DIR;
958
+		};
959
+		0842E33D2206D244003875AC /* libjsiexecutor-tvOS.a */ = {
960
+			isa = PBXReferenceProxy;
961
+			fileType = archive.ar;
962
+			path = "libjsiexecutor-tvOS.a";
963
+			remoteRef = 0842E33C2206D244003875AC /* PBXContainerItemProxy */;
964
+			sourceTree = BUILT_PRODUCTS_DIR;
965
+		};
966
+		08BFF1BC2214766F00E0E165 /* libRCTAgora.a */ = {
899 967
 			isa = PBXReferenceProxy;
900 968
 			fileType = archive.ar;
901 969
 			path = libRCTAgora.a;
902
-			remoteRef = 083336B721E5C177007059A4 /* PBXContainerItemProxy */;
970
+			remoteRef = 08BFF1BB2214766F00E0E165 /* PBXContainerItemProxy */;
903 971
 			sourceTree = BUILT_PRODUCTS_DIR;
904 972
 		};
905 973
 		139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
@@ -986,20 +1054,6 @@
986 1054
 			remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;
987 1055
 			sourceTree = BUILT_PRODUCTS_DIR;
988 1056
 		};
989
-		2DF0FFEB2056DD460020B375 /* libprivatedata.a */ = {
990
-			isa = PBXReferenceProxy;
991
-			fileType = archive.ar;
992
-			path = libprivatedata.a;
993
-			remoteRef = 2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */;
994
-			sourceTree = BUILT_PRODUCTS_DIR;
995
-		};
996
-		2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */ = {
997
-			isa = PBXReferenceProxy;
998
-			fileType = archive.ar;
999
-			path = "libprivatedata-tvOS.a";
1000
-			remoteRef = 2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */;
1001
-			sourceTree = BUILT_PRODUCTS_DIR;
1002
-		};
1003 1057
 		3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
1004 1058
 			isa = PBXReferenceProxy;
1005 1059
 			fileType = archive.ar;
@@ -1077,20 +1131,6 @@
1077 1131
 			remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;
1078 1132
 			sourceTree = BUILT_PRODUCTS_DIR;
1079 1133
 		};
1080
-		3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = {
1081
-			isa = PBXReferenceProxy;
1082
-			fileType = archive.ar;
1083
-			path = libjschelpers.a;
1084
-			remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */;
1085
-			sourceTree = BUILT_PRODUCTS_DIR;
1086
-		};
1087
-		3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = {
1088
-			isa = PBXReferenceProxy;
1089
-			fileType = archive.ar;
1090
-			path = libjschelpers.a;
1091
-			remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */;
1092
-			sourceTree = BUILT_PRODUCTS_DIR;
1093
-		};
1094 1134
 		5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {
1095 1135
 			isa = PBXReferenceProxy;
1096 1136
 			fileType = archive.ar;
@@ -1175,7 +1215,51 @@
1175 1215
 			);
1176 1216
 			runOnlyForDeploymentPostprocessing = 0;
1177 1217
 			shellPath = /bin/sh;
1178
-			shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
1218
+			shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
1219
+		};
1220
+		08F266698EF8951602DE8B81 /* [CP] Check Pods Manifest.lock */ = {
1221
+			isa = PBXShellScriptBuildPhase;
1222
+			buildActionMask = 2147483647;
1223
+			files = (
1224
+			);
1225
+			inputFileListPaths = (
1226
+			);
1227
+			inputPaths = (
1228
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
1229
+				"${PODS_ROOT}/Manifest.lock",
1230
+			);
1231
+			name = "[CP] Check Pods Manifest.lock";
1232
+			outputFileListPaths = (
1233
+			);
1234
+			outputPaths = (
1235
+				"$(DERIVED_FILE_DIR)/Pods-simpleDemo-tvOSTests-checkManifestLockResult.txt",
1236
+			);
1237
+			runOnlyForDeploymentPostprocessing = 0;
1238
+			shellPath = /bin/sh;
1239
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
1240
+			showEnvVarsInLog = 0;
1241
+		};
1242
+		0C0449DF546B8196AD640260 /* [CP] Check Pods Manifest.lock */ = {
1243
+			isa = PBXShellScriptBuildPhase;
1244
+			buildActionMask = 2147483647;
1245
+			files = (
1246
+			);
1247
+			inputFileListPaths = (
1248
+			);
1249
+			inputPaths = (
1250
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
1251
+				"${PODS_ROOT}/Manifest.lock",
1252
+			);
1253
+			name = "[CP] Check Pods Manifest.lock";
1254
+			outputFileListPaths = (
1255
+			);
1256
+			outputPaths = (
1257
+				"$(DERIVED_FILE_DIR)/Pods-simpleDemo-checkManifestLockResult.txt",
1258
+			);
1259
+			runOnlyForDeploymentPostprocessing = 0;
1260
+			shellPath = /bin/sh;
1261
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
1262
+			showEnvVarsInLog = 0;
1179 1263
 		};
1180 1264
 		2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
1181 1265
 			isa = PBXShellScriptBuildPhase;
@@ -1191,6 +1275,50 @@
1191 1275
 			shellPath = /bin/sh;
1192 1276
 			shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
1193 1277
 		};
1278
+		2D951AF5F54A943305AF47CE /* [CP] Check Pods Manifest.lock */ = {
1279
+			isa = PBXShellScriptBuildPhase;
1280
+			buildActionMask = 2147483647;
1281
+			files = (
1282
+			);
1283
+			inputFileListPaths = (
1284
+			);
1285
+			inputPaths = (
1286
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
1287
+				"${PODS_ROOT}/Manifest.lock",
1288
+			);
1289
+			name = "[CP] Check Pods Manifest.lock";
1290
+			outputFileListPaths = (
1291
+			);
1292
+			outputPaths = (
1293
+				"$(DERIVED_FILE_DIR)/Pods-simpleDemoTests-checkManifestLockResult.txt",
1294
+			);
1295
+			runOnlyForDeploymentPostprocessing = 0;
1296
+			shellPath = /bin/sh;
1297
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
1298
+			showEnvVarsInLog = 0;
1299
+		};
1300
+		6A62784F9CCD9039899ABD4F /* [CP] Check Pods Manifest.lock */ = {
1301
+			isa = PBXShellScriptBuildPhase;
1302
+			buildActionMask = 2147483647;
1303
+			files = (
1304
+			);
1305
+			inputFileListPaths = (
1306
+			);
1307
+			inputPaths = (
1308
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
1309
+				"${PODS_ROOT}/Manifest.lock",
1310
+			);
1311
+			name = "[CP] Check Pods Manifest.lock";
1312
+			outputFileListPaths = (
1313
+			);
1314
+			outputPaths = (
1315
+				"$(DERIVED_FILE_DIR)/Pods-simpleDemo-tvOS-checkManifestLockResult.txt",
1316
+			);
1317
+			runOnlyForDeploymentPostprocessing = 0;
1318
+			shellPath = /bin/sh;
1319
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
1320
+			showEnvVarsInLog = 0;
1321
+		};
1194 1322
 /* End PBXShellScriptBuildPhase section */
1195 1323
 
1196 1324
 /* Begin PBXSourcesBuildPhase section */
@@ -1258,25 +1386,19 @@
1258 1386
 /* Begin XCBuildConfiguration section */
1259 1387
 		00E356F61AD99517003FC87E /* Debug */ = {
1260 1388
 			isa = XCBuildConfiguration;
1389
+			baseConfigurationReference = 7C8CC895F34C3FFE167217AB /* Pods-simpleDemoTests.debug.xcconfig */;
1261 1390
 			buildSettings = {
1262 1391
 				BUNDLE_LOADER = "$(TEST_HOST)";
1263
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1264 1392
 				DEVELOPMENT_TEAM = 56968F5P8G;
1265 1393
 				GCC_PREPROCESSOR_DEFINITIONS = (
1266 1394
 					"DEBUG=1",
1267 1395
 					"$(inherited)",
1268 1396
 				);
1269
-				HEADER_SEARCH_PATHS = (
1270
-					"$(inherited)",
1271
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1272
-				);
1397
+				HEADER_SEARCH_PATHS = "$(inherited)";
1273 1398
 				INFOPLIST_FILE = simpleDemoTests/Info.plist;
1274 1399
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1275 1400
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1276
-				LIBRARY_SEARCH_PATHS = (
1277
-					"$(inherited)",
1278
-					"\"$(SRCROOT)/$(TARGET_NAME)\"",
1279
-				);
1401
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
1280 1402
 				OTHER_LDFLAGS = (
1281 1403
 					"-ObjC",
1282 1404
 					"-lc++",
@@ -1289,22 +1411,16 @@
1289 1411
 		};
1290 1412
 		00E356F71AD99517003FC87E /* Release */ = {
1291 1413
 			isa = XCBuildConfiguration;
1414
+			baseConfigurationReference = 8C75CEB377545FED40C4F135 /* Pods-simpleDemoTests.release.xcconfig */;
1292 1415
 			buildSettings = {
1293 1416
 				BUNDLE_LOADER = "$(TEST_HOST)";
1294
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1295 1417
 				COPY_PHASE_STRIP = NO;
1296 1418
 				DEVELOPMENT_TEAM = 56968F5P8G;
1297
-				HEADER_SEARCH_PATHS = (
1298
-					"$(inherited)",
1299
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1300
-				);
1419
+				HEADER_SEARCH_PATHS = "$(inherited)";
1301 1420
 				INFOPLIST_FILE = simpleDemoTests/Info.plist;
1302 1421
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1303 1422
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1304
-				LIBRARY_SEARCH_PATHS = (
1305
-					"$(inherited)",
1306
-					"\"$(SRCROOT)/$(TARGET_NAME)\"",
1307
-				);
1423
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
1308 1424
 				OTHER_LDFLAGS = (
1309 1425
 					"-ObjC",
1310 1426
 					"-lc++",
@@ -1317,26 +1433,32 @@
1317 1433
 		};
1318 1434
 		13B07F941A680F5B00A75B9A /* Debug */ = {
1319 1435
 			isa = XCBuildConfiguration;
1436
+			baseConfigurationReference = B8AF77DEAE35976FF56DAC57 /* Pods-simpleDemo.debug.xcconfig */;
1320 1437
 			buildSettings = {
1321 1438
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
1322 1439
 				CURRENT_PROJECT_VERSION = 1;
1323 1440
 				DEAD_CODE_STRIPPING = NO;
1324 1441
 				DEVELOPMENT_TEAM = 56968F5P8G;
1325
-				ENABLE_BITCODE = NO;
1326
-				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/libs\"\n\n";
1442
+				FRAMEWORK_SEARCH_PATHS = (
1443
+					"$(inherited)",
1444
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1445
+				);
1327 1446
 				HEADER_SEARCH_PATHS = (
1328 1447
 					"$(inherited)",
1329
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1448
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1330 1449
 				);
1331 1450
 				INFOPLIST_FILE = simpleDemo/Info.plist;
1332 1451
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
1333
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/libs\"\n\n";
1452
+				LIBRARY_SEARCH_PATHS = (
1453
+					"$(inherited)",
1454
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1455
+				);
1334 1456
 				OTHER_LDFLAGS = (
1335 1457
 					"$(inherited)",
1336 1458
 					"-ObjC",
1337 1459
 					"-lc++",
1338 1460
 				);
1339
-				PRODUCT_BUNDLE_IDENTIFIER = com.tori.simpleDemo;
1461
+				PRODUCT_BUNDLE_IDENTIFIER = tori.mori.mobi;
1340 1462
 				PRODUCT_NAME = simpleDemo;
1341 1463
 				VERSIONING_SYSTEM = "apple-generic";
1342 1464
 			};
@@ -1344,25 +1466,31 @@
1344 1466
 		};
1345 1467
 		13B07F951A680F5B00A75B9A /* Release */ = {
1346 1468
 			isa = XCBuildConfiguration;
1469
+			baseConfigurationReference = B76CA498082B698840FFCDE0 /* Pods-simpleDemo.release.xcconfig */;
1347 1470
 			buildSettings = {
1348 1471
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
1349 1472
 				CURRENT_PROJECT_VERSION = 1;
1350 1473
 				DEVELOPMENT_TEAM = 56968F5P8G;
1351
-				ENABLE_BITCODE = NO;
1352
-				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/libs\"\n\n";
1474
+				FRAMEWORK_SEARCH_PATHS = (
1475
+					"$(inherited)",
1476
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1477
+				);
1353 1478
 				HEADER_SEARCH_PATHS = (
1354 1479
 					"$(inherited)",
1355
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1480
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1356 1481
 				);
1357 1482
 				INFOPLIST_FILE = simpleDemo/Info.plist;
1358 1483
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
1359
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/libs\"\n\n";
1484
+				LIBRARY_SEARCH_PATHS = (
1485
+					"$(inherited)",
1486
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1487
+				);
1360 1488
 				OTHER_LDFLAGS = (
1361 1489
 					"$(inherited)",
1362 1490
 					"-ObjC",
1363 1491
 					"-lc++",
1364 1492
 				);
1365
-				PRODUCT_BUNDLE_IDENTIFIER = com.tori.simpleDemo;
1493
+				PRODUCT_BUNDLE_IDENTIFIER = tori.mori.mobi;
1366 1494
 				PRODUCT_NAME = simpleDemo;
1367 1495
 				VERSIONING_SYSTEM = "apple-generic";
1368 1496
 			};
@@ -1370,6 +1498,7 @@
1370 1498
 		};
1371 1499
 		2D02E4971E0B4A5E006451C7 /* Debug */ = {
1372 1500
 			isa = XCBuildConfiguration;
1501
+			baseConfigurationReference = A8E3B1381976DA57BA54DF1C /* Pods-simpleDemo-tvOS.debug.xcconfig */;
1373 1502
 			buildSettings = {
1374 1503
 				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
1375 1504
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
@@ -1380,16 +1509,10 @@
1380 1509
 				DEBUG_INFORMATION_FORMAT = dwarf;
1381 1510
 				ENABLE_TESTABILITY = YES;
1382 1511
 				GCC_NO_COMMON_BLOCKS = YES;
1383
-				HEADER_SEARCH_PATHS = (
1384
-					"$(inherited)",
1385
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1386
-				);
1512
+				HEADER_SEARCH_PATHS = "$(inherited)";
1387 1513
 				INFOPLIST_FILE = "simpleDemo-tvOS/Info.plist";
1388 1514
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
1389
-				LIBRARY_SEARCH_PATHS = (
1390
-					"$(inherited)",
1391
-					"\"$(SRCROOT)/$(TARGET_NAME)\"",
1392
-				);
1515
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
1393 1516
 				OTHER_LDFLAGS = (
1394 1517
 					"-ObjC",
1395 1518
 					"-lc++",
@@ -1404,6 +1527,7 @@
1404 1527
 		};
1405 1528
 		2D02E4981E0B4A5E006451C7 /* Release */ = {
1406 1529
 			isa = XCBuildConfiguration;
1530
+			baseConfigurationReference = A6331DF634CD310F84C3B9D0 /* Pods-simpleDemo-tvOS.release.xcconfig */;
1407 1531
 			buildSettings = {
1408 1532
 				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
1409 1533
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
@@ -1414,16 +1538,10 @@
1414 1538
 				COPY_PHASE_STRIP = NO;
1415 1539
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
1416 1540
 				GCC_NO_COMMON_BLOCKS = YES;
1417
-				HEADER_SEARCH_PATHS = (
1418
-					"$(inherited)",
1419
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1420
-				);
1541
+				HEADER_SEARCH_PATHS = "$(inherited)";
1421 1542
 				INFOPLIST_FILE = "simpleDemo-tvOS/Info.plist";
1422 1543
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
1423
-				LIBRARY_SEARCH_PATHS = (
1424
-					"$(inherited)",
1425
-					"\"$(SRCROOT)/$(TARGET_NAME)\"",
1426
-				);
1544
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
1427 1545
 				OTHER_LDFLAGS = (
1428 1546
 					"-ObjC",
1429 1547
 					"-lc++",
@@ -1438,6 +1556,7 @@
1438 1556
 		};
1439 1557
 		2D02E4991E0B4A5E006451C7 /* Debug */ = {
1440 1558
 			isa = XCBuildConfiguration;
1559
+			baseConfigurationReference = 4F8422FC389657ECAE764F35 /* Pods-simpleDemo-tvOSTests.debug.xcconfig */;
1441 1560
 			buildSettings = {
1442 1561
 				BUNDLE_LOADER = "$(TEST_HOST)";
1443 1562
 				CLANG_ANALYZER_NONNULL = YES;
@@ -1447,16 +1566,10 @@
1447 1566
 				DEBUG_INFORMATION_FORMAT = dwarf;
1448 1567
 				ENABLE_TESTABILITY = YES;
1449 1568
 				GCC_NO_COMMON_BLOCKS = YES;
1450
-				HEADER_SEARCH_PATHS = (
1451
-					"$(inherited)",
1452
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1453
-				);
1569
+				HEADER_SEARCH_PATHS = "$(inherited)";
1454 1570
 				INFOPLIST_FILE = "simpleDemo-tvOSTests/Info.plist";
1455 1571
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1456
-				LIBRARY_SEARCH_PATHS = (
1457
-					"$(inherited)",
1458
-					"\"$(SRCROOT)/$(TARGET_NAME)\"",
1459
-				);
1572
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
1460 1573
 				OTHER_LDFLAGS = (
1461 1574
 					"-ObjC",
1462 1575
 					"-lc++",
@@ -1471,6 +1584,7 @@
1471 1584
 		};
1472 1585
 		2D02E49A1E0B4A5E006451C7 /* Release */ = {
1473 1586
 			isa = XCBuildConfiguration;
1587
+			baseConfigurationReference = 3D4E3D78CA5AFF0A0DE8400B /* Pods-simpleDemo-tvOSTests.release.xcconfig */;
1474 1588
 			buildSettings = {
1475 1589
 				BUNDLE_LOADER = "$(TEST_HOST)";
1476 1590
 				CLANG_ANALYZER_NONNULL = YES;
@@ -1480,16 +1594,10 @@
1480 1594
 				COPY_PHASE_STRIP = NO;
1481 1595
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
1482 1596
 				GCC_NO_COMMON_BLOCKS = YES;
1483
-				HEADER_SEARCH_PATHS = (
1484
-					"$(inherited)",
1485
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1486
-				);
1597
+				HEADER_SEARCH_PATHS = "$(inherited)";
1487 1598
 				INFOPLIST_FILE = "simpleDemo-tvOSTests/Info.plist";
1488 1599
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1489
-				LIBRARY_SEARCH_PATHS = (
1490
-					"$(inherited)",
1491
-					"\"$(SRCROOT)/$(TARGET_NAME)\"",
1492
-				);
1600
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
1493 1601
 				OTHER_LDFLAGS = (
1494 1602
 					"-ObjC",
1495 1603
 					"-lc++",
@@ -1529,7 +1637,6 @@
1529 1637
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
1530 1638
 				CLANG_WARN_UNREACHABLE_CODE = YES;
1531 1639
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
1532
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1533 1640
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
1534 1641
 				COPY_PHASE_STRIP = NO;
1535 1642
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -1583,7 +1690,6 @@
1583 1690
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
1584 1691
 				CLANG_WARN_UNREACHABLE_CODE = YES;
1585 1692
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
1586
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1587 1693
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
1588 1694
 				COPY_PHASE_STRIP = YES;
1589 1695
 				ENABLE_NS_ASSERTIONS = NO;

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

@@ -1,6 +1,6 @@
1 1
 <?xml version="1.0" encoding="UTF-8"?>
2 2
 <Scheme
3
-   LastUpgradeVersion = "0940"
3
+   LastUpgradeVersion = "1010"
4 4
    version = "1.3">
5 5
    <BuildAction
6 6
       parallelizeBuildables = "NO"

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

@@ -1,6 +1,6 @@
1 1
 <?xml version="1.0" encoding="UTF-8"?>
2 2
 <Scheme
3
-   LastUpgradeVersion = "0940"
3
+   LastUpgradeVersion = "1010"
4 4
    version = "1.3">
5 5
    <BuildAction
6 6
       parallelizeBuildables = "NO"

+ 1
- 1
samples/simpleDemo/ios/simpleDemo/AppDelegate.h View File

@@ -1,5 +1,5 @@
1 1
 /**
2
- * Copyright (c) 2015-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3 3
  *
4 4
  * This source code is licensed under the MIT license found in the
5 5
  * LICENSE file in the root directory of this source tree.

+ 3
- 7
samples/simpleDemo/ios/simpleDemo/AppDelegate.m View File

@@ -1,5 +1,5 @@
1 1
 /**
2
- * Copyright (c) 2015-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3 3
  *
4 4
  * This source code is licensed under the MIT license found in the
5 5
  * LICENSE file in the root directory of this source tree.
@@ -16,17 +16,13 @@
16 16
 {
17 17
   NSURL *jsCodeLocation;
18 18
 
19
-  #ifdef DEBUG
20
-    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
21
-  #else
22
-    jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
23
-  #endif
19
+  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
24 20
 
25 21
   RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
26 22
                                                       moduleName:@"simpleDemo"
27 23
                                                initialProperties:nil
28 24
                                                    launchOptions:launchOptions];
29
-  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
25
+  rootView.backgroundColor = [UIColor blackColor];
30 26
 
31 27
   self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
32 28
   UIViewController *rootViewController = [UIViewController new];

+ 4
- 4
samples/simpleDemo/ios/simpleDemo/Info.plist View File

@@ -37,12 +37,8 @@
37 37
 			</dict>
38 38
 		</dict>
39 39
 	</dict>
40
-	<key>NSCameraUsageDescription</key>
41
-	<string>use camera for agora video call</string>
42 40
 	<key>NSLocationWhenInUseUsageDescription</key>
43 41
 	<string></string>
44
-	<key>NSMicrophoneUsageDescription</key>
45
-	<string>use microphone for agora video call</string>
46 42
 	<key>UIBackgroundModes</key>
47 43
 	<array>
48 44
 		<string>audio</string>
@@ -61,5 +57,9 @@
61 57
 	</array>
62 58
 	<key>UIViewControllerBasedStatusBarAppearance</key>
63 59
 	<false/>
60
+	<key>NSCameraUsageDescription</key>
61
+	<string>use camera for avc</string>
62
+	<key>NSMicrophoneUsageDescription</key>
63
+	<string>use microphone for avc sdk</string>
64 64
 </dict>
65 65
 </plist>

+ 1
- 1
samples/simpleDemo/ios/simpleDemo/main.m View File

@@ -1,5 +1,5 @@
1 1
 /**
2
- * Copyright (c) 2015-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3 3
  *
4 4
  * This source code is licensed under the MIT license found in the
5 5
  * LICENSE file in the root directory of this source tree.

+ 1
- 1
samples/simpleDemo/ios/simpleDemoTests/simpleDemoTests.m View File

@@ -1,5 +1,5 @@
1 1
 /**
2
- * Copyright (c) 2015-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3 3
  *
4 4
  * This source code is licensed under the MIT license found in the
5 5
  * LICENSE file in the root directory of this source tree.

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


+ 3
- 3
samples/simpleDemo/package.json View File

@@ -11,14 +11,14 @@
11 11
     "test": "jest"
12 12
   },
13 13
   "dependencies": {
14
-    "react": "16.6.3",
15
-    "react-native": "0.57.8"
14
+    "react": "16.7.0",
15
+    "react-native": "0.58.3",
16
+    "react-native-agora": "file:../.."
16 17
   },
17 18
   "devDependencies": {
18 19
     "babel-jest": "23.6.0",
19 20
     "jest": "23.6.0",
20 21
     "metro-react-native-babel-preset": "0.51.1",
21
-    "react-native-agora": "^1.2.5",
22 22
     "react-test-renderer": "16.6.3"
23 23
   },
24 24
   "jest": {

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


+ 27
- 0
src/AgoraView.native.tsx View File

@@ -0,0 +1,27 @@
1
+import React from 'react';
2
+import {
3
+    requireNativeComponent,
4
+} from 'react-native'
5
+
6
+import {
7
+    AgoraViewProps
8
+} from "./types.d";
9
+
10
+const RCTAgoraView = requireNativeComponent("RCTAgoraView");
11
+
12
+export default class AgoraView extends React.Component<AgoraViewProps> {
13
+    public render(): JSX.Element {
14
+        return (
15
+            <RCTAgoraView { ...this.getHTMLProps() } />
16
+        )
17
+    }
18
+
19
+    private getHTMLProps(): AgoraViewProps {
20
+        let htmlProps = {} as AgoraViewProps;
21
+        for (let key in this.props) {
22
+            htmlProps[key] = this.props[key];
23
+        }
24
+        return htmlProps;
25
+    }
26
+}
27
+

+ 295
- 0
src/RtcEngine.native.ts View File

@@ -0,0 +1,295 @@
1
+import {
2
+    NativeModules,
3
+    NativeEventEmitter,
4
+    EmitterSubscription
5
+} from 'react-native';
6
+
7
+import {
8
+    Option, VideoOption,
9
+    EventScheduler,
10
+    PublisherConfig,
11
+    LiveTranscoding, Callback,
12
+    String, Number
13
+} from "./types.d";
14
+
15
+
16
+const { Agora } = NativeModules;
17
+const AgoraEventEmitter = new NativeEventEmitter(Agora);
18
+
19
+export default class RtcEngine {
20
+
21
+    private static listeners: Array<EmitterSubscription>;
22
+    static init(options: Option): void {
23
+        this.removeEmitter();
24
+        Agora.init(options);
25
+        this.listeners = [];
26
+    }
27
+
28
+    static joinChannel(channelName: String, uid?: Number, token?: String, info?: Object): void {
29
+        return Agora.joinChannel({channelName, uid, token, info});
30
+    }
31
+
32
+    static joinChannelWithToken(
33
+        channelName: string, token?: String, uid?: Number): void {
34
+        Agora.joinChannelWithToken(token, channelName, uid);
35
+    }
36
+
37
+    static eventEmitter(eventScheduler: EventScheduler) {
38
+        this.removeEmitter();
39
+        // const events = EventSchedulerKeys;
40
+        const events = [
41
+            "onWarning",
42
+            
43
+            "onError",
44
+            
45
+            "onJoinChannelSuccess",
46
+            
47
+            "onRejoinChannelSuccess",
48
+            
49
+            "onLeaveChannel",
50
+            
51
+            "onClientRoleChanged",
52
+            
53
+            "onUserJoined",
54
+            
55
+            "onUserOffline",
56
+            
57
+            "onConnectionStateChanged",
58
+            
59
+            "onConnectionInterrupted",
60
+            
61
+            "onConnectionLost",
62
+            
63
+            "onConnectionBanned",
64
+            
65
+            "onApiCallExecuted",
66
+            
67
+            "onTokenPrivilegeWillExpire",
68
+            
69
+            "onRequestToken",
70
+            
71
+            "onMicrophoneEnabled",
72
+            
73
+            "onAudioVolumeIndication",
74
+            
75
+            "onActiveSpeaker",
76
+            
77
+            "onFirstLocalAudioFrame",
78
+            
79
+            "onFirstRemoteAudioFrame",
80
+            
81
+            "onVideoStopped",
82
+            
83
+            "onFirstLocalVideoFrame",
84
+            
85
+            "onFirstRemoteVideoDecoded",
86
+            
87
+            "onFirstRemoteVideoFrame",
88
+            
89
+            "onUserMuteAudio",
90
+            
91
+            "onUserMuteVideo",
92
+            
93
+            "onUserEnableVideo",
94
+            
95
+            "onUserEnableLocalVideo",
96
+            
97
+            "onVideoSizeChanged",
98
+            
99
+            "onRemoteVideoStateChanged",
100
+            
101
+            "onLocalPublishFallbackToAudioOnly",
102
+            
103
+            "onRemoteSubscribeFallbackToAudioOnly",
104
+            
105
+            "onAudioRouteChanged",
106
+            
107
+            "onCameraReady",
108
+            
109
+            "onCameraFocusAreaChanged",
110
+            
111
+            "onCameraExposureAreaChanged",
112
+            
113
+            "onAudioQuality",
114
+            
115
+            "onRtcStats",
116
+            
117
+            "onLastmileQuality",
118
+            
119
+            "onNetworkQuality",
120
+            
121
+            "onLocalVideoStats",
122
+            
123
+            "onRemoteVideoStats",
124
+            
125
+            "onRemoteAudioStats",
126
+            
127
+            "onLocalVideoStat",
128
+            
129
+            "onRemoteVideoStat",
130
+            
131
+            "onRemoteAudioTransportStats",
132
+            
133
+            "onRemoteVideoTransportStats",
134
+            
135
+            "onAudioMixingFinished",
136
+            
137
+            "onAudioEffectFinished",
138
+            
139
+            "onStreamPublished",
140
+            
141
+            "onStreamUnpublished",
142
+            
143
+            "onTranscodingUpdated",
144
+            
145
+            "onStreamInjectedStatus",
146
+            
147
+            "onStreamMessage",
148
+            
149
+            "onStreamMessageError",
150
+            
151
+            "onMediaEngineLoadSuccess",
152
+            
153
+            "onMediaEngineStartCallSuccess",
154
+        ];
155
+        for (let event of events) {
156
+            const functor = (eventScheduler as any)[event];
157
+            if (functor) {
158
+                this.listeners.push(
159
+                    AgoraEventEmitter.addListener(event, msg => {
160
+                        functor(msg);
161
+                    })
162
+                );
163
+            }
164
+        }
165
+    }
166
+
167
+    static removeEmitter() {
168
+        if (this.listeners && this.listeners.length > 0) {
169
+            for (let listener of this.listeners) {
170
+                listener.remove();
171
+            }
172
+        }
173
+        this.listeners = [];
174
+    }
175
+
176
+    static enableLastmileTest() {
177
+        Agora.enableLastmileTest();
178
+    }
179
+
180
+    static disableLastmileTest() {
181
+        Agora.disableLastmileTest();
182
+    }
183
+
184
+    static leaveChannel() {
185
+        return Agora.leaveChannel();
186
+    }
187
+
188
+    static destroy() {
189
+        Agora.destroy();
190
+    }
191
+    
192
+    static setupLocalVideo(options: VideoOption) {
193
+        Agora.setupLocalVideo(options);
194
+    }
195
+
196
+    static setupRemoteVideo(options: VideoOption) {
197
+        Agora.setupRemoteVideo(options);
198
+    }
199
+
200
+    static startPreview() {
201
+        Agora.startPreview();
202
+    }
203
+
204
+    static stopPreview() {
205
+        Agora.stopPreview();
206
+    }
207
+
208
+    static configPublisher(options: PublisherConfig) {
209
+        Agora.configPublisher(options);
210
+    }
211
+
212
+    static setLiveTranscoding(options: LiveTranscoding) {
213
+        Agora.setLiveTranscoding(options);
214
+    }
215
+
216
+    static setLocalRenderMode(mode: number) {
217
+        Agora.setLocalRenderMode(mode);
218
+    }
219
+
220
+    static setRemoteRenderMode(mode: number) {
221
+        Agora.setRemoteRenderMode(mode);
222
+    }
223
+
224
+    static enableAudioVolumeIndication(interval: number, smooth: number) {
225
+        Agora.enableAudioVolumeIndication(interval, smooth);
226
+    }
227
+
228
+    static switchCamera() {
229
+        Agora.switchCamera();
230
+    }
231
+
232
+    static enableVideo() {
233
+        Agora.enableVideo();
234
+    }
235
+
236
+    static disableVideo() {
237
+        Agora.disableVideo();
238
+    }
239
+
240
+    static setEnableSpeakerphone(status: boolean) {
241
+        Agora.setEnableSpeakerphone(status);
242
+    }
243
+
244
+    static muteLocalAudioStream(status: boolean) {
245
+        Agora.muteLocalAudioStream(status);
246
+    }
247
+
248
+    static muteRemoteAudioStream(uid: number, status: boolean) {
249
+        Agora.muteRemoteAudioStream(uid, status);
250
+    }
251
+
252
+    static muteAllRemoteAudioStreams(status: boolean) {
253
+        Agora.muteAllRemoteAudioStreams(status);
254
+    }
255
+
256
+    static setCameraTorchOn(status: boolean) {
257
+        return Agora.setCameraTorchOn(status);
258
+    }
259
+
260
+    static setCameraAutoFocusFaceModeEnabled(status: boolean) {
261
+        Agora.setCameraAutoFocusFaceModeEnabled(status);
262
+    }
263
+
264
+    static setDefaultAudioRouteToSpeakerphone(status: boolean) {
265
+        Agora.setDefaultAudioRouteToSpeakerphone(status);
266
+    }
267
+
268
+    static muteLocalVideoStream(status: boolean) {
269
+        Agora.muteLocalVideoStream(status);
270
+    }
271
+
272
+    static enableLocalVideo(status: boolean) {
273
+        Agora.enableLocalVideo(status);
274
+    }
275
+
276
+    static muteAllRemoteVideoStreams(status: boolean) {
277
+        Agora.muteAllRemoteVideoStreams(status);
278
+    }
279
+
280
+    static muteRemoteVideoStream(uid: number, status: boolean) {
281
+        Agora.muteRemoteVideoStream(uid, status);
282
+    }
283
+
284
+    static createDataStream(reliable: boolean, ordered: boolean, callback: Callback<void>) {
285
+        Agora.createDataStream(reliable, ordered, callback);
286
+    }
287
+
288
+    static sendStreamMessage(streamId: number, data: any, callback: Callback<void>) {
289
+        Agora.sendStreamMessage(streamId, data, callback);
290
+    }
291
+
292
+    static getSdkVersion(callback: Callback<void>) {
293
+        Agora.getSdkVersion().then(callback);
294
+    }
295
+};

+ 2
- 0
src/index.ts View File

@@ -0,0 +1,2 @@
1
+export {default as AgoraView} from './AgoraView.native';
2
+export {default as RtcEngine} from './RtcEngine.native';

+ 289
- 0
src/types.d.ts View File

@@ -0,0 +1,289 @@
1
+import { View, ViewProps } from 'react-native';
2
+
3
+declare module "IAgora";
4
+
5
+export interface VideoEncoderConfig {
6
+  width: number,
7
+  height: number,
8
+  bitrate: number,
9
+  frameRate: number,
10
+  orientationMode: number,
11
+}
12
+
13
+export interface Option {
14
+  appid: String,
15
+  videoProfile: number
16
+  channelProfile: number,
17
+  videoEncoderConfig: VideoEncoderConfig,
18
+  clientRole: number,
19
+  audioProfile: number,
20
+  audioScenario: number
21
+}
22
+
23
+export interface PublisherConfig {
24
+  width: number,
25
+  height: number,
26
+  framerate: number,
27
+  bitrate: number,
28
+  defaultLayout: number,
29
+  lifeCycle: number,
30
+  pubishUrl: string,
31
+  rawStreamUrl: string,
32
+  extraInfo: String,
33
+  owner: boolean
34
+}
35
+
36
+export interface BackgroundImage {
37
+  url: string,
38
+  x: number,
39
+  y: number,
40
+  width: number,
41
+  height: number
42
+}
43
+
44
+export interface Rect {
45
+  x: number,
46
+  y: number,
47
+  width: number,
48
+  height: number
49
+}
50
+
51
+export interface Size {
52
+  width: number,
53
+  height: number
54
+}
55
+
56
+export interface TranscodingUser {
57
+  uid: number,
58
+  zOrder: number,
59
+  rect: Rect,
60
+  alpha: number,
61
+  audioChannel: number
62
+}
63
+
64
+export interface Color {
65
+  red: number,
66
+  green: number,
67
+  blue: number,
68
+  alpha: number
69
+}
70
+
71
+export interface LiveTranscoding {
72
+  size: Size,
73
+  videoBitrate: number,
74
+  videoFramerate: number,
75
+  lowLatency: boolean,
76
+  videoGop: number,
77
+  videoCodecProfile: number,
78
+  transcodingUsers: Array<TranscodingUser>,
79
+  transcodingExtraInfo: string,
80
+  watermark: BackgroundImage,
81
+  backgroundImage: BackgroundImage,
82
+  backgroundColor: Color,
83
+  audioSampleRate: number,
84
+  audioBitrate: number,
85
+  audioChannels: number,
86
+}
87
+
88
+export interface VideoOption {
89
+  uid: Number,
90
+  renderMode: number,
91
+  reactTag: number
92
+}
93
+
94
+export interface EventScheduler {
95
+  onWarning: Function,
96
+ 
97
+  onError: Function,
98
+   
99
+  onJoinChannelSuccess: Function,
100
+   
101
+  onRejoinChannelSuccess: Function,
102
+   
103
+  onLeaveChannel: Function,
104
+   
105
+  onClientRoleChanged: Function,
106
+   
107
+  onUserJoined: Function,
108
+   
109
+  onUserOffline: Function,
110
+   
111
+  onConnectionStateChanged: Function,
112
+   
113
+  onConnectionInterrupted?: Function,
114
+   
115
+  onConnectionLost: Function,
116
+   
117
+  onConnectionBanned: Function,
118
+   
119
+  onApiCallExecuted: Function,
120
+   
121
+  onTokenPrivilegeWillExpire: Function,
122
+   
123
+  onRequestToken: Function,
124
+   
125
+  onMicrophoneEnabled: Function,
126
+   
127
+  onAudioVolumeIndication: Function,
128
+   
129
+  onActiveSpeaker: Function,
130
+   
131
+  onFirstLocalAudioFrame: Function,
132
+   
133
+  onFirstRemoteAudioFrame: Function,
134
+   
135
+  onVideoStopped: Function,
136
+   
137
+  onFirstLocalVideoFrame: Function,
138
+   
139
+  onFirstRemoteVideoDecoded: Function,
140
+   
141
+  onFirstRemoteVideoFrame: Function,
142
+   
143
+  onUserMuteAudio: Function,
144
+   
145
+  onUserMuteVideo: Function,
146
+   
147
+  onUserEnableVideo: Function,
148
+   
149
+  onUserEnableLocalVideo: Function,
150
+   
151
+  onVideoSizeChanged: Function,
152
+   
153
+  onRemoteVideoStateChanged: Function,
154
+   
155
+  onLocalPublishFallbackToAudioOnly: Function,
156
+   
157
+  onRemoteSubscribeFallbackToAudioOnly: Function,
158
+   
159
+  onAudioRouteChanged: Function,
160
+   
161
+  onCameraReady: Function,
162
+   
163
+  onCameraFocusAreaChanged: Function,
164
+   
165
+  onCameraExposureAreaChanged: Function,
166
+   
167
+  onAudioQuality: Function,
168
+   
169
+  onRtcStats: Function,
170
+   
171
+  onLastmileQuality: Function,
172
+   
173
+  onNetworkQuality: Function,
174
+   
175
+  onLocalVideoStats: Function,
176
+   
177
+  onRemoteVideoStats: Function,
178
+   
179
+  onRemoteAudioStats: Function,
180
+   
181
+  onLocalVideoStat: Function,
182
+   
183
+  onRemoteVideoStat: Function,
184
+   
185
+  onRemoteAudioTransportStats: Function,
186
+   
187
+  onRemoteVideoTransportStats: Function,
188
+   
189
+  onAudioMixingFinished: Function,
190
+   
191
+  onAudioEffectFinished: Function,
192
+   
193
+  onStreamPublished: Function,
194
+   
195
+  onStreamUnpublished: Function,
196
+   
197
+  onTranscodingUpdated: Function,
198
+   
199
+  onStreamInjectedStatus: Function,
200
+   
201
+  onStreamMessage: Function,
202
+   
203
+  onStreamMessageError: Function,
204
+   
205
+  onMediaEngineLoadSuccess: Function,
206
+   
207
+  onMediaEngineStartCallSuccess: Function,
208
+  // onWarning: Function,
209
+  // onError: Function,
210
+  // onJoinChannelSuccess: Function,
211
+  // onRejoinChannelSuccess: Function,
212
+  // onLeaveChannel: Function,
213
+  // onApiCallExecute: Function,
214
+  // onClientRoleChanged: Function,
215
+  // onUserJoined: Function,
216
+  // onUserOffline: Function,
217
+  // onConnectionStateChanged: Function,
218
+  // onConnectionInterrupted: Function,
219
+  // onTokenPrivilegeWillExpire: Function,
220
+  // onRequestToken: Function,
221
+  
222
+  // DidMicrophoneEnabled: Function,
223
+  // ReportAudioVolumeIndicationOfSpeakers: Function,
224
+  // ActiveSpeaker: Function,
225
+  // FirstLocalAudioFrame: Function,
226
+  // FirstRemoteAudioFrameOfUid: Function,
227
+  // VideoDidStop: Function,
228
+  // FirstLocalVideoFrameWithSize: Function,
229
+  // FirstRemoteVideoDecodedOfUid: Function,
230
+  // FirstRemoteVideoFrameOfUid: Function,
231
+  // DidAudioMuted: Function,
232
+  // DidVideoMuted: Function,
233
+  // DidVideoEnabled: Function,
234
+  // DidLocalVideoEnabled: Function,
235
+  // VideoSizeChangedOfUid: Function,
236
+  // RemoteVideoStateChangedOfUid: Function,
237
+  // DidLocalPublishFallbackToAudioOnly: Function,
238
+  // DidRemoteSubscribeFallbackToAudioOnly: Function,
239
+  
240
+  // DeviceTypeStateChanged: Function,
241
+  // DidAudioRouteChanged: Function,
242
+  // CameraDidReady: Function,
243
+  // CameraFocusDidChangedToRect: Function,
244
+  // CameraExposureDidChangedToRect: Function,
245
+  
246
+  // ReportRtcStats: Function,
247
+  // LastmileQuality: Function,
248
+  // NetworkQuality: Function,
249
+  // LocalVideoStats: Function,
250
+  // RemoteVideoStats: Function,
251
+  // RemoteAudioStats: Function,
252
+  // AudioTransportStatsOfUid: Function,
253
+  // VideoTransportStatsOfUid: Function,
254
+  
255
+  // LocalAudioMixingDidFinish: Function,
256
+  // RemoteAudioMixingDidStart: Function,
257
+  // RemoteAudioMixingDidFinish: Function,
258
+  // DidAudioEffectFinish: Function,
259
+  
260
+  // StreamPublished: Function,
261
+  // StreamUnpublish: Function,
262
+  // TranscodingUpdated: Function,
263
+  
264
+  // StreamInjectedStatus: Function,
265
+  
266
+  // ReceiveStreamMessage: Function,
267
+  // DidOccurStreamMessageError: Function,
268
+  
269
+  // MediaEngineDidLoaded: Function,
270
+  // MediaEngineDidStartCall: Function,
271
+  
272
+  // ConnectionDidInterrupted: Function,
273
+  // ConnectionDidBanned: Function,
274
+  // AudioQualityOfUi: Function
275
+}
276
+
277
+export type Callback<T> = (err: any, data: any) => T;
278
+
279
+export type Nullable<T> = T | null | undefined;
280
+
281
+export type String = Nullable<string>;
282
+export type Number = Nullable<number> | 0;
283
+
284
+export interface AgoraViewProps extends ViewProps {
285
+  showLocalVideo: boolean,
286
+  remoteUid: Number,
287
+  zOrderMediaOverlay: boolean,
288
+  [key:string]: any;
289
+}

+ 23
- 0
tsconfig.json View File

@@ -0,0 +1,23 @@
1
+{
2
+  "compilerOptions": {
3
+    "types": [
4
+      "react",
5
+      "react-native"
6
+    ],
7
+    "target": "es2015",
8
+    "jsx": "react",
9
+    "moduleResolution": "node",
10
+    "sourceMap": true,
11
+    "importHelpers": true,
12
+    "outDir": "./lib",
13
+    "module": "commonjs",
14
+    "strict": true,
15
+    "allowSyntheticDefaultImports": true,
16
+    "esModuleInterop": true,
17
+    "lib": ["es2015"]
18
+  },
19
+  "compileOnSave": true,
20
+  "include": [
21
+    "src"
22
+  ]
23
+}

+ 6504
- 0
yarn.lock
File diff suppressed because it is too large
View File