Video Chat Improvements

This commit is contained in:
Ilya Laktyushin
2021-05-24 16:06:14 +04:00
parent fe31bcdf26
commit e78c869a97
2 changed files with 26 additions and 22 deletions

View File

@@ -528,7 +528,7 @@ public final class VoiceChatController: ViewController {
text = .text(about, textIcon, .generic)
}
return VoiceChatFullscreenParticipantItem(presentationData: ItemListPresentationData(presentationData), nameDisplayOrder: presentationData.nameDisplayOrder, context: context, peer: peerEntry.peer, icon: icon, text: text, textColor: textColor, color: color, isLandscape: peerEntry.isLandscape, active: peerEntry.active, getAudioLevel: { return interaction.getAudioLevel(peerEntry.peer.id) }, getVideo: {
return VoiceChatFullscreenParticipantItem(presentationData: ItemListPresentationData(presentationData), nameDisplayOrder: presentationData.nameDisplayOrder, context: context, peer: peerEntry.peer, videoEndpointId: peerEntry.effectiveVideoEndpointId, icon: icon, text: text, textColor: textColor, color: color, isLandscape: peerEntry.isLandscape, active: peerEntry.active, getAudioLevel: { return interaction.getAudioLevel(peerEntry.peer.id) }, getVideo: {
if let endpointId = peerEntry.effectiveVideoEndpointId {
return interaction.getPeerVideo(endpointId, .list)
} else {
@@ -5264,42 +5264,42 @@ public final class VoiceChatController: ViewController {
}
private func attachFullscreenVideos() {
var verticalItemNodes: [PeerId: ASDisplayNode] = [:]
var verticalItemNodes: [String: ASDisplayNode] = [:]
self.listNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatTilesGridItemNode {
for tileNode in itemNode.tileNodes {
if let item = tileNode.item {
verticalItemNodes[item.peer.id] = tileNode
verticalItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] = tileNode
}
if tileNode.item?.peer.id == self.effectiveSpeaker?.0 {
if tileNode.item?.peer.id == self.effectiveSpeaker?.0 && tileNode.item?.videoEndpointId == self.effectiveSpeaker?.1 {
tileNode.isHidden = false
}
}
}
}
self.fullscreenListNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item, let otherItemNode = verticalItemNodes[item.peer.id] {
if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item, let otherItemNode = verticalItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")] {
itemNode.animateTransitionIn(from: otherItemNode, containerNode: self.transitionContainerNode, transition: .immediate, animate: false)
}
}
}
private func attachTileVideos() {
var fullscreenItemNodes: [PeerId: VoiceChatFullscreenParticipantItemNode] = [:]
var fullscreenItemNodes: [String: VoiceChatFullscreenParticipantItemNode] = [:]
self.fullscreenListNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item {
fullscreenItemNodes[item.peer.id] = itemNode
fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")] = itemNode
}
}
self.listNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatTilesGridItemNode {
for tileNode in itemNode.tileNodes {
if let item = tileNode.item, let otherItemNode = fullscreenItemNodes[item.peer.id] {
if let item = tileNode.item, let otherItemNode = fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] {
tileNode.animateTransitionIn(from: otherItemNode, containerNode: self.transitionContainerNode, transition: .immediate, animate: false)
if tileNode.item?.peer.id == self.effectiveSpeaker?.0 {
if tileNode.item?.peer.id == self.effectiveSpeaker?.0 && tileNode.item?.videoEndpointId == self.effectiveSpeaker?.1 {
tileNode.isHidden = true
}
}
@@ -5336,7 +5336,7 @@ public final class VoiceChatController: ViewController {
self.updateDecorationsLayout(transition: .immediate)
var minimalVisiblePeerid: (PeerId, CGPoint)?
var verticalItemNodes: [PeerId: ASDisplayNode] = [:]
var verticalItemNodes: [String: ASDisplayNode] = [:]
self.listNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatTilesGridItemNode {
for tileNode in itemNode.tileNodes {
@@ -5351,7 +5351,7 @@ public final class VoiceChatController: ViewController {
minimalVisiblePeerid = (item.peer.id, convertedFrame.origin)
}
}
verticalItemNodes[item.peer.id] = tileNode
verticalItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] = tileNode
}
}
} else if let itemNode = itemNode as? VoiceChatParticipantItemNode, let item = itemNode.item {
@@ -5365,7 +5365,7 @@ public final class VoiceChatController: ViewController {
minimalVisiblePeerid = (item.peer.id, convertedFrame.origin)
}
}
verticalItemNodes[item.peer.id] = itemNode
verticalItemNodes[String(item.peer.id.toInt64()) + "_"] = itemNode
}
}
@@ -5373,7 +5373,7 @@ public final class VoiceChatController: ViewController {
let completion = {
let effectiveSpeakerPeerId = self.effectiveSpeaker?.0
if let effectiveSpeakerPeerId = effectiveSpeakerPeerId, let otherItemNode = verticalItemNodes[effectiveSpeakerPeerId] {
if let effectiveSpeakerPeerId = effectiveSpeakerPeerId, let otherItemNode = verticalItemNodes[String(effectiveSpeakerPeerId.toInt64()) + "_" + (self.effectiveSpeaker?.1 ?? "")] {
self.mainStageNode.animateTransitionIn(from: otherItemNode, transition: transition)
self.mainStageBackgroundNode.alpha = 1.0
@@ -5382,7 +5382,7 @@ public final class VoiceChatController: ViewController {
self.fullscreenListNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item {
itemNode.animateTransitionIn(from: verticalItemNodes[item.peer.id], containerNode: self.transitionContainerNode, transition: transition, animate: item.peer.id != effectiveSpeakerPeerId)
itemNode.animateTransitionIn(from: verticalItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")], containerNode: self.transitionContainerNode, transition: transition, animate: item.peer.id != effectiveSpeakerPeerId)
}
}
@@ -5422,7 +5422,7 @@ public final class VoiceChatController: ViewController {
})
} else if case .fullscreen = previousDisplayMode, case .modal = self.displayMode {
var minimalVisiblePeerid: (PeerId, CGFloat)?
var fullscreenItemNodes: [PeerId: VoiceChatFullscreenParticipantItemNode] = [:]
var fullscreenItemNodes: [String: VoiceChatFullscreenParticipantItemNode] = [:]
self.fullscreenListNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatFullscreenParticipantItemNode, let item = itemNode.item {
let convertedFrame = itemNode.view.convert(itemNode.bounds, to: self.transitionContainerNode.view)
@@ -5433,7 +5433,7 @@ public final class VoiceChatController: ViewController {
} else if convertedFrame.minX >= 0.0 {
minimalVisiblePeerid = (item.peer.id, convertedFrame.minX)
}
fullscreenItemNodes[item.peer.id] = itemNode
fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + (item.videoEndpointId ?? "")] = itemNode
}
}
@@ -5448,17 +5448,19 @@ public final class VoiceChatController: ViewController {
self.listNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? VoiceChatTilesGridItemNode {
for tileNode in itemNode.tileNodes {
if let item = tileNode.item, let otherItemNode = fullscreenItemNodes[item.peer.id] {
if !fromPan || item.peer.id == effectiveSpeakerPeerId {
tileNode.animateTransitionIn(from: otherItemNode, containerNode: self.transitionContainerNode, transition: transition, animate: item.peer.id != effectiveSpeakerPeerId)
if let item = tileNode.item {
if let otherItemNode = fullscreenItemNodes[String(item.peer.id.toInt64()) + "_" + item.videoEndpointId] {
if !fromPan || item.peer.id == effectiveSpeakerPeerId {
tileNode.animateTransitionIn(from: otherItemNode, containerNode: self.transitionContainerNode, transition: transition, animate: item.peer.id != effectiveSpeakerPeerId)
}
}
if item.peer.id == effectiveSpeakerPeerId {
if item.peer.id == effectiveSpeakerPeerId, item.videoEndpointId == self.effectiveSpeaker?.1 {
targetTileNode = tileNode
}
}
}
} else if let itemNode = itemNode as? VoiceChatParticipantItemNode, let item = itemNode.item, let otherItemNode = fullscreenItemNodes[item.peer.id] {
} else if let itemNode = itemNode as? VoiceChatParticipantItemNode, let item = itemNode.item, let otherItemNode = fullscreenItemNodes[String(item.peer.id.toInt64()) + "_"] {
if !fromPan {
itemNode.animateTransitionIn(from: otherItemNode, containerNode: self.transitionContainerNode, transition: transition)
}

View File

@@ -67,6 +67,7 @@ final class VoiceChatFullscreenParticipantItem: ListViewItem {
let nameDisplayOrder: PresentationPersonNameOrder
let context: AccountContext
let peer: Peer
let videoEndpointId: String?
let icon: Icon
let text: VoiceChatParticipantItem.ParticipantText
let textColor: Color
@@ -81,11 +82,12 @@ final class VoiceChatFullscreenParticipantItem: ListViewItem {
public let selectable: Bool = true
public init(presentationData: ItemListPresentationData, nameDisplayOrder: PresentationPersonNameOrder, context: AccountContext, peer: Peer, icon: Icon, text: VoiceChatParticipantItem.ParticipantText, textColor: Color, color: Color, isLandscape: Bool, active: Bool, getAudioLevel: (() -> Signal<Float, NoError>)?, getVideo: @escaping () -> GroupVideoNode?, action: ((ASDisplayNode?) -> Void)?, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? = nil, getUpdatingAvatar: @escaping () -> Signal<(TelegramMediaImageRepresentation, Float)?, NoError>) {
public init(presentationData: ItemListPresentationData, nameDisplayOrder: PresentationPersonNameOrder, context: AccountContext, peer: Peer, videoEndpointId: String?, icon: Icon, text: VoiceChatParticipantItem.ParticipantText, textColor: Color, color: Color, isLandscape: Bool, active: Bool, getAudioLevel: (() -> Signal<Float, NoError>)?, getVideo: @escaping () -> GroupVideoNode?, action: ((ASDisplayNode?) -> Void)?, contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? = nil, getUpdatingAvatar: @escaping () -> Signal<(TelegramMediaImageRepresentation, Float)?, NoError>) {
self.presentationData = presentationData
self.nameDisplayOrder = nameDisplayOrder
self.context = context
self.peer = peer
self.videoEndpointId = videoEndpointId
self.icon = icon
self.text = text
self.textColor = textColor