Skip to content

Commit 4007647

Browse files
committed
cr
1 parent 521e8be commit 4007647

12 files changed

Lines changed: 253 additions & 228 deletions

File tree

chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/ActiveSpeakerObserver.kt renamed to chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/ActiveSpeakerObserverImpl.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ package com.wannaverse.chimesdk
33
import com.amazonaws.services.chime.sdk.meetings.audiovideo.AttendeeInfo
44
import com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerdetector.ActiveSpeakerObserver
55

6-
class ActiveSpeakerObserver(val onActiveSpeakersChanged: (Set<String>) -> Unit) : ActiveSpeakerObserver {
7-
companion object Companion {
8-
private const val SPEAKING_THRESHOLD = 0.05
9-
}
6+
private const val SPEAKING_THRESHOLD = 0.05
107

8+
class ActiveSpeakerObserverImpl(val onActiveSpeakersChanged: (Set<String>) -> Unit) : ActiveSpeakerObserver {
119
override val scoreCallbackIntervalMs: Int = 500
1210

1311
override fun onActiveSpeakerDetected(attendeeInfo: Array<AttendeeInfo>) {}

chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/ChimeSDK.android.kt

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,6 @@ actual class ChimeSDK(
7777
}
7878
}
7979

80-
private var videoTileObserver: VideoTileManager? = null
81-
private var cameraCaptureSource: CameraCaptureSource? = null
82-
private var cachedVideoDevices: List<MediaDevice>? = null
83-
private var currentCameraFacing = CameraFacing.FRONT
84-
private var cameraOn = false
85-
8680
actual fun getAvailableInputDevices(): List<AudioDevice> =
8781
meetingSession.audioVideo
8882
.listAudioDevices()
@@ -119,6 +113,18 @@ actual class ChimeSDK(
119113
)
120114
}
121115

116+
private lateinit var realTimeObserver: RealTimeObserverImpl
117+
private lateinit var deviceObserver: DeviceObserverImpl
118+
private lateinit var videoTileObserver: VideoTileObserverImpl
119+
private lateinit var audioVideoObserver: AudioVideoObserverImpl
120+
private lateinit var activeSpeakerObserver: ActiveSpeakerObserverImpl
121+
private lateinit var dataMessageObserver: DataMessageObserverImpl
122+
123+
private var cameraCaptureSource: CameraCaptureSource? = null
124+
private var cachedVideoDevices: List<MediaDevice>? = null
125+
private var currentCameraFacing = CameraFacing.FRONT
126+
private var cameraOn = false
127+
122128
actual fun joinMeeting(
123129
realTimeListener: RealTimeEventListener,
124130
onActiveSpeakersChanged: (Set<String>) -> Unit,
@@ -134,10 +140,10 @@ actual class ChimeSDK(
134140
onRemoteTileAdded: (Int) -> Unit,
135141
onRemoteTileRemoved: () -> Unit
136142
) {
137-
val realTimeObserver = RealTimeObserverImpl(realTimeListener)
143+
realTimeObserver = RealTimeObserverImpl(realTimeListener)
138144
meetingSession.audioVideo.addRealtimeObserver(realTimeObserver)
139145

140-
val deviceObserver = DeviceObserver(
146+
deviceObserver = DeviceObserverImpl(
141147
meetingSession = meetingSession,
142148
realTimeEventListener = realTimeListener
143149
)
@@ -147,15 +153,16 @@ actual class ChimeSDK(
147153
.firstOrNull { it.label == selectedAudioInputDevice }
148154
?.let(deviceObserver::selectAudioDevice)
149155

150-
videoTileObserver = VideoTileManager(
156+
videoTileObserver = VideoTileObserverImpl(
157+
meetingSession = meetingSession,
151158
onLocalTileAdded = onLocalTileAdded,
152159
onLocalTileRemoved = onLocalTileRemoved,
153160
onRemoteTileAdded = onRemoteTileAdded,
154161
onRemoteTileRemoved = onRemoteTileRemoved
155162
)
156-
meetingSession.audioVideo.addVideoTileObserver(videoTileObserver!!)
163+
meetingSession.audioVideo.addVideoTileObserver(videoTileObserver)
157164

158-
val audioVideoObserver = AudioVideoObserverImpl(
165+
audioVideoObserver = AudioVideoObserverImpl(
159166
meetingSession = meetingSession,
160167
onConnectionStatusChanged = onConnectionStatusChanged,
161168
onRemoteVideoAvailable = onRemoteVideoAvailable,
@@ -166,12 +173,14 @@ actual class ChimeSDK(
166173
)
167174
meetingSession.audioVideo.addAudioVideoObserver(audioVideoObserver)
168175

169-
val activeSpeakerObserver = ActiveSpeakerObserver(onActiveSpeakersChanged)
176+
activeSpeakerObserver = ActiveSpeakerObserverImpl(onActiveSpeakersChanged)
170177
meetingSession.audioVideo.addActiveSpeakerObserver(
171178
observer = activeSpeakerObserver,
172179
policy = DefaultActiveSpeakerPolicy()
173180
)
174181

182+
dataMessageObserver = DataMessageObserverImpl(meetingSession)
183+
175184
try {
176185
meetingSession.audioVideo.start()
177186
meetingSession.audioVideo.startRemoteVideo()
@@ -190,14 +199,21 @@ actual class ChimeSDK(
190199
cameraCaptureSource = null
191200
}
192201

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+
193209
meetingSession.audioVideo.stopRemoteVideo()
194210
meetingSession.audioVideo.realtimeLocalMute()
195211
meetingSession.audioVideo.stop()
196212
} catch (e: Exception) {
197213
e.printStackTrace()
198214
}
199215

200-
videoTileObserver?.clearAll()
216+
videoTileObserver.clearAll()
201217
}
202218

203219
actual fun startLocalVideo() {
@@ -240,12 +256,12 @@ actual class ChimeSDK(
240256
@Composable
241257
actual fun LocalVideoView(modifier: Modifier, cameraFacing: CameraFacing, isOnTop: Boolean) =
242258
VideoTileView(
243-
tileId = videoTileObserver?.localTileId,
259+
tileId = videoTileObserver.localTileId,
244260
modifier = modifier,
245261
cameraFacing = cameraFacing,
246262
isOnTop = isOnTop,
247263
meetingSession = meetingSession,
248-
videoTileManager = videoTileObserver!!
264+
videoTileObserverImpl = videoTileObserver
249265
)
250266

251267
@Composable
@@ -254,7 +270,7 @@ actual class ChimeSDK(
254270
modifier = modifier,
255271
isOnTop = isOnTop,
256272
meetingSession = meetingSession,
257-
videoTileManager = videoTileObserver!!
273+
videoTileObserverImpl = videoTileObserver
258274
)
259275

260276
actual fun sendRealtimeMessage(topic: String, data: String, lifetimeMs: Long) =
@@ -291,11 +307,7 @@ actual class ChimeSDK(
291307
}
292308

293309
actual fun subscribeToTopic(topic: String, listener: (ChimeMessage) -> Unit) =
294-
meetingSession.audioVideo.addRealtimeDataMessageObserver(
295-
topic = topic,
296-
observer = DataMessageObserverImpl(listener)
297-
)
310+
dataMessageObserver.addListener(topic, listener)
298311

299-
actual fun unsubscribeFromTopic(topic: String) =
300-
meetingSession.audioVideo.removeRealtimeDataMessageObserverFromTopic(topic)
312+
actual fun unsubscribeFromTopic(topic: String) = dataMessageObserver.removeListener(topic)
301313
}

chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/DataMessageObserverImpl.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,27 @@ package com.wannaverse.chimesdk
22

33
import com.amazonaws.services.chime.sdk.meetings.realtime.datamessage.DataMessage
44
import com.amazonaws.services.chime.sdk.meetings.realtime.datamessage.DataMessageObserver
5+
import com.amazonaws.services.chime.sdk.meetings.session.MeetingSession
56

6-
class DataMessageObserverImpl(private val listener: (ChimeMessage) -> Unit) : DataMessageObserver {
7-
override fun onDataMessageReceived(dataMessage: DataMessage) = listener(
7+
class DataMessageObserverImpl(private val meetingSession: MeetingSession) : DataMessageObserver {
8+
val listeners = mutableMapOf<String, (ChimeMessage) -> Unit>()
9+
10+
fun addListener(topic: String, listener: (ChimeMessage) -> Unit) {
11+
listeners[topic] = listener
12+
meetingSession.audioVideo.addRealtimeDataMessageObserver(topic = topic, observer = this)
13+
}
14+
15+
fun removeListener(topic: String) {
16+
listeners.remove(topic)
17+
meetingSession.audioVideo.removeRealtimeDataMessageObserverFromTopic(topic = topic)
18+
}
19+
20+
fun clearListeners() {
21+
listeners.keys.forEach(meetingSession.audioVideo::removeRealtimeDataMessageObserverFromTopic)
22+
listeners.clear()
23+
}
24+
25+
override fun onDataMessageReceived(dataMessage: DataMessage) = listeners[dataMessage.topic]!!(
826
ChimeMessage(
927
senderId = dataMessage.senderAttendeeId,
1028
content = dataMessage.text(),

chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/DeviceObserver.kt renamed to chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/DeviceObserverImpl.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.amazonaws.services.chime.sdk.meetings.device.MediaDevice
55
import com.amazonaws.services.chime.sdk.meetings.device.MediaDeviceType
66
import com.amazonaws.services.chime.sdk.meetings.session.DefaultMeetingSession
77

8-
class DeviceObserver(
8+
class DeviceObserverImpl(
99
private val meetingSession: DefaultMeetingSession,
1010
private val realTimeEventListener: RealTimeEventListener
1111
) : DeviceChangeObserver {
@@ -40,8 +40,4 @@ class DeviceObserver(
4040
currentSelectedDevice = device
4141
meetingSession.audioVideo.chooseAudioDevice(device)
4242
}
43-
44-
fun clearCurrentDevice() {
45-
currentSelectedDevice = null
46-
}
4743
}

chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/VideoTileManager.kt renamed to chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/VideoTileObserverImpl.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package com.wannaverse.chimesdk
22

33
import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoTileObserver
44
import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoTileState
5+
import com.amazonaws.services.chime.sdk.meetings.session.MeetingSession
56

6-
class VideoTileManager(
7+
class VideoTileObserverImpl(
8+
private val meetingSession: MeetingSession,
79
private val onLocalTileAdded: (Int) -> Unit,
810
private val onLocalTileRemoved: () -> Unit,
911
private val onRemoteTileAdded: (Int) -> Unit,
@@ -15,8 +17,6 @@ class VideoTileManager(
1517

1618
var localTileId: Int? = null
1719
private set
18-
var remoteTileId: Int? = null
19-
private set
2020

2121
private fun logTileInfo(event: String, tileState: VideoTileState) {
2222
println("$LOG_TAG | $event | TileId=${tileState.tileId} | IsLocal=${tileState.isLocalTile} | AttendeeId=${tileState.attendeeId} | Dimensions=${tileState.videoStreamContentWidth}x${tileState.videoStreamContentHeight} | Paused=${tileState.pauseState}")
@@ -30,7 +30,6 @@ class VideoTileManager(
3030
onLocalTileAdded(tileState.tileId)
3131
}
3232
else {
33-
remoteTileId = tileState.tileId
3433
onRemoteTileAdded(tileState.tileId)
3534
}
3635
}
@@ -43,7 +42,6 @@ class VideoTileManager(
4342
onLocalTileRemoved()
4443
}
4544
else {
46-
remoteTileId = null
4745
onRemoteTileRemoved()
4846
}
4947
}
@@ -80,10 +78,6 @@ class VideoTileManager(
8078

8179
private val boundViews = mutableMapOf<Int, Any>()
8280

83-
fun isLocalTile(tileId: Int?): Boolean = tileId != null && tileId == localTileId
84-
85-
fun isRemoteTile(tileId: Int?): Boolean = tileId != null && tileId == remoteTileId
86-
8781
fun updateBoundView(tileId: Int, view: Any) = boundViews.set(tileId, view)
8882

8983
fun isAlreadyBound(tileId: Int, view: Any): Boolean = boundViews[tileId] === view
@@ -96,7 +90,7 @@ class VideoTileManager(
9690
boundViews.forEach { (tileId, _) ->
9791
try {
9892
println("VIDEO_TILE_VIEW | clearAll | Unbinding tile $tileId")
99-
// meetingSession?.audioVideo?.unbindVideoView(tileId)
93+
meetingSession.audioVideo.unbindVideoView(tileId)
10094
} catch (e: Exception) {
10195
println("VIDEO_TILE_VIEW | clearAll | Failed to unbind tile $tileId: ${e.message}")
10296
}

chime-sdk/src/androidMain/kotlin/com/wannaverse/chimesdk/composables/VideoTileView.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import androidx.compose.ui.viewinterop.AndroidView
99
import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.DefaultVideoRenderView
1010
import com.amazonaws.services.chime.sdk.meetings.session.DefaultMeetingSession
1111
import com.wannaverse.chimesdk.CameraFacing
12-
import com.wannaverse.chimesdk.VideoTileManager
12+
import com.wannaverse.chimesdk.VideoTileObserverImpl
1313

1414
@Composable
1515
fun VideoTileView(
@@ -18,7 +18,7 @@ fun VideoTileView(
1818
cameraFacing: CameraFacing? = null,
1919
isOnTop: Boolean,
2020
meetingSession: DefaultMeetingSession,
21-
videoTileManager: VideoTileManager
21+
videoTileObserverImpl: VideoTileObserverImpl
2222
) {
2323
val context = LocalContext.current
2424
if (tileId == null) return
@@ -29,7 +29,7 @@ fun VideoTileView(
2929
onDispose {
3030
try {
3131
meetingSession.audioVideo.unbindVideoView(tileId)
32-
videoTileManager.clearBoundView(tileId)
32+
videoTileObserverImpl.clearBoundView(tileId)
3333
} catch (_: Exception) {}
3434
}
3535
}
@@ -44,15 +44,15 @@ fun VideoTileView(
4444
setZOrderMediaOverlay(isOnTop)
4545
this.mirror = mirror
4646
meetingSession.audioVideo.bindVideoView(this, tileId)
47-
videoTileManager.updateBoundView(tileId, this)
47+
videoTileObserverImpl.updateBoundView(tileId, this)
4848
}
4949
},
5050
update = { view ->
5151
view.mirror = mirror
5252
view.setZOrderMediaOverlay(isOnTop)
53-
if (!videoTileManager.isAlreadyBound(tileId, view)) {
53+
if (!videoTileObserverImpl.isAlreadyBound(tileId, view)) {
5454
meetingSession.audioVideo.bindVideoView(view, tileId)
55-
videoTileManager.updateBoundView(tileId, view)
55+
videoTileObserverImpl.updateBoundView(tileId, view)
5656
}
5757
},
5858
modifier = modifier

chime-sdk/src/iosMain/kotlin/com/wannaverse/chimesdk/ActiveSpeakerObserver.kt renamed to chime-sdk/src/iosMain/kotlin/com/wannaverse/chimesdk/ActiveSpeakerObserverImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import platform.darwin.NSObject
99
private const val SPEAKING_THRESHOLD = 0.05
1010

1111
@OptIn(ExperimentalForeignApi::class)
12-
class ActiveSpeakerObserver(val onActiveSpeakersChanged: (Set<String>) -> Unit) :
13-
NSObject(), ActiveSpeakerObserverProtocol {
12+
class ActiveSpeakerObserverImpl(val onActiveSpeakersChanged: (Set<String>) -> Unit) : NSObject(),
13+
ActiveSpeakerObserverProtocol {
1414
init {
1515
val _this: ActiveSpeakerObserverProtocol = this
1616

chime-sdk/src/iosMain/kotlin/com/wannaverse/chimesdk/AudioVideoObserverImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class AudioVideoObserverImpl(
2626
val _this: AudioVideoObserverProtocol = this
2727

2828
ProtocolDescriptor(
29-
candidates = listOf("AudioVideoObserver", "_TtP14AmazonChimeSDK22AudioVideoObserver_")
29+
candidates = listOf("AudioVideoObserver", "_TtP14AmazonChimeSDK18AudioVideoObserver_")
3030
).forceRegisterProtocol(this)
3131
}
3232

0 commit comments

Comments
 (0)