mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Voice Chats Fixes
This commit is contained in:
parent
94118d9798
commit
98b60f2e01
@ -6291,3 +6291,7 @@ Sorry for the inconvenience.";
|
|||||||
"VoiceChat.LeaveConfirmation" = "Are you sure you want to leave this voice chat?";
|
"VoiceChat.LeaveConfirmation" = "Are you sure you want to leave this voice chat?";
|
||||||
"VoiceChat.LeaveVoiceChat" = "Leave Voice Chat";
|
"VoiceChat.LeaveVoiceChat" = "Leave Voice Chat";
|
||||||
"VoiceChat.LeaveAndEndVoiceChat" = "End Voice Chat";
|
"VoiceChat.LeaveAndEndVoiceChat" = "End Voice Chat";
|
||||||
|
|
||||||
|
"VoiceChat.ForwardTooltip.Chat" = "Invite link forwarded to **%@**";
|
||||||
|
"VoiceChat.ForwardTooltip.TwoChats" = "Invite link forwarded to **%@** and **%@**";
|
||||||
|
"VoiceChat.ForwardTooltip.ManyChats" = "Invite link forwarded to **%@** and %@ others";
|
||||||
|
@ -19,6 +19,7 @@ import AppBundle
|
|||||||
import LocalizedPeerData
|
import LocalizedPeerData
|
||||||
import TextSelectionNode
|
import TextSelectionNode
|
||||||
import UrlEscaping
|
import UrlEscaping
|
||||||
|
import UndoUI
|
||||||
|
|
||||||
private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: .white)
|
private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: .white)
|
||||||
private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionForward"), color: .white)
|
private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionForward"), color: .white)
|
||||||
@ -408,7 +409,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
@objc private func seekBackwardLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
|
@objc private func seekBackwardLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
|
||||||
switch gestureRecognizer.state {
|
switch gestureRecognizer.state {
|
||||||
case .began:
|
case .began:
|
||||||
self.wasPlaying = !(self.currentIsPaused ?? true)
|
self.wasPlaying = !self.currentIsPaused
|
||||||
if self.wasPlaying {
|
if self.wasPlaying {
|
||||||
self.playbackControl?()
|
self.playbackControl?()
|
||||||
}
|
}
|
||||||
@ -444,6 +445,11 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
@objc private func seekForwardLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
|
@objc private func seekForwardLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
|
||||||
switch gestureRecognizer.state {
|
switch gestureRecognizer.state {
|
||||||
case .began:
|
case .began:
|
||||||
|
self.wasPlaying = !self.currentIsPaused
|
||||||
|
if !self.wasPlaying {
|
||||||
|
self.playbackControl?()
|
||||||
|
}
|
||||||
|
|
||||||
self.seekRate = 4.0
|
self.seekRate = 4.0
|
||||||
self.setPlayRate?(self.seekRate)
|
self.setPlayRate?(self.seekRate)
|
||||||
let seekTimer = SwiftSignalKit.Timer(timeout: 2.0, repeat: true, completion: { [weak self] in
|
let seekTimer = SwiftSignalKit.Timer(timeout: 2.0, repeat: true, completion: { [weak self] in
|
||||||
@ -464,6 +470,10 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
self.setPlayRate?(1.0)
|
self.setPlayRate?(1.0)
|
||||||
self.seekTimer?.invalidate()
|
self.seekTimer?.invalidate()
|
||||||
self.seekTimer = nil
|
self.seekTimer = nil
|
||||||
|
|
||||||
|
if !self.wasPlaying {
|
||||||
|
self.playbackControl?()
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -1069,6 +1079,46 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let shareController = ShareController(context: strongSelf.context, subject: subject, preferredAction: preferredAction, forcedTheme: defaultDarkColorPresentationTheme)
|
let shareController = ShareController(context: strongSelf.context, subject: subject, preferredAction: preferredAction, forcedTheme: defaultDarkColorPresentationTheme)
|
||||||
|
shareController.completed = { [weak self] peerIds in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let _ = (strongSelf.context.account.postbox.transaction { transaction -> [Peer] in
|
||||||
|
var peers: [Peer] = []
|
||||||
|
for peerId in peerIds {
|
||||||
|
if let peer = transaction.getPeer(peerId) {
|
||||||
|
peers.append(peer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return peers
|
||||||
|
} |> deliverOnMainQueue).start(next: { [weak self] peers in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
|
let text: String
|
||||||
|
var savedMessages = false
|
||||||
|
if peerIds.count == 1, let peerId = peerIds.first, peerId == strongSelf.context.account.peerId {
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_SavedMessages_One : presentationData.strings.Conversation_ForwardTooltip_SavedMessages_Many
|
||||||
|
savedMessages = true
|
||||||
|
} else {
|
||||||
|
if peers.count == 1, let peer = peers.first {
|
||||||
|
let peerName = peer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_Chat_One(peerName).0 : presentationData.strings.Conversation_ForwardTooltip_Chat_Many(peerName).0
|
||||||
|
} else if peers.count == 2, let firstPeer = peers.first, let secondPeer = peers.last {
|
||||||
|
let firstPeerName = firstPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : firstPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
let secondPeerName = secondPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : secondPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_TwoChats_One(firstPeerName, secondPeerName).0 : presentationData.strings.Conversation_ForwardTooltip_TwoChats_Many(firstPeerName, secondPeerName).0
|
||||||
|
} else if let peer = peers.first {
|
||||||
|
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_ManyChats_One(peerName, "\(peers.count - 1)").0 : presentationData.strings.Conversation_ForwardTooltip_ManyChats_Many(peerName, "\(peers.count - 1)").0
|
||||||
|
} else {
|
||||||
|
text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strongSelf.controllerInteraction?.presentController(UndoOverlayController(presentationData: presentationData, content: .forward(savedMessages: savedMessages, text: text), elevatedLayout: true, animateInAsReplacement: true, action: { _ in return false }), nil)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
strongSelf.controllerInteraction?.presentController(shareController, nil)
|
strongSelf.controllerInteraction?.presentController(shareController, nil)
|
||||||
} else {
|
} else {
|
||||||
var singleText = presentationData.strings.Media_ShareItem(1)
|
var singleText = presentationData.strings.Media_ShareItem(1)
|
||||||
@ -1090,6 +1140,46 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
let shareAction: ([Message]) -> Void = { messages in
|
let shareAction: ([Message]) -> Void = { messages in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
let shareController = ShareController(context: strongSelf.context, subject: .messages(messages), preferredAction: preferredAction, forcedTheme: defaultDarkColorPresentationTheme)
|
let shareController = ShareController(context: strongSelf.context, subject: .messages(messages), preferredAction: preferredAction, forcedTheme: defaultDarkColorPresentationTheme)
|
||||||
|
shareController.completed = { [weak self] peerIds in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let _ = (strongSelf.context.account.postbox.transaction { transaction -> [Peer] in
|
||||||
|
var peers: [Peer] = []
|
||||||
|
for peerId in peerIds {
|
||||||
|
if let peer = transaction.getPeer(peerId) {
|
||||||
|
peers.append(peer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return peers
|
||||||
|
} |> deliverOnMainQueue).start(next: { [weak self] peers in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
|
let text: String
|
||||||
|
var savedMessages = false
|
||||||
|
if peerIds.count == 1, let peerId = peerIds.first, peerId == strongSelf.context.account.peerId {
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_SavedMessages_One : presentationData.strings.Conversation_ForwardTooltip_SavedMessages_Many
|
||||||
|
savedMessages = true
|
||||||
|
} else {
|
||||||
|
if peers.count == 1, let peer = peers.first {
|
||||||
|
let peerName = peer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_Chat_One(peerName).0 : presentationData.strings.Conversation_ForwardTooltip_Chat_Many(peerName).0
|
||||||
|
} else if peers.count == 2, let firstPeer = peers.first, let secondPeer = peers.last {
|
||||||
|
let firstPeerName = firstPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : firstPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
let secondPeerName = secondPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : secondPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_TwoChats_One(firstPeerName, secondPeerName).0 : presentationData.strings.Conversation_ForwardTooltip_TwoChats_Many(firstPeerName, secondPeerName).0
|
||||||
|
} else if let peer = peers.first {
|
||||||
|
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = messages.count == 1 ? presentationData.strings.Conversation_ForwardTooltip_ManyChats_One(peerName, "\(peers.count - 1)").0 : presentationData.strings.Conversation_ForwardTooltip_ManyChats_Many(peerName, "\(peers.count - 1)").0
|
||||||
|
} else {
|
||||||
|
text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strongSelf.controllerInteraction?.presentController(UndoOverlayController(presentationData: presentationData, content: .forward(savedMessages: savedMessages, text: text), elevatedLayout: true, animateInAsReplacement: true, action: { _ in return false }), nil)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
strongSelf.controllerInteraction?.presentController(shareController, nil)
|
strongSelf.controllerInteraction?.presentController(shareController, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1167,6 +1257,46 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let shareController = ShareController(context: self.context, subject: subject, preferredAction: preferredAction, forcedTheme: defaultDarkColorPresentationTheme)
|
let shareController = ShareController(context: self.context, subject: subject, preferredAction: preferredAction, forcedTheme: defaultDarkColorPresentationTheme)
|
||||||
|
shareController.completed = { [weak self] peerIds in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let _ = (strongSelf.context.account.postbox.transaction { transaction -> [Peer] in
|
||||||
|
var peers: [Peer] = []
|
||||||
|
for peerId in peerIds {
|
||||||
|
if let peer = transaction.getPeer(peerId) {
|
||||||
|
peers.append(peer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return peers
|
||||||
|
} |> deliverOnMainQueue).start(next: { [weak self] peers in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
|
let text: String
|
||||||
|
var savedMessages = false
|
||||||
|
if peerIds.count == 1, let peerId = peerIds.first, peerId == strongSelf.context.account.peerId {
|
||||||
|
text = presentationData.strings.Conversation_ForwardTooltip_SavedMessages_One
|
||||||
|
savedMessages = true
|
||||||
|
} else {
|
||||||
|
if peers.count == 1, let peer = peers.first {
|
||||||
|
let peerName = peer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = presentationData.strings.Conversation_ForwardTooltip_Chat_One(peerName).0
|
||||||
|
} else if peers.count == 2, let firstPeer = peers.first, let secondPeer = peers.last {
|
||||||
|
let firstPeerName = firstPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : firstPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
let secondPeerName = secondPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : secondPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = presentationData.strings.Conversation_ForwardTooltip_TwoChats_One(firstPeerName, secondPeerName).0
|
||||||
|
} else if let peer = peers.first {
|
||||||
|
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = presentationData.strings.Conversation_ForwardTooltip_ManyChats_One(peerName, "\(peers.count - 1)").0
|
||||||
|
} else {
|
||||||
|
text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strongSelf.controllerInteraction?.presentController(UndoOverlayController(presentationData: presentationData, content: .forward(savedMessages: savedMessages, text: text), elevatedLayout: true, animateInAsReplacement: true, action: { _ in return false }), nil)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
self.controllerInteraction?.presentController(shareController, nil)
|
self.controllerInteraction?.presentController(shareController, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1152,7 +1152,13 @@ public final class VoiceChatController: ViewController {
|
|||||||
let peer = entry.peer
|
let peer = entry.peer
|
||||||
if let muteState = muteState, !muteState.canUnmute || muteState.mutedByYou {
|
if let muteState = muteState, !muteState.canUnmute || muteState.mutedByYou {
|
||||||
} else {
|
} else {
|
||||||
items.append(.custom(VoiceChatVolumeContextItem(value: entry.volume.flatMap { CGFloat($0) / 10000.0 } ?? 1.0, valueChanged: { newValue, finished in
|
let minValue: CGFloat
|
||||||
|
if let callState = strongSelf.callState, callState.canManageCall && callState.adminIds.contains(peer.id) && muteState == nil {
|
||||||
|
minValue = 0.01
|
||||||
|
} else {
|
||||||
|
minValue = 0.0
|
||||||
|
}
|
||||||
|
items.append(.custom(VoiceChatVolumeContextItem(minValue: minValue, value: entry.volume.flatMap { CGFloat($0) / 10000.0 } ?? 1.0, valueChanged: { newValue, finished in
|
||||||
if finished && newValue.isZero {
|
if finished && newValue.isZero {
|
||||||
let updatedMuteState = strongSelf.call.updateMuteState(peerId: peer.id, isMuted: true)
|
let updatedMuteState = strongSelf.call.updateMuteState(peerId: peer.id, isMuted: true)
|
||||||
muteStatePromise.set(.single(updatedMuteState))
|
muteStatePromise.set(.single(updatedMuteState))
|
||||||
@ -1791,7 +1797,7 @@ public final class VoiceChatController: ViewController {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let controller = voiceChatTitleEditController(sharedContext: strongSelf.context.sharedContext, account: strongSelf.context.account, forceTheme: strongSelf.darkTheme, title: presentationData.strings.VoiceChat_EditTitleTitle, text: presentationData.strings.VoiceChat_EditTitleText, placeholder: presentationData.strings.VoiceChat_Title, value: strongSelf.callState?.title, apply: { title in
|
let controller = voiceChatTitleEditController(sharedContext: strongSelf.context.sharedContext, account: strongSelf.context.account, forceTheme: strongSelf.darkTheme, title: presentationData.strings.VoiceChat_EditTitleTitle, text: presentationData.strings.VoiceChat_EditTitleText, placeholder: chatPeer.displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder), value: strongSelf.callState?.title, apply: { title in
|
||||||
if let strongSelf = self, let title = title {
|
if let strongSelf = self, let title = title {
|
||||||
strongSelf.call.updateTitle(title)
|
strongSelf.call.updateTitle(title)
|
||||||
|
|
||||||
@ -2178,6 +2184,42 @@ public final class VoiceChatController: ViewController {
|
|||||||
})]
|
})]
|
||||||
}
|
}
|
||||||
let shareController = ShareController(context: self.context, subject: .url(inviteLinks.listenerLink), segmentedValues: segmentedValues, forcedTheme: self.darkTheme, forcedActionTitle: self.presentationData.strings.VoiceChat_CopyInviteLink)
|
let shareController = ShareController(context: self.context, subject: .url(inviteLinks.listenerLink), segmentedValues: segmentedValues, forcedTheme: self.darkTheme, forcedActionTitle: self.presentationData.strings.VoiceChat_CopyInviteLink)
|
||||||
|
shareController.completed = { [weak self] peerIds in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let _ = (strongSelf.context.account.postbox.transaction { transaction -> [Peer] in
|
||||||
|
var peers: [Peer] = []
|
||||||
|
for peerId in peerIds {
|
||||||
|
if let peer = transaction.getPeer(peerId) {
|
||||||
|
peers.append(peer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return peers
|
||||||
|
} |> deliverOnMainQueue).start(next: { [weak self] peers in
|
||||||
|
if let strongSelf = self {
|
||||||
|
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
|
let text: String
|
||||||
|
var isSavedMessages = false
|
||||||
|
if peers.count == 1, let peer = peers.first {
|
||||||
|
isSavedMessages = peer.id == strongSelf.context.account.peerId
|
||||||
|
let peerName = peer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = presentationData.strings.VoiceChat_ForwardTooltip_Chat(peerName).0
|
||||||
|
} else if peers.count == 2, let firstPeer = peers.first, let secondPeer = peers.last {
|
||||||
|
let firstPeerName = firstPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : firstPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
let secondPeerName = secondPeer.id == strongSelf.context.account.peerId ? presentationData.strings.DialogList_SavedMessages : secondPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = presentationData.strings.VoiceChat_ForwardTooltip_TwoChats(firstPeerName, secondPeerName).0
|
||||||
|
} else if let peer = peers.first {
|
||||||
|
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
||||||
|
text = presentationData.strings.VoiceChat_ForwardTooltip_ManyChats(peerName, "\(peers.count - 1)").0
|
||||||
|
} else {
|
||||||
|
text = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
strongSelf.controller?.present(UndoOverlayController(presentationData: presentationData, content: .forward(savedMessages: isSavedMessages, text: text), elevatedLayout: false, animateInAsReplacement: true, action: { _ in return false }), in: .current)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
shareController.actionCompleted = { [weak self] in
|
shareController.actionCompleted = { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
@ -7,16 +7,18 @@ import AppBundle
|
|||||||
import ContextUI
|
import ContextUI
|
||||||
|
|
||||||
final class VoiceChatVolumeContextItem: ContextMenuCustomItem {
|
final class VoiceChatVolumeContextItem: ContextMenuCustomItem {
|
||||||
|
private let minValue: CGFloat
|
||||||
private let value: CGFloat
|
private let value: CGFloat
|
||||||
private let valueChanged: (CGFloat, Bool) -> Void
|
private let valueChanged: (CGFloat, Bool) -> Void
|
||||||
|
|
||||||
init(value: CGFloat, valueChanged: @escaping (CGFloat, Bool) -> Void) {
|
init(minValue: CGFloat, value: CGFloat, valueChanged: @escaping (CGFloat, Bool) -> Void) {
|
||||||
|
self.minValue = minValue
|
||||||
self.value = value
|
self.value = value
|
||||||
self.valueChanged = valueChanged
|
self.valueChanged = valueChanged
|
||||||
}
|
}
|
||||||
|
|
||||||
func node(presentationData: PresentationData, getController: @escaping () -> ContextController?, actionSelected: @escaping (ContextMenuActionResult) -> Void) -> ContextMenuCustomNode {
|
func node(presentationData: PresentationData, getController: @escaping () -> ContextController?, actionSelected: @escaping (ContextMenuActionResult) -> Void) -> ContextMenuCustomNode {
|
||||||
return VoiceChatVolumeContextItemNode(presentationData: presentationData, getController: getController, value: self.value, valueChanged: self.valueChanged)
|
return VoiceChatVolumeContextItemNode(presentationData: presentationData, getController: getController, minValue: self.minValue, value: self.value, valueChanged: self.valueChanged)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,6 +34,7 @@ private final class VoiceChatVolumeContextItemNode: ASDisplayNode, ContextMenuCu
|
|||||||
private let foregroundIconNode: VoiceChatSpeakerNode
|
private let foregroundIconNode: VoiceChatSpeakerNode
|
||||||
private let foregroundTextNode: ImmediateTextNode
|
private let foregroundTextNode: ImmediateTextNode
|
||||||
|
|
||||||
|
let minValue: CGFloat
|
||||||
var value: CGFloat = 1.0 {
|
var value: CGFloat = 1.0 {
|
||||||
didSet {
|
didSet {
|
||||||
self.updateValue()
|
self.updateValue()
|
||||||
@ -42,8 +45,9 @@ private final class VoiceChatVolumeContextItemNode: ASDisplayNode, ContextMenuCu
|
|||||||
|
|
||||||
private let hapticFeedback = HapticFeedback()
|
private let hapticFeedback = HapticFeedback()
|
||||||
|
|
||||||
init(presentationData: PresentationData, getController: @escaping () -> ContextController?, value: CGFloat, valueChanged: @escaping (CGFloat, Bool) -> Void) {
|
init(presentationData: PresentationData, getController: @escaping () -> ContextController?, minValue: CGFloat, value: CGFloat, valueChanged: @escaping (CGFloat, Bool) -> Void) {
|
||||||
self.presentationData = presentationData
|
self.presentationData = presentationData
|
||||||
|
self.minValue = minValue
|
||||||
self.value = value
|
self.value = value
|
||||||
self.valueChanged = valueChanged
|
self.valueChanged = valueChanged
|
||||||
|
|
||||||
@ -154,7 +158,7 @@ private final class VoiceChatVolumeContextItemNode: ASDisplayNode, ContextMenuCu
|
|||||||
|
|
||||||
let translation: CGFloat = gestureRecognizer.translation(in: gestureRecognizer.view).x
|
let translation: CGFloat = gestureRecognizer.translation(in: gestureRecognizer.view).x
|
||||||
let delta = translation / self.bounds.width * 2.0
|
let delta = translation / self.bounds.width * 2.0
|
||||||
self.value = max(0.0, min(2.0, self.value + delta))
|
self.value = max(self.minValue, min(2.0, self.value + delta))
|
||||||
gestureRecognizer.setTranslation(CGPoint(), in: gestureRecognizer.view)
|
gestureRecognizer.setTranslation(CGPoint(), in: gestureRecognizer.view)
|
||||||
|
|
||||||
if self.value == 2.0 && previousValue != 2.0 {
|
if self.value == 2.0 && previousValue != 2.0 {
|
||||||
@ -172,11 +176,13 @@ private final class VoiceChatVolumeContextItemNode: ASDisplayNode, ContextMenuCu
|
|||||||
} else if self.value == 0.0 && previousValue != 0.0 {
|
} else if self.value == 0.0 && previousValue != 0.0 {
|
||||||
self.hapticFeedback.impact(.soft)
|
self.hapticFeedback.impact(.soft)
|
||||||
}
|
}
|
||||||
|
if abs(previousValue - self.value) >= 0.01 {
|
||||||
self.valueChanged(self.value, false)
|
self.valueChanged(self.value, false)
|
||||||
|
}
|
||||||
case .ended:
|
case .ended:
|
||||||
let translation: CGFloat = gestureRecognizer.translation(in: gestureRecognizer.view).x
|
let translation: CGFloat = gestureRecognizer.translation(in: gestureRecognizer.view).x
|
||||||
let delta = translation / self.bounds.width * 2.0
|
let delta = translation / self.bounds.width * 2.0
|
||||||
self.value = max(0.0, min(2.0, self.value + delta))
|
self.value = max(self.minValue, min(2.0, self.value + delta))
|
||||||
self.valueChanged(self.value, true)
|
self.valueChanged(self.value, true)
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
@ -185,7 +191,7 @@ private final class VoiceChatVolumeContextItemNode: ASDisplayNode, ContextMenuCu
|
|||||||
|
|
||||||
@objc private func tapGesture(_ gestureRecognizer: UITapGestureRecognizer) {
|
@objc private func tapGesture(_ gestureRecognizer: UITapGestureRecognizer) {
|
||||||
let location = gestureRecognizer.location(in: gestureRecognizer.view)
|
let location = gestureRecognizer.location(in: gestureRecognizer.view)
|
||||||
self.value = max(0.0, min(2.0, location.x / self.bounds.width * 2.0))
|
self.value = max(self.minValue, min(2.0, location.x / self.bounds.width * 2.0))
|
||||||
self.valueChanged(self.value, true)
|
self.valueChanged(self.value, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -5492,7 +5492,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if case .mediaRecording = subject, let _ = strongSelf.presentationInterfaceState.activeGroupCallInfo {
|
if case .mediaRecording = subject, strongSelf.presentationInterfaceState.hasActiveGroupCall {
|
||||||
let rect = strongSelf.chatDisplayNode.frameForInputActionButton()
|
let rect = strongSelf.chatDisplayNode.frameForInputActionButton()
|
||||||
if let rect = rect {
|
if let rect = rect {
|
||||||
strongSelf.mediaRestrictedTooltipController?.dismiss()
|
strongSelf.mediaRestrictedTooltipController?.dismiss()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user