I got the AWS Chime SDK Demo for React Native working and two people can join a video call on mobile. The local device has their video camera show in a small tile in the bottom of the screen while the remote device takes up the whole screen and the local tile sits on top of it. However, I have noticed that on Android when you start local video and then start local video from the other device the video from the remote device covers the Android local tile. The local tile can be brought back by the Android device stopping and starting their video again but it shouldn’t disappear in the first place.
Here are my listeners for the video tile state change events:
const [localDevice, setLocalDevice] = useState({
videoEnabled: false,
videoTileId: null
})
const [remoteDevice, setRemoteDevice] = useState({
videoEnabled: false,
videoTileId: null
})
// ---------- ON ATTENDEE START VIDEO ----------
useEffect(()=>{
onAddVideoTileSubscription.current = getSDKEventEmitter().addListener(
MobileSDKEvent.OnAddVideoTile,
tileState => {
if(tileState.isLocal){
setLocalDevice({
videoEnabled: true,
videoTileId: tileState.tileId
})
}else if(!tileState.isLocal){
setRemoteDevice({
videoEnabled: true,
videoTileId: tileState.tileId
})
}
},
);
return () => {
if (onAddVideoTileSubscription.current) {
onAddVideoTileSubscription.current.remove();
}
};
},[])
// ---------- ON ATTENDEE END VIDEO ----------
useEffect(()=>{
onRemoveVideoTileSubscription.current = getSDKEventEmitter().addListener(
MobileSDKEvent.OnRemoveVideoTile,
tileState => {
if(tileState.isLocal){
setLocalDevice({
videoEnabled: false,
videoTileId: tileState.tileId
})
}else if(!tileState.isLocal){
setRemoteDevice({
videoEnabled: false,
videoTileId: tileState.tileId
})
}
},
);
return () => {
if (onRemoveVideoTileSubscription.current) {
onRemoveVideoTileSubscription.current.remove();
}
};
},[])
And here is my render logic:
return (
<View style={styles.callContainer}>
{remoteDevice.videoEnabled ? (
<View style={styles.remoteDeviceVideoContainer}>
<RNVideoRenderView
style={styles.remoteDeviceVideo}
key={remoteDevice.videoTileId}
tileId={remoteDevice.videoTileId}
/>
</View>
): (
null
)}
{localDevice.videoEnabled ? (
<View style={styles.localDeviceVideoContainer}>
<RNVideoRenderView
style={styles.localDeviceVideo}
key={localDevice.videoTileId}
tileId={localDevice.videoTileId}
/>
</View>
): (
null
)}
<FlatList
style={styles.attendeeList}
data={state.attendees}
renderItem={({item}) => (
<AttendeeItem
attendeeName={
attendeeNameMap[item] ? attendeeNameMap[item] : item
}
muted={state.mutedAttendee.includes(item)}
/>
)}
ItemSeparatorComponent={() => <View style={styles.separator} />}
keyExtractor={item => item}
/>
<View style={styles.buttonContainer}>
<MuteButton
muted={currentMuted}
onPress={() => NativeFunction.setMute(!currentMuted)}
/>
<CameraButton
disabled={localDevice.videoEnabled}
onPress={() =>
NativeFunction.setCameraOn(!localDevice.videoEnabled)
}
/>
<View style={styles.hangOffButtonContainer}>
<HangOffButton onPress={() => NativeFunction.stopMeeting()} />
</View>
</View>
</View>
);
I have tried swapping the position of the remote render and the local render with no change. I have tried using elevation and zIndex with no change. I know for certain the tile is appearing behind the fullscreen video because I set the opacity of the fullscreen video to 0 and saw the component behind it. I know it works perfectly fine across iOS devices and the small tiles stay in the foreground. I have tried so many things to get this to work but have no clue what is happening. Has anyone dealt with this AWS Chime SDK issue before?
Dylon Jaynes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.