Skip to content

Commit c0b5ab1

Browse files
committed
fix ios video view
1 parent cfa50e6 commit c0b5ab1

5 files changed

Lines changed: 29 additions & 96 deletions

File tree

chime-sdk/chime_sdk.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |spec|
22
spec.name = 'chime_sdk'
3-
spec.version = '0.4.0'
3+
spec.version = '0.4.1'
44
spec.homepage = 'https://github.com/WannaverseOfficial/kmp-chime-sdk'
55
spec.source = { :http=> ''}
66
spec.authors = ''

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,15 +262,17 @@ actual class ChimeSDK(
262262
videoTileObserver.localRenderView.apply { this.mirror = mirror }
263263
},
264264
modifier = modifier,
265-
update = {}
265+
update = {
266+
it.mirror = mirror
267+
}
266268
)
267269
}
268270

269271
@Composable
270272
actual fun RemoteVideoView(tileId: Int, isOnTop: Boolean, modifier: Modifier) = AndroidView(
271273
factory = {
272274
videoTileObserver.getRemoteRenderView(tileId)
273-
?: throw IllegalStateException("No remote render view found for tile $tileId")
275+
?: throw IllegalStateException("Remote view for tile $tileId not found")
274276
},
275277
modifier = modifier,
276278
update = {}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ class VideoTileObserverImpl(
2929
}
3030

3131
override fun onVideoTileRemoved(tileState: VideoTileState) {
32+
meetingSession.audioVideo.unbindVideoView(tileState.tileId)
33+
3234
if (tileState.isLocalTile) {
33-
meetingSession.audioVideo.unbindVideoView(tileState.tileId)
3435
onLocalTileRemoved()
3536
} else {
36-
meetingSession.audioVideo.unbindVideoView(tileState.tileId)
37-
remoteRenderView.remove(tileState.tileId)
37+
remoteRenderView -= tileState.tileId
3838
onRemoteTileRemoved()
3939
}
4040
}

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

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,12 @@
33
package com.wannaverse.chimesdk
44

55
import androidx.compose.runtime.Composable
6-
import androidx.compose.runtime.DisposableEffect
7-
import androidx.compose.runtime.LaunchedEffect
8-
import androidx.compose.runtime.SideEffect
96
import androidx.compose.runtime.remember
107
import androidx.compose.ui.Modifier
118
import androidx.compose.ui.viewinterop.UIKitView
129
import cocoapods.AmazonChimeSDK.ConsoleLogger
1310
import cocoapods.AmazonChimeSDK.DefaultActiveSpeakerPolicy
1411
import cocoapods.AmazonChimeSDK.DefaultMeetingSession
15-
import cocoapods.AmazonChimeSDK.DefaultVideoRenderView
16-
import cocoapods.AmazonChimeSDK.DefaultVideoTile
1712
import cocoapods.AmazonChimeSDK.LogLevelINFO
1813
import cocoapods.AmazonChimeSDK.MediaDevice
1914
import cocoapods.AmazonChimeSDK.MediaDeviceTypeAudioBluetooth
@@ -23,10 +18,7 @@ import cocoapods.AmazonChimeSDK.MediaDeviceTypeAudioWiredHeadset
2318
import cocoapods.AmazonChimeSDK.MeetingSessionConfiguration
2419
import cocoapods.AmazonChimeSDK.MeetingSessionCredentials
2520
import cocoapods.AmazonChimeSDK.MeetingSessionURLs
26-
import cocoapods.AmazonChimeSDK.video_client_status_tVar
2721
import kotlinx.cinterop.ExperimentalForeignApi
28-
import kotlinx.cinterop.cValue
29-
import kotlinx.cinterop.copy
3022
import platform.AVFAudio.AVAudioSession
3123
import platform.AVFAudio.AVAudioSessionCategoryOptionAllowBluetoothA2DP
3224
import platform.AVFAudio.AVAudioSessionCategoryOptionAllowBluetoothHFP
@@ -36,10 +28,8 @@ import platform.AVFAudio.setActive
3628
import platform.AVFoundation.AVCaptureDevice
3729
import platform.AVFoundation.AVMediaTypeVideo
3830
import platform.AVFoundation.requestAccessForMediaType
39-
import platform.CoreGraphics.CGRect
4031
import platform.Foundation.NSOperationQueue
41-
import platform.UIKit.UIView
42-
import platform.VideoToolbox.kVTVideoEncoderListOption_IncludeStandardDefinitionDVEncoders
32+
import platform.UIKit.UIViewContentMode
4333
import platform.darwin.NSObject
4434

4535
private val logger = ConsoleLogger(name = "ChimeSDK", level = LogLevelINFO)
@@ -225,17 +215,16 @@ actual class ChimeSDK(
225215
meetingSession.audioVideo().stopLocalVideo()
226216
}
227217

228-
229218
@Composable
230219
actual fun LocalVideoView(cameraFacing: CameraFacing, isOnTop: Boolean, modifier: Modifier) {
231220
val mirror = remember(cameraFacing) { cameraFacing == CameraFacing.FRONT }
232221

233222
UIKitView(
234223
factory = {
235224
videoTileObserver.localRenderView.apply {
225+
contentMode = UIViewContentMode.UIViewContentModeScaleAspectFill
226+
layer.masksToBounds = true
236227
setMirror(mirror)
237-
// setFrame(bounds)
238-
// addSubview(this)
239228
}
240229
},
241230
modifier = modifier,
@@ -245,29 +234,18 @@ actual class ChimeSDK(
245234
)
246235
}
247236

248-
internal class RemoteVideoContainerView(
249-
private val videoTileObserver: VideoTileObserverImpl,
250-
private val tileId: Int
251-
) : UIView(frame = cValue<CGRect>()) {
252-
override fun layoutSubviews() {
253-
super.layoutSubviews()
254-
val actual = videoTileObserver.getRemoteView(tileId) ?: return
255-
if (actual.superview != this) {
256-
subviews.forEach { subview ->
257-
(subview as? UIView)?.removeFromSuperview()
258-
}
259-
addSubview(actual)
260-
videoTileObserver.rebindRemoteView(tileId)
261-
}
262-
actual.setFrame(bounds)
263-
}
264-
}
265-
266237
@Composable
267238
actual fun RemoteVideoView(tileId: Int, isOnTop: Boolean, modifier: Modifier) = UIKitView(
268-
factory = { RemoteVideoContainerView(videoTileObserver, tileId) },
239+
factory = {
240+
(videoTileObserver.getRemoteView(tileId)
241+
?: throw IllegalArgumentException("Remote view for tile $tileId not found")
242+
).apply {
243+
contentMode = UIViewContentMode.UIViewContentModeScaleAspectFill
244+
layer.masksToBounds = true
245+
}
246+
},
269247
modifier = modifier,
270-
update = RemoteVideoContainerView::setNeedsLayout
248+
update = {}
271249
)
272250

273251
actual fun sendRealtimeMessage(topic: String, data: String, lifetimeMs: Long) {

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

Lines changed: 9 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import cocoapods.AmazonChimeSDK.DefaultVideoRenderView
55
import cocoapods.AmazonChimeSDK.VideoTileObserverProtocol
66
import cocoapods.AmazonChimeSDK.VideoTileState
77
import kotlinx.cinterop.ExperimentalForeignApi
8-
import platform.UIKit.UIView
98
import platform.darwin.NSObject
109
import kotlin.collections.set
1110

@@ -25,36 +24,22 @@ class VideoTileObserverImpl(
2524
).forceRegisterProtocol(this)
2625
}
2726

28-
var localTileId: Long? = null
29-
private set
30-
3127
internal val localRenderView: DefaultVideoRenderView = DefaultVideoRenderView()
28+
private val remoteRenderView: MutableMap<Long, DefaultVideoRenderView> = mutableMapOf()
3229

33-
private val attendeeTileMap: MutableMap<String, Long> = mutableMapOf()
34-
private val remoteTiles: MutableMap<Long, DefaultVideoRenderView> = mutableMapOf()
30+
fun getRemoteView(tileId: Int): DefaultVideoRenderView? = remoteRenderView[tileId.toLong()]
3531

3632
override fun videoTileDidAddWithTileState(tileState: VideoTileState) {
3733
val tileId = tileState.tileId()
3834

3935
if (tileState.isLocalTile()) {
40-
localTileId = tileId
4136
meetingSession.audioVideo()
4237
.bindVideoViewWithVideoView(videoView = localRenderView, tileId = tileId)
4338
onLocalTileAdded(tileId.toInt())
4439
} else {
45-
val attendeeId = tileState.attendeeId()
46-
val oldTileId = attendeeTileMap[attendeeId]
47-
if (oldTileId != null && oldTileId != tileId) {
48-
meetingSession.audioVideo().unbindVideoViewWithTileId(tileId = oldTileId)
49-
remoteTiles.remove(oldTileId)
50-
attendeeTileMap.remove(attendeeId)
51-
onRemoteTileRemoved()
52-
}
53-
val renderView = remoteTiles.getOrPut(tileId) {
54-
DefaultVideoRenderView().also { it.setMirror(false) }
55-
}
56-
attendeeTileMap[attendeeId] = tileId
57-
renderView.setFrame(renderView.superview?.bounds ?: renderView.bounds)
40+
remoteRenderView[tileId] = DefaultVideoRenderView()
41+
meetingSession.audioVideo()
42+
.bindVideoViewWithVideoView(videoView = remoteRenderView[tileId]!!, tileId = tileId)
5843
onRemoteTileAdded(tileId.toInt())
5944
}
6045
}
@@ -64,49 +49,17 @@ class VideoTileObserverImpl(
6449

6550
meetingSession.audioVideo().unbindVideoViewWithTileId(tileId = tileId)
6651

67-
if (tileId == localTileId) {
68-
localTileId = null
52+
if (tileState.isLocalTile()) {
6953
onLocalTileRemoved()
70-
} else if (remoteTiles.containsKey(tileId)) {
71-
remoteTiles.remove(tileId)
72-
if (attendeeTileMap[tileState.attendeeId()] == tileId) {
73-
attendeeTileMap.remove(tileState.attendeeId())
74-
}
54+
} else if (remoteRenderView.containsKey(tileId)) {
55+
remoteRenderView -= tileId
7556
onRemoteTileRemoved()
7657
}
7758
}
7859

7960
override fun videoTileDidPauseWithTileState(tileState: VideoTileState) {}
8061

81-
override fun videoTileDidResumeWithTileState(tileState: VideoTileState) {
82-
val tileId = tileState.tileId()
83-
if (tileState.isLocalTile()) {
84-
localTileId = tileId
85-
meetingSession.audioVideo().bindVideoViewWithVideoView(videoView = localRenderView, tileId = tileId)
86-
onLocalTileAdded(tileId.toInt())
87-
} else {
88-
val renderView = remoteTiles.getOrPut(tileId) {
89-
DefaultVideoRenderView().also { it.setMirror(false) }
90-
}
91-
attendeeTileMap[tileState.attendeeId()] = tileId
92-
renderView.setFrame(renderView.superview?.bounds ?: renderView.bounds)
93-
onRemoteTileAdded(tileId.toInt())
94-
}
95-
}
62+
override fun videoTileDidResumeWithTileState(tileState: VideoTileState) {}
9663

9764
override fun videoTileSizeDidChangeWithTileState(tileState: VideoTileState) {}
98-
99-
fun getRemoteView(tileId: Int): UIView? = remoteTiles[tileId.toLong()]
100-
101-
// fun rebindLocalView() {
102-
// val tileId = localTileId ?: return
103-
// localRenderView.setFrame(localVideoContainer.bounds)
104-
// meetingSession.audioVideo().bindVideoViewWithVideoView(videoView = localRenderView, tileId = tileId)
105-
// }
106-
107-
fun rebindRemoteView(tileId: Int) {
108-
val renderView = remoteTiles[tileId.toLong()] ?: return
109-
meetingSession.audioVideo().bindVideoViewWithVideoView(videoView = renderView, tileId = tileId.toLong())
110-
}
111-
11265
}

0 commit comments

Comments
 (0)