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

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
 .project
58
 .project
59
 .settings
59
 .settings
60
 .classpath
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

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
 apply plugin: 'com.android.library'
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
 android {
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
     defaultConfig {
31
     defaultConfig {
8
         minSdkVersion 16
32
         minSdkVersion 16
9
-        targetSdkVersion 22
33
+        targetSdkVersion rootProject.hasProperty('targetSdkVersion') ? rootProject.targetSdkVersion : DEFAULT_TARGET_SDK_VERSION
10
         versionCode 1
34
         versionCode 1
11
         versionName "1.0"
35
         versionName "1.0"
12
 
36
 
19
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
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
 dependencies {
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
     implementation "com.facebook.react:react-native:+"
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

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

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

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
 package com.syan.agora;
1
 package com.syan.agora;
2
 
2
 
3
 import android.content.Context;
3
 import android.content.Context;
4
+import android.support.v7.widget.LinearLayoutCompat;
4
 import android.util.Log;
5
 import android.util.Log;
5
 import android.util.SparseArray;
6
 import android.util.SparseArray;
6
 import android.view.SurfaceView;
7
 import android.view.SurfaceView;
7
 
8
 
8
 import com.facebook.react.bridge.ReadableMap;
9
 import com.facebook.react.bridge.ReadableMap;
10
+import com.facebook.react.bridge.WritableMap;
9
 
11
 
10
 import java.util.ArrayList;
12
 import java.util.ArrayList;
11
 import java.util.List;
13
 import java.util.List;
14
+import java.util.Map;
12
 
15
 
13
 import io.agora.rtc.IRtcEngineEventHandler;
16
 import io.agora.rtc.IRtcEngineEventHandler;
14
 import io.agora.rtc.RtcEngine;
17
 import io.agora.rtc.RtcEngine;
15
 import io.agora.rtc.video.VideoCanvas;
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
  * Created by Leon on 2017/4/9.
25
  * Created by Leon on 2017/4/9.
45
         return sAgoraManager;
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
         this.context = context;
91
         this.context = context;
53
 
92
 
54
-        //创建RtcEngine对象,mRtcEventHandler为RtcEngine的回调
93
+        //create rtcEngine instance and setup rtcEngine eventHandler
55
         try {
94
         try {
56
             mRtcEngine = RtcEngine.create(context, options.getString("appid"), mRtcEventHandler);
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
         } catch (Exception e) {
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
         mRtcEngine.enableVideo();
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
         //创建一个SurfaceView用作视频预览
126
         //创建一个SurfaceView用作视频预览
74
         SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
127
         SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
75
         //将SurfaceView保存起来在SparseArray中,后续会将其加入界面。key为视频的用户id,这里是本地视频, 默认id是0
128
         //将SurfaceView保存起来在SparseArray中,后续会将其加入界面。key为视频的用户id,这里是本地视频, 默认id是0
78
 
131
 
79
         //设置本地视频,渲染模式选择VideoCanvas.RENDER_MODE_HIDDEN,如果选其他模式会出现视频不会填充满整个SurfaceView的情况,
132
         //设置本地视频,渲染模式选择VideoCanvas.RENDER_MODE_HIDDEN,如果选其他模式会出现视频不会填充满整个SurfaceView的情况,
80
         //具体渲染模式参考官方文档https://docs.agora.io/cn/user_guide/API/android_api.html#set-local-video-view-setuplocalvideo
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
         SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
139
         SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
88
         mSurfaceViews.put(uid, surfaceView);
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
     public void startPreview() {
192
     public void startPreview() {
118
         mRtcEngine.stopPreview();
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
     public void removeSurfaceView(int uid) {
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

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

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
-#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
 	objects = {
7
 	objects = {
8
 
8
 
9
 /* Begin PBXBuildFile section */
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
 		23AF28211EEFECD800D771AB /* RCTAgora.m in Sources */ = {isa = PBXBuildFile; fileRef = 23AF28201EEFECD800D771AB /* RCTAgora.m */; };
13
 		23AF28211EEFECD800D771AB /* RCTAgora.m in Sources */ = {isa = PBXBuildFile; fileRef = 23AF28201EEFECD800D771AB /* RCTAgora.m */; };
11
 		23AF28221EEFECD800D771AB /* RCTAgora.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 23AF281F1EEFECD800D771AB /* RCTAgora.h */; };
14
 		23AF28221EEFECD800D771AB /* RCTAgora.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 23AF281F1EEFECD800D771AB /* RCTAgora.h */; };
12
 		23C20DD11F0A6ED80095F60C /* AgoraConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 23C20DCC1F0A6ED80095F60C /* AgoraConst.m */; };
15
 		23C20DD11F0A6ED80095F60C /* AgoraConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 23C20DCC1F0A6ED80095F60C /* AgoraConst.m */; };
28
 /* End PBXCopyFilesBuildPhase section */
31
 /* End PBXCopyFilesBuildPhase section */
29
 
32
 
30
 /* Begin PBXFileReference section */
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
 		23AF281C1EEFECD800D771AB /* libRCTAgora.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTAgora.a; sourceTree = BUILT_PRODUCTS_DIR; };
37
 		23AF281C1EEFECD800D771AB /* libRCTAgora.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTAgora.a; sourceTree = BUILT_PRODUCTS_DIR; };
33
 		23AF281F1EEFECD800D771AB /* RCTAgora.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAgora.h; sourceTree = "<group>"; };
38
 		23AF281F1EEFECD800D771AB /* RCTAgora.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAgora.h; sourceTree = "<group>"; };
34
 		23AF28201EEFECD800D771AB /* RCTAgora.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAgora.m; sourceTree = "<group>"; };
39
 		23AF28201EEFECD800D771AB /* RCTAgora.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAgora.m; sourceTree = "<group>"; };
45
 			isa = PBXFrameworksBuildPhase;
50
 			isa = PBXFrameworksBuildPhase;
46
 			buildActionMask = 2147483647;
51
 			buildActionMask = 2147483647;
47
 			files = (
52
 			files = (
53
+				08B28CF72211239F00E57CEB /* AgoraRtcEngineKit.framework in Frameworks */,
54
+				085CF7D82204A7B7002075D5 /* libcrypto.a in Frameworks */,
55
+				085CF7D72204A7B7002075D5 /* AgoraRtcCryptoLoader.framework in Frameworks */,
48
 			);
56
 			);
49
 			runOnlyForDeploymentPostprocessing = 0;
57
 			runOnlyForDeploymentPostprocessing = 0;
50
 		};
58
 		};
51
 /* End PBXFrameworksBuildPhase section */
59
 /* End PBXFrameworksBuildPhase section */
52
 
60
 
53
 /* Begin PBXGroup section */
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
 		23AF28131EEFECD800D771AB = {
79
 		23AF28131EEFECD800D771AB = {
55
 			isa = PBXGroup;
80
 			isa = PBXGroup;
56
 			children = (
81
 			children = (
57
 				23AF281E1EEFECD800D771AB /* RCTAgora */,
82
 				23AF281E1EEFECD800D771AB /* RCTAgora */,
58
 				23AF281D1EEFECD800D771AB /* Products */,
83
 				23AF281D1EEFECD800D771AB /* Products */,
84
+				08B28CF52211239F00E57CEB /* Frameworks */,
59
 			);
85
 			);
60
 			sourceTree = "<group>";
86
 			sourceTree = "<group>";
61
 		};
87
 		};
70
 		23AF281E1EEFECD800D771AB /* RCTAgora */ = {
96
 		23AF281E1EEFECD800D771AB /* RCTAgora */ = {
71
 			isa = PBXGroup;
97
 			isa = PBXGroup;
72
 			children = (
98
 			children = (
73
-				23ACF47C1EF0CF9500801BC7 /* libs */,
99
+				085CF7D42204A787002075D5 /* libs */,
74
 				23C20DCB1F0A6ED80095F60C /* AgoraConst.h */,
100
 				23C20DCB1F0A6ED80095F60C /* AgoraConst.h */,
75
 				23C20DCC1F0A6ED80095F60C /* AgoraConst.m */,
101
 				23C20DCC1F0A6ED80095F60C /* AgoraConst.m */,
76
 				23C20DCD1F0A6ED80095F60C /* RCTAgoraVideoView.h */,
102
 				23C20DCD1F0A6ED80095F60C /* RCTAgoraVideoView.h */,
109
 		23AF28141EEFECD800D771AB /* Project object */ = {
135
 		23AF28141EEFECD800D771AB /* Project object */ = {
110
 			isa = PBXProject;
136
 			isa = PBXProject;
111
 			attributes = {
137
 			attributes = {
112
-				LastUpgradeCheck = 0830;
138
+				LastUpgradeCheck = 1010;
113
 				ORGANIZATIONNAME = Syan;
139
 				ORGANIZATIONNAME = Syan;
114
 				TargetAttributes = {
140
 				TargetAttributes = {
115
 					23AF281B1EEFECD800D771AB = {
141
 					23AF281B1EEFECD800D771AB = {
161
 				CLANG_CXX_LIBRARY = "libc++";
187
 				CLANG_CXX_LIBRARY = "libc++";
162
 				CLANG_ENABLE_MODULES = YES;
188
 				CLANG_ENABLE_MODULES = YES;
163
 				CLANG_ENABLE_OBJC_ARC = YES;
189
 				CLANG_ENABLE_OBJC_ARC = YES;
190
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
164
 				CLANG_WARN_BOOL_CONVERSION = YES;
191
 				CLANG_WARN_BOOL_CONVERSION = YES;
192
+				CLANG_WARN_COMMA = YES;
165
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
193
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
194
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
166
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
195
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
167
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
196
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
168
 				CLANG_WARN_EMPTY_BODY = YES;
197
 				CLANG_WARN_EMPTY_BODY = YES;
169
 				CLANG_WARN_ENUM_CONVERSION = YES;
198
 				CLANG_WARN_ENUM_CONVERSION = YES;
170
 				CLANG_WARN_INFINITE_RECURSION = YES;
199
 				CLANG_WARN_INFINITE_RECURSION = YES;
171
 				CLANG_WARN_INT_CONVERSION = YES;
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
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
204
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
205
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
206
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
173
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
207
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
174
 				CLANG_WARN_UNREACHABLE_CODE = YES;
208
 				CLANG_WARN_UNREACHABLE_CODE = YES;
175
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
209
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
210
 				CLANG_CXX_LIBRARY = "libc++";
244
 				CLANG_CXX_LIBRARY = "libc++";
211
 				CLANG_ENABLE_MODULES = YES;
245
 				CLANG_ENABLE_MODULES = YES;
212
 				CLANG_ENABLE_OBJC_ARC = YES;
246
 				CLANG_ENABLE_OBJC_ARC = YES;
247
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
213
 				CLANG_WARN_BOOL_CONVERSION = YES;
248
 				CLANG_WARN_BOOL_CONVERSION = YES;
249
+				CLANG_WARN_COMMA = YES;
214
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
250
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
251
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
215
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
252
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
216
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
253
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
217
 				CLANG_WARN_EMPTY_BODY = YES;
254
 				CLANG_WARN_EMPTY_BODY = YES;
218
 				CLANG_WARN_ENUM_CONVERSION = YES;
255
 				CLANG_WARN_ENUM_CONVERSION = YES;
219
 				CLANG_WARN_INFINITE_RECURSION = YES;
256
 				CLANG_WARN_INFINITE_RECURSION = YES;
220
 				CLANG_WARN_INT_CONVERSION = YES;
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
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
261
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
262
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
263
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
222
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
264
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
223
 				CLANG_WARN_UNREACHABLE_CODE = YES;
265
 				CLANG_WARN_UNREACHABLE_CODE = YES;
224
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
266
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
248
 			buildSettings = {
290
 			buildSettings = {
249
 				DEVELOPMENT_TEAM = 342K4Q49RK;
291
 				DEVELOPMENT_TEAM = 342K4Q49RK;
250
 				ENABLE_BITCODE = YES;
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
 				HEADER_SEARCH_PATHS = (
298
 				HEADER_SEARCH_PATHS = (
299
+					"$(inherited)",
253
 					"\"$(SRCROOT)/../../react-native/React\"/**",
300
 					"\"$(SRCROOT)/../../react-native/React\"/**",
254
 					"\"$(SRCROOT)/../../react-native/Libraries\"/**",
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
 				OTHER_LDFLAGS = "-ObjC";
310
 				OTHER_LDFLAGS = "-ObjC";
258
 				PRODUCT_NAME = "$(TARGET_NAME)";
311
 				PRODUCT_NAME = "$(TARGET_NAME)";
259
 				SKIP_INSTALL = YES;
312
 				SKIP_INSTALL = YES;
265
 			buildSettings = {
318
 			buildSettings = {
266
 				DEVELOPMENT_TEAM = 342K4Q49RK;
319
 				DEVELOPMENT_TEAM = 342K4Q49RK;
267
 				ENABLE_BITCODE = YES;
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
 				HEADER_SEARCH_PATHS = (
326
 				HEADER_SEARCH_PATHS = (
327
+					"$(inherited)",
270
 					"\"$(SRCROOT)/../../react-native/React\"/**",
328
 					"\"$(SRCROOT)/../../react-native/React\"/**",
271
 					"\"$(SRCROOT)/../../react-native/Libraries\"/**",
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
 				OTHER_LDFLAGS = "-ObjC";
338
 				OTHER_LDFLAGS = "-ObjC";
275
 				PRODUCT_NAME = "$(TARGET_NAME)";
339
 				PRODUCT_NAME = "$(TARGET_NAME)";
276
 				SKIP_INSTALL = YES;
340
 				SKIP_INSTALL = YES;

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

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
 
8
 
9
 #import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
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
 @interface AgoraConst : NSObject
81
 @interface AgoraConst : NSObject
12
 
82
 
13
 @property (nonatomic, copy) NSString *appid;
83
 @property (nonatomic, copy) NSString *appid;

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

12
 
12
 
13
 static AgoraConst *_person;
13
 static AgoraConst *_person;
14
 + (instancetype)allocWithZone:(struct _NSZone *)zone{
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
 + (instancetype)share {
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
 - (id)copyWithZone:(NSZone *)zone {
30
 - (id)copyWithZone:(NSZone *)zone {
31
-    return _person;
31
+  return _person;
32
 }
32
 }
33
 
33
 
34
-
35
-
36
 @end
34
 @end

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

9
 #import <Foundation/Foundation.h>
9
 #import <Foundation/Foundation.h>
10
 #import <UIKit/UIKit.h>
10
 #import <UIKit/UIKit.h>
11
 #import <React/RCTBridgeModule.h>
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
 @end
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
 @implementation RCTAgoraVideoView
11
 @implementation RCTAgoraVideoView
12
 
12
 
13
 - (instancetype)init{
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
 - (void)setShowLocalVideo:(BOOL)showLocalVideo {
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
 -(void)setRemoteUid:(NSInteger)remoteUid {
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
 @end
42
 @end

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

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

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

17
 RCT_EXPORT_VIEW_PROPERTY(remoteUid, NSInteger)
17
 RCT_EXPORT_VIEW_PROPERTY(remoteUid, NSInteger)
18
 
18
 
19
 - (UIView *)view {
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
 //  AgoraRtcCryptoLoader.h
2
 //  AgoraRtcCryptoLoader.h
3
 //  AgoraRtcCryptoLoader
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
 #import <Foundation/Foundation.h>
8
 #import <Foundation/Foundation.h>

+ 53
- 7
package.json View File

1
 {
1
 {
2
   "name": "react-native-agora",
2
   "name": "react-native-agora",
3
-  "version": "1.2.5",
3
+  "version": "2.3.3",
4
   "description": "声网Agora",
4
   "description": "声网Agora",
5
-  "main": "index.js",
5
+  "summary": "agora native sdk for react-native",
6
+  "main": "lib/index.js",
6
   "scripts": {
7
   "scripts": {
7
     "pu": "npm publish",
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
   "repository": {
13
   "repository": {
11
     "type": "git",
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
   "keywords": [
17
   "keywords": [
15
     "agora",
18
     "agora",
21
     "video",
24
     "video",
22
     "react-native-video"
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
   "license": "MIT",
31
   "license": "MIT",
26
   "bugs": {
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

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
 suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
67
 suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
68
 
68
 
69
 [version]
69
 [version]
70
-^0.78.0
70
+^0.86.0

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

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

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

8
 # - `buck install -r android/app` - compile, install and run application
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
 lib_deps = []
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
 android_library(
19
 android_library(
30
     name = "all-libs",
20
     name = "all-libs",

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

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

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

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

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

2
 
2
 
3
 buildscript {
3
 buildscript {
4
     ext {
4
     ext {
5
-        buildToolsVersion = "27.0.3"
5
+        buildToolsVersion = "28.0.2"
6
         minSdkVersion = 16
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
     repositories {
11
     repositories {
12
         google()
12
         google()
13
         jcenter()
13
         jcenter()
14
     }
14
     }
15
     dependencies {
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
         // NOTE: Do not place your application dependencies here; they belong
18
         // NOTE: Do not place your application dependencies here; they belong
19
         // in the individual module build.gradle files
19
         // in the individual module build.gradle files
34
 
34
 
35
 
35
 
36
 task wrapper(type: Wrapper) {
36
 task wrapper(type: Wrapper) {
37
-    gradleVersion = '4.4'
37
+    gradleVersion = '4.7'
38
     distributionUrl = distributionUrl.replace("bin", "all")
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
 distributionPath=wrapper/dists
2
 distributionPath=wrapper/dists
3
 zipStoreBase=GRADLE_USER_HOME
3
 zipStoreBase=GRADLE_USER_HOME
4
 zipStorePath=wrapper/dists
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

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

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

1
 import React, {Component, PureComponent} from 'react';
1
 import React, {Component, PureComponent} from 'react';
2
 import {
2
 import {
3
   StyleSheet, Text, View, TouchableOpacity,
3
   StyleSheet, Text, View, TouchableOpacity,
4
-  Image, Dimensions, Modal, Platform
4
+  Image, Dimensions, Modal, Platform, NativeModules
5
 } from 'react-native';
5
 } from 'react-native';
6
 
6
 
7
 import {RtcEngine, AgoraView} from 'react-native-agora';
7
 import {RtcEngine, AgoraView} from 'react-native-agora';
10
   isIphoneX, isIphoneXR
10
   isIphoneX, isIphoneXR
11
 } from '../utils';
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
 const BtnEndCall = () => require('../assets/btn_endcall.png');
27
 const BtnEndCall = () => require('../assets/btn_endcall.png');
14
 const BtnMute = () => require('../assets/btn_mute.png');
28
 const BtnMute = () => require('../assets/btn_mute.png');
15
 const BtnSpeaker = () => require('../assets/btn_speaker.png');
29
 const BtnSpeaker = () => require('../assets/btn_speaker.png');
86
   channelName: String,
100
   channelName: String,
87
   videoProfile: Number,
101
   videoProfile: Number,
88
   clientRole: Number,
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
   state = {
108
   state = {
95
     peerIds: [],
109
     peerIds: [],
96
     joinSucceed: false,
110
     joinSucceed: false,
109
       channelProfile: this.props.channelProfile,
123
       channelProfile: this.props.channelProfile,
110
       videoProfile: this.props.videoProfile,
124
       videoProfile: this.props.videoProfile,
111
       clientRole: this.props.clientRole,
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
     RtcEngine.init(config);
139
     RtcEngine.init(config);
116
   }
140
   }
117
 
141
 
121
     })
145
     })
122
 
146
 
123
     console.log('[joinChannel] ' + this.props.channelName);
147
     console.log('[joinChannel] ' + this.props.channelName);
124
-    RtcEngine.joinChannel(this.props.channelName);
148
+    RtcEngine.joinChannel(this.props.channelName, this.props.uid);
125
     RtcEngine.enableAudioVolumeIndication(500, 3);
149
     RtcEngine.enableAudioVolumeIndication(500, 3);
126
     RtcEngine.eventEmitter({
150
     RtcEngine.eventEmitter({
127
       onFirstRemoteVideoDecoded: (data) => {
151
       onFirstRemoteVideoDecoded: (data) => {
128
         console.log('[RtcEngine] onFirstRemoteVideoDecoded', data);
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
       onUserOffline: (data) => {
163
       onUserOffline: (data) => {
131
         console.log('[RtcEngine] onUserOffline', data);
164
         console.log('[RtcEngine] onUserOffline', data);
132
         this.setState({
165
         this.setState({
135
       },
168
       },
136
       onJoinChannelSuccess: (data) => {
169
       onJoinChannelSuccess: (data) => {
137
         console.log('[RtcEngine] onJoinChannelSuccess', data);
170
         console.log('[RtcEngine] onJoinChannelSuccess', data);
138
-        // RtcEngine.setShowLocalVideo()
139
         RtcEngine.startPreview();
171
         RtcEngine.startPreview();
140
         this.setState({
172
         this.setState({
141
           joinSucceed: true
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
         const {peerIds} = this.state;
175
         const {peerIds} = this.state;
150
-        if (peerIds.indexOf(data.uid) !== -1) {
176
+        if (peerIds.indexOf(data.uid) === -1) {
151
           this.setState({
177
           this.setState({
152
             peerIds: [...peerIds, data.uid]
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
       onError: (data) => {
188
       onError: (data) => {
157
         console.log('[RtcEngine] onError', data);
189
         console.log('[RtcEngine] onError', data);
158
         if (data.error === 17) {
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
   componentWillUnmount () {
200
   componentWillUnmount () {
168
-    RtcEngine.removeEmitter()
201
+    if (this.state.joinSucceed) {
202
+      RtcEngine.leaveChannel();
203
+      RtcEngine.destroy();
204
+    }
169
   }
205
   }
170
 
206
 
171
   handleCancel = () => {
207
   handleCancel = () => {
198
     this.setState({
234
     this.setState({
199
       isCameraTorch: !this.state.isCameraTorch
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

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

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
 		00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
13
 		00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
14
 		00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
14
 		00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
15
 		00E356F31AD99517003FC87E /* simpleDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* simpleDemoTests.m */; };
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
 		11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
25
 		11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
28
 		133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
26
 		133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
29
 		139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
27
 		139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
47
 		2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };
45
 		2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };
48
 		2DCD954D1E0B4F2C00145EB5 /* simpleDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* simpleDemoTests.m */; };
46
 		2DCD954D1E0B4F2C00145EB5 /* simpleDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* simpleDemoTests.m */; };
49
 		2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };
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
 		832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
51
 		832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
51
 		ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
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
 /* End PBXBuildFile section */
55
 /* End PBXBuildFile section */
54
 
56
 
55
 /* Begin PBXContainerItemProxy section */
57
 /* Begin PBXContainerItemProxy section */
95
 			remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
97
 			remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
96
 			remoteInfo = simpleDemo;
98
 			remoteInfo = simpleDemo;
97
 		};
99
 		};
98
-		083336B721E5C177007059A4 /* PBXContainerItemProxy */ = {
100
+		0842E3362206D244003875AC /* PBXContainerItemProxy */ = {
99
 			isa = PBXContainerItemProxy;
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
 			proxyType = 2;
131
 			proxyType = 2;
102
 			remoteGlobalIDString = 23AF281C1EEFECD800D771AB;
132
 			remoteGlobalIDString = 23AF281C1EEFECD800D771AB;
103
 			remoteInfo = RCTAgora;
133
 			remoteInfo = RCTAgora;
193
 			remoteGlobalIDString = 3D383D621EBD27B9005632C8;
223
 			remoteGlobalIDString = 3D383D621EBD27B9005632C8;
194
 			remoteInfo = "double-conversion-tvOS";
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
 		3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {
226
 		3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {
211
 			isa = PBXContainerItemProxy;
227
 			isa = PBXContainerItemProxy;
212
 			containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
228
 			containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
284
 			remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;
300
 			remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;
285
 			remoteInfo = "cxxreact-tvOS";
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
 		5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
303
 		5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
302
 			isa = PBXContainerItemProxy;
304
 			isa = PBXContainerItemProxy;
303
 			containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
305
 			containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
345
 		00E356EE1AD99517003FC87E /* simpleDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = simpleDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
347
 		00E356EE1AD99517003FC87E /* simpleDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = simpleDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
346
 		00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
348
 		00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
347
 		00E356F21AD99517003FC87E /* simpleDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = simpleDemoTests.m; sourceTree = "<group>"; };
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
 		139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
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
 		139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
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
 		13B07F961A680F5B00A75B9A /* simpleDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = simpleDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
364
 		13B07F961A680F5B00A75B9A /* simpleDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = simpleDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
370
 		2D02E47B1E0B4A5D006451C7 /* simpleDemo-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "simpleDemo-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
372
 		2D02E47B1E0B4A5D006451C7 /* simpleDemo-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "simpleDemo-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
371
 		2D02E4901E0B4A5D006451C7 /* simpleDemo-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "simpleDemo-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
373
 		2D02E4901E0B4A5D006451C7 /* simpleDemo-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "simpleDemo-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
372
 		2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };
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
 		5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
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
 		78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
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
 		832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
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
 		ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = "<group>"; };
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
 /* End PBXFileReference section */
392
 /* End PBXFileReference section */
379
 
393
 
380
 /* Begin PBXFrameworksBuildPhase section */
394
 /* Begin PBXFrameworksBuildPhase section */
383
 			buildActionMask = 2147483647;
397
 			buildActionMask = 2147483647;
384
 			files = (
398
 			files = (
385
 				140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,
399
 				140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,
400
+				EEEC06144F8951761B114A63 /* libPods-simpleDemoTests.a in Frameworks */,
386
 			);
401
 			);
387
 			runOnlyForDeploymentPostprocessing = 0;
402
 			runOnlyForDeploymentPostprocessing = 0;
388
 		};
403
 		};
390
 			isa = PBXFrameworksBuildPhase;
405
 			isa = PBXFrameworksBuildPhase;
391
 			buildActionMask = 2147483647;
406
 			buildActionMask = 2147483647;
392
 			files = (
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
 				ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,
418
 				ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,
405
 				11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,
419
 				11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,
406
 				146834051AC3E58100842450 /* libReact.a in Frameworks */,
420
 				146834051AC3E58100842450 /* libReact.a in Frameworks */,
413
 				832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
427
 				832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
414
 				00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
428
 				00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
415
 				139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
429
 				139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
416
-				FE3240808F774A3B8D6D68B2 /* libRCTAgora.a in Frameworks */,
430
+				75EFD1DDB6D7C688791C27A6 /* libPods-simpleDemo.a in Frameworks */,
417
 			);
431
 			);
418
 			runOnlyForDeploymentPostprocessing = 0;
432
 			runOnlyForDeploymentPostprocessing = 0;
419
 		};
433
 		};
429
 				2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,
443
 				2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,
430
 				2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,
444
 				2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,
431
 				2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,
445
 				2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,
446
+				813AD4D43E8DEAAF0478F6EF /* libPods-simpleDemo-tvOS.a in Frameworks */,
432
 			);
447
 			);
433
 			runOnlyForDeploymentPostprocessing = 0;
448
 			runOnlyForDeploymentPostprocessing = 0;
434
 		};
449
 		};
437
 			buildActionMask = 2147483647;
452
 			buildActionMask = 2147483647;
438
 			files = (
453
 			files = (
439
 				2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */,
454
 				2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */,
455
+				5A931A3C341570AA3E833874 /* libPods-simpleDemo-tvOSTests.a in Frameworks */,
440
 			);
456
 			);
441
 			runOnlyForDeploymentPostprocessing = 0;
457
 			runOnlyForDeploymentPostprocessing = 0;
442
 		};
458
 		};
502
 			name = "Supporting Files";
518
 			name = "Supporting Files";
503
 			sourceTree = "<group>";
519
 			sourceTree = "<group>";
504
 		};
520
 		};
505
-		0833368E21E5C173007059A4 /* Recovered References */ = {
521
+		0842E3102206D244003875AC /* Recovered References */ = {
506
 			isa = PBXGroup;
522
 			isa = PBXGroup;
507
 			children = (
523
 			children = (
508
-				579173BBF9FA4C0B85E6C677 /* libRCTAgora.a */,
509
 			);
524
 			);
510
 			name = "Recovered References";
525
 			name = "Recovered References";
511
 			sourceTree = "<group>";
526
 			sourceTree = "<group>";
512
 		};
527
 		};
513
-		083336B421E5C176007059A4 /* Products */ = {
528
+		08BFF1B82214766F00E0E165 /* Products */ = {
514
 			isa = PBXGroup;
529
 			isa = PBXGroup;
515
 			children = (
530
 			children = (
516
-				083336B821E5C177007059A4 /* libRCTAgora.a */,
531
+				08BFF1BC2214766F00E0E165 /* libRCTAgora.a */,
517
 			);
532
 			);
518
 			name = Products;
533
 			name = Products;
519
 			sourceTree = "<group>";
534
 			sourceTree = "<group>";
561
 				3DAD3EA71DF850E9000B6D8A /* libyoga.a */,
576
 				3DAD3EA71DF850E9000B6D8A /* libyoga.a */,
562
 				3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,
577
 				3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,
563
 				3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,
578
 				3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,
564
-				3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */,
565
-				3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */,
566
 				2DF0FFDF2056DD460020B375 /* libjsinspector.a */,
579
 				2DF0FFDF2056DD460020B375 /* libjsinspector.a */,
567
 				2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,
580
 				2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,
568
 				2DF0FFE32056DD460020B375 /* libthird-party.a */,
581
 				2DF0FFE32056DD460020B375 /* libthird-party.a */,
569
 				2DF0FFE52056DD460020B375 /* libthird-party.a */,
582
 				2DF0FFE52056DD460020B375 /* libthird-party.a */,
570
 				2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,
583
 				2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,
571
 				2DF0FFE92056DD460020B375 /* libdouble-conversion.a */,
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
 			name = Products;
590
 			name = Products;
576
 			sourceTree = "<group>";
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
 		2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
608
 		2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
579
 			isa = PBXGroup;
609
 			isa = PBXGroup;
580
 			children = (
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
 				2D16E6891FA4F8E400B85C8A /* libReact.a */,
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
 			name = Frameworks;
629
 			name = Frameworks;
595
 			sourceTree = "<group>";
630
 			sourceTree = "<group>";
615
 		832341AE1AAA6A7D00B99B32 /* Libraries */ = {
650
 		832341AE1AAA6A7D00B99B32 /* Libraries */ = {
616
 			isa = PBXGroup;
651
 			isa = PBXGroup;
617
 			children = (
652
 			children = (
653
+				08BFF1B72214766F00E0E165 /* RCTAgora.xcodeproj */,
618
 				5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,
654
 				5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,
619
 				146833FF1AC3E56700842450 /* React.xcodeproj */,
655
 				146833FF1AC3E56700842450 /* React.xcodeproj */,
620
 				00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
656
 				00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
627
 				832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
663
 				832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
628
 				00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
664
 				00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
629
 				139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
665
 				139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
630
-				040C0180048A4B0B9127DD27 /* RCTAgora.xcodeproj */,
631
 			);
666
 			);
632
 			name = Libraries;
667
 			name = Libraries;
633
 			sourceTree = "<group>";
668
 			sourceTree = "<group>";
649
 				00E356EF1AD99517003FC87E /* simpleDemoTests */,
684
 				00E356EF1AD99517003FC87E /* simpleDemoTests */,
650
 				83CBBA001A601CBA00E9B192 /* Products */,
685
 				83CBBA001A601CBA00E9B192 /* Products */,
651
 				2D16E6871FA4F8E400B85C8A /* Frameworks */,
686
 				2D16E6871FA4F8E400B85C8A /* Frameworks */,
652
-				0833368E21E5C173007059A4 /* Recovered References */,
687
+				0842E3102206D244003875AC /* Recovered References */,
688
+				1FE1E6BD58AC46ED69A01571 /* Pods */,
653
 			);
689
 			);
654
 			indentWidth = 2;
690
 			indentWidth = 2;
655
 			sourceTree = "<group>";
691
 			sourceTree = "<group>";
683
 			isa = PBXNativeTarget;
719
 			isa = PBXNativeTarget;
684
 			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "simpleDemoTests" */;
720
 			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "simpleDemoTests" */;
685
 			buildPhases = (
721
 			buildPhases = (
722
+				2D951AF5F54A943305AF47CE /* [CP] Check Pods Manifest.lock */,
686
 				00E356EA1AD99517003FC87E /* Sources */,
723
 				00E356EA1AD99517003FC87E /* Sources */,
687
 				00E356EB1AD99517003FC87E /* Frameworks */,
724
 				00E356EB1AD99517003FC87E /* Frameworks */,
688
 				00E356EC1AD99517003FC87E /* Resources */,
725
 				00E356EC1AD99517003FC87E /* Resources */,
701
 			isa = PBXNativeTarget;
738
 			isa = PBXNativeTarget;
702
 			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "simpleDemo" */;
739
 			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "simpleDemo" */;
703
 			buildPhases = (
740
 			buildPhases = (
741
+				0C0449DF546B8196AD640260 /* [CP] Check Pods Manifest.lock */,
704
 				13B07F871A680F5B00A75B9A /* Sources */,
742
 				13B07F871A680F5B00A75B9A /* Sources */,
705
 				13B07F8C1A680F5B00A75B9A /* Frameworks */,
743
 				13B07F8C1A680F5B00A75B9A /* Frameworks */,
706
 				13B07F8E1A680F5B00A75B9A /* Resources */,
744
 				13B07F8E1A680F5B00A75B9A /* Resources */,
719
 			isa = PBXNativeTarget;
757
 			isa = PBXNativeTarget;
720
 			buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "simpleDemo-tvOS" */;
758
 			buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "simpleDemo-tvOS" */;
721
 			buildPhases = (
759
 			buildPhases = (
760
+				6A62784F9CCD9039899ABD4F /* [CP] Check Pods Manifest.lock */,
722
 				2D02E4771E0B4A5D006451C7 /* Sources */,
761
 				2D02E4771E0B4A5D006451C7 /* Sources */,
723
 				2D02E4781E0B4A5D006451C7 /* Frameworks */,
762
 				2D02E4781E0B4A5D006451C7 /* Frameworks */,
724
 				2D02E4791E0B4A5D006451C7 /* Resources */,
763
 				2D02E4791E0B4A5D006451C7 /* Resources */,
737
 			isa = PBXNativeTarget;
776
 			isa = PBXNativeTarget;
738
 			buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "simpleDemo-tvOSTests" */;
777
 			buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "simpleDemo-tvOSTests" */;
739
 			buildPhases = (
778
 			buildPhases = (
779
+				08F266698EF8951602DE8B81 /* [CP] Check Pods Manifest.lock */,
740
 				2D02E48C1E0B4A5D006451C7 /* Sources */,
780
 				2D02E48C1E0B4A5D006451C7 /* Sources */,
741
 				2D02E48D1E0B4A5D006451C7 /* Frameworks */,
781
 				2D02E48D1E0B4A5D006451C7 /* Frameworks */,
742
 				2D02E48E1E0B4A5D006451C7 /* Resources */,
782
 				2D02E48E1E0B4A5D006451C7 /* Resources */,
801
 					ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
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
 					ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;
848
 					ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;
895
 			remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
935
 			remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
896
 			sourceTree = BUILT_PRODUCTS_DIR;
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
 			isa = PBXReferenceProxy;
967
 			isa = PBXReferenceProxy;
900
 			fileType = archive.ar;
968
 			fileType = archive.ar;
901
 			path = libRCTAgora.a;
969
 			path = libRCTAgora.a;
902
-			remoteRef = 083336B721E5C177007059A4 /* PBXContainerItemProxy */;
970
+			remoteRef = 08BFF1BB2214766F00E0E165 /* PBXContainerItemProxy */;
903
 			sourceTree = BUILT_PRODUCTS_DIR;
971
 			sourceTree = BUILT_PRODUCTS_DIR;
904
 		};
972
 		};
905
 		139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
973
 		139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
986
 			remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;
1054
 			remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;
987
 			sourceTree = BUILT_PRODUCTS_DIR;
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
 		3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
1057
 		3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
1004
 			isa = PBXReferenceProxy;
1058
 			isa = PBXReferenceProxy;
1005
 			fileType = archive.ar;
1059
 			fileType = archive.ar;
1077
 			remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;
1131
 			remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;
1078
 			sourceTree = BUILT_PRODUCTS_DIR;
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
 		5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {
1134
 		5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {
1095
 			isa = PBXReferenceProxy;
1135
 			isa = PBXReferenceProxy;
1096
 			fileType = archive.ar;
1136
 			fileType = archive.ar;
1175
 			);
1215
 			);
1176
 			runOnlyForDeploymentPostprocessing = 0;
1216
 			runOnlyForDeploymentPostprocessing = 0;
1177
 			shellPath = /bin/sh;
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
 		2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
1264
 		2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
1181
 			isa = PBXShellScriptBuildPhase;
1265
 			isa = PBXShellScriptBuildPhase;
1191
 			shellPath = /bin/sh;
1275
 			shellPath = /bin/sh;
1192
 			shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
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
 /* End PBXShellScriptBuildPhase section */
1322
 /* End PBXShellScriptBuildPhase section */
1195
 
1323
 
1196
 /* Begin PBXSourcesBuildPhase section */
1324
 /* Begin PBXSourcesBuildPhase section */
1258
 /* Begin XCBuildConfiguration section */
1386
 /* Begin XCBuildConfiguration section */
1259
 		00E356F61AD99517003FC87E /* Debug */ = {
1387
 		00E356F61AD99517003FC87E /* Debug */ = {
1260
 			isa = XCBuildConfiguration;
1388
 			isa = XCBuildConfiguration;
1389
+			baseConfigurationReference = 7C8CC895F34C3FFE167217AB /* Pods-simpleDemoTests.debug.xcconfig */;
1261
 			buildSettings = {
1390
 			buildSettings = {
1262
 				BUNDLE_LOADER = "$(TEST_HOST)";
1391
 				BUNDLE_LOADER = "$(TEST_HOST)";
1263
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1264
 				DEVELOPMENT_TEAM = 56968F5P8G;
1392
 				DEVELOPMENT_TEAM = 56968F5P8G;
1265
 				GCC_PREPROCESSOR_DEFINITIONS = (
1393
 				GCC_PREPROCESSOR_DEFINITIONS = (
1266
 					"DEBUG=1",
1394
 					"DEBUG=1",
1267
 					"$(inherited)",
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
 				INFOPLIST_FILE = simpleDemoTests/Info.plist;
1398
 				INFOPLIST_FILE = simpleDemoTests/Info.plist;
1274
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1399
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1275
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1402
 				OTHER_LDFLAGS = (
1281
 					"-ObjC",
1403
 					"-ObjC",
1282
 					"-lc++",
1404
 					"-lc++",
1289
 		};
1411
 		};
1290
 		00E356F71AD99517003FC87E /* Release */ = {
1412
 		00E356F71AD99517003FC87E /* Release */ = {
1291
 			isa = XCBuildConfiguration;
1413
 			isa = XCBuildConfiguration;
1414
+			baseConfigurationReference = 8C75CEB377545FED40C4F135 /* Pods-simpleDemoTests.release.xcconfig */;
1292
 			buildSettings = {
1415
 			buildSettings = {
1293
 				BUNDLE_LOADER = "$(TEST_HOST)";
1416
 				BUNDLE_LOADER = "$(TEST_HOST)";
1294
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1295
 				COPY_PHASE_STRIP = NO;
1417
 				COPY_PHASE_STRIP = NO;
1296
 				DEVELOPMENT_TEAM = 56968F5P8G;
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
 				INFOPLIST_FILE = simpleDemoTests/Info.plist;
1420
 				INFOPLIST_FILE = simpleDemoTests/Info.plist;
1302
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1421
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1303
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1424
 				OTHER_LDFLAGS = (
1309
 					"-ObjC",
1425
 					"-ObjC",
1310
 					"-lc++",
1426
 					"-lc++",
1317
 		};
1433
 		};
1318
 		13B07F941A680F5B00A75B9A /* Debug */ = {
1434
 		13B07F941A680F5B00A75B9A /* Debug */ = {
1319
 			isa = XCBuildConfiguration;
1435
 			isa = XCBuildConfiguration;
1436
+			baseConfigurationReference = B8AF77DEAE35976FF56DAC57 /* Pods-simpleDemo.debug.xcconfig */;
1320
 			buildSettings = {
1437
 			buildSettings = {
1321
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
1438
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
1322
 				CURRENT_PROJECT_VERSION = 1;
1439
 				CURRENT_PROJECT_VERSION = 1;
1323
 				DEAD_CODE_STRIPPING = NO;
1440
 				DEAD_CODE_STRIPPING = NO;
1324
 				DEVELOPMENT_TEAM = 56968F5P8G;
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
 				HEADER_SEARCH_PATHS = (
1446
 				HEADER_SEARCH_PATHS = (
1328
 					"$(inherited)",
1447
 					"$(inherited)",
1329
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1448
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1330
 				);
1449
 				);
1331
 				INFOPLIST_FILE = simpleDemo/Info.plist;
1450
 				INFOPLIST_FILE = simpleDemo/Info.plist;
1332
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1456
 				OTHER_LDFLAGS = (
1335
 					"$(inherited)",
1457
 					"$(inherited)",
1336
 					"-ObjC",
1458
 					"-ObjC",
1337
 					"-lc++",
1459
 					"-lc++",
1338
 				);
1460
 				);
1339
-				PRODUCT_BUNDLE_IDENTIFIER = com.tori.simpleDemo;
1461
+				PRODUCT_BUNDLE_IDENTIFIER = tori.mori.mobi;
1340
 				PRODUCT_NAME = simpleDemo;
1462
 				PRODUCT_NAME = simpleDemo;
1341
 				VERSIONING_SYSTEM = "apple-generic";
1463
 				VERSIONING_SYSTEM = "apple-generic";
1342
 			};
1464
 			};
1344
 		};
1466
 		};
1345
 		13B07F951A680F5B00A75B9A /* Release */ = {
1467
 		13B07F951A680F5B00A75B9A /* Release */ = {
1346
 			isa = XCBuildConfiguration;
1468
 			isa = XCBuildConfiguration;
1469
+			baseConfigurationReference = B76CA498082B698840FFCDE0 /* Pods-simpleDemo.release.xcconfig */;
1347
 			buildSettings = {
1470
 			buildSettings = {
1348
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
1471
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
1349
 				CURRENT_PROJECT_VERSION = 1;
1472
 				CURRENT_PROJECT_VERSION = 1;
1350
 				DEVELOPMENT_TEAM = 56968F5P8G;
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
 				HEADER_SEARCH_PATHS = (
1478
 				HEADER_SEARCH_PATHS = (
1354
 					"$(inherited)",
1479
 					"$(inherited)",
1355
-					"$(SRCROOT)/../node_modules/react-native-agora/ios/RCTAgora/**",
1480
+					"$(SRCROOT)/../node_modules/react-native-agora/ios/**",
1356
 				);
1481
 				);
1357
 				INFOPLIST_FILE = simpleDemo/Info.plist;
1482
 				INFOPLIST_FILE = simpleDemo/Info.plist;
1358
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1488
 				OTHER_LDFLAGS = (
1361
 					"$(inherited)",
1489
 					"$(inherited)",
1362
 					"-ObjC",
1490
 					"-ObjC",
1363
 					"-lc++",
1491
 					"-lc++",
1364
 				);
1492
 				);
1365
-				PRODUCT_BUNDLE_IDENTIFIER = com.tori.simpleDemo;
1493
+				PRODUCT_BUNDLE_IDENTIFIER = tori.mori.mobi;
1366
 				PRODUCT_NAME = simpleDemo;
1494
 				PRODUCT_NAME = simpleDemo;
1367
 				VERSIONING_SYSTEM = "apple-generic";
1495
 				VERSIONING_SYSTEM = "apple-generic";
1368
 			};
1496
 			};
1370
 		};
1498
 		};
1371
 		2D02E4971E0B4A5E006451C7 /* Debug */ = {
1499
 		2D02E4971E0B4A5E006451C7 /* Debug */ = {
1372
 			isa = XCBuildConfiguration;
1500
 			isa = XCBuildConfiguration;
1501
+			baseConfigurationReference = A8E3B1381976DA57BA54DF1C /* Pods-simpleDemo-tvOS.debug.xcconfig */;
1373
 			buildSettings = {
1502
 			buildSettings = {
1374
 				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
1503
 				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
1375
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
1504
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
1380
 				DEBUG_INFORMATION_FORMAT = dwarf;
1509
 				DEBUG_INFORMATION_FORMAT = dwarf;
1381
 				ENABLE_TESTABILITY = YES;
1510
 				ENABLE_TESTABILITY = YES;
1382
 				GCC_NO_COMMON_BLOCKS = YES;
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
 				INFOPLIST_FILE = "simpleDemo-tvOS/Info.plist";
1513
 				INFOPLIST_FILE = "simpleDemo-tvOS/Info.plist";
1388
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1516
 				OTHER_LDFLAGS = (
1394
 					"-ObjC",
1517
 					"-ObjC",
1395
 					"-lc++",
1518
 					"-lc++",
1404
 		};
1527
 		};
1405
 		2D02E4981E0B4A5E006451C7 /* Release */ = {
1528
 		2D02E4981E0B4A5E006451C7 /* Release */ = {
1406
 			isa = XCBuildConfiguration;
1529
 			isa = XCBuildConfiguration;
1530
+			baseConfigurationReference = A6331DF634CD310F84C3B9D0 /* Pods-simpleDemo-tvOS.release.xcconfig */;
1407
 			buildSettings = {
1531
 			buildSettings = {
1408
 				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
1532
 				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
1409
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
1533
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
1414
 				COPY_PHASE_STRIP = NO;
1538
 				COPY_PHASE_STRIP = NO;
1415
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
1539
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
1416
 				GCC_NO_COMMON_BLOCKS = YES;
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
 				INFOPLIST_FILE = "simpleDemo-tvOS/Info.plist";
1542
 				INFOPLIST_FILE = "simpleDemo-tvOS/Info.plist";
1422
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1545
 				OTHER_LDFLAGS = (
1428
 					"-ObjC",
1546
 					"-ObjC",
1429
 					"-lc++",
1547
 					"-lc++",
1438
 		};
1556
 		};
1439
 		2D02E4991E0B4A5E006451C7 /* Debug */ = {
1557
 		2D02E4991E0B4A5E006451C7 /* Debug */ = {
1440
 			isa = XCBuildConfiguration;
1558
 			isa = XCBuildConfiguration;
1559
+			baseConfigurationReference = 4F8422FC389657ECAE764F35 /* Pods-simpleDemo-tvOSTests.debug.xcconfig */;
1441
 			buildSettings = {
1560
 			buildSettings = {
1442
 				BUNDLE_LOADER = "$(TEST_HOST)";
1561
 				BUNDLE_LOADER = "$(TEST_HOST)";
1443
 				CLANG_ANALYZER_NONNULL = YES;
1562
 				CLANG_ANALYZER_NONNULL = YES;
1447
 				DEBUG_INFORMATION_FORMAT = dwarf;
1566
 				DEBUG_INFORMATION_FORMAT = dwarf;
1448
 				ENABLE_TESTABILITY = YES;
1567
 				ENABLE_TESTABILITY = YES;
1449
 				GCC_NO_COMMON_BLOCKS = YES;
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
 				INFOPLIST_FILE = "simpleDemo-tvOSTests/Info.plist";
1570
 				INFOPLIST_FILE = "simpleDemo-tvOSTests/Info.plist";
1455
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1573
 				OTHER_LDFLAGS = (
1461
 					"-ObjC",
1574
 					"-ObjC",
1462
 					"-lc++",
1575
 					"-lc++",
1471
 		};
1584
 		};
1472
 		2D02E49A1E0B4A5E006451C7 /* Release */ = {
1585
 		2D02E49A1E0B4A5E006451C7 /* Release */ = {
1473
 			isa = XCBuildConfiguration;
1586
 			isa = XCBuildConfiguration;
1587
+			baseConfigurationReference = 3D4E3D78CA5AFF0A0DE8400B /* Pods-simpleDemo-tvOSTests.release.xcconfig */;
1474
 			buildSettings = {
1588
 			buildSettings = {
1475
 				BUNDLE_LOADER = "$(TEST_HOST)";
1589
 				BUNDLE_LOADER = "$(TEST_HOST)";
1476
 				CLANG_ANALYZER_NONNULL = YES;
1590
 				CLANG_ANALYZER_NONNULL = YES;
1480
 				COPY_PHASE_STRIP = NO;
1594
 				COPY_PHASE_STRIP = NO;
1481
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
1595
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
1482
 				GCC_NO_COMMON_BLOCKS = YES;
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
 				INFOPLIST_FILE = "simpleDemo-tvOSTests/Info.plist";
1598
 				INFOPLIST_FILE = "simpleDemo-tvOSTests/Info.plist";
1488
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
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
 				OTHER_LDFLAGS = (
1601
 				OTHER_LDFLAGS = (
1494
 					"-ObjC",
1602
 					"-ObjC",
1495
 					"-lc++",
1603
 					"-lc++",
1529
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
1637
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
1530
 				CLANG_WARN_UNREACHABLE_CODE = YES;
1638
 				CLANG_WARN_UNREACHABLE_CODE = YES;
1531
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
1639
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
1532
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1533
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
1640
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
1534
 				COPY_PHASE_STRIP = NO;
1641
 				COPY_PHASE_STRIP = NO;
1535
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
1642
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
1583
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
1690
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
1584
 				CLANG_WARN_UNREACHABLE_CODE = YES;
1691
 				CLANG_WARN_UNREACHABLE_CODE = YES;
1585
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
1692
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
1586
-				CODE_SIGN_IDENTITY = "iPhone Developer";
1587
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
1693
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
1588
 				COPY_PHASE_STRIP = YES;
1694
 				COPY_PHASE_STRIP = YES;
1589
 				ENABLE_NS_ASSERTIONS = NO;
1695
 				ENABLE_NS_ASSERTIONS = NO;

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

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

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

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

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

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

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

1
 /**
1
 /**
2
- * Copyright (c) 2015-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
  *
3
  *
4
  * This source code is licensed under the MIT license found in the
4
  * This source code is licensed under the MIT license found in the
5
  * LICENSE file in the root directory of this source tree.
5
  * LICENSE file in the root directory of this source tree.
16
 {
16
 {
17
   NSURL *jsCodeLocation;
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
   RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
21
   RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
26
                                                       moduleName:@"simpleDemo"
22
                                                       moduleName:@"simpleDemo"
27
                                                initialProperties:nil
23
                                                initialProperties:nil
28
                                                    launchOptions:launchOptions];
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
   self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
27
   self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
32
   UIViewController *rootViewController = [UIViewController new];
28
   UIViewController *rootViewController = [UIViewController new];

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

37
 			</dict>
37
 			</dict>
38
 		</dict>
38
 		</dict>
39
 	</dict>
39
 	</dict>
40
-	<key>NSCameraUsageDescription</key>
41
-	<string>use camera for agora video call</string>
42
 	<key>NSLocationWhenInUseUsageDescription</key>
40
 	<key>NSLocationWhenInUseUsageDescription</key>
43
 	<string></string>
41
 	<string></string>
44
-	<key>NSMicrophoneUsageDescription</key>
45
-	<string>use microphone for agora video call</string>
46
 	<key>UIBackgroundModes</key>
42
 	<key>UIBackgroundModes</key>
47
 	<array>
43
 	<array>
48
 		<string>audio</string>
44
 		<string>audio</string>
61
 	</array>
57
 	</array>
62
 	<key>UIViewControllerBasedStatusBarAppearance</key>
58
 	<key>UIViewControllerBasedStatusBarAppearance</key>
63
 	<false/>
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
 </dict>
64
 </dict>
65
 </plist>
65
 </plist>

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

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

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

1
 /**
1
 /**
2
- * Copyright (c) 2015-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
  *
3
  *
4
  * This source code is licensed under the MIT license found in the
4
  * This source code is licensed under the MIT license found in the
5
  * LICENSE file in the root directory of this source tree.
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
     "test": "jest"
11
     "test": "jest"
12
   },
12
   },
13
   "dependencies": {
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
   "devDependencies": {
18
   "devDependencies": {
18
     "babel-jest": "23.6.0",
19
     "babel-jest": "23.6.0",
19
     "jest": "23.6.0",
20
     "jest": "23.6.0",
20
     "metro-react-native-babel-preset": "0.51.1",
21
     "metro-react-native-babel-preset": "0.51.1",
21
-    "react-native-agora": "^1.2.5",
22
     "react-test-renderer": "16.6.3"
22
     "react-test-renderer": "16.6.3"
23
   },
23
   },
24
   "jest": {
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

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

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

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

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

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

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