├── .DS_Store ├── .gradle ├── 7.1 │ ├── dependencies-accessors │ │ ├── dependencies-accessors.lock │ │ └── gc.properties │ ├── executionHistory │ │ ├── executionHistory.bin │ │ └── executionHistory.lock │ ├── fileChanges │ │ └── last-build.bin │ ├── fileHashes │ │ ├── fileHashes.bin │ │ ├── fileHashes.lock │ │ └── resourceHashesCache.bin │ └── gc.properties ├── 8.10 │ ├── checksums │ │ ├── checksums.lock │ │ └── sha1-checksums.bin │ ├── dependencies-accessors │ │ └── gc.properties │ ├── executionHistory │ │ ├── executionHistory.bin │ │ └── executionHistory.lock │ ├── fileChanges │ │ └── last-build.bin │ ├── fileHashes │ │ ├── fileHashes.bin │ │ ├── fileHashes.lock │ │ └── resourceHashesCache.bin │ └── gc.properties ├── buildOutputCleanup │ ├── buildOutputCleanup.lock │ ├── cache.properties │ └── outputFiles.bin ├── checksums │ └── checksums.lock ├── config.properties ├── file-system.probe ├── vcs-1 │ └── gc.properties └── vcsWorkingDirs │ └── gc.properties ├── .idea ├── AndroidProjectSystem.xml ├── caches │ ├── build_file_checksums.ser │ └── deviceStreaming.xml ├── codeStyles │ └── Project.xml ├── compiler.xml ├── deploymentTargetDropDown.xml ├── deploymentTargetSelector.xml ├── gradle.xml ├── jarRepositories.xml ├── libraries │ ├── Gradle__D.xml │ ├── Gradle__D__1_.xml │ ├── Gradle__androidx_annotation_annotation_1_0_0.xml │ ├── Gradle__androidx_appcompat_appcompat_1_0_0_aar.xml │ ├── Gradle__androidx_arch_core_core_common_2_0_0.xml │ ├── Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml │ ├── Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml │ ├── Gradle__androidx_cardview_cardview_1_0_0_aar.xml │ ├── Gradle__androidx_collection_collection_1_0_0.xml │ ├── Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml │ ├── Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3.xml │ ├── Gradle__androidx_coordinatorlayout_coordinatorlayout_1_0_0_aar.xml │ ├── Gradle__androidx_core_core_1_0_0_aar.xml │ ├── Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml │ ├── Gradle__androidx_customview_customview_1_0_0_aar.xml │ ├── Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml │ ├── Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml │ ├── Gradle__androidx_fragment_fragment_1_0_0_aar.xml │ ├── Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml │ ├── Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml │ ├── Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml │ ├── Gradle__androidx_lifecycle_lifecycle_common_2_0_0.xml │ ├── Gradle__androidx_lifecycle_lifecycle_extensions_2_0_0_aar.xml │ ├── Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml │ ├── Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml │ ├── Gradle__androidx_lifecycle_lifecycle_process_2_0_0_aar.xml │ ├── Gradle__androidx_lifecycle_lifecycle_runtime_2_0_0_aar.xml │ ├── Gradle__androidx_lifecycle_lifecycle_service_2_0_0_aar.xml │ ├── Gradle__androidx_lifecycle_lifecycle_viewmodel_2_0_0_aar.xml │ ├── Gradle__androidx_loader_loader_1_0_0_aar.xml │ ├── Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml │ ├── Gradle__androidx_print_print_1_0_0_aar.xml │ ├── Gradle__androidx_recyclerview_recyclerview_1_0_0_aar.xml │ ├── Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml │ ├── Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml │ ├── Gradle__androidx_test_core_1_2_0_aar.xml │ ├── Gradle__androidx_test_espresso_espresso_core_3_1_0_aar.xml │ ├── Gradle__androidx_test_espresso_espresso_idling_resource_3_1_0_aar.xml │ ├── Gradle__androidx_test_ext_junit_1_1_1_aar.xml │ ├── Gradle__androidx_test_monitor_1_2_0_aar.xml │ ├── Gradle__androidx_test_runner_1_1_0_aar.xml │ ├── Gradle__androidx_transition_transition_1_0_0_aar.xml │ ├── Gradle__androidx_vectordrawable_vectordrawable_1_0_0_aar.xml │ ├── Gradle__androidx_vectordrawable_vectordrawable_animated_1_0_0_aar.xml │ ├── Gradle__androidx_versionedparcelable_versionedparcelable_1_0_0_aar.xml │ ├── Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml │ ├── Gradle__com_google_android_material_material_1_0_0_aar.xml │ ├── Gradle__com_google_code_findbugs_jsr305_2_0_1.xml │ ├── Gradle__com_google_code_gson_gson_2_8_5.xml │ ├── Gradle__com_squareup_javawriter_2_1_1.xml │ ├── Gradle__com_squareup_okhttp3_okhttp_3_12_12.xml │ ├── Gradle__com_squareup_okio_okio_1_15_0.xml │ ├── Gradle__commons_logging_commons_logging_1_3_5.xml │ ├── Gradle__io_socket_engine_io_client_2_1_0.xml │ ├── Gradle__io_socket_socket_io_client_2_1_1.xml │ ├── Gradle__javax_inject_javax_inject_1.xml │ ├── Gradle__junit_junit_4_12.xml │ ├── Gradle__net_sf_kxml_kxml2_2_3_0.xml │ ├── Gradle__org_hamcrest_hamcrest_core_1_3.xml │ ├── Gradle__org_hamcrest_hamcrest_integration_1_3.xml │ ├── Gradle__org_hamcrest_hamcrest_library_1_3.xml │ ├── Gradle__org_jetbrains_annotations_13_0.xml │ ├── Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_8_0.xml │ └── Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_8_0.xml ├── migrations.xml ├── misc.xml ├── modules.xml ├── modules │ └── app │ │ ├── Multiparty-Video-Chat-Application-Sample-for-Android.app.androidTest.iml │ │ ├── Multiparty-Video-Chat-Application-Sample-for-Android.app.iml │ │ ├── Multiparty-Video-Chat-Application-Sample-for-Android.app.main.iml │ │ └── Multiparty-Video-Chat-Application-Sample-for-Android.app.unitTest.iml ├── runConfigurations.xml ├── vcs.xml └── workspace.xml ├── Multiparty-Video-Chat-Application-Sample-for-Android.iml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── libs │ ├── EnxRtcAndroid-release_2.3.24.aar │ └── libwebrtc.aar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── enablex │ │ └── multiconferencequickapp │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ │ └── com │ │ │ └── enablex │ │ │ └── multiconferencequickapp │ │ │ ├── ApplicationController.java │ │ │ ├── activity │ │ │ ├── DashboardActivity.java │ │ │ └── VideoConferenceActivity.java │ │ │ ├── adapter │ │ │ └── HorizontalViewAdapter.java │ │ │ ├── model │ │ │ ├── HorizontalViewModel.java │ │ │ ├── RoomModel.java │ │ │ ├── SIPData.java │ │ │ ├── SettingsData.java │ │ │ ├── UserDataModel.java │ │ │ └── UserModel.java │ │ │ ├── utilities │ │ │ └── OnDragTouchListener.java │ │ │ └── web_communication │ │ │ ├── WebCall.java │ │ │ ├── WebConstants.java │ │ │ └── WebResponse.java │ └── res │ │ ├── drawable-v24 │ │ └── mybutton.xml │ │ ├── drawable │ │ ├── background.xml │ │ ├── camera.png │ │ ├── disconnect.png │ │ ├── frame_border.xml │ │ ├── front_camera.xml │ │ ├── ic_videocam.xml │ │ ├── ic_videocam_off.xml │ │ ├── items_background.xml │ │ ├── logofront.png │ │ ├── mute.xml │ │ ├── mybutton.xml │ │ ├── rear_camera.xml │ │ ├── share.xml │ │ ├── transparent_bg.png │ │ ├── unmute.xml │ │ ├── volume_off.xml │ │ └── volume_on.xml │ │ ├── layout │ │ ├── activity_video_conference.xml │ │ ├── dashboard.xml │ │ ├── horizontalviewitem.xml │ │ └── radiogroup.xml │ │ ├── menu │ │ └── actions.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── enablex │ └── multiconferencequickapp │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.DS_Store -------------------------------------------------------------------------------- /.gradle/7.1/dependencies-accessors/dependencies-accessors.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/dependencies-accessors/dependencies-accessors.lock -------------------------------------------------------------------------------- /.gradle/7.1/dependencies-accessors/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/dependencies-accessors/gc.properties -------------------------------------------------------------------------------- /.gradle/7.1/executionHistory/executionHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/executionHistory/executionHistory.bin -------------------------------------------------------------------------------- /.gradle/7.1/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /.gradle/7.1/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/7.1/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/7.1/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/7.1/fileHashes/resourceHashesCache.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/fileHashes/resourceHashesCache.bin -------------------------------------------------------------------------------- /.gradle/7.1/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/7.1/gc.properties -------------------------------------------------------------------------------- /.gradle/8.10/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/checksums/checksums.lock -------------------------------------------------------------------------------- /.gradle/8.10/checksums/sha1-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/checksums/sha1-checksums.bin -------------------------------------------------------------------------------- /.gradle/8.10/dependencies-accessors/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/dependencies-accessors/gc.properties -------------------------------------------------------------------------------- /.gradle/8.10/executionHistory/executionHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/executionHistory/executionHistory.bin -------------------------------------------------------------------------------- /.gradle/8.10/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /.gradle/8.10/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/8.10/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/8.10/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/8.10/fileHashes/resourceHashesCache.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/fileHashes/resourceHashesCache.bin -------------------------------------------------------------------------------- /.gradle/8.10/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/8.10/gc.properties -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Thu Apr 03 11:20:59 IST 2025 2 | gradle.version=8.10 3 | -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/outputFiles.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/buildOutputCleanup/outputFiles.bin -------------------------------------------------------------------------------- /.gradle/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/checksums/checksums.lock -------------------------------------------------------------------------------- /.gradle/config.properties: -------------------------------------------------------------------------------- 1 | #Thu Apr 03 11:19:35 IST 2025 2 | java.home=C\:\\Program Files\\Android\\Android Studio\\jbr 3 | -------------------------------------------------------------------------------- /.gradle/file-system.probe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/file-system.probe -------------------------------------------------------------------------------- /.gradle/vcs-1/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/vcs-1/gc.properties -------------------------------------------------------------------------------- /.gradle/vcsWorkingDirs/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.gradle/vcsWorkingDirs/gc.properties -------------------------------------------------------------------------------- /.idea/AndroidProjectSystem.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | xmlns:android 11 | 12 | ^$ 13 | 14 | 15 | 16 |
17 |
18 | 19 | 20 | 21 | xmlns:.* 22 | 23 | ^$ 24 | 25 | 26 | BY_NAME 27 | 28 |
29 |
30 | 31 | 32 | 33 | .*:id 34 | 35 | http://schemas.android.com/apk/res/android 36 | 37 | 38 | 39 |
40 |
41 | 42 | 43 | 44 | .*:name 45 | 46 | http://schemas.android.com/apk/res/android 47 | 48 | 49 | 50 |
51 |
52 | 53 | 54 | 55 | name 56 | 57 | ^$ 58 | 59 | 60 | 61 |
62 |
63 | 64 | 65 | 66 | style 67 | 68 | ^$ 69 | 70 | 71 | 72 |
73 |
74 | 75 | 76 | 77 | .* 78 | 79 | ^$ 80 | 81 | 82 | BY_NAME 83 | 84 |
85 |
86 | 87 | 88 | 89 | .* 90 | 91 | http://schemas.android.com/apk/res/android 92 | 93 | 94 | ANDROID_ATTRIBUTE_ORDER 95 | 96 |
97 |
98 | 99 | 100 | 101 | .* 102 | 103 | .* 104 | 105 | 106 | BY_NAME 107 | 108 |
109 |
110 |
111 |
112 |
113 |
-------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/deploymentTargetSelector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__D.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__D__1_.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_annotation_annotation_1_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_appcompat_appcompat_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_arch_core_core_common_2_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_collection_collection_1_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_1_1_3_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_1_1_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_core_core_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_fragment_fragment_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_extensions_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_process_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_service_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_1_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_1_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_test_runner_1_1_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_transition_transition_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_google_android_material_material_1_0_0_aar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_google_code_gson_gson_2_8_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_12_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_squareup_okio_okio_1_15_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__commons_logging_commons_logging_1_3_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_socket_engine_io_client_2_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_socket_socket_io_client_2_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__javax_inject_javax_inject_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__junit_junit_4_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_8_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_8_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 26 | 45 | 46 | 47 | 48 | 49 | 50 | 52 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/modules/app/Multiparty-Video-Chat-Application-Sample-for-Android.app.androidTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /.idea/modules/app/Multiparty-Video-Chat-Application-Sample-for-Android.app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/modules/app/Multiparty-Video-Chat-Application-Sample-for-Android.app.main.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /.idea/modules/app/Multiparty-Video-Chat-Application-Sample-for-Android.app.unitTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 17 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Multiparty-Video-Chat-Application-Sample-for-Android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Multi-Party RTC: Android App with EnableX Android Toolkit 2 | 3 | Multi-Party RTC: A Sample Android App with EnableX Android Toolkit 4 | 5 | This is a Sample Android App that demonstrates the use of EnableX platform Video APIs (https://developer.enablex.io/docs/references/apis/video-api/index/) and Android Toolkit (https://developer.enablex.io/docs/references/sdks/video-sdk/android-sdk/index/) to build Multi-Party RTC (Real Time Communication) Application. It allows developers to ramp up on app development by hosting on their own devices. 6 | 7 | This App creates a virtual Room on the fly hosted on the Enablex platform using REST calls and uses the Room credentials (i.e. Room Id) to connect to the virtual Room as a mobile client. The same Room credentials can be shared with others to join the same virtual Room to carry out an RTC session. 8 | 9 | > EnableX Developer Center: https://developer.enablex.io/ 10 | 11 | ## 1. How to get started 12 | 13 | ### 1.1 Prerequisites 14 | 15 | #### 1.1.1 App Id and App Key 16 | 17 | * Register with EnableX [https://www.enablex.io/free-trial/] 18 | * Create your Application 19 | * Get your App ID and App Key delivered to your email 20 | 21 | 22 | #### 1.1.2 Sample Android Client 23 | 24 | * Clone or download this Repository [https://github.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android.git] 25 | 26 | 27 | #### 1.1.3 Test Application Server 28 | 29 | You need to set up an Application Server to provision Web Service API for your Android Application to enable Video Session. 30 | 31 | To help you to try our Android Application quickly, without having to set up Application Server, this Application is shipped pre-configured to work in a "try" mode with EnableX hosted Application Server i.e. https://demo.enablex.io. 32 | 33 | Our Application Server restricts a single Session duations to 10 minutes, and allows 1 moderator and not more than 3 participants in a Session. 34 | 35 | Once you tried EnableX Android Sample Application, you may need to set up your own Application Server and verify your Application to work with your Application Server. Refer to point 2 for more details on this 36 | 37 | 38 | 39 | #### 1.1.4 Configure Android Client 40 | 41 | * Open the App 42 | * Go to WebConstants and change the following: 43 | ``` 44 | /* To try the App with Enablex Hosted Service you need to set the kTry = true When you setup your own Application Service, set kTry = false */ 45 | 46 | public static final boolean kTry = true; 47 | 48 | /* Your Web Service Host URL. Keet the defined host when kTry = true */ 49 | 50 | String kBaseURL = "https://demo.enablex.io/" 51 | 52 | /* Your Application Credential required to try with EnableX Hosted Service 53 | When you setup your own Application Service, remove these */ 54 | 55 | String kAppId = "" 56 | String kAppkey = "" 57 | ``` 58 | 59 | 60 | ### 1.2 Test 61 | 62 | #### 1.2.1 Open the App 63 | 64 | * Open the App in your Device. You get a form to enter Credentials i.e. Name & Room Id. 65 | * You need to create a Room by clicking the "Create Room" button. 66 | * Once the Room Id is created, you can use it and share with others to connect to the Virtual Room to carry out an RTC Session either as a Moderator or a Participant (Choose applicable Role in the Form). 67 | 68 | Note: Only one user with Moderator Role allowed to connect to a Virtual Room while trying with EnableX Hosted Service. Your Own Application Server may allow upto 5 Moderators. 69 | 70 | Note:- In case of emulator/simulator your local stream will not create. It will create only on real device. 71 | 72 | ## 2 Set up Your Own Application Server 73 | 74 | You may need to set up your own Application Server after you tried the Sample Application with EnableX hosted Server. We have differnt variants of Application Server Sample Code. Pick one in your preferred language and follow instructions given in respective README.md file. 75 | 76 | * NodeJS: [https://github.com/EnableX/Video-Conferencing-Open-Source-Web-Application-Sample] 77 | * PHP: [https://github.com/EnableX/Group-Video-Call-Conferencing-Sample-Application-in-PHP] 78 | 79 | Note the following: 80 | * You need to use App ID and App Key to run this Service. 81 | * Your Android Client End Point needs to connect to this Service to create Virtual Room and Create Token to join the session. 82 | * Application Server is created using EnableX Server API, a Rest API Service helps in provisioning, session access and post-session reporting. 83 | 84 | To know more about Server API, go to: 85 | https://developer.enablex.io/docs/guides/video-guide/sample-codes/video-calling-app/#demo-application-server 86 | 87 | 88 | ## 3 Android Toolkit 89 | 90 | This Sample Application uses EnableX Android Toolkit to communicate with EnableX Servers to initiate and manage Real Time Communications. Please update your Application with latest version of EnableX Android Toolkit as and when a new release is available. 91 | 92 | * Documentation: https://developer.enablex.io/docs/references/sdks/video-sdk/android-sdk/index/ 93 | * Download Toolkit: https://developer.enablex.io/docs/references/sdks/video-sdk/android-sdk/index/ 94 | 95 | 96 | ## 4 Trial 97 | 98 | EnableX provides hosted Demo Application Server of different use-case for you to try out. 99 | 100 | Try a quick Video Call: https://demo.enablex.io/ 101 | 102 | Sign up for a free trial https://www.enablex.io/free-trial/ 103 | 104 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 34 5 | namespace 'com.enablex.multipartyquickapp' 6 | defaultConfig { 7 | applicationId 'com.enablex.multipartyquickapp' 8 | minSdkVersion 24 9 | targetSdkVersion 34 10 | versionCode 1 11 | versionName "1.1" 12 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' 13 | vectorDrawables.useSupportLibrary = true 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | compileOptions { 22 | sourceCompatibility JavaVersion.VERSION_1_8 23 | targetCompatibility JavaVersion.VERSION_1_8 24 | } 25 | lintOptions { 26 | disable 'RestrictedApi' 27 | } 28 | productFlavors { 29 | } 30 | ndkVersion '20.0.5594570' 31 | } 32 | 33 | dependencies { 34 | implementation fileTree(include: ['*.aar'], dir: 'libs') 35 | implementation 'androidx.appcompat:appcompat:1.0.0' 36 | implementation 'com.google.android.material:material:1.0.0' 37 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 38 | implementation 'androidx.vectordrawable:vectordrawable:1.0.0' 39 | testImplementation 'junit:junit:4.12' 40 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 41 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' 42 | 43 | implementation('io.socket:socket.io-client:2.1.1') { 44 | //Excluding org.json which is provided by Android 45 | exclude group: 'org.json', module: 'json' 46 | } 47 | implementation 'android.arch.lifecycle:extensions:1.1.1' 48 | implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' 49 | implementation 'com.google.code.gson:gson:2.8.5' 50 | implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.0" 51 | implementation("commons-logging:commons-logging:1.3.5") 52 | 53 | } 54 | -------------------------------------------------------------------------------- /app/libs/EnxRtcAndroid-release_2.3.24.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/app/libs/EnxRtcAndroid-release_2.3.24.aar -------------------------------------------------------------------------------- /app/libs/libwebrtc.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/app/libs/libwebrtc.aar -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/enablex/multiconferencequickapp/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.enablex.demo.demoenablex; 2 | 3 | import android.content.Context; 4 | import androidx.test.platform.app.InstrumentationRegistry; 5 | import androidx.test.ext.junit.runners.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.enablex.demo.demoenablex", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 26 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/ApplicationController.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp; 2 | 3 | import android.app.Activity; 4 | import android.app.Application; 5 | import android.content.ComponentCallbacks2; 6 | import android.content.Context; 7 | import android.content.SharedPreferences; 8 | import android.os.Bundle; 9 | 10 | public class ApplicationController extends Application implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 { 11 | public static Context context; 12 | 13 | public static SharedPreferences getSharedPrefs() { 14 | return context.getSharedPreferences("APP_PREF_MULTIPARTY", MODE_PRIVATE); 15 | } 16 | 17 | @Override 18 | public void onCreate() { 19 | super.onCreate(); 20 | context = this; 21 | } 22 | 23 | @Override 24 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 25 | 26 | } 27 | 28 | @Override 29 | public void onActivityStarted(Activity activity) { 30 | 31 | } 32 | 33 | @Override 34 | public void onActivityResumed(Activity activity) { 35 | 36 | } 37 | 38 | @Override 39 | public void onActivityPaused(Activity activity) { 40 | 41 | } 42 | 43 | @Override 44 | public void onActivityStopped(Activity activity) { 45 | 46 | } 47 | 48 | @Override 49 | public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 50 | 51 | } 52 | 53 | @Override 54 | public void onActivityDestroyed(Activity activity) { 55 | 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/activity/DashboardActivity.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.activity; 2 | 3 | import android.content.Intent; 4 | import android.content.SharedPreferences; 5 | import android.os.Bundle; 6 | 7 | import androidx.annotation.Nullable; 8 | import androidx.appcompat.app.AppCompatActivity; 9 | 10 | import android.util.Log; 11 | import android.view.Menu; 12 | import android.view.MenuInflater; 13 | import android.view.MenuItem; 14 | import android.view.View; 15 | import android.widget.Button; 16 | import android.widget.EditText; 17 | import android.widget.RadioGroup; 18 | import android.widget.Toast; 19 | 20 | import com.enablex.multiconferencequickapp.ApplicationController; 21 | import com.enablex.multiconferencequickapp.web_communication.WebCall; 22 | import com.enablex.multiconferencequickapp.web_communication.WebConstants; 23 | import com.enablex.multiconferencequickapp.web_communication.WebResponse; 24 | import com.enablex.multipartyquickapp.R; 25 | 26 | import org.json.JSONException; 27 | import org.json.JSONObject; 28 | 29 | public class DashboardActivity extends AppCompatActivity implements View.OnClickListener, WebResponse { 30 | private EditText name; 31 | private EditText roomId; 32 | private Button joinRoom; 33 | private Button createRoom; 34 | private String token; 35 | private SharedPreferences sharedPreferences; 36 | private String room_Id; 37 | private RadioGroup radioGroup; 38 | private String role = "moderator"; 39 | 40 | @Override 41 | protected void onCreate(@Nullable Bundle savedInstanceState) { 42 | super.onCreate(savedInstanceState); 43 | setContentView(R.layout.dashboard); 44 | getSupportActionBar().setTitle("QuickApp"); 45 | sharedPreferences = ApplicationController.getSharedPrefs(); 46 | setView(); 47 | setClickListener(); 48 | getSupportActionBar().setTitle("Quick App"); 49 | setSharedPreference(); 50 | } 51 | 52 | @Override 53 | public void onClick(View view) { 54 | int id=view.getId(); 55 | 56 | if(id== R.id.createRoom) { 57 | 58 | new WebCall(this, this, null, WebConstants.getRoomId, WebConstants.getRoomIdCode, false, true).execute(); 59 | 60 | } 61 | else if(id== R.id.joinRoom){ 62 | room_Id = roomId.getText().toString(); 63 | if (validations()) { 64 | validateRoomIDWebCall(); 65 | } 66 | 67 | } 68 | } 69 | 70 | private boolean validations() { 71 | if (name.getText().toString().isEmpty()) { 72 | Toast.makeText(this, "Please Enter name", Toast.LENGTH_SHORT).show(); 73 | return false; 74 | } else if (roomId.getText().toString().isEmpty()) { 75 | Toast.makeText(this, "Please create Room Id.", Toast.LENGTH_SHORT).show(); 76 | return false; 77 | } 78 | return true; 79 | } 80 | 81 | private void validateRoomIDWebCall() { 82 | new WebCall(this, this, null, WebConstants.validateRoomId + room_Id, WebConstants.validateRoomIdCode, true, false).execute(); 83 | } 84 | 85 | @Override 86 | public boolean onCreateOptionsMenu(Menu menu) { 87 | MenuInflater inflater = getMenuInflater(); 88 | inflater.inflate(R.menu.actions, menu); 89 | return true; 90 | } 91 | 92 | @Override 93 | public boolean onOptionsItemSelected(MenuItem item) { 94 | 95 | int id=item.getItemId(); 96 | if(id== R.id.action_share){ 97 | if (!name.getText().toString().equalsIgnoreCase("") && !roomId.getText().toString().equalsIgnoreCase("")) { 98 | String shareBody = "Hi,\n" + name.getText().toString() + " has invited you to join room with Room Id " + roomId.getText().toString(); 99 | Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 100 | sharingIntent.setType("text/plain"); 101 | sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here"); 102 | sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody); 103 | startActivity(sharingIntent); 104 | } else { 105 | Toast.makeText(this, "Please create Room first.", Toast.LENGTH_SHORT).show(); 106 | } 107 | 108 | } 109 | return super.onOptionsItemSelected(item); 110 | } 111 | 112 | @Override 113 | public void onWebResponse(String response, int callCode) { 114 | switch (callCode) { 115 | case WebConstants.getRoomIdCode: 116 | onGetRoomIdSuccess(response); 117 | break; 118 | case WebConstants.getTokenURLCode: 119 | onGetTokenSuccess(response); 120 | break; 121 | case WebConstants.validateRoomIdCode: 122 | onVaidateRoomIdSuccess(response); 123 | break; 124 | } 125 | 126 | } 127 | 128 | private void onVaidateRoomIdSuccess(String response) { 129 | Log.e("responsevalidate", response); 130 | try { 131 | JSONObject jsonObject = new JSONObject(response); 132 | if (jsonObject.optString("result").trim().equalsIgnoreCase("40001")) { 133 | Toast.makeText(this, jsonObject.optString("error"), Toast.LENGTH_SHORT).show(); 134 | } else { 135 | savePreferences(); 136 | getRoomTokenWebCall(); 137 | } 138 | } catch (JSONException e) { 139 | e.printStackTrace(); 140 | } 141 | 142 | } 143 | 144 | private void onGetTokenSuccess(String response) { 145 | Log.e("responseToken", response); 146 | 147 | try { 148 | JSONObject jsonObject = new JSONObject(response); 149 | if (jsonObject.optString("result").equalsIgnoreCase("0")) { 150 | token = jsonObject.optString("token"); 151 | Log.e("token", token); 152 | Intent intent = new Intent(DashboardActivity.this, VideoConferenceActivity.class); 153 | intent.putExtra("token", token); 154 | intent.putExtra("name", name.getText().toString()); 155 | startActivity(intent); 156 | } else { 157 | Toast.makeText(this, jsonObject.optString("error"), Toast.LENGTH_SHORT).show(); 158 | } 159 | } catch (JSONException e) { 160 | e.printStackTrace(); 161 | } 162 | } 163 | 164 | private void onGetRoomIdSuccess(String response) { 165 | Log.e("responseDashboard", response); 166 | 167 | try { 168 | JSONObject jsonObject = new JSONObject(response); 169 | room_Id = jsonObject.optJSONObject("room").optString("room_id"); 170 | } catch (JSONException e) { 171 | 172 | e.printStackTrace(); 173 | } 174 | 175 | runOnUiThread(new Runnable() { 176 | @Override 177 | public void run() { 178 | roomId.setText(room_Id); 179 | } 180 | }); 181 | } 182 | 183 | @Override 184 | public void onWebResponseError(String error, int callCode) { 185 | Log.e("errorDashboard", error); 186 | } 187 | 188 | private void setSharedPreference() { 189 | if (sharedPreferences != null) { 190 | if (!sharedPreferences.getString("name", "").isEmpty()) { 191 | name.setText(sharedPreferences.getString("name", "")); 192 | } 193 | if (!sharedPreferences.getString("room_id", "").isEmpty()) { 194 | roomId.setText(sharedPreferences.getString("room_id", "")); 195 | } 196 | } 197 | } 198 | 199 | private void setClickListener() { 200 | createRoom.setOnClickListener(this); 201 | joinRoom.setOnClickListener(this); 202 | radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 203 | @Override 204 | public void onCheckedChanged(RadioGroup radioGroup, int i) { 205 | if (i == 0) { 206 | role = "moderator"; 207 | } else { 208 | role = "participant"; 209 | } 210 | } 211 | }); 212 | } 213 | 214 | private void setView() { 215 | name = (EditText) findViewById(R.id.name); 216 | roomId = (EditText) findViewById(R.id.roomId); 217 | createRoom = (Button) findViewById(R.id.createRoom); 218 | joinRoom = (Button) findViewById(R.id.joinRoom); 219 | radioGroup = (RadioGroup) findViewById(R.id.radioButtonGroup); 220 | } 221 | 222 | private JSONObject jsonObjectToSend() { 223 | JSONObject jsonObject = new JSONObject(); 224 | try { 225 | jsonObject.put("name", "Test Dev Room"); 226 | jsonObject.put("settings", getSettingsObject()); 227 | jsonObject.put("data", getDataObject()); 228 | jsonObject.put("sip", getSIPObject()); 229 | jsonObject.put("owner_ref", "fadaADADAAee"); 230 | } catch (JSONException e) { 231 | e.printStackTrace(); 232 | } 233 | return jsonObject; 234 | } 235 | 236 | private JSONObject getSIPObject() { 237 | JSONObject jsonObject = new JSONObject(); 238 | return jsonObject; 239 | } 240 | 241 | private JSONObject getDataObject() { 242 | JSONObject jsonObject = new JSONObject(); 243 | try { 244 | jsonObject.put("name", name.getText().toString()); 245 | } catch (JSONException e) { 246 | e.printStackTrace(); 247 | } 248 | return jsonObject; 249 | } 250 | 251 | private JSONObject getSettingsObject() { 252 | JSONObject jsonObject = new JSONObject(); 253 | try { 254 | jsonObject.put("description", "Testing"); 255 | jsonObject.put("scheduled", false); 256 | jsonObject.put("scheduled_time", ""); 257 | jsonObject.put("duration", 50); 258 | jsonObject.put("participants", 10); 259 | jsonObject.put("billing_code", 1234); 260 | jsonObject.put("auto_recording", false); 261 | jsonObject.put("active_talker", true); 262 | jsonObject.put("quality", "HD"); 263 | jsonObject.put("wait_moderator", false); 264 | jsonObject.put("adhoc", false); 265 | jsonObject.put("mode", "group"); 266 | } catch (JSONException e) { 267 | e.printStackTrace(); 268 | } 269 | return jsonObject; 270 | } 271 | 272 | private void getRoomTokenWebCall() { 273 | JSONObject jsonObject = new JSONObject(); 274 | try { 275 | jsonObject.put("name", name.getText().toString()); 276 | jsonObject.put("role", role); 277 | jsonObject.put("user_ref", "2236"); 278 | jsonObject.put("roomId", room_Id); 279 | } catch (JSONException e) { 280 | e.printStackTrace(); 281 | } 282 | if (!name.getText().toString().isEmpty() && !roomId.getText().toString().isEmpty()) { 283 | new WebCall(this, this, jsonObject, WebConstants.getTokenURL, WebConstants.getTokenURLCode, false, false).execute(); 284 | } 285 | } 286 | 287 | 288 | private void savePreferences() { 289 | SharedPreferences.Editor editor = sharedPreferences.edit(); 290 | editor.putString("name", name.getText().toString()); 291 | editor.putString("room_id", room_Id); 292 | editor.commit(); 293 | 294 | } 295 | } 296 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/adapter/HorizontalViewAdapter.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.adapter; 2 | 3 | 4 | import android.content.Context; 5 | import androidx.recyclerview.widget.RecyclerView; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.RelativeLayout; 10 | import android.widget.TextView; 11 | import android.widget.Toast; 12 | 13 | import com.enablex.multiconferencequickapp.model.HorizontalViewModel; 14 | import com.enablex.multipartyquickapp.R; 15 | 16 | import java.util.List; 17 | 18 | import enx_rtc_android.Controller.EnxPlayerView; 19 | import enx_rtc_android.Controller.EnxStream; 20 | 21 | 22 | public class HorizontalViewAdapter extends RecyclerView.Adapter { 23 | 24 | private List streamArrayList; 25 | private Context context; 26 | int mHieght; 27 | int mWidth; 28 | boolean mSharedPrersentation; 29 | 30 | public HorizontalViewAdapter(List horizontalList, Context context, int hieght, int width, boolean sharedPresentation) { 31 | this.streamArrayList = horizontalList; 32 | this.context = context; 33 | this.mHieght = hieght; 34 | this.mWidth = width; 35 | this.mSharedPrersentation = sharedPresentation; 36 | } 37 | 38 | @Override 39 | public int getItemCount() { 40 | if (streamArrayList.size() > 0) { 41 | return streamArrayList.size(); 42 | } 43 | return 0; 44 | } 45 | 46 | @Override 47 | public int getItemViewType(int position) { 48 | return super.getItemViewType(position); 49 | } 50 | 51 | @Override 52 | public void onBindViewHolder(final MessageViewHolder holder, final int position) { 53 | final EnxStream enxStream = streamArrayList.get(position).getEnxStream(); 54 | final boolean isAudioOnly = streamArrayList.get(position).getEnxStream().isAudioOnlyStream(); 55 | MessageViewHolder messageViewHolder = (MessageViewHolder) holder; 56 | 57 | try { 58 | if (enxStream == null) { 59 | return; 60 | } 61 | boolean mScreen = enxStream.hasScreen(); 62 | EnxPlayerView enxPlayerView = streamArrayList.get(position).getEnxPlayerView(); 63 | enxPlayerView.setId(Integer.valueOf(enxStream.getId())); 64 | if (mScreen) { 65 | enxPlayerView.setScalingType(EnxPlayerView.ScalingType.SCALE_ASPECT_FIT);//SCALE_ASPECT_BALANCED for full view other waise FIT is actual size 66 | enxPlayerView.setTag("screen"); 67 | } else { 68 | enxPlayerView.setScalingType(EnxPlayerView.ScalingType.SCALE_ASPECT_BALANCED); 69 | enxPlayerView.setTag("not_screen"); 70 | } 71 | 72 | String name = enxStream.getName(); 73 | 74 | int count = messageViewHolder.relativeLayout.getChildCount(); 75 | if (count > 0) { 76 | TextView textView = null; 77 | View surfaceview = null; 78 | for (int i = 0; i < count; i++) { 79 | surfaceview = messageViewHolder.relativeLayout.getChildAt(i); 80 | if (surfaceview instanceof EnxPlayerView) { 81 | if (i == count - 1) { 82 | textView = (TextView) messageViewHolder.relativeLayout.getChildAt(i - 1); 83 | } else { 84 | textView = (TextView) messageViewHolder.relativeLayout.getChildAt(i + 1); 85 | } 86 | break; 87 | } else { 88 | surfaceview = null; 89 | textView = (TextView) messageViewHolder.relativeLayout.getChildAt(i); 90 | } 91 | } 92 | if (surfaceview != null) { 93 | EnxPlayerView sv = (EnxPlayerView) surfaceview; 94 | messageViewHolder.relativeLayout.removeView(sv); 95 | messageViewHolder.relativeLayout.removeView(textView); 96 | } else { 97 | messageViewHolder.relativeLayout.removeView(textView); 98 | } 99 | } 100 | 101 | if (mSharedPrersentation) { 102 | if (position == 0) { 103 | messageViewHolder.relativeLayout.setBackgroundColor(context.getResources().getColor(R.color.colorAccent)); 104 | } else { 105 | messageViewHolder.relativeLayout.setBackgroundColor(context.getResources().getColor(R.color.white)); 106 | } 107 | } else { 108 | messageViewHolder.relativeLayout.setBackgroundColor(context.getResources().getColor(R.color.white)); 109 | } 110 | 111 | messageViewHolder.relativeLayout.addView(enxPlayerView); 112 | 113 | if (enxStream.getMedia() != null) { 114 | enxStream.attachRenderer(enxPlayerView); 115 | } else { 116 | Toast.makeText(context, name + "null", Toast.LENGTH_SHORT).show(); 117 | } 118 | 119 | if (!isAudioOnly) { 120 | messageViewHolder.audioOnlyText.setVisibility(View.GONE); 121 | } else { 122 | messageViewHolder.audioOnlyText.setVisibility(View.VISIBLE); 123 | } 124 | 125 | TextView tv = new TextView(context); 126 | tv.setTextColor(context.getResources().getColor(R.color.green)); 127 | RelativeLayout.LayoutParams tvlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 128 | tvlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 129 | tvlp.addRule(RelativeLayout.CENTER_HORIZONTAL); 130 | tv.setLayoutParams(tvlp); 131 | if (name != null) { 132 | tv.setText(name); 133 | } 134 | messageViewHolder.relativeLayout.addView(tv); 135 | 136 | 137 | } catch (Exception e) { 138 | Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show(); 139 | } 140 | } 141 | 142 | public class MessageViewHolder extends RecyclerView.ViewHolder { 143 | 144 | RelativeLayout relativeLayout; 145 | TextView audioOnlyText; 146 | 147 | private MessageViewHolder(View view) { 148 | super(view); 149 | relativeLayout = (RelativeLayout) view.findViewById(R.id.imageView); 150 | audioOnlyText = (TextView) view.findViewById(R.id.audioonlyAdapterText); 151 | } 152 | } 153 | 154 | @Override 155 | public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 156 | View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontalviewitem, parent, false); 157 | return new MessageViewHolder(itemView); 158 | } 159 | 160 | public void setItems(List list) { 161 | this.streamArrayList = list; 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/model/HorizontalViewModel.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.model; 2 | 3 | import enx_rtc_android.Controller.EnxPlayerView; 4 | import enx_rtc_android.Controller.EnxStream; 5 | 6 | public class HorizontalViewModel { 7 | private EnxStream enxStream; 8 | private boolean isAudioOnly; 9 | private String mediaType; 10 | private EnxPlayerView enxPlayerView; 11 | 12 | public EnxStream getEnxStream() { 13 | return enxStream; 14 | } 15 | 16 | public void setEnxStream(EnxStream enxStream) { 17 | this.enxStream = enxStream; 18 | } 19 | 20 | public EnxPlayerView getEnxPlayerView() { 21 | return enxPlayerView; 22 | } 23 | 24 | public void setEnxPlayerView(EnxPlayerView enxPlayerView) { 25 | this.enxPlayerView = enxPlayerView; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/model/RoomModel.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.model; 2 | 3 | public class RoomModel { 4 | /** 5 | * result : 0 6 | * room : {"name":"Test Dev Room","owner_ref":"fadaADADAAee","settings":{"description":"Testing","mode":"lecture","scheduled":false,"adhoc":false,"participants":"10","billing_code":1234,"auto_recording":false,"active_talker":true,"quality":"HD"},"data":{"name":"Mayank"},"created":"2018-11-28T09:26:17.837Z","room_id":"5bfe5f39e9f8e16af7dd5b77"} 7 | */ 8 | 9 | private int result; 10 | private RoomData room; 11 | 12 | public int getResult() 13 | { 14 | return result; 15 | } 16 | 17 | public void setResult(int result) 18 | { 19 | this.result = result; 20 | } 21 | 22 | public RoomData getRoom() 23 | { 24 | return room; 25 | } 26 | 27 | public void setRoom(RoomData room) 28 | { 29 | this.room = room; 30 | } 31 | 32 | public static class RoomData 33 | { 34 | /** 35 | * name : Test Dev Room 36 | * owner_ref : fadaADADAAee 37 | * settings : {"description":"Testing","mode":"lecture","scheduled":false,"adhoc":false,"participants":"10","billing_code":1234,"auto_recording":false,"active_talker":true,"quality":"HD"} 38 | * data : {"name":"Mayank"} 39 | * created : 2018-11-28T09:26:17.837Z 40 | * room_id : 5bfe5f39e9f8e16af7dd5b77 41 | */ 42 | 43 | private String name; 44 | private String owner_ref; 45 | private SettingsData settings; 46 | private UserDataModel data; 47 | private String created; 48 | private String room_id; 49 | 50 | public String getName() 51 | { 52 | return name; 53 | } 54 | 55 | public void setName(String name) 56 | { 57 | this.name = name; 58 | } 59 | 60 | public String getOwner_ref() 61 | { 62 | return owner_ref; 63 | } 64 | 65 | public void setOwner_ref(String owner_ref) 66 | { 67 | this.owner_ref = owner_ref; 68 | } 69 | 70 | public SettingsData getSettings() 71 | { 72 | return settings; 73 | } 74 | 75 | public void setSettings(SettingsData settings) 76 | { 77 | this.settings = settings; 78 | } 79 | 80 | public UserDataModel getData() 81 | { 82 | return data; 83 | } 84 | 85 | public void setData(UserDataModel data) 86 | { 87 | this.data = data; 88 | } 89 | 90 | public String getCreated() 91 | { 92 | return created; 93 | } 94 | 95 | public void setCreated(String created) 96 | { 97 | this.created = created; 98 | } 99 | 100 | public String getRoom_id() 101 | { 102 | return room_id; 103 | } 104 | 105 | public void setRoom_id(String room_id) 106 | { 107 | this.room_id = room_id; 108 | } 109 | } 110 | 111 | /** 112 | * room_id : 5b9f8f3c6306115afd6a1f07 113 | * role : participant 114 | * mode : group 115 | */ 116 | 117 | 118 | } 119 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/model/SIPData.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.model; 2 | 3 | import java.util.List; 4 | 5 | public class SIPData 6 | { 7 | /** 8 | * enabled : true 9 | * uri : sip:292@192.168.200.116:5060 10 | * name : Mayank 11 | * auth : Yes 12 | * secret : No 13 | * aor : ["sip:292@192.168.200.116:5060","sip:292@192.168.200.116:5060"] 14 | */ 15 | 16 | private boolean enabled; 17 | private String uri; 18 | private String name; 19 | private String auth; 20 | private String secret; 21 | private List aor; 22 | 23 | public boolean isEnabled() 24 | { 25 | return enabled; 26 | } 27 | 28 | public void setEnabled(boolean enabled) 29 | { 30 | this.enabled = enabled; 31 | } 32 | 33 | public String getUri() 34 | { 35 | return uri; 36 | } 37 | 38 | public void setUri(String uri) 39 | { 40 | this.uri = uri; 41 | } 42 | 43 | public String getName() 44 | { 45 | return name; 46 | } 47 | 48 | public void setName(String name) 49 | { 50 | this.name = name; 51 | } 52 | 53 | public String getAuth() 54 | { 55 | return auth; 56 | } 57 | 58 | public void setAuth(String auth) 59 | { 60 | this.auth = auth; 61 | } 62 | 63 | public String getSecret() 64 | { 65 | return secret; 66 | } 67 | 68 | public void setSecret(String secret) 69 | { 70 | this.secret = secret; 71 | } 72 | 73 | public List getAor() 74 | { 75 | return aor; 76 | } 77 | 78 | public void setAor(List aor) 79 | { 80 | this.aor = aor; 81 | } 82 | } 83 | 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/model/SettingsData.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.model; 2 | 3 | import java.io.Serializable; 4 | 5 | public class SettingsData implements Serializable 6 | { 7 | 8 | /** 9 | * description : Testing 10 | * mode : lecture 11 | * scheduled : false 12 | * adhoc : false 13 | * participants : 10 14 | * billing_code : 1234 15 | * auto_recording : false 16 | * active_talker : true 17 | * quality : HD 18 | */ 19 | 20 | private String description; 21 | private String mode; 22 | private boolean scheduled; 23 | private boolean adhoc; 24 | private String participants; 25 | private int billing_code; 26 | private boolean auto_recording; 27 | private boolean active_talker; 28 | private String quality; 29 | 30 | public String getDescription() 31 | { 32 | return description; 33 | } 34 | 35 | public void setDescription(String description) 36 | { 37 | this.description = description; 38 | } 39 | 40 | public String getMode() 41 | { 42 | return mode; 43 | } 44 | 45 | public void setMode(String mode) 46 | { 47 | this.mode = mode; 48 | } 49 | 50 | public boolean isScheduled() 51 | { 52 | return scheduled; 53 | } 54 | 55 | public void setScheduled(boolean scheduled) 56 | { 57 | this.scheduled = scheduled; 58 | } 59 | 60 | public boolean isAdhoc() 61 | { 62 | return adhoc; 63 | } 64 | 65 | public void setAdhoc(boolean adhoc) 66 | { 67 | this.adhoc = adhoc; 68 | } 69 | 70 | public String getParticipants() 71 | { 72 | return participants; 73 | } 74 | 75 | public void setParticipants(String participants) 76 | { 77 | this.participants = participants; 78 | } 79 | 80 | public int getBilling_code() 81 | { 82 | return billing_code; 83 | } 84 | 85 | public void setBilling_code(int billing_code) 86 | { 87 | this.billing_code = billing_code; 88 | } 89 | 90 | public boolean isAuto_recording() 91 | { 92 | return auto_recording; 93 | } 94 | 95 | public void setAuto_recording(boolean auto_recording) 96 | { 97 | this.auto_recording = auto_recording; 98 | } 99 | 100 | public boolean isActive_talker() 101 | { 102 | return active_talker; 103 | } 104 | 105 | public void setActive_talker(boolean active_talker) 106 | { 107 | this.active_talker = active_talker; 108 | } 109 | 110 | public String getQuality() 111 | { 112 | return quality; 113 | } 114 | 115 | public void setQuality(String quality) 116 | { 117 | this.quality = quality; 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/model/UserDataModel.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.model; 2 | 3 | public class UserDataModel 4 | { 5 | 6 | 7 | /** 8 | * name : Mayank 9 | */ 10 | 11 | private String name; 12 | 13 | public String getName() 14 | { 15 | return name; 16 | } 17 | 18 | public void setName(String name) 19 | { 20 | this.name = name; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.model; 2 | 3 | public class UserModel { 4 | 5 | /** 6 | * name : moderator 7 | * user_ref : 2236 8 | * role : moderator 9 | * permissions : {"publish":true,"subscribe":true,"record":true,"stats":true,"controlhandlers":true} 10 | * clientId : bdacbfe9-0db9-4577-b0b0-d2538614a640 11 | */ 12 | 13 | private String name; 14 | private String user_ref; 15 | private String role; 16 | private PermissionsBean permissions; 17 | private String clientId; 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | public String getUser_ref() { 28 | return user_ref; 29 | } 30 | 31 | public void setUser_ref(String user_ref) { 32 | this.user_ref = user_ref; 33 | } 34 | 35 | public String getRole() { 36 | return role; 37 | } 38 | 39 | public void setRole(String role) { 40 | this.role = role; 41 | } 42 | 43 | public PermissionsBean getPermissions() { 44 | return permissions; 45 | } 46 | 47 | public void setPermissions(PermissionsBean permissions) { 48 | this.permissions = permissions; 49 | } 50 | 51 | public String getClientId() { 52 | return clientId; 53 | } 54 | 55 | public void setClientId(String clientId) { 56 | this.clientId = clientId; 57 | } 58 | 59 | public static class PermissionsBean { 60 | /** 61 | * publish : true 62 | * subscribe : true 63 | * record : true 64 | * stats : true 65 | * controlhandlers : true 66 | */ 67 | 68 | private boolean publish; 69 | private boolean subscribe; 70 | private boolean record; 71 | private boolean stats; 72 | private boolean controlhandlers; 73 | 74 | public boolean isPublish() { 75 | return publish; 76 | } 77 | 78 | public void setPublish(boolean publish) { 79 | this.publish = publish; 80 | } 81 | 82 | public boolean isSubscribe() { 83 | return subscribe; 84 | } 85 | 86 | public void setSubscribe(boolean subscribe) { 87 | this.subscribe = subscribe; 88 | } 89 | 90 | public boolean isRecord() { 91 | return record; 92 | } 93 | 94 | public void setRecord(boolean record) { 95 | this.record = record; 96 | } 97 | 98 | public boolean isStats() { 99 | return stats; 100 | } 101 | 102 | public void setStats(boolean stats) { 103 | this.stats = stats; 104 | } 105 | 106 | public boolean isControlhandlers() { 107 | return controlhandlers; 108 | } 109 | 110 | public void setControlhandlers(boolean controlhandlers) { 111 | this.controlhandlers = controlhandlers; 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/utilities/OnDragTouchListener.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.utilities; 2 | 3 | import android.view.MotionEvent; 4 | import android.view.View; 5 | 6 | public class OnDragTouchListener implements View.OnTouchListener { 7 | 8 | private View mView; 9 | private View mParent; 10 | private boolean isDragging; 11 | private boolean isInitialized = false; 12 | 13 | private int width; 14 | private float xWhenAttached; 15 | private float maxLeft; 16 | private float maxRight; 17 | private float dX; 18 | 19 | private int height; 20 | private float yWhenAttached; 21 | private float maxTop; 22 | private float maxBottom; 23 | private float dY; 24 | 25 | private OnDragActionListener mOnDragActionListener; 26 | 27 | public OnDragTouchListener(View view) { 28 | this(view, (View) view.getParent(), null); 29 | } 30 | 31 | public OnDragTouchListener(View view, View parent) { 32 | this(view, parent, null); 33 | } 34 | 35 | public OnDragTouchListener(View view, OnDragActionListener onDragActionListener) { 36 | this(view, (View) view.getParent(), onDragActionListener); 37 | } 38 | 39 | public OnDragTouchListener(View view, View parent, OnDragActionListener onDragActionListener) { 40 | initListener(view, parent); 41 | setOnDragActionListener(onDragActionListener); 42 | } 43 | 44 | public void setOnDragActionListener(OnDragActionListener onDragActionListener) { 45 | mOnDragActionListener = onDragActionListener; 46 | } 47 | 48 | @Override 49 | public boolean onTouch(View v, MotionEvent event) { 50 | if (isDragging) { 51 | float[] bounds = new float[4]; 52 | // LEFT 53 | bounds[0] = event.getRawX() + dX; 54 | if (bounds[0] < maxLeft) { 55 | bounds[0] = maxLeft; 56 | } 57 | // RIGHT 58 | bounds[2] = bounds[0] + width; 59 | if (bounds[2] > maxRight) { 60 | bounds[2] = maxRight; 61 | bounds[0] = bounds[2] - width; 62 | } 63 | // TOP 64 | bounds[1] = event.getRawY() + dY; 65 | if (bounds[1] < maxTop) { 66 | bounds[1] = maxTop; 67 | } 68 | // BOTTOM 69 | bounds[3] = bounds[1] + height; 70 | if (bounds[3] > maxBottom) { 71 | bounds[3] = maxBottom; 72 | bounds[1] = bounds[3] - height; 73 | } 74 | 75 | switch (event.getAction()) { 76 | case MotionEvent.ACTION_CANCEL: 77 | case MotionEvent.ACTION_UP: 78 | onDragFinish(); 79 | break; 80 | case MotionEvent.ACTION_MOVE: 81 | mView.animate().x(bounds[0]).y(bounds[1]).setDuration(0).start(); 82 | break; 83 | } 84 | return true; 85 | } else { 86 | switch (event.getAction()) { 87 | case MotionEvent.ACTION_DOWN: 88 | isDragging = true; 89 | if (!isInitialized) { 90 | updateBounds(); 91 | } 92 | dX = v.getX() - event.getRawX(); 93 | dY = v.getY() - event.getRawY(); 94 | if (mOnDragActionListener != null) { 95 | mOnDragActionListener.onDragStart(mView); 96 | } 97 | return true; 98 | } 99 | } 100 | return false; 101 | } 102 | 103 | 104 | public void initListener(View view, View parent) { 105 | mView = view; 106 | mParent = parent; 107 | isDragging = false; 108 | isInitialized = false; 109 | } 110 | 111 | public void updateBounds() { 112 | updateViewBounds(); 113 | updateParentBounds(); 114 | isInitialized = true; 115 | } 116 | 117 | public void updateViewBounds() { 118 | width = mView.getWidth(); 119 | xWhenAttached = mView.getX(); 120 | dX = 0; 121 | 122 | height = mView.getHeight(); 123 | yWhenAttached = mView.getY(); 124 | dY = 0; 125 | } 126 | 127 | public void updateParentBounds() { 128 | maxLeft = 0; 129 | maxRight = maxLeft + mParent.getWidth(); 130 | 131 | maxTop = 0; 132 | maxBottom = maxTop + mParent.getHeight(); 133 | } 134 | 135 | private void onDragFinish() { 136 | if (mOnDragActionListener != null) { 137 | mOnDragActionListener.onDragEnd(mView); 138 | } 139 | 140 | dX = 0; 141 | dY = 0; 142 | isDragging = false; 143 | } 144 | 145 | public interface OnDragActionListener { 146 | void onDragStart(View view); 147 | 148 | void onDragEnd(View view); 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/web_communication/WebCall.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.web_communication; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Context; 5 | import android.net.ConnectivityManager; 6 | import android.net.NetworkInfo; 7 | import android.os.AsyncTask; 8 | import android.util.Log; 9 | import android.widget.Toast; 10 | 11 | import org.json.JSONObject; 12 | 13 | import java.io.BufferedReader; 14 | import java.io.InputStream; 15 | import java.io.InputStreamReader; 16 | import java.io.OutputStream; 17 | import java.net.HttpURLConnection; 18 | import java.net.URL; 19 | import java.net.URLEncoder; 20 | import java.util.HashMap; 21 | import java.util.Map; 22 | 23 | 24 | public class WebCall extends AsyncTask { 25 | 26 | private static final String TAG = "WebCall"; 27 | private Context context; 28 | private WebResponse callback; 29 | private HashMap paramsMap; 30 | private String urlPath; 31 | private int callCode; 32 | private Boolean isShowDialog = true; 33 | private Boolean isGetCall = false; 34 | private Boolean isAuthenticated = false; 35 | private JSONObject object = null; 36 | ProgressDialog dialog; 37 | 38 | public WebCall(Context context, WebResponse callback, JSONObject object, 39 | String urlPath, int callCode, Boolean isGetCall, Boolean isAuthenticated) { 40 | this.context = context; 41 | this.callback = callback; 42 | this.object = object; 43 | this.urlPath = urlPath; 44 | this.callCode = callCode; 45 | this.isGetCall = isGetCall; 46 | this.isAuthenticated = isAuthenticated; 47 | } 48 | 49 | @Override 50 | protected void onPreExecute() { 51 | super.onPreExecute(); 52 | if (!checkIntenetConnection()) { 53 | 54 | return; 55 | } 56 | if (isShowDialog) { 57 | dialog = new ProgressDialog(context); 58 | dialog.setCancelable(false); 59 | dialog.show(); 60 | } 61 | } 62 | 63 | @Override 64 | protected String doInBackground(Void... params) { 65 | if (isGetCall) { 66 | return callGetCall(); 67 | } else { 68 | return callPostCallWithJSON(); 69 | } 70 | 71 | } 72 | 73 | private String callGetCall() { 74 | HttpURLConnection httpURLConnection = null; 75 | try { 76 | URL url = new URL(WebConstants.kBaseURL + urlPath + getDataForGetCall(paramsMap)); 77 | Log.e("Weburl", String.valueOf(url)); 78 | httpURLConnection = (HttpURLConnection) url.openConnection(); 79 | httpURLConnection.setReadTimeout(60000); 80 | httpURLConnection.setConnectTimeout(60000); 81 | httpURLConnection.setRequestMethod("GET"); 82 | 83 | if (WebConstants.kTry) { 84 | httpURLConnection.setRequestProperty("x-app-id", WebConstants.kAppId); 85 | httpURLConnection.setRequestProperty("x-app-key", WebConstants.kAppkey); 86 | } 87 | httpURLConnection.setRequestProperty("Content-Type", "application/json"); 88 | httpURLConnection.connect(); 89 | Log.e("responseCode", String.valueOf(httpURLConnection.getResponseCode())); 90 | if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_FORBIDDEN) { 91 | httpURLConnection.disconnect(); 92 | return "HTTP_FORBIDDEN"; 93 | } 94 | if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK || 95 | httpURLConnection.getResponseCode() == 422 || 96 | httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED || 97 | httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) { 98 | InputStream is = null; 99 | if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND || 100 | httpURLConnection.getResponseCode() == 422 || httpURLConnection.getResponseCode() == 401) { 101 | is = httpURLConnection.getErrorStream(); 102 | } else { 103 | is = httpURLConnection.getInputStream(); 104 | } 105 | BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 106 | StringBuilder builder = new StringBuilder(); 107 | String line = bufferedReader.readLine(); 108 | while (line != null) { 109 | builder.append(line + "\n"); 110 | line = bufferedReader.readLine(); 111 | } 112 | is.close(); 113 | if (httpURLConnection != null) { 114 | httpURLConnection.disconnect(); 115 | } 116 | return builder.toString(); 117 | } else { 118 | if (httpURLConnection != null) { 119 | httpURLConnection.disconnect(); 120 | } 121 | return "Invalid response from the server"; 122 | } 123 | } catch (Exception e) { 124 | e.printStackTrace(); 125 | } finally { 126 | if (httpURLConnection != null) { 127 | httpURLConnection.disconnect(); 128 | } 129 | } 130 | return null; 131 | } 132 | 133 | private String callPostCallWithJSON() { 134 | HttpURLConnection httpURLConnection = null; 135 | try { 136 | URL url = new URL(WebConstants.kBaseURL + urlPath); 137 | Log.e("Weburl", String.valueOf(url)); 138 | httpURLConnection = (HttpURLConnection) url.openConnection(); 139 | httpURLConnection.setReadTimeout(60000); 140 | httpURLConnection.setConnectTimeout(60000); 141 | httpURLConnection.setRequestMethod("POST"); 142 | httpURLConnection.setDoInput(true); 143 | httpURLConnection.setDoOutput(true); 144 | httpURLConnection.setRequestProperty("Content-Type", "application/json"); 145 | if (WebConstants.kTry) { 146 | httpURLConnection.setRequestProperty("x-app-id", WebConstants.kAppId); 147 | httpURLConnection.setRequestProperty("x-app-key", WebConstants.kAppkey); 148 | } 149 | httpURLConnection.connect(); 150 | OutputStream os = httpURLConnection.getOutputStream(); 151 | if (object != null) { 152 | Log.e("jsonObject", object.toString()); 153 | os.write(object.toString().getBytes()); 154 | os.flush(); 155 | os.close(); 156 | } 157 | Log.e("responseCode", String.valueOf(httpURLConnection.getResponseCode())); 158 | if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK || 159 | httpURLConnection.getResponseCode() == 422 || 160 | httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED || 161 | httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) { 162 | InputStream is = null; 163 | if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND || 164 | httpURLConnection.getResponseCode() == 422 || httpURLConnection.getResponseCode() == 401) { 165 | is = httpURLConnection.getErrorStream(); 166 | } else { 167 | is = httpURLConnection.getInputStream(); 168 | } 169 | BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 170 | StringBuilder builder = new StringBuilder(); 171 | String line = bufferedReader.readLine(); 172 | while (line != null) { 173 | builder.append(line + "\n"); 174 | line = bufferedReader.readLine(); 175 | } 176 | is.close(); 177 | if (httpURLConnection != null) { 178 | httpURLConnection.disconnect(); 179 | } 180 | return builder.toString(); 181 | } else { 182 | if (httpURLConnection != null) { 183 | httpURLConnection.disconnect(); 184 | } 185 | return "Invalid response from the server"; 186 | } 187 | } catch (Exception e) { 188 | e.printStackTrace(); 189 | } finally { 190 | if (httpURLConnection != null) { 191 | httpURLConnection.disconnect(); 192 | } 193 | } 194 | return null; 195 | } 196 | 197 | @Override 198 | protected void onPostExecute(String response) { 199 | super.onPostExecute(response); 200 | try { 201 | if (dialog != null && dialog.isShowing()) { 202 | dialog.dismiss(); 203 | } 204 | if (response == null) { 205 | Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show(); 206 | } else { 207 | Log.d(TAG, response); 208 | if (!response.isEmpty()) { 209 | callback.onWebResponse(response, callCode); 210 | } else { 211 | callback.onWebResponseError(response, callCode); 212 | } 213 | } 214 | } catch (Exception e) { 215 | e.printStackTrace(); 216 | } 217 | } 218 | 219 | private String getDataForGetCall(HashMap postparams) { 220 | StringBuilder builder = new StringBuilder(); 221 | int count = 0; 222 | if (postparams != null && postparams.size() > 0) { 223 | for (Map.Entry entry : postparams.entrySet()) { 224 | try { 225 | if (count == 0) { 226 | builder.append("?"); 227 | } else { 228 | builder.append("&"); 229 | } 230 | builder.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 231 | builder.append("="); 232 | builder.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 233 | count++; 234 | } catch (Exception e) { 235 | e.printStackTrace(); 236 | } 237 | } 238 | Log.d("Web Query", builder.toString()); 239 | return builder.toString(); 240 | } else { 241 | return ""; 242 | } 243 | } 244 | 245 | private boolean checkIntenetConnection() { 246 | ConnectivityManager connectivityManager = (ConnectivityManager) 247 | context.getSystemService(Context.CONNECTIVITY_SERVICE); 248 | NetworkInfo activeNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 249 | NetworkInfo activeNetInfoWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 250 | boolean isConnected = activeNetInfo != null && activeNetInfo.isConnectedOrConnecting() || activeNetInfoWifi != null && activeNetInfoWifi.isConnectedOrConnecting(); 251 | if (isConnected) { 252 | Log.i("NET", "connected" + isConnected); 253 | return true; 254 | } else { 255 | Log.i("NET", "disconnected" + isConnected); 256 | return false; 257 | } 258 | } 259 | 260 | } 261 | 262 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/web_communication/WebConstants.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.web_communication; 2 | 3 | public class WebConstants { 4 | 5 | 6 | /* To try the app with Enablex hosted service you need to set the kTry = true */ 7 | public static final boolean kTry = true; 8 | 9 | /*Your webservice host URL, Keet the defined host when kTry = true */ 10 | 11 | public static final String kBaseURL = "https://demo.enablex.io/"; 12 | 13 | /*The following information required, Only when kTry = true, When you hosted your own webservice remove these fileds*/ 14 | 15 | /*Use enablex portal to create your app and get these following credentials*/ 16 | public static final String kAppId = "App--ID"; 17 | public static final String kAppkey = "App--Key"; 18 | 19 | 20 | public static final String getRoomId = "createRoom/"; 21 | public static final int getRoomIdCode = 1; 22 | public static final String validateRoomId = "getRoom/"; 23 | public static final int validateRoomIdCode = 2; 24 | public static final String getTokenURL = "createToken/"; 25 | public static final int getTokenURLCode = 3; 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/enablex/multiconferencequickapp/web_communication/WebResponse.java: -------------------------------------------------------------------------------- 1 | package com.enablex.multiconferencequickapp.web_communication; 2 | 3 | public interface WebResponse { 4 | void onWebResponse(String response, int callCode); 5 | 6 | void onWebResponseError(String error, int callCode); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/mybutton.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/app/src/main/res/drawable/camera.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/disconnect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/app/src/main/res/drawable/disconnect.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/frame_border.xml: -------------------------------------------------------------------------------- 1 | 4 | 7 | 8 | 13 | 14 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/front_camera.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_videocam.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_videocam_off.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/items_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/logofront.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/app/src/main/res/drawable/logofront.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mute.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/mybutton.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rear_camera.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnableX/Multiparty-Video-Chat-Application-Sample-for-Android/629cb1779296907d15f065bb76ffa4df8f2568da/app/src/main/res/drawable/transparent_bg.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/unmute.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/volume_off.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/volume_on.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_video_conference.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 23 | 24 | 31 | 32 | 35 | 36 | 43 | 44 | 45 | 46 | 50 | 51 | 56 | 57 | 62 | 63 | 70 | 71 | 76 | 77 | 85 | 86 | 93 | 94 | 101 | 102 | 110 | 111 | 119 | 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dashboard.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 21 | 22 | 27 | 28 | 37 | 38 | 48 | 49 | 66 | 67 | 84 | 85 | 93 | 94 | 102 | 103 | 112 | 113 | 114 | 115 | 122 | 123 |