@@ -3,7 +3,9 @@ package com.wannaverse.chimesdk
33import android.content.Context
44import android.hardware.camera2.CameraManager
55import androidx.compose.runtime.Composable
6+ import androidx.compose.runtime.remember
67import androidx.compose.ui.Modifier
8+ import androidx.compose.ui.viewinterop.AndroidView
79import com.amazonaws.services.chime.sdk.meetings.analytics.DefaultEventAnalyticsController
810import com.amazonaws.services.chime.sdk.meetings.analytics.DefaultMeetingStatsCollector
911import com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerpolicy.DefaultActiveSpeakerPolicy
@@ -20,7 +22,6 @@ import com.amazonaws.services.chime.sdk.meetings.session.MeetingSessionCredentia
2022import com.amazonaws.services.chime.sdk.meetings.session.MeetingSessionURLs
2123import com.amazonaws.services.chime.sdk.meetings.utils.logger.ConsoleLogger
2224import com.amazonaws.services.chime.sdk.meetings.utils.logger.LogLevel
23- import com.wannaverse.chimesdk.composables.VideoTileView
2425
2526@Suppress(" EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING" )
2627actual class ChimeSDK (
@@ -71,7 +72,12 @@ actual class ChimeSDK(
7172 val eglCoreFactory = DefaultEglCoreFactory ()
7273
7374 val meetingSession =
74- DefaultMeetingSession (meetingSessionConfiguration, logger, appContext, eglCoreFactory)
75+ DefaultMeetingSession (
76+ meetingSessionConfiguration,
77+ logger,
78+ appContext,
79+ eglCoreFactory
80+ )
7581
7682 return ChimeSDK (meetingSession, eventAnalyticsController, eglCoreFactory)
7783 }
@@ -191,29 +197,23 @@ actual class ChimeSDK(
191197 }
192198
193199 actual fun leaveMeeting () {
194- try {
195- if (cameraOn || cameraCaptureSource != null ) {
196- cameraCaptureSource?.stop()
197- meetingSession.audioVideo.stopLocalVideo()
198- cameraOn = false
199- cameraCaptureSource = null
200- }
201-
202- meetingSession.audioVideo.removeRealtimeObserver(realTimeObserver)
203- meetingSession.audioVideo.removeDeviceChangeObserver(deviceObserver)
204- meetingSession.audioVideo.removeVideoTileObserver(videoTileObserver)
205- meetingSession.audioVideo.removeAudioVideoObserver(audioVideoObserver)
206- meetingSession.audioVideo.removeActiveSpeakerObserver(activeSpeakerObserver)
207- dataMessageObserver.clearListeners()
208-
209- meetingSession.audioVideo.stopRemoteVideo()
210- meetingSession.audioVideo.realtimeLocalMute()
211- meetingSession.audioVideo.stop()
212- } catch (e: Exception ) {
213- e.printStackTrace()
200+ if (cameraOn || cameraCaptureSource != null ) {
201+ cameraCaptureSource?.stop()
202+ meetingSession.audioVideo.stopLocalVideo()
203+ cameraOn = false
204+ cameraCaptureSource = null
214205 }
215206
216- videoTileObserver.clearAll()
207+ meetingSession.audioVideo.removeRealtimeObserver(realTimeObserver)
208+ meetingSession.audioVideo.removeDeviceChangeObserver(deviceObserver)
209+ meetingSession.audioVideo.removeVideoTileObserver(videoTileObserver)
210+ meetingSession.audioVideo.removeAudioVideoObserver(audioVideoObserver)
211+ meetingSession.audioVideo.removeActiveSpeakerObserver(activeSpeakerObserver)
212+ dataMessageObserver.clearListeners()
213+
214+ meetingSession.audioVideo.stopRemoteVideo()
215+ meetingSession.audioVideo.realtimeLocalMute()
216+ meetingSession.audioVideo.stop()
217217 }
218218
219219 actual fun startLocalVideo () {
@@ -254,23 +254,28 @@ actual class ChimeSDK(
254254 }
255255
256256 @Composable
257- actual fun LocalVideoView (modifier : Modifier , cameraFacing : CameraFacing , isOnTop : Boolean ) =
258- VideoTileView (
259- tileId = videoTileObserver.localTileId!! ,
257+ actual fun LocalVideoView (cameraFacing : CameraFacing , modifier : Modifier ) {
258+ val mirror = remember(cameraFacing) { cameraFacing == CameraFacing .FRONT }
259+
260+ AndroidView (
261+ factory = {
262+ videoTileObserver.localRenderView.apply { this .mirror = mirror }
263+ },
260264 modifier = modifier,
261- cameraFacing = cameraFacing,
262- isOnTop = isOnTop,
263- meetingSession = meetingSession,
264- videoTileObserverImpl = videoTileObserver
265+ update = {
266+ it.mirror = mirror
267+ }
265268 )
269+ }
266270
267271 @Composable
268- actual fun RemoteVideoView (modifier : Modifier , tileId : Int , isOnTop : Boolean ) = VideoTileView (
269- tileId = tileId,
272+ actual fun RemoteVideoView (tileId : Int , modifier : Modifier ) = AndroidView (
273+ factory = {
274+ videoTileObserver.getRemoteRenderView(tileId)
275+ ? : throw IllegalStateException (" Remote view for tile $tileId not found" )
276+ },
270277 modifier = modifier,
271- isOnTop = isOnTop,
272- meetingSession = meetingSession,
273- videoTileObserverImpl = videoTileObserver
278+ update = {}
274279 )
275280
276281 actual fun sendRealtimeMessage (topic : String , data : String , lifetimeMs : Long ) =
@@ -283,7 +288,8 @@ actual class ChimeSDK(
283288 val source = cameraCaptureSource ? : return
284289
285290 val previous = currentCameraFacing
286- currentCameraFacing = if (currentCameraFacing == CameraFacing .FRONT ) CameraFacing .BACK else CameraFacing .FRONT
291+ currentCameraFacing =
292+ if (currentCameraFacing == CameraFacing .FRONT ) CameraFacing .BACK else CameraFacing .FRONT
287293
288294 val cm = appContext.getSystemService(Context .CAMERA_SERVICE ) as CameraManager
289295 val devices = MediaDevice .listVideoDevices(cm)
0 commit comments