Skip to content

Commit

Permalink
feat: Implement RtcEngine plugin feature (#470)
Browse files Browse the repository at this point in the history
* feat: Implement RtcEngine plugin feature

* Remove unnecessary comments

* Remove unnecessary comments

* Resolve PR comment
  • Loading branch information
littleGnAl authored Oct 25, 2021
1 parent 1800a85 commit 9230a55
Show file tree
Hide file tree
Showing 29 changed files with 1,876 additions and 75 deletions.
33 changes: 24 additions & 9 deletions android/src/main/java/io/agora/rtc/base/RtcEngine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,20 @@ class IRtcEngine {
}
}

class RtcEngineManager(
private val emit: (methodName: String, data: Map<String, Any?>?) -> Unit
open class RtcEngineFactory {
open fun create(params: Map<String, *>, rtcEngineEventHandler: RtcEngineEventHandler): RtcEngine? {
val engine = RtcEngineEx.create(mapToRtcEngineConfig(params["config"] as Map<*, *>).apply {
mContext = params["context"] as Context
mEventHandler = rtcEngineEventHandler
})

return engine
}
}

open class RtcEngineManager(
private val emit: (methodName: String, data: Map<String, Any?>?) -> Unit,
private val rtcEngineFactory: RtcEngineFactory = RtcEngineFactory()
) : IRtcEngine.RtcEngineInterface {
var engine: RtcEngine? = null
private set
Expand All @@ -385,17 +397,20 @@ class RtcEngineManager(
}

override fun create(params: Map<String, *>, callback: Callback) {
engine = RtcEngineEx.create(mapToRtcEngineConfig(params["config"] as Map<*, *>).apply {
mContext = params["context"] as Context
mEventHandler = RtcEngineEventHandler { methodName, data ->
emit(methodName, data)
}
engine = rtcEngineFactory.create(params, RtcEngineEventHandler { methodName, data ->
emit(methodName, data)
})
callback.code((engine as RtcEngineEx).setAppType((params["appType"] as Number).toInt()))
callback.code((engine as RtcEngineEx).setAppType((params["appType"] as Number).toInt())) {
RtcEngineRegistry.instance.onRtcEngineCreated(engine)
it
}
}

override fun destroy(callback: Callback) {
callback.resolve(engine) { release() }
callback.resolve(engine) {
release()
RtcEngineRegistry.instance.onRtcEngineDestroyed()
}
}

override fun setChannelProfile(params: Map<String, *>, callback: Callback) {
Expand Down
44 changes: 44 additions & 0 deletions android/src/main/java/io/agora/rtc/base/RtcEnginePlugin.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package io.agora.rtc.base

import io.agora.rtc.RtcEngine

/**
* A [RtcEnginePlugin] allows developers to interact with the [RtcEngine] which created from flutter
* side.
*/
interface RtcEnginePlugin {

/**
* This callback will be called when the [RtcEngine] is created by
* [RtcEngine.createWithContext](https://docs.agora.io/cn/Video/API%20Reference/flutter/agora_rtc_engine/RtcEngine/createWithContext.html)
* function from flutter.
*
* @param rtcEngine The same [RtcEngine] used by flutter side
*/
fun onRtcEngineCreated(rtcEngine: RtcEngine?)

/**
* This callback will be called when the [RtcEngine.destroy](https://docs.agora.io/cn/Video/API%20Reference/flutter/v4.0.7/rtc_channel/RtcChannel/destroy.html)
* function is called from flutter.
*/
fun onRtcEngineDestroyed()

companion object Registrant {
/**
* Register a [RtcEnginePlugin]. The [plugin] will be called when the [RtcEngine] is created from
* flutter side.
*/
fun register(plugin: RtcEnginePlugin) {
RtcEngineRegistry.instance.add(plugin = plugin)
}

/**
* Unregister a previously registered [RtcEnginePlugin].
*/
fun unregister(plugin: RtcEnginePlugin) {
RtcEngineRegistry.instance.remove(pluginClass = plugin.javaClass)
}
}
}


43 changes: 43 additions & 0 deletions android/src/main/java/io/agora/rtc/base/RtcEngineRegistry.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package io.agora.rtc.base

import io.agora.rtc.RtcEngine
import java.util.HashMap

/**
* The [RtcEngineRegistry] is response to add, remove and notify the callback when [RtcEngine] is created
* from flutter side.
*/
internal class RtcEngineRegistry private constructor() : RtcEnginePlugin {
companion object {
val instance: RtcEngineRegistry by lazy { RtcEngineRegistry() }
}

private val plugins: MutableMap<Class<out RtcEnginePlugin>, RtcEnginePlugin> = HashMap()

/**
* Add a [RtcEnginePlugin].
*/
fun add(plugin: RtcEnginePlugin) {
if (plugins.containsKey(plugin.javaClass)) return
plugins[plugin.javaClass] = plugin
}

/**
* Remove the previously added [RtcEnginePlugin].
*/
fun remove(pluginClass: Class<out RtcEnginePlugin>) {
plugins.remove(pluginClass)
}

override fun onRtcEngineCreated(rtcEngine: RtcEngine?) {
for (plugin in plugins.values) {
plugin.onRtcEngineCreated(rtcEngine)
}
}

override fun onRtcEngineDestroyed() {
for (plugin in plugins.values) {
plugin.onRtcEngineDestroyed()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.os.Looper
import androidx.annotation.NonNull
import io.agora.rtc.RtcEngine
import io.agora.rtc.base.RtcEngineManager
import io.agora.rtc.base.RtcEngineRegistry
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.*
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
Expand All @@ -27,7 +28,7 @@ class AgoraRtcEnginePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stre
private lateinit var eventChannel: EventChannel

private var eventSink: EventChannel.EventSink? = null
private val manager = RtcEngineManager { methodName, data -> emit(methodName, data) }
private val manager = RtcEngineManager(emit = { methodName, data -> emit(methodName, data) })
private val handler = Handler(Looper.getMainLooper())
private val rtcChannelPlugin = AgoraRtcChannelPlugin(this)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class AgoraSurfaceViewFactory(
}
}

class AgoraSurfaceView(
internal class AgoraSurfaceView(
context: Context,
messenger: BinaryMessenger,
viewId: Int,
Expand Down
4 changes: 4 additions & 0 deletions example/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ android {

sourceSets {
main.java.srcDirs += 'src/main/kotlin'
test.java.srcDirs += 'src/test/kotlin'
}

lintOptions {
Expand Down Expand Up @@ -66,4 +67,7 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:3.3.3'
}
Loading

0 comments on commit 9230a55

Please sign in to comment.